diff --git a/entry.S b/entry.S
index f814aeb..4fd85c6 100644
--- a/entry.S
+++ b/entry.S
@@ -54,10 +54,10 @@ entry:
   # Set up the stack pointer.
   movl $(stack + STACK), %esp
 
-  # Call main(), which switches to executing at
+  # Jump to main(), and switch to executing at
   # high addresses. The indirect call is needed because
   # the assembler produces a PC-relative instruction
-  # for a direct call. 
+  # for a direct jump.
   mov $main, %eax
   jmp *%eax
 
diff --git a/proc.c b/proc.c
index bdc119f..05cb85f 100644
--- a/proc.c
+++ b/proc.c
@@ -49,7 +49,7 @@ found:
   p->pid = nextpid++;
   release(&ptable.lock);
 
-  // Allocate kernel stack if possible.
+  // Allocate kernel stack.
   if((p->kstack = kalloc()) == 0){
     p->state = UNUSED;
     return 0;
diff --git a/usertests.c b/usertests.c
index 655610c..62ce8d7 100644
--- a/usertests.c
+++ b/usertests.c
@@ -1508,30 +1508,41 @@ bsstest(void)
   printf(stdout, "bss test ok\n");
 }
 
-// does exec do something sensible if the arguments
-// are larger than a page?
+// does exec return an error if the arguments
+// are larger than a page? or does it write
+// below the stack and wreck the instructions/data?
 void
 bigargtest(void)
 {
-  int pid, ppid;
+  int pid, ppid, fd;
 
+  unlink("bigarg-ok");
   ppid = getpid();
   pid = fork();
   if(pid == 0){
-    char *args[32+1];
+    static char *args[MAXARG];
     int i;
-    for(i = 0; i < 32; i++)
-      args[i] = "bigargs test: failed\n                                                                                                                     ";
-    args[32] = 0;
-    printf(stdout, "bigarg test\n");
+    for(i = 0; i < MAXARG-1; i++)
+      args[i] = "bigargs test: failed\n                                                                                                                                                                                                       ";
+    args[MAXARG-1] = 0;
+    printf(stdout, "bigarg test %d\n", (MAXARG-1)*strlen(args[0]));
     exec("echo", args);
     printf(stdout, "bigarg test ok\n");
+    fd = open("bigarg-ok", O_CREATE);
+    close(fd);
     exit();
   } else if(pid < 0){
     printf(stdout, "bigargtest: fork failed\n");
     exit();
   }
   wait();
+  fd = open("bigarg-ok", 0);
+  if(fd < 0){
+    printf(stdout, "bigarg test failed!\n");
+    exit();
+  }
+  close(fd);
+  unlink("bigarg-ok");
 }
 
 // what happens when the file system runs out of blocks?
@@ -1606,6 +1617,7 @@ main(int argc, char *argv[])
   }
   close(open("usertests.ran", O_CREATE));
 
+  bigargtest();
   bigwrite();
   bigargtest();
   bsstest();
diff --git a/vm.c b/vm.c
index 32775a1..7bda3dd 100644
--- a/vm.c
+++ b/vm.c
@@ -68,7 +68,8 @@ walkpgdir(pde_t *pgdir, const void *va, char* (*alloc)(void))
 // physical addresses starting at pa. va and size might not
 // be page-aligned.
 static int
-mappages(pde_t *pgdir, void *va, uint size, uint pa, int perm, char* (*alloc)(void))
+mappages(pde_t *pgdir, void *va, uint size, uint pa,
+         int perm, char* (*alloc)(void))
 {
   char *a, *last;
   pte_t *pte;
@@ -343,7 +344,7 @@ copyout(pde_t *pgdir, uint va, void *p, uint len)
 {
   char *buf, *pa0;
   uint n, va0;
-  
+
   buf = (char*)p;
   while(len > 0){
     va0 = (uint)PGROUNDDOWN(va);