diff --git a/pipe.c b/pipe.c
index b866a0ea9cfd0fedf39c7043af505ccde71beb73..a207df192320faf0e564e395a505fd268528b386 100644
--- a/pipe.c
+++ b/pipe.c
@@ -45,6 +45,7 @@ pipe_alloc(struct file **f0, struct file **f1)
   (*f1)->writable = 1;
   (*f1)->pipe = p;
   return 0;
+
  oops:
   if(p)
     kfree((char*) p, PAGE);
@@ -78,6 +79,7 @@ pipe_close(struct pipe *p, int writable)
     kfree((char*) p, PAGE);
 }
 
+//PAGEBREAK: 20
 int
 pipe_write(struct pipe *p, char *addr, int n)
 {
@@ -117,7 +119,6 @@ pipe_read(struct pipe *p, char *addr, int n)
     }
     sleep(&p->readp, &p->lock);
   }
-
   for(i = 0; i < n; i++){
     if(p->readp == p->writep)
       break;
diff --git a/runoff b/runoff
index 919d8375e87f9afe00227737dd8de3f786201a8f..092c8b6846d38f2deedcda45619280f84362e085 100755
--- a/runoff
+++ b/runoff
@@ -35,6 +35,7 @@ pr -e8 -t runoff.list | awk '
 	close(f)
 	n=$1
 	printf("%02d %s\n", n/100, s);
+	printf("TOC: %04d %s\n", n, s) >"fmt/tocdata"
 	next
 }
 {
@@ -42,6 +43,48 @@ pr -e8 -t runoff.list | awk '
 }' | pr -3 -t >>fmt/toc
 cat toc.ftr >>fmt/toc
 
+# check for bad alignments
+perl -e '
+	while(<>){
+		chomp;
+		s!#.*!!;
+		s!\s+! !g;
+		s! +$!!;
+		next if /^$/;
+		
+		if(/TOC: (\d+) (.*)/){
+			$toc{$2} = $1;
+			next;
+		}
+		
+		if(/even: (.*)/){
+			$file = $1;
+			if(!defined($toc{$file})){
+				print STDERR "Have no toc for $file\n";
+				next;
+			}
+			if($toc{$file} =~ /^\d\d[^0]/){
+				print STDERR "$file does not start on a fresh page.\n";
+			}
+			next;
+		}
+		
+		if(/odd: (.*)/){
+			$file = $1;
+			if(!defined($toc{$file})){
+				print STDERR "Have no toc for $file\n";
+				next;
+			}
+			if($toc{$file} =~ /^\d\d[^5]/){
+				print STDERR "$file does not start on a second half page.\n";
+			}
+			next;
+		}
+		
+		print STDERR "Unknown spec: $_\n";
+	}
+' fmt/tocdata runoff.spec
+
 # make definition list
 cd fmt
 perl -e '
diff --git a/runoff.spec b/runoff.spec
new file mode 100644
index 0000000000000000000000000000000000000000..53e98eea2a31aea1b94d5eebf991c7e199aa1e91
--- /dev/null
+++ b/runoff.spec
@@ -0,0 +1,11 @@
+even: mmu.h
+even: bootasm.S
+even: bootother.S
+even: bootmain.c
+even: main.c
+even: spinlock.c
+even: proc.h
+even: proc.c
+odd: kalloc.c
+even: trap.c
+odd: bio.c
diff --git a/show1 b/show1
new file mode 100755
index 0000000000000000000000000000000000000000..3637c72775fbcf11cfcfdf95712f41bbc3d88862
--- /dev/null
+++ b/show1
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+runoff1 "$@" | pr.pl -h "xv6/$@" | mpage -m50t50b -o -bLetter -T -t -2 -FCourier -L60 >x.ps; gv --swap x.ps
diff --git a/syscall.c b/syscall.c
index d6973373ac4941225c5386d75ddce1038922b20f..7f4caa1d3f77a317632aa43002ecaacf76673c1f 100644
--- a/syscall.c
+++ b/syscall.c
@@ -98,6 +98,7 @@ extern int sys_kill(void);
 extern int sys_link(void);
 extern int sys_mkdir(void);
 extern int sys_mknod(void);
+//PAGEBREAK: 0
 extern int sys_open(void);
 extern int sys_pipe(void);
 extern int sys_read(void);
diff --git a/trap.c b/trap.c
index 1faa49e1d2e708569e7c614cea4995c7d8f19c0c..43b5a4202f52c58d13271e8cca40c31645df167b 100644
--- a/trap.c
+++ b/trap.c
@@ -40,11 +40,11 @@ trap(struct trapframe *tf)
     return;
   }
 
-  // PAGEBREAK: 10
   // Increment nlock to make sure interrupts stay off
   // during interrupt handler.  Decrement before returning.
   cpus[cpu()].nlock++;
 
+  // PAGEBREAK: 10
   switch(tf->trapno){
   case IRQ_OFFSET + IRQ_TIMER:
     lapic_timerintr();
@@ -80,8 +80,8 @@ trap(struct trapframe *tf)
   default:
     if(cp) {
       // Assume process divided by zero or dereferenced null, etc.
-      cprintf("pid %d %s: unhandled trap %d on cpu %d eip %x -- kill proc\n",
-              cp->pid, cp->name, tf->trapno, cpu(), tf->eip);
+      cprintf("pid %d %s: unhandled trap %d err %d on cpu %d eip %x -- kill proc\n",
+              cp->pid, cp->name, tf->trapno, tf->err, cpu(), tf->eip);
       proc_exit();
     }