From 5753553213df8f9de851adb68377db43faecb91f Mon Sep 17 00:00:00 2001
From: Robert Morris <rtm@csail.mit.edu>
Date: Tue, 11 Jun 2019 09:57:14 -0400
Subject: [PATCH] separate source into kernel/ user/ mkfs/

---
 .gdbinit.tmpl-i386                  |   6 --
 .gdbinit.tmpl-riscv                 |   2 +-
 .gdbinit.tmpl-x64                   |  18 ----
 .gitignore                          |   1 -
 Makefile                            | 148 ++++++++++++++--------------
 ioapic.c                            |  76 --------------
 bio.c => kernel/bio.c               |   0
 buf.h => kernel/buf.h               |   0
 console.c => kernel/console.c       |   0
 date.h => kernel/date.h             |   0
 defs.h => kernel/defs.h             |   0
 elf.h => kernel/elf.h               |   0
 entry.S => kernel/entry.S           |   0
 exec.c => kernel/exec.c             |   0
 fcntl.h => kernel/fcntl.h           |   0
 file.c => kernel/file.c             |   0
 file.h => kernel/file.h             |   0
 fs.c => kernel/fs.c                 |   0
 fs.h => kernel/fs.h                 |   0
 kalloc.c => kernel/kalloc.c         |   0
 kernel.ld => kernel/kernel.ld       |   0
 kernelvec.S => kernel/kernelvec.S   |   0
 log.c => kernel/log.c               |   0
 main.c => kernel/main.c             |   0
 memlayout.h => kernel/memlayout.h   |   0
 param.h => kernel/param.h           |   0
 pipe.c => kernel/pipe.c             |   0
 plic.c => kernel/plic.c             |   0
 proc.c => kernel/proc.c             |   0
 proc.h => kernel/proc.h             |   0
 ramdisk.c => kernel/ramdisk.c       |   0
 riscv.h => kernel/riscv.h           |   0
 sleeplock.c => kernel/sleeplock.c   |   0
 sleeplock.h => kernel/sleeplock.h   |   0
 spinlock.c => kernel/spinlock.c     |   0
 spinlock.h => kernel/spinlock.h     |   0
 start.c => kernel/start.c           |   0
 stat.h => kernel/stat.h             |   0
 string.c => kernel/string.c         |   0
 swtch.S => kernel/swtch.S           |   0
 syscall.c => kernel/syscall.c       |   0
 syscall.h => kernel/syscall.h       |   0
 sysfile.c => kernel/sysfile.c       |   0
 sysproc.c => kernel/sysproc.c       |   0
 trampoline.S => kernel/trampoline.S |   0
 trap.c => kernel/trap.c             |   0
 types.h => kernel/types.h           |   0
 uart.c => kernel/uart.c             |   0
 vm.c => kernel/vm.c                 |   0
 mkfs.c => mkfs/mkfs.c               |  23 +++--
 cat.c => user/cat.c                 |   6 +-
 echo.c => user/echo.c               |   6 +-
 forktest.c => user/forktest.c       |   6 +-
 grep.c => user/grep.c               |   6 +-
 init.c => user/init.c               |   8 +-
 initcode.S => user/initcode.S       |   0
 kill.c => user/kill.c               |   6 +-
 ln.c => user/ln.c                   |   6 +-
 ls.c => user/ls.c                   |   8 +-
 mkdir.c => user/mkdir.c             |   6 +-
 printf.c => user/printf.c           |   6 +-
 rm.c => user/rm.c                   |   6 +-
 sh.c => user/sh.c                   |   6 +-
 stressfs.c => user/stressfs.c       |  10 +-
 ulib.c => user/ulib.c               |   8 +-
 umalloc.c => user/umalloc.c         |   8 +-
 user.h => user/user.h               |   0
 usertests.c => user/usertests.c     |  16 +--
 usys.pl => user/usys.pl             |   2 +-
 wc.c => user/wc.c                   |   6 +-
 zombie.c => user/zombie.c           |   6 +-
 vectors.pl                          |  47 ---------
 72 files changed, 157 insertions(+), 296 deletions(-)
 delete mode 100644 .gdbinit.tmpl-i386
 delete mode 100644 .gdbinit.tmpl-x64
 delete mode 100644 ioapic.c
 rename bio.c => kernel/bio.c (100%)
 rename buf.h => kernel/buf.h (100%)
 rename console.c => kernel/console.c (100%)
 rename date.h => kernel/date.h (100%)
 rename defs.h => kernel/defs.h (100%)
 rename elf.h => kernel/elf.h (100%)
 rename entry.S => kernel/entry.S (100%)
 rename exec.c => kernel/exec.c (100%)
 rename fcntl.h => kernel/fcntl.h (100%)
 rename file.c => kernel/file.c (100%)
 rename file.h => kernel/file.h (100%)
 rename fs.c => kernel/fs.c (100%)
 rename fs.h => kernel/fs.h (100%)
 rename kalloc.c => kernel/kalloc.c (100%)
 rename kernel.ld => kernel/kernel.ld (100%)
 rename kernelvec.S => kernel/kernelvec.S (100%)
 rename log.c => kernel/log.c (100%)
 rename main.c => kernel/main.c (100%)
 rename memlayout.h => kernel/memlayout.h (100%)
 rename param.h => kernel/param.h (100%)
 rename pipe.c => kernel/pipe.c (100%)
 rename plic.c => kernel/plic.c (100%)
 rename proc.c => kernel/proc.c (100%)
 rename proc.h => kernel/proc.h (100%)
 rename ramdisk.c => kernel/ramdisk.c (100%)
 rename riscv.h => kernel/riscv.h (100%)
 rename sleeplock.c => kernel/sleeplock.c (100%)
 rename sleeplock.h => kernel/sleeplock.h (100%)
 rename spinlock.c => kernel/spinlock.c (100%)
 rename spinlock.h => kernel/spinlock.h (100%)
 rename start.c => kernel/start.c (100%)
 rename stat.h => kernel/stat.h (100%)
 rename string.c => kernel/string.c (100%)
 rename swtch.S => kernel/swtch.S (100%)
 rename syscall.c => kernel/syscall.c (100%)
 rename syscall.h => kernel/syscall.h (100%)
 rename sysfile.c => kernel/sysfile.c (100%)
 rename sysproc.c => kernel/sysproc.c (100%)
 rename trampoline.S => kernel/trampoline.S (100%)
 rename trap.c => kernel/trap.c (100%)
 rename types.h => kernel/types.h (100%)
 rename uart.c => kernel/uart.c (100%)
 rename vm.c => kernel/vm.c (100%)
 rename mkfs.c => mkfs/mkfs.c (93%)
 rename cat.c => user/cat.c (87%)
 rename echo.c => user/echo.c (65%)
 rename forktest.c => user/forktest.c (90%)
 rename grep.c => user/grep.c (96%)
 rename init.c => user/init.c (85%)
 rename initcode.S => user/initcode.S (100%)
 rename kill.c => user/kill.c (70%)
 rename ln.c => user/ln.c (73%)
 rename ls.c => user/ls.c (93%)
 rename mkdir.c => user/mkdir.c (78%)
 rename printf.c => user/printf.c (95%)
 rename rm.c => user/rm.c (78%)
 rename sh.c => user/sh.c (99%)
 rename stressfs.c => user/stressfs.c (88%)
 rename ulib.c => user/ulib.c (92%)
 rename umalloc.c => user/umalloc.c (94%)
 rename user.h => user/user.h (100%)
 rename usertests.c => user/usertests.c (99%)
 rename usys.pl => user/usys.pl (93%)
 rename wc.c => user/wc.c (91%)
 rename zombie.c => user/zombie.c (68%)
 delete mode 100755 vectors.pl

diff --git a/.gdbinit.tmpl-i386 b/.gdbinit.tmpl-i386
deleted file mode 100644
index a3a274b..0000000
--- a/.gdbinit.tmpl-i386
+++ /dev/null
@@ -1,6 +0,0 @@
-set confirm off
-python
-gdb.execute("target remote localhost:26000")
-gdb.execute("set architecture i386")
-gdb.execute("symbol-file kernel")
-gdb.execute("break *0x7c00")
diff --git a/.gdbinit.tmpl-riscv b/.gdbinit.tmpl-riscv
index c1616b6..8d461a1 100644
--- a/.gdbinit.tmpl-riscv
+++ b/.gdbinit.tmpl-riscv
@@ -1,4 +1,4 @@
 set confirm off
 set architecture riscv
 target remote 127.0.0.1:1234
-symbol-file kernel
+symbol-file kernel/kernel
diff --git a/.gdbinit.tmpl-x64 b/.gdbinit.tmpl-x64
deleted file mode 100644
index 9c120ff..0000000
--- a/.gdbinit.tmpl-x64
+++ /dev/null
@@ -1,18 +0,0 @@
-#if you would like to use gdb in 32bit mode, comment out lines 8 and 15, then uncomment
-#the lines after. Note this will only work properly until 64bit mode is enabled in entry.S
-
-python
-gdb.execute("set architecture i386:x86-64:intel")
-gdb.execute("target remote localhost:26000")
-gdb.execute("symbol-file kernel")
-gdb.execute("break start64")
-#gdb.execute("break *0x7c00")
-try:
-  gdb.execute("continue")
-except: 
-  pass
-gdb.execute("disconnect")
-gdb.execute("set architecture i386:x86-64")
-#gdb.execute("set architecture i386")
-gdb.execute("target remote localhost:26000")
-gdb.execute("delete break 1")
diff --git a/.gitignore b/.gitignore
index 3e2c9de..fe754f0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,7 +10,6 @@ bootblock
 entryother
 initcode
 initcode.out
-kernel
 kernelmemfs
 mkfs
 .gdbinit
diff --git a/Makefile b/Makefile
index 731a157..545f28c 100644
--- a/Makefile
+++ b/Makefile
@@ -1,29 +1,33 @@
+K=kernel
+U=user
+
 OBJS = \
-  start.o \
-  console.o \
-  uart.o \
-  kalloc.o \
-  spinlock.o \
-  string.o \
-  main.o \
-  vm.o \
-  proc.o \
-  swtch.o \
-  trampoline.o \
-  trap.o \
-  syscall.o \
-  sysproc.o \
-  bio.o \
-  fs.o \
-  log.o \
-  sleeplock.o \
-  file.o \
-  pipe.o \
-  ramdisk.o \
-  exec.o \
-  sysfile.o \
-  kernelvec.o \
-  plic.o
+  $K/entry.o \
+  $K/start.o \
+  $K/console.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/ramdisk.o \
+  $K/exec.o \
+  $K/sysfile.o \
+  $K/kernelvec.o \
+  $K/plic.o
 
 # riscv64-unknown-elf- or riscv64-linux-gnu-
 # perhaps in /opt/riscv/bin
@@ -53,6 +57,7 @@ OBJDUMP = $(TOOLPREFIX)objdump
 CFLAGS = -Wall -Werror -O -fno-omit-frame-pointer -ggdb
 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)
 
 # Disable PIE when possible (for Ubuntu 16.10 toolchain)
@@ -65,41 +70,41 @@ endif
 
 LDFLAGS = -z max-page-size=4096
 
-kernel: $(OBJS) entry.o kernel.ld initcode
-	$(LD) $(LDFLAGS) -T kernel.ld -o kernel entry.o $(OBJS) 
-	$(OBJDUMP) -S kernel > kernel.asm
-	$(OBJDUMP) -t kernel | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > kernel.sym
+$K/kernel: $(OBJS) $K/kernel.ld $U/initcode
+	$(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
 
-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
+$U/initcode: $U/initcode.S
+	$(CC) $(CFLAGS) -nostdinc -I. -Ikernel -c $U/initcode.S -o $U/initcode.o
+	$(LD) $(LDFLAGS) -N -e start -Ttext 0 -o $U/initcode.out $U/initcode.o
+	$(OBJCOPY) -S -O binary $U/initcode.out $U/initcode
+	$(OBJDUMP) -S $U/initcode.o > $U/initcode.asm
 
-tags: $(OBJS) entryother.S _init
+tags: $(OBJS) _init
 	etags *.S *.c
 
-vectors.S: vectors.pl
-	./vectors.pl > vectors.S
-
-ULIB = ulib.o usys.o printf.o umalloc.o
+ULIB = $U/ulib.o $U/usys.o $U/printf.o $U/umalloc.o
 
 _%: %.o $(ULIB)
 	$(LD) $(LDFLAGS) -N -e main -Ttext 0 -o $@ $^
 	$(OBJDUMP) -S $@ > $*.asm
 	$(OBJDUMP) -t $@ | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $*.sym
 
-usys.S : usys.pl
-	perl ./usys.pl > usys.S
+$U/usys.S : $U/usys.pl
+	perl $U/usys.pl > $U/usys.S
 
-_forktest: forktest.o $(ULIB)
+$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 _forktest forktest.o ulib.o usys.o
-	$(OBJDUMP) -S _forktest > forktest.asm
+	$(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.c fs.h
-	gcc -Werror -Wall -o mkfs mkfs.c
+mkfs/mkfs: mkfs/mkfs.c $K/fs.h
+	gcc -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
@@ -108,32 +113,33 @@ mkfs: mkfs.c fs.h
 .PRECIOUS: %.o
 
 UPROGS=\
-	_cat\
-	_echo\
-	_forktest\
-	_grep\
-	_init\
-	_kill\
-	_ln\
-	_ls\
-	_mkdir\
-	_rm\
-	_sh\
-	_stressfs\
-	_usertests\
-	_wc\
-	_zombie\
+	$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/_wc\
+	$U/_zombie\
 
-fs.img: mkfs README $(UPROGS)
-	./mkfs fs.img README $(UPROGS)
+fs.img: mkfs/mkfs README $(UPROGS)
+	mkfs/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 fs.img kernelmemfs \
-	mkfs .gdbinit \
+	*/*.o */*.d */*.asm */*.sym \
+	$U/initcode $U/initcode.out $K/kernel fs.img \
+	mkfs/mkfs .gdbinit \
+        $U/usys.S \
 	$(UPROGS)
 
 # make a printout
@@ -155,23 +161,19 @@ QEMUGDB = $(shell if $(QEMU) -help | grep -q '^-gdb'; \
 ifndef CPUS
 CPUS := 3
 endif
-QEMUOPTS = -machine virt -kernel kernel -m 3G -smp $(CPUS) -nographic
+QEMUOPTS = -machine virt -kernel $K/kernel -m 3G -smp $(CPUS) -nographic
 QEMUOPTS += -initrd fs.img
 
-qemu: kernel fs.img
+qemu: $K/kernel fs.img
 	$(QEMU) $(QEMUOPTS)
 
 .gdbinit: .gdbinit.tmpl-riscv
 	sed "s/:1234/:$(GDBPORT)/" < $^ > $@
 
-qemu-gdb: kernel .gdbinit fs.img
+qemu-gdb: $K/kernel .gdbinit fs.img
 	@echo "*** Now run 'gdb'." 1>&2
 	$(QEMU) $(QEMUOPTS) -S $(QEMUGDB)
 
-qemu-nox-gdb: fs.img kernel .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
diff --git a/ioapic.c b/ioapic.c
deleted file mode 100644
index bbe5f9b..0000000
--- a/ioapic.c
+++ /dev/null
@@ -1,76 +0,0 @@
-// The I/O APIC manages hardware interrupts for an SMP system.
-// http://www.intel.com/design/chipsets/datashts/29056601.pdf
-// See also picirq.c.
-
-#include "types.h"
-#include "defs.h"
-#include "memlayout.h"
-#include "traps.h"
-
-#define IOAPIC  0xFEC00000   // Default physical address of IO APIC
-
-#define REG_ID     0x00  // Register index: ID
-#define REG_VER    0x01  // Register index: version
-#define REG_TABLE  0x10  // Redirection table base
-
-// The redirection table starts at REG_TABLE and uses
-// two registers to configure each interrupt.
-// The first (low) register in a pair contains configuration bits.
-// The second (high) register contains a bitmask telling which
-// CPUs can serve that interrupt.
-#define INT_DISABLED   0x00010000  // Interrupt disabled
-#define INT_LEVEL      0x00008000  // Level-triggered (vs edge-)
-#define INT_ACTIVELOW  0x00002000  // Active low (vs high)
-#define INT_LOGICAL    0x00000800  // Destination is CPU id (vs APIC ID)
-
-volatile struct ioapic *ioapic;
-
-// IO APIC MMIO structure: write reg, then read or write data.
-struct ioapic {
-  uint reg;
-  uint pad[3];
-  uint data;
-};
-
-static uint
-ioapicread(int reg)
-{
-  ioapic->reg = reg;
-  return ioapic->data;
-}
-
-static void
-ioapicwrite(int reg, uint data)
-{
-  ioapic->reg = reg;
-  ioapic->data = data;
-}
-
-void
-ioapicinit(void)
-{
-  int i, id, maxintr;
-
-  ioapic = P2V((volatile struct ioapic*)IOAPIC);
-  maxintr = (ioapicread(REG_VER) >> 16) & 0xFF;
-  id = ioapicread(REG_ID) >> 24;
-  if(id != ioapicid)
-    cprintf("ioapicinit: id isn't equal to ioapicid; not a MP\n");
-
-  // Mark all interrupts edge-triggered, active high, disabled,
-  // and not routed to any CPUs.
-  for(i = 0; i <= maxintr; i++){
-    ioapicwrite(REG_TABLE+2*i, INT_DISABLED | (T_IRQ0 + i));
-    ioapicwrite(REG_TABLE+2*i+1, 0);
-  }
-}
-
-void
-ioapicenable(int irq, int cpunum)
-{
-  // Mark interrupt edge-triggered, active high,
-  // enabled, and routed to the given cpunum,
-  // which happens to be that cpu's APIC ID.
-  ioapicwrite(REG_TABLE+2*irq, T_IRQ0 + irq);
-  ioapicwrite(REG_TABLE+2*irq+1, cpunum << 24);
-}
diff --git a/bio.c b/kernel/bio.c
similarity index 100%
rename from bio.c
rename to kernel/bio.c
diff --git a/buf.h b/kernel/buf.h
similarity index 100%
rename from buf.h
rename to kernel/buf.h
diff --git a/console.c b/kernel/console.c
similarity index 100%
rename from console.c
rename to kernel/console.c
diff --git a/date.h b/kernel/date.h
similarity index 100%
rename from date.h
rename to kernel/date.h
diff --git a/defs.h b/kernel/defs.h
similarity index 100%
rename from defs.h
rename to kernel/defs.h
diff --git a/elf.h b/kernel/elf.h
similarity index 100%
rename from elf.h
rename to kernel/elf.h
diff --git a/entry.S b/kernel/entry.S
similarity index 100%
rename from entry.S
rename to kernel/entry.S
diff --git a/exec.c b/kernel/exec.c
similarity index 100%
rename from exec.c
rename to kernel/exec.c
diff --git a/fcntl.h b/kernel/fcntl.h
similarity index 100%
rename from fcntl.h
rename to kernel/fcntl.h
diff --git a/file.c b/kernel/file.c
similarity index 100%
rename from file.c
rename to kernel/file.c
diff --git a/file.h b/kernel/file.h
similarity index 100%
rename from file.h
rename to kernel/file.h
diff --git a/fs.c b/kernel/fs.c
similarity index 100%
rename from fs.c
rename to kernel/fs.c
diff --git a/fs.h b/kernel/fs.h
similarity index 100%
rename from fs.h
rename to kernel/fs.h
diff --git a/kalloc.c b/kernel/kalloc.c
similarity index 100%
rename from kalloc.c
rename to kernel/kalloc.c
diff --git a/kernel.ld b/kernel/kernel.ld
similarity index 100%
rename from kernel.ld
rename to kernel/kernel.ld
diff --git a/kernelvec.S b/kernel/kernelvec.S
similarity index 100%
rename from kernelvec.S
rename to kernel/kernelvec.S
diff --git a/log.c b/kernel/log.c
similarity index 100%
rename from log.c
rename to kernel/log.c
diff --git a/main.c b/kernel/main.c
similarity index 100%
rename from main.c
rename to kernel/main.c
diff --git a/memlayout.h b/kernel/memlayout.h
similarity index 100%
rename from memlayout.h
rename to kernel/memlayout.h
diff --git a/param.h b/kernel/param.h
similarity index 100%
rename from param.h
rename to kernel/param.h
diff --git a/pipe.c b/kernel/pipe.c
similarity index 100%
rename from pipe.c
rename to kernel/pipe.c
diff --git a/plic.c b/kernel/plic.c
similarity index 100%
rename from plic.c
rename to kernel/plic.c
diff --git a/proc.c b/kernel/proc.c
similarity index 100%
rename from proc.c
rename to kernel/proc.c
diff --git a/proc.h b/kernel/proc.h
similarity index 100%
rename from proc.h
rename to kernel/proc.h
diff --git a/ramdisk.c b/kernel/ramdisk.c
similarity index 100%
rename from ramdisk.c
rename to kernel/ramdisk.c
diff --git a/riscv.h b/kernel/riscv.h
similarity index 100%
rename from riscv.h
rename to kernel/riscv.h
diff --git a/sleeplock.c b/kernel/sleeplock.c
similarity index 100%
rename from sleeplock.c
rename to kernel/sleeplock.c
diff --git a/sleeplock.h b/kernel/sleeplock.h
similarity index 100%
rename from sleeplock.h
rename to kernel/sleeplock.h
diff --git a/spinlock.c b/kernel/spinlock.c
similarity index 100%
rename from spinlock.c
rename to kernel/spinlock.c
diff --git a/spinlock.h b/kernel/spinlock.h
similarity index 100%
rename from spinlock.h
rename to kernel/spinlock.h
diff --git a/start.c b/kernel/start.c
similarity index 100%
rename from start.c
rename to kernel/start.c
diff --git a/stat.h b/kernel/stat.h
similarity index 100%
rename from stat.h
rename to kernel/stat.h
diff --git a/string.c b/kernel/string.c
similarity index 100%
rename from string.c
rename to kernel/string.c
diff --git a/swtch.S b/kernel/swtch.S
similarity index 100%
rename from swtch.S
rename to kernel/swtch.S
diff --git a/syscall.c b/kernel/syscall.c
similarity index 100%
rename from syscall.c
rename to kernel/syscall.c
diff --git a/syscall.h b/kernel/syscall.h
similarity index 100%
rename from syscall.h
rename to kernel/syscall.h
diff --git a/sysfile.c b/kernel/sysfile.c
similarity index 100%
rename from sysfile.c
rename to kernel/sysfile.c
diff --git a/sysproc.c b/kernel/sysproc.c
similarity index 100%
rename from sysproc.c
rename to kernel/sysproc.c
diff --git a/trampoline.S b/kernel/trampoline.S
similarity index 100%
rename from trampoline.S
rename to kernel/trampoline.S
diff --git a/trap.c b/kernel/trap.c
similarity index 100%
rename from trap.c
rename to kernel/trap.c
diff --git a/types.h b/kernel/types.h
similarity index 100%
rename from types.h
rename to kernel/types.h
diff --git a/uart.c b/kernel/uart.c
similarity index 100%
rename from uart.c
rename to kernel/uart.c
diff --git a/vm.c b/kernel/vm.c
similarity index 100%
rename from vm.c
rename to kernel/vm.c
diff --git a/mkfs.c b/mkfs/mkfs.c
similarity index 93%
rename from mkfs.c
rename to mkfs/mkfs.c
index 17040b7..246a4e2 100644
--- a/mkfs.c
+++ b/mkfs/mkfs.c
@@ -6,10 +6,10 @@
 #include <assert.h>
 
 #define stat xv6_stat  // avoid clash with host struct stat
-#include "types.h"
-#include "fs.h"
-#include "stat.h"
-#include "param.h"
+#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)
@@ -129,7 +129,14 @@ main(int argc, char *argv[])
   iappend(rootino, &de, sizeof(de));
 
   for(i = 2; i < argc; i++){
-    assert(index(argv[i], '/') == 0);
+    // 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){
       perror(argv[i]);
@@ -140,14 +147,14 @@ main(int argc, char *argv[])
     // 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(argv[i][0] == '_')
-      ++argv[i];
+    if(shortname[0] == '_')
+      shortname += 1;
 
     inum = ialloc(T_FILE);
 
     bzero(&de, sizeof(de));
     de.inum = xshort(inum);
-    strncpy(de.name, argv[i], DIRSIZ);
+    strncpy(de.name, shortname, DIRSIZ);
     iappend(rootino, &de, sizeof(de));
 
     while((cc = read(fd, buf, sizeof(buf))) > 0)
diff --git a/cat.c b/user/cat.c
similarity index 87%
rename from cat.c
rename to user/cat.c
index 5ddc820..d3d16c4 100644
--- a/cat.c
+++ b/user/cat.c
@@ -1,6 +1,6 @@
-#include "types.h"
-#include "stat.h"
-#include "user.h"
+#include "kernel/types.h"
+#include "kernel/stat.h"
+#include "user/user.h"
 
 char buf[512];
 
diff --git a/echo.c b/user/echo.c
similarity index 65%
rename from echo.c
rename to user/echo.c
index 806dee0..ef744ab 100644
--- a/echo.c
+++ b/user/echo.c
@@ -1,6 +1,6 @@
-#include "types.h"
-#include "stat.h"
-#include "user.h"
+#include "kernel/types.h"
+#include "kernel/stat.h"
+#include "user/user.h"
 
 int
 main(int argc, char *argv[])
diff --git a/forktest.c b/user/forktest.c
similarity index 90%
rename from forktest.c
rename to user/forktest.c
index 8bc984d..be4915e 100644
--- a/forktest.c
+++ b/user/forktest.c
@@ -1,9 +1,9 @@
 // Test that fork fails gracefully.
 // Tiny executable so that the limit can be filling the proc table.
 
-#include "types.h"
-#include "stat.h"
-#include "user.h"
+#include "kernel/types.h"
+#include "kernel/stat.h"
+#include "user/user.h"
 
 #define N  1000
 
diff --git a/grep.c b/user/grep.c
similarity index 96%
rename from grep.c
rename to user/grep.c
index adc4835..b5fdfc2 100644
--- a/grep.c
+++ b/user/grep.c
@@ -1,8 +1,8 @@
 // Simple grep.  Only supports ^ . * $ operators.
 
-#include "types.h"
-#include "stat.h"
-#include "user.h"
+#include "kernel/types.h"
+#include "kernel/stat.h"
+#include "user/user.h"
 
 char buf[1024];
 int match(char*, char*);
diff --git a/init.c b/user/init.c
similarity index 85%
rename from init.c
rename to user/init.c
index 046b551..f36ba31 100644
--- a/init.c
+++ b/user/init.c
@@ -1,9 +1,9 @@
 // init: The initial user-level program
 
-#include "types.h"
-#include "stat.h"
-#include "user.h"
-#include "fcntl.h"
+#include "kernel/types.h"
+#include "kernel/stat.h"
+#include "user/user.h"
+#include "kernel/fcntl.h"
 
 char *argv[] = { "sh", 0 };
 
diff --git a/initcode.S b/user/initcode.S
similarity index 100%
rename from initcode.S
rename to user/initcode.S
diff --git a/kill.c b/user/kill.c
similarity index 70%
rename from kill.c
rename to user/kill.c
index 364f6af..4b19d3c 100644
--- a/kill.c
+++ b/user/kill.c
@@ -1,6 +1,6 @@
-#include "types.h"
-#include "stat.h"
-#include "user.h"
+#include "kernel/types.h"
+#include "kernel/stat.h"
+#include "user/user.h"
 
 int
 main(int argc, char **argv)
diff --git a/ln.c b/user/ln.c
similarity index 73%
rename from ln.c
rename to user/ln.c
index cf8a64e..482dd79 100644
--- a/ln.c
+++ b/user/ln.c
@@ -1,6 +1,6 @@
-#include "types.h"
-#include "stat.h"
-#include "user.h"
+#include "kernel/types.h"
+#include "kernel/stat.h"
+#include "user/user.h"
 
 int
 main(int argc, char *argv[])
diff --git a/ls.c b/user/ls.c
similarity index 93%
rename from ls.c
rename to user/ls.c
index 2862913..c649c57 100644
--- a/ls.c
+++ b/user/ls.c
@@ -1,7 +1,7 @@
-#include "types.h"
-#include "stat.h"
-#include "user.h"
-#include "fs.h"
+#include "kernel/types.h"
+#include "kernel/stat.h"
+#include "user/user.h"
+#include "kernel/fs.h"
 
 char*
 fmtname(char *path)
diff --git a/mkdir.c b/user/mkdir.c
similarity index 78%
rename from mkdir.c
rename to user/mkdir.c
index 6e4c954..5f1e155 100644
--- a/mkdir.c
+++ b/user/mkdir.c
@@ -1,6 +1,6 @@
-#include "types.h"
-#include "stat.h"
-#include "user.h"
+#include "kernel/types.h"
+#include "kernel/stat.h"
+#include "user/user.h"
 
 int
 main(int argc, char *argv[])
diff --git a/printf.c b/user/printf.c
similarity index 95%
rename from printf.c
rename to user/printf.c
index c820305..0c6b34b 100644
--- a/printf.c
+++ b/user/printf.c
@@ -1,6 +1,6 @@
-#include "types.h"
-#include "stat.h"
-#include "user.h"
+#include "kernel/types.h"
+#include "kernel/stat.h"
+#include "user/user.h"
 
 #include <stdarg.h>
 
diff --git a/rm.c b/user/rm.c
similarity index 78%
rename from rm.c
rename to user/rm.c
index 4fd33c8..3076d83 100644
--- a/rm.c
+++ b/user/rm.c
@@ -1,6 +1,6 @@
-#include "types.h"
-#include "stat.h"
-#include "user.h"
+#include "kernel/types.h"
+#include "kernel/stat.h"
+#include "user/user.h"
 
 int
 main(int argc, char *argv[])
diff --git a/sh.c b/user/sh.c
similarity index 99%
rename from sh.c
rename to user/sh.c
index 054bab9..13c7883 100644
--- a/sh.c
+++ b/user/sh.c
@@ -1,8 +1,8 @@
 // Shell.
 
-#include "types.h"
-#include "user.h"
-#include "fcntl.h"
+#include "kernel/types.h"
+#include "user/user.h"
+#include "kernel/fcntl.h"
 
 // Parsed command representation
 #define EXEC  1
diff --git a/stressfs.c b/user/stressfs.c
similarity index 88%
rename from stressfs.c
rename to user/stressfs.c
index c0a4743..ef8f1cd 100644
--- a/stressfs.c
+++ b/user/stressfs.c
@@ -7,11 +7,11 @@
 //    for (i = 0; i < 40000; i++)
 //      asm volatile("");
 
-#include "types.h"
-#include "stat.h"
-#include "user.h"
-#include "fs.h"
-#include "fcntl.h"
+#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[])
diff --git a/ulib.c b/user/ulib.c
similarity index 92%
rename from ulib.c
rename to user/ulib.c
index 532fe42..ddda0f5 100644
--- a/ulib.c
+++ b/user/ulib.c
@@ -1,7 +1,7 @@
-#include "types.h"
-#include "stat.h"
-#include "fcntl.h"
-#include "user.h"
+#include "kernel/types.h"
+#include "kernel/stat.h"
+#include "kernel/fcntl.h"
+#include "user/user.h"
 
 char*
 strcpy(char *s, const char *t)
diff --git a/umalloc.c b/user/umalloc.c
similarity index 94%
rename from umalloc.c
rename to user/umalloc.c
index a7e7d2c..2092a32 100644
--- a/umalloc.c
+++ b/user/umalloc.c
@@ -1,7 +1,7 @@
-#include "types.h"
-#include "stat.h"
-#include "user.h"
-#include "param.h"
+#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.
diff --git a/user.h b/user/user.h
similarity index 100%
rename from user.h
rename to user/user.h
diff --git a/usertests.c b/user/usertests.c
similarity index 99%
rename from usertests.c
rename to user/usertests.c
index 292319e..beca8f9 100644
--- a/usertests.c
+++ b/user/usertests.c
@@ -1,11 +1,11 @@
-#include "param.h"
-#include "types.h"
-#include "stat.h"
-#include "user.h"
-#include "fs.h"
-#include "fcntl.h"
-#include "syscall.h"
-#include "memlayout.h"
+#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"
 
 char buf[8192];
 char name[3];
diff --git a/usys.pl b/user/usys.pl
similarity index 93%
rename from usys.pl
rename to user/usys.pl
index f8d47d5..01e426e 100755
--- a/usys.pl
+++ b/user/usys.pl
@@ -4,7 +4,7 @@
 
 print "# generated by usys.pl - do not edit\n";
 
-print "#include \"syscall.h\"\n";
+print "#include \"kernel/syscall.h\"\n";
 
 sub entry {
     my $name = shift;
diff --git a/wc.c b/user/wc.c
similarity index 91%
rename from wc.c
rename to user/wc.c
index d6a54df..e2543a6 100644
--- a/wc.c
+++ b/user/wc.c
@@ -1,6 +1,6 @@
-#include "types.h"
-#include "stat.h"
-#include "user.h"
+#include "kernel/types.h"
+#include "kernel/stat.h"
+#include "user/user.h"
 
 char buf[512];
 
diff --git a/zombie.c b/user/zombie.c
similarity index 68%
rename from zombie.c
rename to user/zombie.c
index ee817da..b56231a 100644
--- a/zombie.c
+++ b/user/zombie.c
@@ -1,9 +1,9 @@
 // Create a zombie process that
 // must be reparented at exit.
 
-#include "types.h"
-#include "stat.h"
-#include "user.h"
+#include "kernel/types.h"
+#include "kernel/stat.h"
+#include "user/user.h"
 
 int
 main(void)
diff --git a/vectors.pl b/vectors.pl
deleted file mode 100755
index d746d6b..0000000
--- a/vectors.pl
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/usr/bin/perl -w
-
-# Generate vectors.S, the trap/interrupt entry points.
-# There has to be one entry point per interrupt number
-# since otherwise there's no way for trap() to discover
-# the interrupt number.
-
-print "# generated by vectors.pl - do not edit\n";
-print "# handlers\n";
-print ".globl alltraps\n";
-for(my $i = 0; $i < 256; $i++){
-    print ".globl vector$i\n";
-    print "vector$i:\n";
-    if(!($i == 8 || ($i >= 10 && $i <= 14) || $i == 17)){
-        print "  push \$0\n";
-    }
-    print "  push \$$i\n";
-    print "  jmp alltraps\n";
-}
-
-print "\n# vector table\n";
-print ".data\n";
-print ".globl vectors\n";
-print "vectors:\n";
-for(my $i = 0; $i < 256; $i++){
-    print "  .quad vector$i\n";
-}
-
-# sample output:
-#   # handlers
-#   .globl alltraps
-#   .globl vector0
-#   vector0:
-#     push $0
-#     push $0
-#     jmp alltraps
-#   ...
-#   
-#   # vector table
-#   .data
-#   .globl vectors
-#   vectors:
-#     .quad vector0
-#     .quad vector1
-#     .quad vector2
-#   ...
-