diff options
| -rw-r--r-- | entry.S | 4 | ||||
| -rw-r--r-- | proc.c | 2 | ||||
| -rw-r--r-- | usertests.c | 28 | ||||
| -rw-r--r-- | vm.c | 5 | 
4 files changed, 26 insertions, 13 deletions
| @@ -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 @@ -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(); @@ -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); | 
