From dff63ee1bbb8a6e8249fd6ca69c007985906c7f2 Mon Sep 17 00:00:00 2001 From: winPond Date: Wed, 17 Jul 2019 16:09:04 +0800 Subject: [PATCH] all homework are done --- xv6-public/Makefile | 5 +- xv6-public/big | Bin 0 -> 9332 bytes xv6-public/big.c | 53 ++ xv6-public/file.h | 2 +- xv6-public/fs.c | 40 +- xv6-public/fs.h | 8 +- xv6-public/log.c | 38 +- xv6-public/param.h | 2 +- .../xv6.si4project/Backup/Makefile(3731) | 297 ++++++++ .../xv6.si4project/Backup/Makefile(4513) | 296 ++++++++ .../xv6.si4project/Backup/Makefile(7520) | 299 ++++++++ xv6-public/xv6.si4project/Backup/big(6818).c | 53 ++ xv6-public/xv6.si4project/Backup/file(5413).h | 37 + xv6-public/xv6.si4project/Backup/fs(4986).c | 671 ++++++++++++++++++ xv6-public/xv6.si4project/Backup/fs(5757).h | 57 ++ xv6-public/xv6.si4project/Backup/log(5899).c | 234 ++++++ .../xv6.si4project/Backup/param(1678).h | 14 + .../xv6.si4project/Backup/param(8017).h | 14 + .../xv6.si4project/cache/parse/big.c.sisc | Bin 0 -> 3890 bytes .../xv6.si4project/cache/parse/file.h.sisc | Bin 4327 -> 6751 bytes .../xv6.si4project/cache/parse/fs.c.sisc | Bin 44413 -> 47850 bytes .../xv6.si4project/cache/parse/fs.h.sisc | Bin 4736 -> 6479 bytes .../xv6.si4project/cache/parse/log.c.sisc | Bin 13545 -> 15361 bytes .../xv6.si4project/cache/parse/param.h.sisc | Bin 2058 -> 2130 bytes xv6-public/xv6.si4project/xv6.SearchResults | 5 +- xv6-public/xv6.si4project/xv6.sip_sym | Bin 987452 -> 1047752 bytes xv6-public/xv6.si4project/xv6.sip_xc | Bin 196840 -> 200888 bytes xv6-public/xv6.si4project/xv6.sip_xf | Bin 196840 -> 200888 bytes xv6-public/xv6.si4project/xv6.sip_xm | Bin 388 -> 396 bytes xv6-public/xv6.si4project/xv6.sip_xr | Bin 196840 -> 200888 bytes xv6-public/xv6.si4project/xv6.sip_xsb | Bin 126976 -> 131072 bytes xv6-public/xv6.si4project/xv6.sip_xsd | Bin 1568 -> 1608 bytes xv6-public/xv6.si4project/xv6.siproj | Bin 32328 -> 32984 bytes xv6-public/xv6.si4project/xv6.siwork | Bin 65716 -> 58850 bytes 34 files changed, 2107 insertions(+), 18 deletions(-) create mode 100644 xv6-public/big create mode 100644 xv6-public/big.c create mode 100644 xv6-public/xv6.si4project/Backup/Makefile(3731) create mode 100644 xv6-public/xv6.si4project/Backup/Makefile(4513) create mode 100644 xv6-public/xv6.si4project/Backup/Makefile(7520) create mode 100644 xv6-public/xv6.si4project/Backup/big(6818).c create mode 100644 xv6-public/xv6.si4project/Backup/file(5413).h create mode 100644 xv6-public/xv6.si4project/Backup/fs(4986).c create mode 100644 xv6-public/xv6.si4project/Backup/fs(5757).h create mode 100644 xv6-public/xv6.si4project/Backup/log(5899).c create mode 100644 xv6-public/xv6.si4project/Backup/param(1678).h create mode 100644 xv6-public/xv6.si4project/Backup/param(8017).h create mode 100644 xv6-public/xv6.si4project/cache/parse/big.c.sisc diff --git a/xv6-public/Makefile b/xv6-public/Makefile index 346f45c..de6e75c 100644 --- a/xv6-public/Makefile +++ b/xv6-public/Makefile @@ -188,6 +188,7 @@ UPROGS=\ _date\ _alarmtest\ _uthread\ + _big\ fs.img: mkfs README $(UPROGS) ./mkfs fs.img README $(UPROGS) @@ -224,10 +225,12 @@ QEMUGDB = $(shell if $(QEMU) -help | grep -q '^-gdb'; \ then echo "-gdb tcp::$(GDBPORT)"; \ else echo "-s -p $(GDBPORT)"; fi) ifndef CPUS -CPUS := 2 +CPUS := 1 endif +# QEMUEXTRA = -snapshot QEMUOPTS = -drive file=fs.img,index=1,media=disk,format=raw -drive file=xv6.img,index=0,media=disk,format=raw -smp $(CPUS) -m 512 $(QEMUEXTRA) + gdb: gdb -x .gdbinit diff --git a/xv6-public/big b/xv6-public/big new file mode 100644 index 0000000000000000000000000000000000000000..3ed59dbd2dea5e9e9bae9fd04b5d4e1de1858e30 GIT binary patch literal 9332 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[bn]) == 0) ip->addrs[bn] = addr = balloc(ip->dev); return addr; } bn -= NDIRECT; - + + // #define NINDIRECT (BSIZE / sizeof(uint)) BSIZE = 512 if(bn < NINDIRECT){ + // 一级索引 // Load indirect block, allocating if necessary. if((addr = ip->addrs[NDIRECT]) == 0) ip->addrs[NDIRECT] = addr = balloc(ip->dev); + bp = bread(ip->dev, addr); a = (uint*)bp->data; if((addr = a[bn]) == 0){ @@ -397,6 +402,37 @@ bmap(struct inode *ip, uint bn) return addr; } + + bn -= NINDIRECT; + // 二级索引 + if (bn < NDINDIRECT) { + // 根结点 + if((addr = ip->addrs[NDIRECT+1]) == 0) + ip->addrs[NDIRECT+1] = addr = balloc(ip->dev); + + bp = bread(ip->dev, addr); + // 指向一级索引 + a = (uint *)bp->data; + if ((addr = a[bn/NINDIRECT]) == 0) { + a[bn/NINDIRECT] = addr = balloc(ip->dev); + log_write(bp); + } + + bp2 = bread(ip->dev, addr); + // 二级页表 + a = (uint *)bp2->data; + if ((addr = a[bn%NINDIRECT]) == 0) { + a[bn%NINDIRECT] = addr = balloc(ip->dev); + log_write(bp2); + } + + brelse(bp2); + brelse(bp); + return addr; + // + } + + panic("bmap: out of range"); } diff --git a/xv6-public/fs.h b/xv6-public/fs.h index 3214f1d..fb50385 100644 --- a/xv6-public/fs.h +++ b/xv6-public/fs.h @@ -21,9 +21,11 @@ struct superblock { uint bmapstart; // Block number of first free map block }; -#define NDIRECT 12 +#define NDIRECT 11 #define NINDIRECT (BSIZE / sizeof(uint)) -#define MAXFILE (NDIRECT + NINDIRECT) +// DOUBLE INDIRECT +#define NDINDIRECT (NINDIRECT * NINDIRECT) +#define MAXFILE (NDIRECT + NINDIRECT + NDINDIRECT) // On-disk inode structure struct dinode { @@ -32,7 +34,7 @@ struct dinode { short minor; // Minor device number (T_DEV only) short nlink; // Number of links to inode in file system uint size; // Size of file (bytes) - uint addrs[NDIRECT+1]; // Data block addresses + uint addrs[NDIRECT+2]; // Data block addresses }; // Inodes per block. diff --git a/xv6-public/log.c b/xv6-public/log.c index a64c0f6..62cb643 100644 --- a/xv6-public/log.c +++ b/xv6-public/log.c @@ -5,6 +5,10 @@ #include "sleeplock.h" #include "fs.h" #include "buf.h" +// -------------- hw11 crash added +#include "mmu.h" +#include "proc.h" + // Simple logging that allows concurrent FS system calls. // @@ -72,11 +76,11 @@ install_trans(void) int tail; for (tail = 0; tail < log.lh.n; tail++) { - struct buf *lbuf = bread(log.dev, log.start+tail+1); // read log block + // 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 + // memmove(dbuf->data, lbuf->data, BSIZE); // copy block to dst bwrite(dbuf); // write dst to disk - brelse(lbuf); + // brelse(lbuf); brelse(dbuf); } } @@ -115,12 +119,14 @@ write_head(void) static void recover_from_log(void) { - read_head(); - install_trans(); // if committed, copy from log to disk + read_head(); + cprintf("recovery: n=%d but ignoring\n", log.lh.n); + install_trans(); log.lh.n = 0; - write_head(); // clear the log + write_head(); } + // called at the start of each FS system call. void begin_op(void) @@ -189,6 +195,26 @@ write_log(void) } } +/* +void +commit(void) +{ + int pid = myproc()->pid; + if (log.lh.n > 0) { + write_log(); + write_head(); + if(pid > 1) // AAA + log.lh.block[0] = 0; // BBB + install_trans(); + if(pid > 1) // AAA + panic("commit mimicking crash"); // CCC + log.lh.n = 0; + write_head(); + } +} +*/ + + static void commit() { diff --git a/xv6-public/param.h b/xv6-public/param.h index a7e90ef..fe38bfb 100644 --- a/xv6-public/param.h +++ b/xv6-public/param.h @@ -10,5 +10,5 @@ #define MAXOPBLOCKS 10 // max # of blocks any FS op writes #define LOGSIZE (MAXOPBLOCKS*3) // max data blocks in on-disk log #define NBUF (MAXOPBLOCKS*3) // size of disk block cache -#define FSSIZE 1000 // size of file system in blocks +#define FSSIZE 20000 // size of file system in blocks diff --git a/xv6-public/xv6.si4project/Backup/Makefile(3731) b/xv6-public/xv6.si4project/Backup/Makefile(3731) new file mode 100644 index 0000000..e0d2379 --- /dev/null +++ b/xv6-public/xv6.si4project/Backup/Makefile(3731) @@ -0,0 +1,297 @@ +OBJS = \ + bio.o\ + console.o\ + exec.o\ + file.o\ + fs.o\ + ide.o\ + ioapic.o\ + kalloc.o\ + kbd.o\ + lapic.o\ + log.o\ + main.o\ + mp.o\ + picirq.o\ + pipe.o\ + proc.o\ + sleeplock.o\ + spinlock.o\ + string.o\ + swtch.o\ + syscall.o\ + sysfile.o\ + sysproc.o\ + trapasm.o\ + trap.o\ + uart.o\ + vectors.o\ + vm.o\ + +# Cross-compiling (e.g., on Mac OS X) +# TOOLPREFIX = i386-jos-elf + +# Using native tools (e.g., on X86 Linux) +#TOOLPREFIX = + +# Try to infer the correct TOOLPREFIX if not set +ifndef TOOLPREFIX +TOOLPREFIX := $(shell if i386-jos-elf-objdump -i 2>&1 | grep '^elf32-i386$$' >/dev/null 2>&1; \ + then echo 'i386-jos-elf-'; \ + elif objdump -i 2>&1 | grep 'elf32-i386' >/dev/null 2>&1; \ + then echo ''; \ + else echo "***" 1>&2; \ + echo "*** Error: Couldn't find an i386-*-elf version of GCC/binutils." 1>&2; \ + echo "*** Is the directory with i386-jos-elf-gcc in your PATH?" 1>&2; \ + echo "*** If your i386-*-elf toolchain is installed with a command" 1>&2; \ + echo "*** prefix other than 'i386-jos-elf-', set your TOOLPREFIX" 1>&2; \ + echo "*** environment variable to that prefix and run 'make' again." 1>&2; \ + echo "*** To turn off this error, run 'gmake TOOLPREFIX= ...'." 1>&2; \ + echo "***" 1>&2; exit 1; fi) +endif + +# If the makefile can't find QEMU, specify its path here +# QEMU = qemu-system-i386 + +# Try to infer the correct QEMU +ifndef QEMU +QEMU = $(shell if which qemu > /dev/null; \ + then echo qemu; exit; \ + elif which qemu-system-i386 > /dev/null; \ + then echo qemu-system-i386; exit; \ + elif which qemu-system-x86_64 > /dev/null; \ + then echo qemu-system-x86_64; exit; \ + else \ + qemu=/Applications/Q.app/Contents/MacOS/i386-softmmu.app/Contents/MacOS/i386-softmmu; \ + if test -x $$qemu; then echo $$qemu; exit; fi; fi; \ + echo "***" 1>&2; \ + echo "*** Error: Couldn't find a working QEMU executable." 1>&2; \ + echo "*** Is the directory containing the qemu binary in your PATH" 1>&2; \ + echo "*** or have you tried setting the QEMU variable in Makefile?" 1>&2; \ + echo "***" 1>&2; exit 1) +endif + +CC = $(TOOLPREFIX)gcc +AS = $(TOOLPREFIX)gas +LD = $(TOOLPREFIX)ld +OBJCOPY = $(TOOLPREFIX)objcopy +OBJDUMP = $(TOOLPREFIX)objdump +CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer +CFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector) +ASFLAGS = -m32 -gdwarf-2 -Wa,-divide +# FreeBSD ld wants ``elf_i386_fbsd'' +LDFLAGS += -m $(shell $(LD) -V | grep elf_i386 2>/dev/null | head -n 1) + +# 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 + +xv6.img: bootblock kernel + dd if=/dev/zero of=xv6.img count=10000 + dd if=bootblock of=xv6.img conv=notrunc + dd if=kernel of=xv6.img seek=1 conv=notrunc + +xv6memfs.img: bootblock kernelmemfs + dd if=/dev/zero of=xv6memfs.img count=10000 + dd if=bootblock of=xv6memfs.img conv=notrunc + dd if=kernelmemfs of=xv6memfs.img seek=1 conv=notrunc + +bootblock: bootasm.S bootmain.c + $(CC) $(CFLAGS) -fno-pic -O -nostdinc -I. -c bootmain.c + $(CC) $(CFLAGS) -fno-pic -nostdinc -I. -c bootasm.S + $(LD) $(LDFLAGS) -N -e start -Ttext 0x7C00 -o bootblock.o bootasm.o bootmain.o + $(OBJDUMP) -S bootblock.o > bootblock.asm + $(OBJCOPY) -S -O binary -j .text bootblock.o bootblock + ./sign.pl bootblock + +entryother: entryother.S + $(CC) $(CFLAGS) -fno-pic -nostdinc -I. -c entryother.S + $(LD) $(LDFLAGS) -N -e start -Ttext 0x7000 -o bootblockother.o entryother.o + $(OBJCOPY) -S -O binary -j .text bootblockother.o entryother + $(OBJDUMP) -S bootblockother.o > entryother.asm + +initcode: initcode.S + $(CC) $(CFLAGS) -nostdinc -I. -c initcode.S + $(LD) $(LDFLAGS) -N -e start -Ttext 0 -o initcode.out initcode.o + $(OBJCOPY) -S -O binary initcode.out initcode + $(OBJDUMP) -S initcode.o > initcode.asm + +kernel: $(OBJS) entry.o entryother initcode kernel.ld + $(LD) $(LDFLAGS) -T kernel.ld -o kernel entry.o $(OBJS) -b binary initcode entryother + $(OBJDUMP) -S kernel > kernel.asm + $(OBJDUMP) -t kernel | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > kernel.sym + +_uthread: uthread.o uthread_switch.o + $(LD) $(LDFLAGS) -N -e main -Ttext 0 -o _uthread uthread.o uthread_switch.o $(ULIB) + $(OBJDUMP) -S _uthread > uthread.asm + +# kernelmemfs is a copy of kernel that maintains the +# disk image in memory instead of writing to a disk. +# This is not so useful for testing persistent storage or +# exploring disk buffering implementations, but it is +# great for testing the kernel on real hardware without +# needing a scratch disk. +MEMFSOBJS = $(filter-out ide.o,$(OBJS)) memide.o +kernelmemfs: $(MEMFSOBJS) entry.o entryother initcode kernel.ld fs.img + $(LD) $(LDFLAGS) -T kernel.ld -o kernelmemfs entry.o $(MEMFSOBJS) -b binary initcode entryother fs.img + $(OBJDUMP) -S kernelmemfs > kernelmemfs.asm + $(OBJDUMP) -t kernelmemfs | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > kernelmemfs.sym + +tags: $(OBJS) entryother.S _init + etags *.S *.c + +vectors.S: vectors.pl + ./vectors.pl > vectors.S + +ULIB = ulib.o usys.o printf.o umalloc.o + +_%: %.o $(ULIB) + $(LD) $(LDFLAGS) -N -e main -Ttext 0 -o $@ $^ + $(OBJDUMP) -S $@ > $*.asm + $(OBJDUMP) -t $@ | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $*.sym + +_forktest: 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 _forktest forktest.o ulib.o usys.o + $(OBJDUMP) -S _forktest > forktest.asm + +mkfs: mkfs.c fs.h + gcc -Werror -Wall -o 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=\ + _cat\ + _echo\ + _forktest\ + _grep\ + _init\ + _kill\ + _ln\ + _ls\ + _mkdir\ + _rm\ + _sh\ + _stressfs\ + _usertests\ + _wc\ + _zombie\ + _date\ + _alarmtest\ + _uthread\ + +fs.img: mkfs README $(UPROGS) + ./mkfs fs.img README $(UPROGS) + +-include *.d + +clean: + rm -f *.tex *.dvi *.idx *.aux *.log *.ind *.ilg \ + *.o *.d *.asm *.sym vectors.S bootblock entryother \ + initcode initcode.out kernel xv6.img fs.img kernelmemfs \ + xv6memfs.img mkfs .gdbinit \ + $(UPROGS) + +# make a printout +FILES = $(shell grep -v '^\#' runoff.list) +PRINT = runoff.list runoff.spec README toc.hdr toc.ftr $(FILES) + +xv6.pdf: $(PRINT) + ./runoff + ls -l xv6.pdf + +print: xv6.pdf + +# run in emulators + +bochs : fs.img xv6.img + if [ ! -e .bochsrc ]; then ln -s dot-bochsrc .bochsrc; fi + bochs -q + +# 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 := 1 +endif +QEMUOPTS = -drive file=fs.img,index=1,media=disk,format=raw -drive file=xv6.img,index=0,media=disk,format=raw -smp $(CPUS) -m 512 $(QEMUEXTRA) +QEMUEXTRA = -snapshot + +gdb: + gdb -x .gdbinit + +qemu: fs.img xv6.img + $(QEMU) -serial mon:stdio $(QEMUOPTS) + +qemu-memfs: xv6memfs.img + $(QEMU) -drive file=xv6memfs.img,index=0,media=disk,format=raw -smp $(CPUS) -m 256 + +qemu-nox: fs.img xv6.img + $(QEMU) -nographic $(QEMUOPTS) + +.gdbinit: .gdbinit.tmpl + sed "s/localhost:1234/localhost:$(GDBPORT)/" < $^ > $@ + +qemu-gdb: fs.img xv6.img .gdbinit + @echo "*** Now run 'gdb'." 1>&2 + $(QEMU) -serial mon:stdio $(QEMUOPTS) -S $(QEMUGDB) + +qemu-nox-gdb: fs.img xv6.img .gdbinit + @echo "*** Now run 'gdb'." 1>&2 + $(QEMU) -nographic $(QEMUOPTS) -S $(QEMUGDB) + +# CUT HERE +# prepare dist for students +# after running make dist, probably want to +# rename it to rev0 or rev1 or so on and then +# check in that version. + +EXTRA=\ + mkfs.c ulib.c user.h cat.c echo.c forktest.c grep.c kill.c\ + ln.c ls.c mkdir.c rm.c stressfs.c usertests.c wc.c zombie.c\ + printf.c umalloc.c\ + README dot-bochsrc *.pl toc.* runoff runoff1 runoff.list\ + .gdbinit.tmpl gdbutil\ + +dist: + rm -rf dist + mkdir dist + for i in $(FILES); \ + do \ + grep -v PAGEBREAK $$i >dist/$$i; \ + done + sed '/CUT HERE/,$$d' Makefile >dist/Makefile + echo >dist/runoff.spec + cp $(EXTRA) dist + +dist-test: + rm -rf dist + make dist + rm -rf dist-test + mkdir dist-test + cp dist/* dist-test + cd dist-test; $(MAKE) print + cd dist-test; $(MAKE) bochs || true + cd dist-test; $(MAKE) qemu + +# update this rule (change rev#) when it is time to +# make a new revision. +tar: + rm -rf /tmp/xv6 + mkdir -p /tmp/xv6 + cp dist/* dist/.gdbinit.tmpl /tmp/xv6 + (cd /tmp; tar cf - xv6) | gzip >xv6-rev10.tar.gz # the next one will be 10 (9/17) + +.PHONY: dist-test dist diff --git a/xv6-public/xv6.si4project/Backup/Makefile(4513) b/xv6-public/xv6.si4project/Backup/Makefile(4513) new file mode 100644 index 0000000..346f45c --- /dev/null +++ b/xv6-public/xv6.si4project/Backup/Makefile(4513) @@ -0,0 +1,296 @@ +OBJS = \ + bio.o\ + console.o\ + exec.o\ + file.o\ + fs.o\ + ide.o\ + ioapic.o\ + kalloc.o\ + kbd.o\ + lapic.o\ + log.o\ + main.o\ + mp.o\ + picirq.o\ + pipe.o\ + proc.o\ + sleeplock.o\ + spinlock.o\ + string.o\ + swtch.o\ + syscall.o\ + sysfile.o\ + sysproc.o\ + trapasm.o\ + trap.o\ + uart.o\ + vectors.o\ + vm.o\ + +# Cross-compiling (e.g., on Mac OS X) +# TOOLPREFIX = i386-jos-elf + +# Using native tools (e.g., on X86 Linux) +#TOOLPREFIX = + +# Try to infer the correct TOOLPREFIX if not set +ifndef TOOLPREFIX +TOOLPREFIX := $(shell if i386-jos-elf-objdump -i 2>&1 | grep '^elf32-i386$$' >/dev/null 2>&1; \ + then echo 'i386-jos-elf-'; \ + elif objdump -i 2>&1 | grep 'elf32-i386' >/dev/null 2>&1; \ + then echo ''; \ + else echo "***" 1>&2; \ + echo "*** Error: Couldn't find an i386-*-elf version of GCC/binutils." 1>&2; \ + echo "*** Is the directory with i386-jos-elf-gcc in your PATH?" 1>&2; \ + echo "*** If your i386-*-elf toolchain is installed with a command" 1>&2; \ + echo "*** prefix other than 'i386-jos-elf-', set your TOOLPREFIX" 1>&2; \ + echo "*** environment variable to that prefix and run 'make' again." 1>&2; \ + echo "*** To turn off this error, run 'gmake TOOLPREFIX= ...'." 1>&2; \ + echo "***" 1>&2; exit 1; fi) +endif + +# If the makefile can't find QEMU, specify its path here +# QEMU = qemu-system-i386 + +# Try to infer the correct QEMU +ifndef QEMU +QEMU = $(shell if which qemu > /dev/null; \ + then echo qemu; exit; \ + elif which qemu-system-i386 > /dev/null; \ + then echo qemu-system-i386; exit; \ + elif which qemu-system-x86_64 > /dev/null; \ + then echo qemu-system-x86_64; exit; \ + else \ + qemu=/Applications/Q.app/Contents/MacOS/i386-softmmu.app/Contents/MacOS/i386-softmmu; \ + if test -x $$qemu; then echo $$qemu; exit; fi; fi; \ + echo "***" 1>&2; \ + echo "*** Error: Couldn't find a working QEMU executable." 1>&2; \ + echo "*** Is the directory containing the qemu binary in your PATH" 1>&2; \ + echo "*** or have you tried setting the QEMU variable in Makefile?" 1>&2; \ + echo "***" 1>&2; exit 1) +endif + +CC = $(TOOLPREFIX)gcc +AS = $(TOOLPREFIX)gas +LD = $(TOOLPREFIX)ld +OBJCOPY = $(TOOLPREFIX)objcopy +OBJDUMP = $(TOOLPREFIX)objdump +CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer +CFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector) +ASFLAGS = -m32 -gdwarf-2 -Wa,-divide +# FreeBSD ld wants ``elf_i386_fbsd'' +LDFLAGS += -m $(shell $(LD) -V | grep elf_i386 2>/dev/null | head -n 1) + +# 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 + +xv6.img: bootblock kernel + dd if=/dev/zero of=xv6.img count=10000 + dd if=bootblock of=xv6.img conv=notrunc + dd if=kernel of=xv6.img seek=1 conv=notrunc + +xv6memfs.img: bootblock kernelmemfs + dd if=/dev/zero of=xv6memfs.img count=10000 + dd if=bootblock of=xv6memfs.img conv=notrunc + dd if=kernelmemfs of=xv6memfs.img seek=1 conv=notrunc + +bootblock: bootasm.S bootmain.c + $(CC) $(CFLAGS) -fno-pic -O -nostdinc -I. -c bootmain.c + $(CC) $(CFLAGS) -fno-pic -nostdinc -I. -c bootasm.S + $(LD) $(LDFLAGS) -N -e start -Ttext 0x7C00 -o bootblock.o bootasm.o bootmain.o + $(OBJDUMP) -S bootblock.o > bootblock.asm + $(OBJCOPY) -S -O binary -j .text bootblock.o bootblock + ./sign.pl bootblock + +entryother: entryother.S + $(CC) $(CFLAGS) -fno-pic -nostdinc -I. -c entryother.S + $(LD) $(LDFLAGS) -N -e start -Ttext 0x7000 -o bootblockother.o entryother.o + $(OBJCOPY) -S -O binary -j .text bootblockother.o entryother + $(OBJDUMP) -S bootblockother.o > entryother.asm + +initcode: initcode.S + $(CC) $(CFLAGS) -nostdinc -I. -c initcode.S + $(LD) $(LDFLAGS) -N -e start -Ttext 0 -o initcode.out initcode.o + $(OBJCOPY) -S -O binary initcode.out initcode + $(OBJDUMP) -S initcode.o > initcode.asm + +kernel: $(OBJS) entry.o entryother initcode kernel.ld + $(LD) $(LDFLAGS) -T kernel.ld -o kernel entry.o $(OBJS) -b binary initcode entryother + $(OBJDUMP) -S kernel > kernel.asm + $(OBJDUMP) -t kernel | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > kernel.sym + +_uthread: uthread.o uthread_switch.o + $(LD) $(LDFLAGS) -N -e main -Ttext 0 -o _uthread uthread.o uthread_switch.o $(ULIB) + $(OBJDUMP) -S _uthread > uthread.asm + +# kernelmemfs is a copy of kernel that maintains the +# disk image in memory instead of writing to a disk. +# This is not so useful for testing persistent storage or +# exploring disk buffering implementations, but it is +# great for testing the kernel on real hardware without +# needing a scratch disk. +MEMFSOBJS = $(filter-out ide.o,$(OBJS)) memide.o +kernelmemfs: $(MEMFSOBJS) entry.o entryother initcode kernel.ld fs.img + $(LD) $(LDFLAGS) -T kernel.ld -o kernelmemfs entry.o $(MEMFSOBJS) -b binary initcode entryother fs.img + $(OBJDUMP) -S kernelmemfs > kernelmemfs.asm + $(OBJDUMP) -t kernelmemfs | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > kernelmemfs.sym + +tags: $(OBJS) entryother.S _init + etags *.S *.c + +vectors.S: vectors.pl + ./vectors.pl > vectors.S + +ULIB = ulib.o usys.o printf.o umalloc.o + +_%: %.o $(ULIB) + $(LD) $(LDFLAGS) -N -e main -Ttext 0 -o $@ $^ + $(OBJDUMP) -S $@ > $*.asm + $(OBJDUMP) -t $@ | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $*.sym + +_forktest: 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 _forktest forktest.o ulib.o usys.o + $(OBJDUMP) -S _forktest > forktest.asm + +mkfs: mkfs.c fs.h + gcc -Werror -Wall -o 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=\ + _cat\ + _echo\ + _forktest\ + _grep\ + _init\ + _kill\ + _ln\ + _ls\ + _mkdir\ + _rm\ + _sh\ + _stressfs\ + _usertests\ + _wc\ + _zombie\ + _date\ + _alarmtest\ + _uthread\ + +fs.img: mkfs README $(UPROGS) + ./mkfs fs.img README $(UPROGS) + +-include *.d + +clean: + rm -f *.tex *.dvi *.idx *.aux *.log *.ind *.ilg \ + *.o *.d *.asm *.sym vectors.S bootblock entryother \ + initcode initcode.out kernel xv6.img fs.img kernelmemfs \ + xv6memfs.img mkfs .gdbinit \ + $(UPROGS) + +# make a printout +FILES = $(shell grep -v '^\#' runoff.list) +PRINT = runoff.list runoff.spec README toc.hdr toc.ftr $(FILES) + +xv6.pdf: $(PRINT) + ./runoff + ls -l xv6.pdf + +print: xv6.pdf + +# run in emulators + +bochs : fs.img xv6.img + if [ ! -e .bochsrc ]; then ln -s dot-bochsrc .bochsrc; fi + bochs -q + +# 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 := 2 +endif +QEMUOPTS = -drive file=fs.img,index=1,media=disk,format=raw -drive file=xv6.img,index=0,media=disk,format=raw -smp $(CPUS) -m 512 $(QEMUEXTRA) + +gdb: + gdb -x .gdbinit + +qemu: fs.img xv6.img + $(QEMU) -serial mon:stdio $(QEMUOPTS) + +qemu-memfs: xv6memfs.img + $(QEMU) -drive file=xv6memfs.img,index=0,media=disk,format=raw -smp $(CPUS) -m 256 + +qemu-nox: fs.img xv6.img + $(QEMU) -nographic $(QEMUOPTS) + +.gdbinit: .gdbinit.tmpl + sed "s/localhost:1234/localhost:$(GDBPORT)/" < $^ > $@ + +qemu-gdb: fs.img xv6.img .gdbinit + @echo "*** Now run 'gdb'." 1>&2 + $(QEMU) -serial mon:stdio $(QEMUOPTS) -S $(QEMUGDB) + +qemu-nox-gdb: fs.img xv6.img .gdbinit + @echo "*** Now run 'gdb'." 1>&2 + $(QEMU) -nographic $(QEMUOPTS) -S $(QEMUGDB) + +# CUT HERE +# prepare dist for students +# after running make dist, probably want to +# rename it to rev0 or rev1 or so on and then +# check in that version. + +EXTRA=\ + mkfs.c ulib.c user.h cat.c echo.c forktest.c grep.c kill.c\ + ln.c ls.c mkdir.c rm.c stressfs.c usertests.c wc.c zombie.c\ + printf.c umalloc.c\ + README dot-bochsrc *.pl toc.* runoff runoff1 runoff.list\ + .gdbinit.tmpl gdbutil\ + +dist: + rm -rf dist + mkdir dist + for i in $(FILES); \ + do \ + grep -v PAGEBREAK $$i >dist/$$i; \ + done + sed '/CUT HERE/,$$d' Makefile >dist/Makefile + echo >dist/runoff.spec + cp $(EXTRA) dist + +dist-test: + rm -rf dist + make dist + rm -rf dist-test + mkdir dist-test + cp dist/* dist-test + cd dist-test; $(MAKE) print + cd dist-test; $(MAKE) bochs || true + cd dist-test; $(MAKE) qemu + +# update this rule (change rev#) when it is time to +# make a new revision. +tar: + rm -rf /tmp/xv6 + mkdir -p /tmp/xv6 + cp dist/* dist/.gdbinit.tmpl /tmp/xv6 + (cd /tmp; tar cf - xv6) | gzip >xv6-rev10.tar.gz # the next one will be 10 (9/17) + +.PHONY: dist-test dist diff --git a/xv6-public/xv6.si4project/Backup/Makefile(7520) b/xv6-public/xv6.si4project/Backup/Makefile(7520) new file mode 100644 index 0000000..ebfdfc9 --- /dev/null +++ b/xv6-public/xv6.si4project/Backup/Makefile(7520) @@ -0,0 +1,299 @@ +OBJS = \ + bio.o\ + console.o\ + exec.o\ + file.o\ + fs.o\ + ide.o\ + ioapic.o\ + kalloc.o\ + kbd.o\ + lapic.o\ + log.o\ + main.o\ + mp.o\ + picirq.o\ + pipe.o\ + proc.o\ + sleeplock.o\ + spinlock.o\ + string.o\ + swtch.o\ + syscall.o\ + sysfile.o\ + sysproc.o\ + trapasm.o\ + trap.o\ + uart.o\ + vectors.o\ + vm.o\ + +# Cross-compiling (e.g., on Mac OS X) +# TOOLPREFIX = i386-jos-elf + +# Using native tools (e.g., on X86 Linux) +#TOOLPREFIX = + +# Try to infer the correct TOOLPREFIX if not set +ifndef TOOLPREFIX +TOOLPREFIX := $(shell if i386-jos-elf-objdump -i 2>&1 | grep '^elf32-i386$$' >/dev/null 2>&1; \ + then echo 'i386-jos-elf-'; \ + elif objdump -i 2>&1 | grep 'elf32-i386' >/dev/null 2>&1; \ + then echo ''; \ + else echo "***" 1>&2; \ + echo "*** Error: Couldn't find an i386-*-elf version of GCC/binutils." 1>&2; \ + echo "*** Is the directory with i386-jos-elf-gcc in your PATH?" 1>&2; \ + echo "*** If your i386-*-elf toolchain is installed with a command" 1>&2; \ + echo "*** prefix other than 'i386-jos-elf-', set your TOOLPREFIX" 1>&2; \ + echo "*** environment variable to that prefix and run 'make' again." 1>&2; \ + echo "*** To turn off this error, run 'gmake TOOLPREFIX= ...'." 1>&2; \ + echo "***" 1>&2; exit 1; fi) +endif + +# If the makefile can't find QEMU, specify its path here +# QEMU = qemu-system-i386 + +# Try to infer the correct QEMU +ifndef QEMU +QEMU = $(shell if which qemu > /dev/null; \ + then echo qemu; exit; \ + elif which qemu-system-i386 > /dev/null; \ + then echo qemu-system-i386; exit; \ + elif which qemu-system-x86_64 > /dev/null; \ + then echo qemu-system-x86_64; exit; \ + else \ + qemu=/Applications/Q.app/Contents/MacOS/i386-softmmu.app/Contents/MacOS/i386-softmmu; \ + if test -x $$qemu; then echo $$qemu; exit; fi; fi; \ + echo "***" 1>&2; \ + echo "*** Error: Couldn't find a working QEMU executable." 1>&2; \ + echo "*** Is the directory containing the qemu binary in your PATH" 1>&2; \ + echo "*** or have you tried setting the QEMU variable in Makefile?" 1>&2; \ + echo "***" 1>&2; exit 1) +endif + +CC = $(TOOLPREFIX)gcc +AS = $(TOOLPREFIX)gas +LD = $(TOOLPREFIX)ld +OBJCOPY = $(TOOLPREFIX)objcopy +OBJDUMP = $(TOOLPREFIX)objdump +CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer +CFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector) +ASFLAGS = -m32 -gdwarf-2 -Wa,-divide +# FreeBSD ld wants ``elf_i386_fbsd'' +LDFLAGS += -m $(shell $(LD) -V | grep elf_i386 2>/dev/null | head -n 1) + +# 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 + +xv6.img: bootblock kernel + dd if=/dev/zero of=xv6.img count=10000 + dd if=bootblock of=xv6.img conv=notrunc + dd if=kernel of=xv6.img seek=1 conv=notrunc + +xv6memfs.img: bootblock kernelmemfs + dd if=/dev/zero of=xv6memfs.img count=10000 + dd if=bootblock of=xv6memfs.img conv=notrunc + dd if=kernelmemfs of=xv6memfs.img seek=1 conv=notrunc + +bootblock: bootasm.S bootmain.c + $(CC) $(CFLAGS) -fno-pic -O -nostdinc -I. -c bootmain.c + $(CC) $(CFLAGS) -fno-pic -nostdinc -I. -c bootasm.S + $(LD) $(LDFLAGS) -N -e start -Ttext 0x7C00 -o bootblock.o bootasm.o bootmain.o + $(OBJDUMP) -S bootblock.o > bootblock.asm + $(OBJCOPY) -S -O binary -j .text bootblock.o bootblock + ./sign.pl bootblock + +entryother: entryother.S + $(CC) $(CFLAGS) -fno-pic -nostdinc -I. -c entryother.S + $(LD) $(LDFLAGS) -N -e start -Ttext 0x7000 -o bootblockother.o entryother.o + $(OBJCOPY) -S -O binary -j .text bootblockother.o entryother + $(OBJDUMP) -S bootblockother.o > entryother.asm + +initcode: initcode.S + $(CC) $(CFLAGS) -nostdinc -I. -c initcode.S + $(LD) $(LDFLAGS) -N -e start -Ttext 0 -o initcode.out initcode.o + $(OBJCOPY) -S -O binary initcode.out initcode + $(OBJDUMP) -S initcode.o > initcode.asm + +kernel: $(OBJS) entry.o entryother initcode kernel.ld + $(LD) $(LDFLAGS) -T kernel.ld -o kernel entry.o $(OBJS) -b binary initcode entryother + $(OBJDUMP) -S kernel > kernel.asm + $(OBJDUMP) -t kernel | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > kernel.sym + +_uthread: uthread.o uthread_switch.o + $(LD) $(LDFLAGS) -N -e main -Ttext 0 -o _uthread uthread.o uthread_switch.o $(ULIB) + $(OBJDUMP) -S _uthread > uthread.asm + +# kernelmemfs is a copy of kernel that maintains the +# disk image in memory instead of writing to a disk. +# This is not so useful for testing persistent storage or +# exploring disk buffering implementations, but it is +# great for testing the kernel on real hardware without +# needing a scratch disk. +MEMFSOBJS = $(filter-out ide.o,$(OBJS)) memide.o +kernelmemfs: $(MEMFSOBJS) entry.o entryother initcode kernel.ld fs.img + $(LD) $(LDFLAGS) -T kernel.ld -o kernelmemfs entry.o $(MEMFSOBJS) -b binary initcode entryother fs.img + $(OBJDUMP) -S kernelmemfs > kernelmemfs.asm + $(OBJDUMP) -t kernelmemfs | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > kernelmemfs.sym + +tags: $(OBJS) entryother.S _init + etags *.S *.c + +vectors.S: vectors.pl + ./vectors.pl > vectors.S + +ULIB = ulib.o usys.o printf.o umalloc.o + +_%: %.o $(ULIB) + $(LD) $(LDFLAGS) -N -e main -Ttext 0 -o $@ $^ + $(OBJDUMP) -S $@ > $*.asm + $(OBJDUMP) -t $@ | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $*.sym + +_forktest: 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 _forktest forktest.o ulib.o usys.o + $(OBJDUMP) -S _forktest > forktest.asm + +mkfs: mkfs.c fs.h + gcc -Werror -Wall -o 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=\ + _cat\ + _echo\ + _forktest\ + _grep\ + _init\ + _kill\ + _ln\ + _ls\ + _mkdir\ + _rm\ + _sh\ + _stressfs\ + _usertests\ + _wc\ + _zombie\ + _date\ + _alarmtest\ + _uthread\ + _big\ + +fs.img: mkfs README $(UPROGS) + ./mkfs fs.img README $(UPROGS) + +-include *.d + +clean: + rm -f *.tex *.dvi *.idx *.aux *.log *.ind *.ilg \ + *.o *.d *.asm *.sym vectors.S bootblock entryother \ + initcode initcode.out kernel xv6.img fs.img kernelmemfs \ + xv6memfs.img mkfs .gdbinit \ + $(UPROGS) + +# make a printout +FILES = $(shell grep -v '^\#' runoff.list) +PRINT = runoff.list runoff.spec README toc.hdr toc.ftr $(FILES) + +xv6.pdf: $(PRINT) + ./runoff + ls -l xv6.pdf + +print: xv6.pdf + +# run in emulators + +bochs : fs.img xv6.img + if [ ! -e .bochsrc ]; then ln -s dot-bochsrc .bochsrc; fi + bochs -q + +# 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 := 1 +endif +QEMUEXTRA = -snapshot +QEMUOPTS = -drive file=fs.img,index=1,media=disk,format=raw -drive file=xv6.img,index=0,media=disk,format=raw -smp $(CPUS) -m 512 $(QEMUEXTRA) + + +gdb: + gdb -x .gdbinit + +qemu: fs.img xv6.img + $(QEMU) -serial mon:stdio $(QEMUOPTS) + +qemu-memfs: xv6memfs.img + $(QEMU) -drive file=xv6memfs.img,index=0,media=disk,format=raw -smp $(CPUS) -m 256 + +qemu-nox: fs.img xv6.img + $(QEMU) -nographic $(QEMUOPTS) + +.gdbinit: .gdbinit.tmpl + sed "s/localhost:1234/localhost:$(GDBPORT)/" < $^ > $@ + +qemu-gdb: fs.img xv6.img .gdbinit + @echo "*** Now run 'gdb'." 1>&2 + $(QEMU) -serial mon:stdio $(QEMUOPTS) -S $(QEMUGDB) + +qemu-nox-gdb: fs.img xv6.img .gdbinit + @echo "*** Now run 'gdb'." 1>&2 + $(QEMU) -nographic $(QEMUOPTS) -S $(QEMUGDB) + +# CUT HERE +# prepare dist for students +# after running make dist, probably want to +# rename it to rev0 or rev1 or so on and then +# check in that version. + +EXTRA=\ + mkfs.c ulib.c user.h cat.c echo.c forktest.c grep.c kill.c\ + ln.c ls.c mkdir.c rm.c stressfs.c usertests.c wc.c zombie.c\ + printf.c umalloc.c\ + README dot-bochsrc *.pl toc.* runoff runoff1 runoff.list\ + .gdbinit.tmpl gdbutil\ + +dist: + rm -rf dist + mkdir dist + for i in $(FILES); \ + do \ + grep -v PAGEBREAK $$i >dist/$$i; \ + done + sed '/CUT HERE/,$$d' Makefile >dist/Makefile + echo >dist/runoff.spec + cp $(EXTRA) dist + +dist-test: + rm -rf dist + make dist + rm -rf dist-test + mkdir dist-test + cp dist/* dist-test + cd dist-test; $(MAKE) print + cd dist-test; $(MAKE) bochs || true + cd dist-test; $(MAKE) qemu + +# update this rule (change rev#) when it is time to +# make a new revision. +tar: + rm -rf /tmp/xv6 + mkdir -p /tmp/xv6 + cp dist/* dist/.gdbinit.tmpl /tmp/xv6 + (cd /tmp; tar cf - xv6) | gzip >xv6-rev10.tar.gz # the next one will be 10 (9/17) + +.PHONY: dist-test dist diff --git a/xv6-public/xv6.si4project/Backup/big(6818).c b/xv6-public/xv6.si4project/Backup/big(6818).c new file mode 100644 index 0000000..cecf1a0 --- /dev/null +++ b/xv6-public/xv6.si4project/Backup/big(6818).c @@ -0,0 +1,53 @@ +#include "types.h" +#include "stat.h" +#include "user.h" +#include "fcntl.h" + +int +main() +{ + char buf[512]; + int fd, i, sectors; + + fd = open("big.file", O_CREATE | O_WRONLY); + if(fd < 0){ + printf(2, "big: cannot open big.file for writing\n"); + exit(); + } + + sectors = 0; + while(1){ + *(int*)buf = sectors; + int cc = write(fd, buf, sizeof(buf)); + if(cc <= 0) + break; + sectors++; + if (sectors % 100 == 0) + printf(2, "."); + } + + printf(1, "\nwrote %d sectors\n", sectors); + + close(fd); + fd = open("big.file", O_RDONLY); + if(fd < 0){ + printf(2, "big: cannot re-open big.file for reading\n"); + exit(); + } + for(i = 0; i < sectors; i++){ + int cc = read(fd, buf, sizeof(buf)); + if(cc <= 0){ + printf(2, "big: read error at sector %d\n", i); + exit(); + } + if(*(int*)buf != i){ + printf(2, "big: read the wrong data (%d) for sector %d\n", + *(int*)buf, i); + exit(); + } + } + + printf(1, "done; ok\n"); + + exit(); +} diff --git a/xv6-public/xv6.si4project/Backup/file(5413).h b/xv6-public/xv6.si4project/Backup/file(5413).h new file mode 100644 index 0000000..0990c82 --- /dev/null +++ b/xv6-public/xv6.si4project/Backup/file(5413).h @@ -0,0 +1,37 @@ +struct file { + enum { FD_NONE, FD_PIPE, FD_INODE } type; + int ref; // reference count + char readable; + char writable; + struct pipe *pipe; + struct inode *ip; + uint off; +}; + + +// 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]; +}; + +// table mapping major device number to +// device functions +struct devsw { + int (*read)(struct inode*, char*, int); + int (*write)(struct inode*, char*, int); +}; + +extern struct devsw devsw[]; + +#define CONSOLE 1 diff --git a/xv6-public/xv6.si4project/Backup/fs(4986).c b/xv6-public/xv6.si4project/Backup/fs(4986).c new file mode 100644 index 0000000..feb59fe --- /dev/null +++ b/xv6-public/xv6.si4project/Backup/fs(4986).c @@ -0,0 +1,671 @@ +// 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 "defs.h" +#include "param.h" +#include "stat.h" +#include "mmu.h" +#include "proc.h" +#include "spinlock.h" +#include "sleeplock.h" +#include "fs.h" +#include "buf.h" +#include "file.h" + +#define min(a, b) ((a) < (b) ? (a) : (b)) +static void itrunc(struct inode*); +// there should be one superblock per disk device, but we run with +// only one device +struct superblock sb; + +// Read the super block. +void +readsb(int dev, struct superblock *sb) +{ + struct buf *bp; + + bp = bread(dev, 1); + memmove(sb, bp->data, sizeof(*sb)); + brelse(bp); +} + +// 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. +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); + } + panic("balloc: out of blocks"); +} + +// Free a disk block. +static void +bfree(int dev, uint b) +{ + struct buf *bp; + int bi, m; + + readsb(dev, &sb); + 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 +// sb.startinode. Each inode has a number, indicating its +// position on the disk. +// +// The kernel keeps a cache of in-use inodes in memory +// to provide a place for synchronizing access +// to inodes used by multiple processes. The cached +// 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 cache: an entry in the inode cache +// 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 cache entry and increments its ref; iput() +// decrements ref. +// +// * Valid: the information (type, size, &c) in an inode +// cache 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 cached 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 icache.lock spin-lock protects the allocation of icache +// 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 icache.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]; +} icache; + +void +iinit(int dev) +{ + int i = 0; + + initlock(&icache.lock, "icache"); + for(i = 0; i < NINODE; i++) { + initsleeplock(&icache.inode[i].lock, "inode"); + } + + readsb(dev, &sb); + cprintf("sb: size %d nblocks %d ninodes %d nlog %d logstart %d\ + inodestart %d bmap start %d\n", sb.size, sb.nblocks, + sb.ninodes, sb.nlog, sb.logstart, sb.inodestart, + sb.bmapstart); +} + +static struct inode* iget(uint dev, uint inum); + +//PAGEBREAK! +// Allocate an inode on device dev. +// Mark it as allocated by giving it type type. +// Returns an unlocked but allocated and referenced 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); + } + panic("ialloc: no inodes"); +} + +// Copy a modified in-memory inode to disk. +// Must be called after every change to an ip->xxx field +// that lives on disk, since i-node cache is write-through. +// 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(&icache.lock); + + // Is the inode already cached? + empty = 0; + for(ip = &icache.inode[0]; ip < &icache.inode[NINODE]; ip++){ + if(ip->ref > 0 && ip->dev == dev && ip->inum == inum){ + ip->ref++; + release(&icache.lock); + return ip; + } + if(empty == 0 && ip->ref == 0) // Remember empty slot. + empty = ip; + } + + // Recycle an inode cache entry. + if(empty == 0) + panic("iget: no inodes"); + + ip = empty; + ip->dev = dev; + ip->inum = inum; + ip->ref = 1; + ip->valid = 0; + release(&icache.lock); + + return ip; +} + +// Increment reference count for ip. +// Returns ip to enable ip = idup(ip1) idiom. +struct inode* +idup(struct inode *ip) +{ + acquire(&icache.lock); + ip->ref++; + release(&icache.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 cache 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) +{ + acquiresleep(&ip->lock); + if(ip->valid && ip->nlink == 0){ + acquire(&icache.lock); + int r = ip->ref; + release(&icache.lock); + if(r == 1){ + // inode has no links and no other references: truncate and free. + itrunc(ip); + ip->type = 0; + iupdate(ip); + ip->valid = 0; + } + } + releasesleep(&ip->lock); + + acquire(&icache.lock); + ip->ref--; + release(&icache.lock); +} + +// Common idiom: unlock, then put. +void +iunlockput(struct inode *ip) +{ + iunlock(ip); + iput(ip); +} + +//PAGEBREAK! +// 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. +static uint +bmap(struct inode *ip, uint bn) +{ + uint addr, *a; + struct buf *bp; + + if(bn < NDIRECT){ + if((addr = ip->addrs[bn]) == 0) + ip->addrs[bn] = addr = balloc(ip->dev); + return addr; + } + bn -= NDIRECT; + + if(bn < NINDIRECT){ + // Load indirect block, allocating if necessary. + if((addr = ip->addrs[NDIRECT]) == 0) + ip->addrs[NDIRECT] = addr = balloc(ip->dev); + bp = bread(ip->dev, addr); + a = (uint*)bp->data; + if((addr = a[bn]) == 0){ + a[bn] = addr = balloc(ip->dev); + log_write(bp); + } + brelse(bp); + return addr; + } + + panic("bmap: out of range"); +} + +// Truncate inode (discard contents). +// Only called when the inode has no links +// to it (no directory entries referring to it) +// and has no in-memory reference to it (is +// not an open file or current directory). +static 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; +} + +//PAGEBREAK! +// Read data from inode. +// Caller must hold ip->lock. +int +readi(struct inode *ip, char *dst, uint off, uint n) +{ + uint tot, m; + struct buf *bp; + + if(ip->type == T_DEV){ + if(ip->major < 0 || ip->major >= NDEV || !devsw[ip->major].read) + return -1; + return devsw[ip->major].read(ip, dst, n); + } + + if(off > ip->size || off + n < off) + return -1; + if(off + n > ip->size) + n = ip->size - off; + + for(tot=0; totdev, bmap(ip, off/BSIZE)); + m = min(n - tot, BSIZE - off%BSIZE); + memmove(dst, bp->data + off%BSIZE, m); + brelse(bp); + } + return n; +} + +// PAGEBREAK! +// Write data to inode. +// Caller must hold ip->lock. +int +writei(struct inode *ip, char *src, uint off, uint n) +{ + uint tot, m; + struct buf *bp; + + if(ip->type == T_DEV){ + if(ip->major < 0 || ip->major >= NDEV || !devsw[ip->major].write) + return -1; + return devsw[ip->major].write(ip, src, n); + } + + if(off > ip->size || off + n < off) + return -1; + if(off + n > MAXFILE*BSIZE) + return -1; + + for(tot=0; totdev, bmap(ip, off/BSIZE)); + m = min(n - tot, BSIZE - off%BSIZE); + memmove(bp->data + off%BSIZE, src, m); + log_write(bp); + brelse(bp); + } + + if(n > 0 && off > ip->size){ + ip->size = off; + iupdate(ip); + } + return n; +} + +//PAGEBREAK! +// 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, (char*)&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. +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, (char*)&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, (char*)&de, off, sizeof(de)) != sizeof(de)) + panic("dirlink"); + + return 0; +} + +//PAGEBREAK! +// 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/xv6-public/xv6.si4project/Backup/fs(5757).h b/xv6-public/xv6.si4project/Backup/fs(5757).h new file mode 100644 index 0000000..3214f1d --- /dev/null +++ b/xv6-public/xv6.si4project/Backup/fs(5757).h @@ -0,0 +1,57 @@ +// On-disk file system format. +// Both the kernel and user programs use this header file. + + +#define ROOTINO 1 // root i-number +#define BSIZE 512 // 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 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 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_DEV only) + short minor; // Minor device number (T_DEV 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 + +struct dirent { + ushort inum; + char name[DIRSIZ]; +}; + diff --git a/xv6-public/xv6.si4project/Backup/log(5899).c b/xv6-public/xv6.si4project/Backup/log(5899).c new file mode 100644 index 0000000..a64c0f6 --- /dev/null +++ b/xv6-public/xv6.si4project/Backup/log(5899).c @@ -0,0 +1,234 @@ +#include "types.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[LOGSIZE]; +}; + +struct log { + struct spinlock lock; + int start; + int size; + 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) +{ + if (sizeof(struct logheader) >= BSIZE) + panic("initlog: too big logheader"); + + struct superblock sb; + initlock(&log.lock, "log"); + readsb(dev, &sb); + log.start = sb.logstart; + log.size = sb.nlog; + log.dev = dev; + recover_from_log(); +} + +// Copy committed blocks from log to their home location +static void +install_trans(void) +{ + int tail; + + for (tail = 0; tail < log.lh.n; 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 + 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(); // 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 > LOGSIZE){ + // 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(); // 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 with B_DIRTY. +// 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; + + if (log.lh.n >= LOGSIZE || log.lh.n >= log.size - 1) + panic("too big a transaction"); + if (log.outstanding < 1) + panic("log_write outside of trans"); + + acquire(&log.lock); + for (i = 0; i < log.lh.n; i++) { + if (log.lh.block[i] == b->blockno) // log absorbtion + break; + } + log.lh.block[i] = b->blockno; + if (i == log.lh.n) + log.lh.n++; + b->flags |= B_DIRTY; // prevent eviction + release(&log.lock); +} + diff --git a/xv6-public/xv6.si4project/Backup/param(1678).h b/xv6-public/xv6.si4project/Backup/param(1678).h new file mode 100644 index 0000000..a7e90ef --- /dev/null +++ b/xv6-public/xv6.si4project/Backup/param(1678).h @@ -0,0 +1,14 @@ +#define NPROC 64 // maximum number of processes +#define KSTACKSIZE 4096 // size of per-process kernel stack +#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 LOGSIZE (MAXOPBLOCKS*3) // max data blocks in on-disk log +#define NBUF (MAXOPBLOCKS*3) // size of disk block cache +#define FSSIZE 1000 // size of file system in blocks + diff --git a/xv6-public/xv6.si4project/Backup/param(8017).h b/xv6-public/xv6.si4project/Backup/param(8017).h new file mode 100644 index 0000000..fe38bfb --- /dev/null +++ b/xv6-public/xv6.si4project/Backup/param(8017).h @@ -0,0 +1,14 @@ +#define NPROC 64 // maximum number of processes +#define KSTACKSIZE 4096 // size of per-process kernel stack +#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 LOGSIZE (MAXOPBLOCKS*3) // max data blocks in on-disk log +#define NBUF (MAXOPBLOCKS*3) // size of disk block cache +#define FSSIZE 20000 // size of file system in blocks + diff --git a/xv6-public/xv6.si4project/cache/parse/big.c.sisc b/xv6-public/xv6.si4project/cache/parse/big.c.sisc new file mode 100644 index 0000000000000000000000000000000000000000..4b09c271ffc39ea29b300e60b079539635272a3b GIT binary patch literal 3890 zcmeH~&ud&&6vtnt(WaAROtpooi;l^(nWSK+gF>N+W?2QTqJ=E9w3*D1SJG+8OtcD8 zHzNU;7IYD$n?M9z3N8g*^dG1cbkSv&E(21Y-_MrHPK>Q2Z={<_SsuSfaBf(<3SOaGwdIpqgtijT$hFSwTs(>z-uD3mPB^j8g}sO=jo~$jSfXcw~j}n z*RI6%LmGr7xPP*o+nZ^Z;0xNdt(f*_%ekqo?Qx7fh+A14AXGRdNEqRDYw8fzEOuN< z#3w{t*RT>)t3|;rOmxum=ftsNGTC7`5PdpVHftBO6HCO;CBadEPLn-arw?5F(UYmIzAHxRI8KV; zJTgorvb0Lp3`x?Rp>iZ9;Uo}EdM!Cl=1e29w8pMmTt4Y)1C0k8)k^dFMgzSB&4sg{ zWU`L;COaM^^v<TsHTU{uj7mLq}(EE}Iz4&jkQ16#lTUpi(eR@A#i`T39 zGw9`V@*?!kh|FJ;9gjvj1+dg;Wy8+v)9d|Rksf?2h{*G45qimi$wGgZ>ghZj)y_6J zceHkWBOfo8&czEp)92z-r&teL`4?I_-)?2rRz+KC<>fQCT+8x&zzoUH+LQfbg|<&0Xbqp%B)c2ik~=93G+|JZt( z)0Ui}%DGN>Q54G36(7c!Bwg#+%~UG-?FqG5Ea!H8sH_p{S;_X^=%ydj)_DIV{f`S3 z*TVFlS4o`rK20jtZ$!(IP5u3KrzA)_!CCrANf^4O4wQ`nI}muBPwe?o#P!=XoY0tD zz-L9+G@0_lQU{?g1FqqsHsbzC5iZV&q{59&7WUfZPttG6t~Ej$Qx8`v3yUQ_Q4q{~ zWv_~(7&2L?_<CsiNMM?Cet4Cww9BC*@N?y6IQQZ1M2JrV(Gb;aBdOzM}73 z{=$7(YiSU|dQPtoTN@@%pHI)z=WK4=_NV72@8iTxK7i$h!aO#ke-syPySQx+&)1$k z%FXge?LC|U CW?U)& literal 0 HcmV?d00001 diff --git a/xv6-public/xv6.si4project/cache/parse/file.h.sisc b/xv6-public/xv6.si4project/cache/parse/file.h.sisc index eb8592b53a47fb54f725f374017a9b763182f8dc..68488a403622db6b6a7a60dde4c6e02ba63859e3 100644 GIT binary patch delta 1416 zcmbu9T}TvB6vt<0KOA?a*=gNS%a0KZ)*@-5WQ#zDEDSO%me_}d@{<)TL(!s#um{7p z9IlW)BulWhWME>DAdy55LJ#_6mO;L?J@;i0+5gOXBW8T617~OF+;h%7=XcMYk5wNI zhYtn>Aub5M8mJ%&LP6B=y}lo$;D)F99eD@TEyePBN4}tn7e3uz0HZ`L&2IV@JbryXBYWAh zTsFHN2#Bs46R2^a>+!ZVo}hiH5nkgeYRrZwZRbm{cR)8#qh3ED6KUc{bR{S`p+;5} zEM-fw!p;_s*6@5BP!5~VH9Iy(oX0YY2vUUaOo60b-94Q%rsg?9=SiLK#Ix~OviWqp zt~Pckmh5S5yV&15(AVDCpS(U;ci`$kTTgd;lHzJpmbu0jMJ0q7fhZM1MZs&ChU+xO z(P`>J{xlu|`Ar~*y*Jcc?=Ab>=`^TgB10WJXD{(Re;S25u&6@OQt@nGaK-C7fjK}J zdA9wOxQHcI40UMI;haxz6Wiq^)_tY71IR-EjO>k0cZ6`2(mqiBPHh37!1e{ptTT}~ z@%VdMqL_@RoS&8{tWj_lT+_d9NR)>d(lpb5&XE4|iB94EGOZxOo~Vky0t=OvS;^Mb zX%|8XSx1*0RJJaf3tIr0-io%Vt9cN!l;=#+AF zdb}D|`a+O$PGqA5TnPm!B_fGpM%TfW)oayOOA%XA6sBsI_m{w~w~qa}<~%3QPyC~x LxOjeyJHyfL6x0kEoUsIE6n~<<>9La?GA?4{8a9Hojru^trh5wam3ejc8YGqi5%h?Z zTDYW-PZ7a2k=6<~ARSmVOgs_RBE$O0RU3m?iPrVrWorn4C?_mK=2{iO4265@rjt^j zk+U)`VP#nIo4Ds0#Fl%^TF@>WTJQm+z~Yc;#dW7L$BhHzJ+j@pA)g!Fx$_iXCvQ`1 zRQPxKA`388Y+I6@5s`wurz>qDvDUS5GwKF>g;aUHe7fc^<_Q zSN>O7BJ{W4*QszDLDooRA#DAvgxA4LJ#@a?kA*Ax2nGYZlNja#)j*6gyl{5zvJK79 ss5eQg|GKgV<)B*5PUCqfQeK{F*43*Yy1xCZ!A6q$i{{R30 diff --git a/xv6-public/xv6.si4project/cache/parse/fs.c.sisc b/xv6-public/xv6.si4project/cache/parse/fs.c.sisc index 37e53a7363401b6609c29db29c8f83e3bc81abae..adc98de45557350d3064ba6becd1f516ab7e31bd 100644 GIT binary patch literal 47850 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 XMOzur&h_=R0qscC(|w|fD!2Y0#N>BZ literal 44413 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%0AhD`l394lS5BYS*L>iv2(1u-a0^L1IC%J zOgDs1cMFql(d_{hlAU2yv%2P?jrRtzEamBz*+pu&$%P$WBWxo10++OfmQW@G)w{PmwRBQ?1VS9-xOYZ;m;lU$H=JqgYR(M!i zj17p<0HZYykAkvgch{*D+Z5IVQ?`Tr5Iz+^S(HTK6Q!)pEEuraUa+z_a~ya*n%P4k z@CK#P`=n8~Xvr7zGsG9E54qg}52a&g*INf{{|y+2c7P?1vOZkjEMFz~?iBtBek&jW z#DVybqvp@I@z!X^ABYc&%V{cLJ47^E8U@YBU(US}S|HLNi-FHkK_R215ziwJ6nPeW zlPBz93i)#?OaYkbgQ?N9NXC|TeyPh2>h=Ldx81sZUQM_g1hbWbsnHrU#q~Y32rcfb zlG%{&3o0uDCON{=XhoK~ltJCP)nBPrbQL#xR7HK0zfoa0Cd_CG{!I5yJ<^y9hTEO1 zmLBNmPM6SsT25p7aCVFuy(NiYf`WV16K9%P;h z28_1gB!JLy5}1%;N5YPPKAQRR%qKn8vItSEn32%ncChY{>;Qd+dqG^2abTI7%Pji>ymruRs2LrXTTa)b7N z3VTVNkE1IES(=quE!mj$4Qt43Mi!K8+)_e{jJ55OX3u=uJNQ{r={y-|N)|Z!`uuQ# zNABoj4vyxrL+Pyp5`zKbn5}7RVAo@em9Nt@>}M(jcdN{(m<66y9o~jj&FYOEJr6l# z@lVXzP0sg4K`XGGG8iq5+;Y`@MNc=q%!l%u9QxyrV2d83#XLtoUF3-;d4RjS$sv9q z|3HPf0k2fSN=7R>J5ys&7e5vEWdUqL_p<^%Ti94aE3(YBW!4K89oSLb{U$a-%=eFd z?}U%S=ygg&J1?^6q%0byS}ovOwh^jsTBE(8W|&nFvRUE!8u3OcrrX>K3>fXwh9@Hh7bv^+>q4;yYn7cAZA>4jp(M&W z|55!!Dccql1Ow*pFId@b&OO7-ZWrSZsPu?-WW}SIvM7n-%~WN$v z7Q6Qr9r%&%blJho47XVxn4EL;0V>;|T?5;$=vcd!s?JF^ZtRzL(+aQ2eBq$dbJz=V ztzV^8wEa5wgI63%$k>cM5kkc>9n~Ck1}D5r*M6#!$O$Lczfpb6QBbo1h!GwO`W~Hs`!WgEOVUaUc8%J_s zMQ{d$7Hc~#%|=2fe^e^*oOY{Rre`$YMiV65IhxC$bv#vi>wr)vjjTrOkVXtwbz z6o4h|^Dwi(a9nTfK3SkTIoyN(<~^yH;&|Yn7iJ9Vjuv^(l)mG}fCeSrV_WGp>dsag zY+Grg$ri`6l|EmrR){4S$%I@TT4R>E(A3yUbH~V(tP>Na?=oSoA+pipOgZ|${C8t? z*+JPIBkA!Cz1u7Ox?@DP*sTuBg*wCCnFUeGau~MieAf{FSG812%A zYd_L?aI(4};(e@bhcsJNxIdl}ZCNaq}7m^}IV7&i|xZ;5AD>@vVpi(Ydz zg9{AD_2c#$zS7JF0&E)yqotA8jQ;OAy=G8s(2wN{FL=E$?^!a97U$OVAB!x@ccCt~ z`d#P{UmV?7a*wr7bGA1e5?G!c7i~*8k>p$2$Rv@ROwIOCGofJ(>r9NP7w(}*9((AN zG#d+Bv%7VTjeL(hbn5(jot9{8o(68Dt+i9L1?4ohWxzEmSoJk}VRZ+iWlU49=TZi- z*VjG1uxqp0q4D)%LHxW=B2Y6m9l8N+C4gR+C%2M zSK_`|)7(0#XRqG>T6#dv zMZIXwZR<$j2)5fdqc!GO)V%t7u|wlK#EOe=5oRz1H(H#=$DhgLWXJ%Har3c1c$yakoVH@?uoS~b`zLe9U#cNYIiK8Q`Pe}D1 zO$RK9WJChM&DfS<(%41DCDUYZkx$E>zk?vq4(88zr6O^tY>O-=icO)n4vu$`{c|bH z?ZmSx`^D+Cl7rafGcCYk<5K02%{J+j?JmM`)y{= z1O3j59`p8#EYEo}3i5tP+);o|Je_Yp*PYsd%2DM-}EtB;{^x_Jz%x+pTy~qwp$+c+V-dw zDX%Kp_!oV)M_XnZ`!`ctHdV|7sfK`JFOU4xjTX=Kw2l(v6j!#X;&j~4b>(KUshQ;| z={WL5uQ%7w`>1HiA)o5;SmXh~%}Dj|jZ=LpFIyF48q~G-sdS4rr7y)|f98TYz$VR{ z3vA(Z)(dlgkFd=JkD)+|=OWSexppq>xj!GTFCw~c)t5MK%{RFlZe71#Y-;rHk*<4# zFLDhzs-m?j^6+5d8@T{*Gv*o1coT7VRPxTYix(wujz2 zVBQQEhXT;nz*A~pe_e0)2a+wd2ZJFDbJ^<0z0^*MX`2{h>_R3k7pGM3QNh~@ZPEQh&subG;Cnuf{XE|#b#M4MI!6E6IOBN#y3W+!U1 zlwroT`U_9gho#xFFBhI}5v}KQxwdGDm71xoIUt(Z#DW2%HP$u{1LR!74`~u{anv1^ zVuL~1Th;1mmDW$`vyr7U%TSP$r8UCmt60=A)kKj{4X|4rE*aFgMX%sy@ ze>i7AA||TSor5LtYGI*_mPRb6-tM1q)MW>CV)hTapL1b0;nf~6S>1R-OCz46zh4y7 zCd13tvUA%uHmgfj;Q8`^e_7agLQ5l_$sZleK5)<_O)D)uzYL8Q(;mJ)5q#^9#qUAmbGq`jkZBw7f+5pz;*;^v@}||yZ)fKfH7kp5MQ6z z+BS&pT9_QmHNr@3v@~Lw&b191-nA8;OdI_#4)_vb;|VQ|cuq^qTrj4=Cd5xoybXdU z+aIvZm+^!a^BjF=k*7KYfP20T`lc?BNx(QW?Tn@@Lq^S@p_I`!i2gVk*tS7NEAk|h z8O**7`j$Ac4FcOX$Y@25wNmEq+?40rpr^%(i~lUlB?K{AyhoWj{%z3r#TvH9!VuWm zXz>u^+6Jjf1`FB-^{N|D{9|!IpPz=oa6zNRgLUb5{A&lxgAhBk=~#4#hwZidzJmQ7 zztl$uyu;GbVWpmBg;UW{rKs+QLWdAkwl;s><(HK0 zwZ^5`SV7rw8Q^d@S?JN!!iLOnqLj5X3I0q4-372^+n}<9Jgbjw;0rQ!=&1&~y6*f8efc^Iv!y;ug zIcyv64Psg9HaXhgaf;#=4ZYBj|3X7DXB_I#(r8OErGIQ9QU-O~hhaFC(_8#XA3{R@uX%b^J=MES*vKL@9fIP!J5*R4-Ur*0VU`CKPdFf9;ih zKpLGb164)a^iTJ={S$}I7c!vAToFfBHDDZ!1I!h1&&&PzEaO@%D!5bc?-J(WUq;D+FQl4Mv=Zb3ls{-OCCvs4 zsdQA?r6+7W(bn}Ahh}PP>qZ=yYl8GfYpiX-HOp=(_DQiLhili3RMXw{GQV!1ENpP+ z6Q!&r3^0JQ)EA^|*)2tnX7-t|Q`;_vA5fW+0S3?TU&TjRl*E^tsqCQm6DwzHAdH&| zE)`Ue(+FE05ieuwm36($@G{VG-2W%399 zRFcGjYyg;8wzbd^qZeyuBxC`seY~FeEB=)=H(t-jCDW!L(*broHs6`k(t>R4VNEDc;8nhGB7pi5h8tAiV^ z=rCQcM&OqU8&ha$#B}rxbFAnrl(wR;6Ejv}Fp~yTqcvVAbHS-`9&6uHST9~IzF=E? zjaKA|V;PhzzOW=VF9|Hc#?oj-mc|ZT$Ffo-1uy|G6)XKEFV_niAc@i96wotL{KuB{ zDWJVl-I)DH&i4N5CFB650QL@8^;a|oY3A3$SXkU>HDe7Ir|t#p9Y&Q~4u!qC?H%@s zw)aQ=E|~uWiUF8%glzWS!D7m=hIGD6>@{9sFr5b`s(kM-F3m;?%W0P~*|Hzz+R__u zYNocfcR`!# zu$Cv9l)-<=WkMF>t64IUL}Hn`WRqnf-uaBJ~<#0;U+4e@A>~z&|I9 zQbtRog)z~864s>*>X=r0cMrmpRxlvZgO#E)rqI%usdfbnXi&$LrQjM}B_3}OGh7vn zThP&H#bvCPY5or377g3_&DTtrAh2;XT9IR{eBFj<`+)m0B)qnYm;RD%dZ7=J8!cX~ zrlJk2n$+)J2DT5^eMr_Lk33XJUEQK}9`ljI|B+^J21S@=txD#R<|u|WWac~zN?m1n z`Y4KpkhIUps-kWA*IZdFOgT}?np4{@#vFaY%3`TF|0K$Z%fifZjXb?i${q{*4Q3W4 zab;81@~%iVkh{Alo9kNpI5)%{39eYC4#_kaCg7`bs||9iamkeaYLfkb-*)v`qhdJ` zer5a#F9Ta|ct4j+!??5HCMk8Y$~~&{H68Y3d_rJnD^=CWyM|TG>Wy<_+5X6qBmYvJ z<25jwax81KG|FRBZ=OeT+@j7*1q|4>fmaI~Q)p?#wCj#ya$K$!9^e!IKXe2p=;3*B zz%LOt-q6yB_qevNTr((5yxc!v9p(V-!FK;(v|^g9WvUJV5Li#gASdoicRq*#^HT|Q zGg@PoXz2l#ONItUcHgE7bAN}JG2*-Q!bM~?TAX^PW!RhzK4^~@`hG8d<6vd`K-$iV zwsH8jN_AlSzz+BBk|Euf+$grV@E?ZZ{%aTxmPU(*>#F+D)nx}WGiO-UiFrmi1_}S# z9#h0o*rg~uR!D>0MCOlu8XVWcjMkVHv6`Lp&HoK+$SfunoCb@^j!LoiaAdn#jQdsg zi8d1U<|ymtUG!!u%MJnAP|{)*3>dAkvPkKHTG_wgnqp!LPi0Pvb|h?r(G{Pfe=~Kp z#T>mXcYpz-HP$r`CO0=M=2T)Y-lzTjmN2pW9M}<+DbYG#x_mj_i?YNpWiDm&;kKvtL!@s*4`c#(1vV&6a!?~Dk6|G&jn8-xB#ncqulb~#>^tJ|Q69er5 zYY+C6`q$Xqk|`b4gd=lW_N%0l>Dc#knPeh2KPO72ak=~c!map(Xos|)H9MKUCrYNO z?DR}w?z)gO+)xmfgd<>KX>;MJ`Rnn{9lFMI*CmA2N|BY?q`8le&*b?T)?#nvlGpoX_N~(uw zG;U37A#!XJ-UGBVU>s9%KJ#PimRZX%{H*?h*R5_8v!D&m*dyA+>f9OEX~5Mg;6~>{ z|CY}9o?tn{8an$D;qg1;d&QM?4a{~2g^iX*&Y0?xJzdJ6p)3(V)f|H5Vg=r=@!2pquo$pvFr^Z$GilXx1`}GFD%(GZvLSEM@mTUi+!{ zgp{59&Wkc-nHTzjn|&*QVm7mO3uUwgD|>+iZVM%LE|jtI=NgcbMbd;G75lqS#LdCF`88@g+qKzv%tnXLY}aO^ z&o*|E-l#v zUUT)C?fPu=BL9Eu_b+tZ0W#fy^PkV{c&Amf6Cq!ustltd|e;a=6tHf zeQslIHi*vgGVN&7p*?KUd#~HWUZ(c|A9)*G5h||^SjTutSE&D|h<0VDUlq|92k3FH z{>6RaMAbh=pa6G-`db5LjJJjQe~D=C2=#YGG&?G`FPFj6o+^BW_UZ;avIT4im@#-{ z4EW`Uc3P-k7%mL4wL3f1d88bG-$SmJB!3q$=+RJrJYd>A7V2M%Xl+5Ka|7nm zv*G%Rh-SY@Y4@t|`$=f$Zd6o<#_KvT6Syy6>imo%@E1`#eh3fvU_|4I6ksBv?GN>jL^MwIfmZ}f zeQT&!BH9yN5PZ)g_iEqu^1n&zFW52L{|NI7)lNIO2Q=UlU*Nw*G(Ls{_63an?g(|e z292X};18m9oc;r&5zXq>p1zL+ot}(z;}>awe+Za%{16WCm563H%NO}e?)CaG-faOx z+#2e?8OdTl!ZsE7(e5d$M}7HPIPjxrT)vGCd^e);v=i{Ni1uMma!(;qh3)?X8WP)@ diff --git a/xv6-public/xv6.si4project/cache/parse/fs.h.sisc b/xv6-public/xv6.si4project/cache/parse/fs.h.sisc index 1c1e15e499a2693c73556426eca2c3d96db33140..a35e30d42f7c33d58b63122d66e39fd56d703901 100644 GIT binary patch literal 6479 zcmeI0U1(fI6vuDUuWi$=ZLPJnpy{VA#bOqzYkkqQm8`Z&(?%O=pxrd9S(|LaZX&TD z6d_naP^2J=UoU~wYDGjS2#QdlzV)SA!G}JH4~pVT^LG9J=H9b=_ug$VMSQ3|aB}AU zXXZa=&di*d&4UX)ugCM|Zp7-J1o_FQTW~V>MqEkO#Sqe6F@$53}Jny#LDiL7q z*GgAuLT9A!Nz+ok=Sz`}&6#xe*>_qfe=qQy_RPelOnOc6jKjbYKa|Ux-)^BVpWxHK zPo}iBoZJ!G&t)0M_R=zyS4**t;H4P#W3W8Y3yS77?D$&~Leu`0*2q%uBQDEAMI96v!I zn7q!n6K6w*DK~OBI#ePMoqKWz_wMd_Mtzye8pj&ikQb~GZ@50Lhwn4FK$!aC&Rob$ zFj$&#%wUa}>phMIL%bn1!63ftLTYD2YRZkM>z$76iv5rGK9SqE_fXjPURhdf zmeLPC!=f%;`)sPkc(Z@7ezmuF=I zwg;{*Ro^xUCC-MNl;f^m`?_{2XrFMk-MLBxI8+bOM&fKpOSzG&u3`8mL8}9yLkw+N zx>L#?ctlDdIedmiXMF0LDVHr(?Ib}vP%IZpW7M%;r_>jFX+tJGc<7uv{?LPW$Tkw& zV$|Uh{VgG$-jYdQz5c%A85GCs(o4b)y!plw`aPy#vLr-`X_4Gz6x1NOU-)g3Ksl)v z^u;)~l=LI<$M>ipCuxoOg$6q!eOkz;(gmT@-6~Ur15PXsM6nh6j*9sP=KD6&z@Pb* z;>kjfDm12Z3R0Yd7*fh$aZ*85NhHIP%dr)BnY4D1oPVRPek=f6S_maU8coIFQ)8aX{ zE6GE@~GwF_{AGqA#tTgb7^s2Bw z->uyf`Qi}IU z83fCNA&SMb!mM}1*h`}Yd*Qc=2vRITgOoB@oK#R%5-faF-iDZ8Y-4fbgP;RVxyEL!`iK5Se!MwbctJstCs+<=9{FD zV)^}nJBGzc37AR3)%?Ifxk7C;>!vnl(i4-(tZOV$8w~{IC{KrYMu(C-(LTmihp`$G zFf@3_gWML2!0qg9k*NJRv>%N2W0Aw$D0@>sn{W)H**mLDot+6@`BSR9F6|X|>aEwR zuYB5*6%n#G`is6_opTx`YC_%Nh6la+F@ zVfnSgK!(LhRaKP)X(>Nk;6`L2P`B4*@eoqeM^#3{E5}>&Q(Jmw{AE(d&5BXoY=8Rw z8yvHZpWr7R#0jyO@qC&1u`PZ1$>3kr)`nO{+sx?S*{6>NZ7jELfk?ul@{b#2S702* LjzLxj#$kU02XDpm literal 4736 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 fD5N9s1Cgvd@V$XD_wm3#6DWjtK;UUloGNm@ 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 H3NY^9?vm#; diff --git a/xv6-public/xv6.si4project/cache/parse/param.h.sisc b/xv6-public/xv6.si4project/cache/parse/param.h.sisc index dae8fa1c62868a0acf41fe53593e0be2a8592537..06cdf34597a69b67bcacb3a794a495c6d6960448 100644 GIT binary patch delta 241 zcmeAYxFjHGz{bE3!oa|y3B(Lc3=ESt3JNpHL?|2aC4|o8W&nab76yjJtPBhqDn@)a z0v2&ic3={*ePK8qEcqV@K#DkIr*i{!g8?6uRs_<#K+Fu~a{+0PCZ>sw;+t16En-mx zNq|HffLcLxg{cwWi*h-z0gO;_51{JFa%?=JDnJ1dCLv~r73Ltwz_!O{X0inw#CIA2c delta 199 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 diff --git a/xv6-public/xv6.si4project/xv6.sip_xc b/xv6-public/xv6.si4project/xv6.sip_xc index a10e3dc1de3e621f0d89fce5706f263dcd7e5020..c93fef934532c4be92563009a568c17804a13c18 100644 GIT binary patch delta 2239 zcmXX{U2I&%75>ib*vz#zcy?nao5Y1#Ynvt}z={AbO_T9zTbZhYB`QBJG>)NCc|isw zB!tAyM%%Eosk-(hT=k*Rx~kOj6Pm~mE0-hj$|Q|=QrxFRQ1{?x1>vZ zCpMn{-T8amvXVK#1ce}mfdZzd*?B0o80z%+=*E^o=WdQP-=37T$Gn07bZ9#Gn)85N zglLUck+Xtc#OOgf(1!?QJX{2~&iM)r(u<=5_v)@Kyx?4LTd*d<0`;00>>U3dB`8KR zAv`z--3VTXKuq076Q&3&j<&rWQjVUL#q;~*raNdON625xkT?dvEg<2dCIe;am{LUM zP@+Rok6ZKw)90U-gYB+?4+EM3<=i&9$0s_d?m3E96zYV8mM1j6|+%HiLe>n7+U>%%sbCtN&t*C21vfn?bBDPnTMQB$O1;oCrNuHcrlAVVQB1jo>7OHMC&m>y ziBAeK2nB?gh0#2kQJBw!q`VU~VZcpA=~yJMYGMU{tpmr>*nM zGKLQNWhQ*0F=kcEcPf?kIpdQdRq+{$kG4Al=}$t{fMxDI=DaxL$3Z@kJ1LS8X)%^G zqv%55Aqku|G-nAq&2=;D-2X^OKwIeDW^F! zbRe%J9!x4(<0ztLe!{Z^KP%a{wYc`O(g+6_NV6Oi9Hp3W1`Pcc)`=2Fy27>-3FlWw zh+IqK@if+18;Qd0`SnAiXcJN5tIv4oL5V`n5>==!@Fx;R*Mmc_ZtA(`8SfSi=bNY@ zK+l_wx3=1yK*R}oa)ss)&phj@W_mo2BGh$pRtI$H-1m-=$~wklDalqYPrgU-J%kq4EsqVtJgb$(QxfH^vBiOPF@L1yEx}qejfP{~6h(j~9%|1SxF&B?bR7vg zp3Z$$RpX`7jVg3#DT>Wb2;M0QycOd(zfW?Z9k-jSgy$9}HpV$!@$8aWR2-(mT~zTW zmFRBB@$c-Nc)fEy70D8~cB8`86PF6x?d=~HN5iT9=xyacf8coEm}mRWonz3|_=O7pQ0E*aGJ`Vl`{t zPS8QVS}tm0O%wc*P{m)!!{$wm~kxGDSi4OPxQ_?{}Q){}H_!&vr% ze@c?w^Dil`)+<@KP1@NXk4Z80<1?G?sLT{r>yzoASXonMbLmbwdO+Of3-`)yi66}8 zE}oRlizn4LUrW9ijYcuj>DB7)?9$U}Pu71#j;+=^>B@m=+I}Yu2fv%P&hDnXz%TDq zI;y>!T{tC=lEvP%{-MiOF3aQTO6@*cd_5bSl4ZKOwNFl^{%Rv_Jvo~rgoBUK=I5*R z7R}1^EoN^mi|5=t^~Xq4mPvuGGaIiTu1NOrth$iC|G3GHzO5?pd%pSlpVgR5{W#C7 z4F48chrQXSKN6RHx}}bfG1JPVpSk%w=>0eUl^^2H%AWKO_jR)Wo>LR)%HavBDh!^a z|G8yXR;sE;(uZzc5tV*+XEk;Er_y&`WPu7|8UA? I?s~cOC4PN<U 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 diff --git a/xv6-public/xv6.si4project/xv6.sip_xm b/xv6-public/xv6.si4project/xv6.sip_xm index da9442979569d321b7337b8a0fd3687aaf89bb88..d46a04b7ced15a5c4b52eb13bc06a24b19b41924 100644 GIT binary patch delta 26 bcmZo+?qL>;V_;y20b&qH0^-DtoYjl~Gp7UF delta 18 XcmeBSZeiw(V_;y20b+)Yg4K)w9{2+o diff --git a/xv6-public/xv6.si4project/xv6.sip_xr b/xv6-public/xv6.si4project/xv6.sip_xr index 83aad6c20285a182d928b5c850dd2d5d6e3a033a..899af821203935050655c882c31a2aed3508b5ec 100644 GIT binary patch delta 3246 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 delta 2562 zcmYLLU2I&%75>ib?C$Jl$qM;44S|jx#H&rC)LrX#*+J~Yp1&OHQ!O+k;;Q02t z=|iuzzIW!F`ObIF`DX5Y{Z#34yR^O%0EYoR4Pg4U^_zO?o$TUmz3+=4eBsm;k;R{$ z-l{|`{`SR1#kp_4d^-CQeK$mxwyRn=y6|Xp^AnPr8(kmvw&?H|3)@4#d2<+_EQN1P z=N7LmJSpL$Cv)N7Y6DS!Uh<3GSMqB9o>FMnJHRk;C5uFUJ=Z0g7diawqTNB_h~gXs-5i~KY>iw+K$ytYu55jXlTV? zX=*;X7ZoUkA0{`p#)GC6jie0np21okC!JO!yI^8`8FdUI1MK%jg}CE!-UrBEav2kxV2W*FRNyc`A^9|2C}#uL z;)B#v4AeE_DdO!dRDFl5oq8<@#9~OLT8dF9056gk$<5Yddl3B=t@iw5%jceB=*#() znllPlGS_}~l6Wh!mKRjcu1b>O&>Ulxm{$8-oTOZ5Ywxv?W1-@6fb~Uu?siVkxQ)~< z9jwOhE+=T(O7AbrNifvw#mQUa3mWonsA)g6C6*F1tMN}#X-|+^$z}U3V^=YQ2$4+-_HBJKCacc0>q?z&qn^%C^ z9Gy~9y^Z|0TY5gtmAZq8jx_E=a0A`+)>*`-(tZUd`n!^iE#>JsN)u~VniR)d5y}CZ zFt#&c_ z_}qo$-IgTpC2H-dq`6v7ez`KfR{nTA;BNQTl~TgQF0vu8P?68bhE{`8MZ*;=TtadI z_Obm8ZXLahhwS5ShMi~215X+z{l6YIhlw1jD>W4-Y*>! z1tdqQiJ}Fi%u_-sg}{OeB67MtT0LSCRpUg%A8t;2hhk%p%TOo=o~lB3!k~m&z*`r5>|-h$Pyo(uygA z<1?Nem7|q^=Y7R|9_@C)`LXN-JIFuaKpI-ZmT={q!~4lcTQ4SY`FPTF0S~S!Zwy-zLM(E4|IMC%ZwNttC`Sn_Z|Ay2a}9e9TR2o|Thu zgH~newIX3HC%4lpmYGt;ea>&yEwzj@%@C^-9tx6*;Pcj zpc<5VfgOS|Y{JB@ES9;q`mKIGPFnvccbJD|9z0-=vG1!+ZSxl`YicvlH%eo;TE}dl zIdPmUMDrX-C0a?(tsHAhM>ZqoDd}mpCH)6~0IYvOsV@d;pT1sobh-VjIKl&CZX)na zI4jivN|{!m@g}{k61cs@Vy{zOP*~h$XEPtR`nQ&ni{)-|Ud5}MzSJ$5V_n!2mi1@| zniBB%M-ww6K0_EXJ4!hgYyoHS&HWm)sest)6PP-U?&Ewt?&h1)HewHDVl5AraHEa6 zC0V&NI-cRL6u4nGQl(<#UR88ZBN#^291To`)_u_adfF@r$HSvjvx@S&PJZc~oJ3o* ztHio(u09k!yF;3S=&c>{1!Yy#+99>DyK{ZP5hBI#VRP3F{8Y$BM|R3c*ln9|wY)C; z$Xcu~3Sxjmq6~cND`jHx#qP0>Zgp-7+^C z@Z&*8kMB{Xu=USu^!zRvjN;8|Ao|TN`EF=4*}(e$C7P}Qs~_FHTOL_QN%FG%Wy6Ef zQ1sevsf&yLyj!-1{rlI2H#LT$<(;CVvvZP*{`kHOM0f3xk!awU%7vdCE=RAvDg$Bl zgGw~NM}8dkJ}dL1XCV61`}}@!W3nxKy*FWdWDBz`M$eDQ!}D1kKK4dl8AP9q$^Fs5 z7!lm-IXdLlIWpm8fvIqM%gsz#M^D`;d!h^fQ5BAI(WN`(ktn&M%+lCh(%&TSENysD zj%8Tw=MKsnynW@6+%I@);gBpX98#~`!>Na#QCB6u^uV*~110^XJG<&_kqt{`UiH8C EU%ekWfdBvi diff --git a/xv6-public/xv6.si4project/xv6.sip_xsb b/xv6-public/xv6.si4project/xv6.sip_xsb index fe7d859adfb70d848acb10885bf6ba63d665f74f..34314b87a2ad22d10d999f4cb2d07875e1adaa78 100644 GIT binary patch delta 5845 zcmc)OX?PPw7zgl~9K8@s!4^@}f~Y70+k&8oHWUyMs0Bnpl%`EK5TQxfY(k2_Zn~X-Pt6wiQ1H` zsws7Ts*p^QM9w|bqQo-=o4{tU1#AT;fs=WgNlGRwrftk^Q;h|eOG-=RmP#|LONpe| zE;1C0oi4)c>CLo#hMtn*DL&^g6CtUj59`}*sKuVC7u8}vakd9v4DJACYWpUO63Wn* zCou|{1`dNu!PCJHf-m7_%^{cawv�KrRDc4!(jnE9_WiD$j~{nPHqb=q5A4vl3=| zv-+pxDu#-axQPlb1JCBo&UCG&%+{?jx$_)j#YxCq@VpGRC#Q#XNS59+ar#P1I)OWb zuLO5FXLh3RLCWm?9Icg@VWz}Y^Jw6m;9cNnz|Vr813%9@&+`HwcpAWs;N9RoY~_&k zrVYc=gzNQ_Ro$e}*&W;iTt6nBR`2j9D+>)nx?O}U0xt$H0WSqF11|@!;LUs!(`jx` zV|Q-i6u{Zw9NtWsv^%NXUuWu-$u{_x(?PxUI&n*)cmuc(xG(s|gjpBqur=xk+ebz8 zmd}p15?l_Bf*%4uoWaV&FIY^EWU#!M`KEfc$t?8OJ5W6&DBS|S70jCEG`FgcsOI#q z^wHIT}3M*a09AQwrGfj5C`z_no39BsBnQGxrU=lJl>!kJOCVR+*=^z8AG2}9ta);X10B5T7BGZRtD=8)l0ncZQvo` z+rdM@cYue1hx1OCNAQ8n><1!A%0|O#c?l6818)M?fNQ~zgY%8EW)t~N-sy4yAIL0z z&_Qie^kGQ;prQFpI8Z_2VNoArw76(^D>z)ymo0&f9t1#biAP(uH?qapc&hevxJ z&sIhndltj;DDY_TUEnd`yTSK>$MRO>aeN@(3my-?4}3p(0=N+D;CxqDF5-f)Tnu)C zU0@OH&SayG&$4W+I+?0e7_NXP@s?Z#UJYIYUJG6aeiU5EyO+4055y{PHF!hfd;0X& zv>h~JRVErv%umAdB(Mkk0C+NZ3b+L99LT=02p-EZk)1eUdLI z^#k7wX2Ogtdj9UELKsWq%FBB9s$Z7KE8zX$SHZ7=UkASdev@|&d5aH79Q-!;9qrUu znoDhyGl=#4HZXGVh%vRoz0?|WP{C%aGaTX#5~2xy8nI+=*JI)hdOh`E2Hv482C8&bMOi97vL{> zYi})}*;H#>M4Q?wU+cA&drbKo@VDUaz|G)O;P1gd@E#?f<^%ah@K4~M!M}ii)mE;f zD@?H}8t;&|*>DNuQor~F_(||n;4PWjo?X;yF4(FUNH8E4ZUfhWw}b1!n(#cWqng@4 z1+$&$MRl4KB0IoOgJa;@x;->`ys9{nh{|^2G{3rM?@R^G0{j@>Q43m|LMbb|2 zF0kf!mBuZxIBm2lUc-<@i67@aupc}XEP(@H864!z3R_p3lvaiYi-}9R0Nfhf27Dpd z22KaJ<()3I;{%Be7#B&3HPHg|$d3#S2Z%%tfe(W}27dznv|_+f+Td8H&qxBI)AuO2 z5_~vS|Lbe?;DMu?^kG|$myduo+c9cyRWp{-|9jI={{5z*pUc@@?g02*@O$9*Ik%I@ z2V5YL4_kJno+f3HzR0RX#L!~!67W*+GVpTn3UGvXr_f412$h2?vc}UmJ*XWSPv@Cv ta>c|6biWcczDRVFhrkbm9|2c@SAkc9*YNH{*6IO~M7I;2`1ClE{s!+w>dXKD delta 683 zcmcJNKZw*o6vp?5z#Trp#0)l90s70#vR=9+ea3Rcp*w?Ia?3 zrh#G=Q@mo%Ay19z9?5mKLSiF#RC9@|WHZ4wZEs!!u?uZT$z^junK-Gq7*cmV0;M;a zz;>FcD5((=ly4dTX@;V@Q+m|gO&#?n7L~MVqX*r=zvf)Js!)RXlg_91XKLZk#Hy0( z7u9HSio_zb@$1Ol+3nH!w6W+W@}~P4$$i-e5S2+?GVk+%x(^)0KNj}*DGOBoC8gx6 z@aipC3i~EQ;=haD(=3qtItw6el(U^z9|k`@YbHo$?F7+(DcX`5`l0Itk*BlMDEl`^ z=P5!xUgCQ|CLUwHfpFddn*9QEba&N?)n06BjwI5lK@7;2yo2$q k-Pm1g`dup=JzC;N{~a&u){1B4XR9l2g4=#wbDUB z5FxIe3N9VvA`T82I|ybFaS{B!wDcf(_j~Vhd6x_d<3i`$Sj%_2$Gak;XIBOBJ0sHA z?5X6euRv*;l4r#552jJtX>3}-UPh}+BJ!-j1wM!(Dp$ZWp@9)_M^u3c@J56{(U@)E z06V}FD>a~I=#5jtZCc`TG9CGac|UUK)$7cj@aA}yIGLbrtf)WQ$0i|md?XU!-6$JP z>mpk=&}=2E)h#O{R2<-wh=3ztNW{PZNDt`ZnK963MSuhdIk&N_WNP(AXjE+Ag{T4z zQ?Cm?sn}@G=43jS7U#$C-IkXouX#_fE(wO_D!YuaRhQWqP&ut`2p^~d_e2M;-v{Cp hsQ9_`fDg$1Fc%^h0k6ae_{}XBCR;sK+U}))_#e7MXk`EZ delta 510 zcmYMxJxIeq6bJCvBn_bi=~#&1QA9chr-Dls!7-y_9Yo!NbZ|41lS5(z9sH=ch*Jj# zw{~zSf)Jc^E284yP|(4T#sB{r>A~I0@4dUr;~k z>8$-$KxtcIGor;S<0!F?b;*`W%Gn`uF|!D`C90?#0+)mW`oIz418=|`(FLl8a`uT3 zXaZ+M3uqb2|0be3Iv>XE%9xyILu8fN9}Y1VJz$4ZVpNwsbIw4jfq=t>rg9Eg=_9uV zJQ6w30gj0wFaS~_!kW=P1gKfcIcFunv;fc>C{)&g9xFbOSZY2d0x>1PT^4O|YI5wT zy{WSw97D_tvnOkor*z82eGUO1NH`@1mVpx@!Ruq-UIUejvi`svxp(He$bA7fL?2N0 Ov|D@eD%Y=`{-b}Es8@sl diff --git a/xv6-public/xv6.si4project/xv6.siproj b/xv6-public/xv6.si4project/xv6.siproj index 725d9550458a0b8efcffa81de3b5cf4782c09666..ad6141fcdd23e82f0f202df5224cb4fa5e125cb1 100644 GIT binary patch delta 582 zcmX@{hw(-u6R!a~149S{14}Xk14Hsg-gr*7^sBsgmY8fV;!I*=%iW*|V&CHb#KHE% z`P<@UCYvuwI5D#MJ~RZ0OG$MxDPEG)WnOM_l`)-(f#EO^ivUdm;XMuv3@$)=^5&y5 z>Wos{Q7@h@11ifAWni!d3Ii!H7GR&KD7INfPJ)rG>5d1;R4e&Q%xpOu;z4X7a zwyful7?@pU+$qMu@WO|IK>?^0gi|}XCMt?Fg zxtsfqfO=cFfSzPzU{C|<1L4);3=Bd*x?%HGV|Ad_UuD^rn`~w>y~HdvtANEr0jMRE zn}I{tF)Tx{)gB0#okMZFS~P7t~ZWM5_61$5OGpbLY5 z#(?lyHCB)(U2;CKuz6kE4AN^=2=wIlv{N9qP^lCv+XIs)AhuBzFlx@Y{spnCs?RY^ zp1{J&l$k#Hq23=khDj4DQ$Wtl1qQq+(A-2QzRAqMz&W|lOqeloqM|TN%SP+pG7JnI e%mVj7dj13Tl(R7~Bmwn+@cF|)uQ4V8)dK*tHL)51 delta 464 zcmcc7$aLZlBd-BF149S{14|+U14H6Q-gr*79aH}A%~RW4#F@m#7G5c_56Hg7|A}L= z4-3cUD-sTjY`^*gK!Q?IT}&WB$#ff>VVRg zKp{~mKFT&xQEan}oCG7A^n^l?X;$)=nAwsx^nlnx%AYu-gG8U-o2Yh`aTf;zL#rzT zg91=12v2>^IZ;t`vxyE+@6-t^KWpmV3{ODHnM^M+OC?r*x&G7eDq|=&1A_)51A`V&83q_?h zK;@fkRa)|ft2>RoZw)Ky{QCJ8s*!?#J0>W7{q?%Z^gyN^gA2G z){1&1C>_%F2*?I{4(OsSKoJv3_)z8Dkny^iau$HLbc6R)#sQ12XKZ^ diff --git a/xv6-public/xv6.si4project/xv6.siwork b/xv6-public/xv6.si4project/xv6.siwork index 125f7ae55a1203663f7ca012469c334fda5b943f..c268c9a6411358d1fc332195c7cc304bcc5e88b1 100644 GIT binary patch literal 58850 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 HClmh*-^cqf literal 65716 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