summaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
authorSanjit Bhat <[email protected]>2023-10-25 19:42:59 -0400
committerSanjit Bhat <[email protected]>2023-10-25 19:42:59 -0400
commit1ed40716eb54e371df9d1814b9129666b3fe4f09 (patch)
tree84666aacb6d6a9554b09500c0b0420870af2e19e /Makefile
parent74c1eba516fdb0ec1a17b16be7e76613ccba92bf (diff)
downloadxv6-labs-1ed40716eb54e371df9d1814b9129666b3fe4f09.tar.gz
xv6-labs-1ed40716eb54e371df9d1814b9129666b3fe4f09.tar.bz2
xv6-labs-1ed40716eb54e371df9d1814b9129666b3fe4f09.zip
release lab net
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile227
1 files changed, 211 insertions, 16 deletions
diff --git a/Makefile b/Makefile
index 39a99d7..da43ce2 100644
--- a/Makefile
+++ b/Makefile
@@ -1,14 +1,16 @@
+
+# To compile and run with a lab solution, set the lab name in conf/lab.mk
+# (e.g., LAB=util). Run make grade to test solution with the lab's
+# grade script (e.g., grade-lab-util).
+
+-include conf/lab.mk
+
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 \
@@ -30,6 +32,34 @@ OBJS = \
$K/plic.o \
$K/virtio_disk.o
+OBJS_KCSAN = \
+ $K/start.o \
+ $K/console.o \
+ $K/printf.o \
+ $K/uart.o \
+ $K/spinlock.o
+
+ifdef KCSAN
+OBJS_KCSAN += \
+ $K/kcsan.o
+endif
+
+ifeq ($(LAB),$(filter $(LAB), lock))
+OBJS += \
+ $K/stats.o\
+ $K/sprintf.o
+endif
+
+
+ifeq ($(LAB),net)
+OBJS += \
+ $K/e1000.o \
+ $K/net.o \
+ $K/sysnet.o \
+ $K/pci.o
+endif
+
+
# riscv64-unknown-elf- or riscv64-linux-gnu-
# perhaps in /opt/riscv/bin
#TOOLPREFIX =
@@ -57,12 +87,28 @@ OBJCOPY = $(TOOLPREFIX)objcopy
OBJDUMP = $(TOOLPREFIX)objdump
CFLAGS = -Wall -Werror -O -fno-omit-frame-pointer -ggdb -gdwarf-2
+
+ifdef LAB
+LABUPPER = $(shell echo $(LAB) | tr a-z A-Z)
+XCFLAGS += -DSOL_$(LABUPPER) -DLAB_$(LABUPPER)
+endif
+
+CFLAGS += $(XCFLAGS)
CFLAGS += -MD
CFLAGS += -mcmodel=medany
CFLAGS += -ffreestanding -fno-common -nostdlib -mno-relax
CFLAGS += -I.
CFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector)
+ifeq ($(LAB),net)
+CFLAGS += -DNET_TESTS_PORT=$(SERVERPORT)
+endif
+
+ifdef KCSAN
+CFLAGS += -DKCSAN
+KCSANFLAG = -fsanitize=thread -fno-inline
+endif
+
# 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
@@ -73,11 +119,17 @@ endif
LDFLAGS = -z max-page-size=4096
-$K/kernel: $(OBJS) $K/kernel.ld $U/initcode
- $(LD) $(LDFLAGS) -T $K/kernel.ld -o $K/kernel $(OBJS)
+$K/kernel: $(OBJS) $(OBJS_KCSAN) $K/kernel.ld $U/initcode
+ $(LD) $(LDFLAGS) -T $K/kernel.ld -o $K/kernel $(OBJS) $(OBJS_KCSAN)
$(OBJDUMP) -S $K/kernel > $K/kernel.asm
$(OBJDUMP) -t $K/kernel | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $K/kernel.sym
+$(OBJS): EXTRAFLAG := $(KCSANFLAG)
+
+$K/%.o: $K/%.c
+ $(CC) $(CFLAGS) $(EXTRAFLAG) -c -o $@ $<
+
+
$U/initcode: $U/initcode.S
$(CC) $(CFLAGS) -march=rv64g -nostdinc -I. -Ikernel -c $U/initcode.S -o $U/initcode.o
$(LD) $(LDFLAGS) -N -e start -Ttext 0 -o $U/initcode.out $U/initcode.o
@@ -89,6 +141,10 @@ tags: $(OBJS) _init
ULIB = $U/ulib.o $U/usys.o $U/printf.o $U/umalloc.o
+ifeq ($(LAB),$(filter $(LAB), lock))
+ULIB += $U/statistics.o
+endif
+
_%: %.o $(ULIB)
$(LD) $(LDFLAGS) -T $U/user.ld -o $@ $^
$(OBJDUMP) -S $@ > $*.asm
@@ -107,7 +163,7 @@ $U/_forktest: $U/forktest.o $(ULIB)
$(OBJDUMP) -S $U/_forktest > $U/forktest.asm
mkfs/mkfs: mkfs/mkfs.c $K/fs.h $K/param.h
- gcc -Werror -Wall -I. -o mkfs/mkfs mkfs/mkfs.c
+ gcc $(XCFLAGS) -Werror -Wall -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
@@ -133,18 +189,89 @@ UPROGS=\
$U/_wc\
$U/_zombie\
-fs.img: mkfs/mkfs README $(UPROGS)
- mkfs/mkfs fs.img README $(UPROGS)
+
+
+
+ifeq ($(LAB),$(filter $(LAB), lock))
+UPROGS += \
+ $U/_stats
+endif
+
+ifeq ($(LAB),traps)
+UPROGS += \
+ $U/_call\
+ $U/_bttest
+endif
+
+ifeq ($(LAB),lazy)
+UPROGS += \
+ $U/_lazytests
+endif
+
+ifeq ($(LAB),cow)
+UPROGS += \
+ $U/_cowtest
+endif
+
+ifeq ($(LAB),thread)
+UPROGS += \
+ $U/_uthread
+
+$U/uthread_switch.o : $U/uthread_switch.S
+ $(CC) $(CFLAGS) -c -o $U/uthread_switch.o $U/uthread_switch.S
+
+$U/_uthread: $U/uthread.o $U/uthread_switch.o $(ULIB)
+ $(LD) $(LDFLAGS) -N -e main -Ttext 0 -o $U/_uthread $U/uthread.o $U/uthread_switch.o $(ULIB)
+ $(OBJDUMP) -S $U/_uthread > $U/uthread.asm
+
+ph: notxv6/ph.c
+ gcc -o ph -g -O2 $(XCFLAGS) notxv6/ph.c -pthread
+
+barrier: notxv6/barrier.c
+ gcc -o barrier -g -O2 $(XCFLAGS) notxv6/barrier.c -pthread
+endif
+
+ifeq ($(LAB),pgtbl)
+UPROGS += \
+ $U/_pgtbltest
+endif
+
+ifeq ($(LAB),lock)
+UPROGS += \
+ $U/_kalloctest\
+ $U/_bcachetest
+endif
+
+ifeq ($(LAB),fs)
+UPROGS += \
+ $U/_bigfile
+endif
+
+
+
+ifeq ($(LAB),net)
+UPROGS += \
+ $U/_nettests
+endif
+
+UEXTRA=
+ifeq ($(LAB),util)
+ UEXTRA += user/xargstest.sh
+endif
+
+
+fs.img: mkfs/mkfs README $(UEXTRA) $(UPROGS)
+ mkfs/mkfs fs.img README $(UEXTRA) $(UPROGS)
-include kernel/*.d user/*.d
-clean:
- rm -f *.tex *.dvi *.idx *.aux *.log *.ind *.ilg \
+clean:
+ rm -rf *.tex *.dvi *.idx *.aux *.log *.ind *.ilg *.dSYM *.zip *.pcap \
*/*.o */*.d */*.asm */*.sym \
- $U/initcode $U/initcode.out $K/kernel fs.img \
- mkfs/mkfs .gdbinit \
- $U/usys.S \
- $(UPROGS)
+ $U/initcode $U/initcode.out $U/usys.S $U/_* \
+ $K/kernel \
+ mkfs/mkfs fs.img .gdbinit __pycache__ xv6.out* \
+ ph barrier
# try to generate a unique GDB port
GDBPORT = $(shell expr `id -u` % 5000 + 25000)
@@ -155,12 +282,22 @@ QEMUGDB = $(shell if $(QEMU) -help | grep -q '^-gdb'; \
ifndef CPUS
CPUS := 3
endif
+ifeq ($(LAB),fs)
+CPUS := 1
+endif
+
+FWDPORT = $(shell expr `id -u` % 5000 + 25999)
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
+ifeq ($(LAB),net)
+QEMUOPTS += -netdev user,id=net0,hostfwd=udp::$(FWDPORT)-:2000 -object filter-dump,id=net0,netdev=net0,file=packets.pcap
+QEMUOPTS += -device e1000,netdev=net0,bus=pcie.0
+endif
+
qemu: $K/kernel fs.img
$(QEMU) $(QEMUOPTS)
@@ -171,3 +308,61 @@ qemu-gdb: $K/kernel .gdbinit fs.img
@echo "*** Now run 'gdb' in another window." 1>&2
$(QEMU) $(QEMUOPTS) -S $(QEMUGDB)
+ifeq ($(LAB),net)
+# try to generate a unique port for the echo server
+SERVERPORT = $(shell expr `id -u` % 5000 + 25099)
+
+server:
+ python3 server.py $(SERVERPORT)
+
+ping:
+ python3 ping.py $(FWDPORT)
+endif
+
+##
+## FOR testing lab grading script
+##
+
+ifneq ($(V),@)
+GRADEFLAGS += -v
+endif
+
+print-gdbport:
+ @echo $(GDBPORT)
+
+grade:
+ @echo $(MAKE) clean
+ @$(MAKE) clean || \
+ (echo "'make clean' failed. HINT: Do you have another running instance of xv6?" && exit 1)
+ ./grade-lab-$(LAB) $(GRADEFLAGS)
+
+##
+## FOR submissions
+##
+
+submit-check:
+ @if ! test -d .git; then \
+ echo No .git directory, is this a git repository?; \
+ false; \
+ fi
+ @if test "$$(git symbolic-ref HEAD)" != refs/heads/$(LAB); then \
+ git branch; \
+ read -p "You are not on the $(LAB) branch. Hand-in the current branch? [y/N] " r; \
+ test "$$r" = y; \
+ fi
+ @if ! git diff-files --quiet || ! git diff-index --quiet --cached HEAD; then \
+ git status -s; \
+ echo; \
+ echo "You have uncomitted changes. Please commit or stash them."; \
+ false; \
+ fi
+ @if test -n "`git status -s`"; then \
+ git status -s; \
+ read -p "Untracked files will not be handed in. Continue? [y/N] " r; \
+ test "$$r" = y; \
+ fi
+
+zipball: clean submit-check
+ git archive --verbose --format zip --output lab.zip HEAD
+
+.PHONY: zipball clean grade submit-check