diff options
| author | Robert Morris <rtm@csail.mit.edu> | 2010-09-29 14:12:26 -0400 | 
|---|---|---|
| committer | Robert Morris <rtm@csail.mit.edu> | 2010-09-29 14:12:26 -0400 | 
| commit | 2ea6c764c34d3025b5f3121a0919fda7d1eb9b01 (patch) | |
| tree | a224084f23defb1d9cf24fee3a09827deae3485c | |
| parent | 06feabeceeccc8dbd2658e9f10dd139c14f01ba6 (diff) | |
| download | xv6-labs-2ea6c764c34d3025b5f3121a0919fda7d1eb9b01.tar.gz xv6-labs-2ea6c764c34d3025b5f3121a0919fda7d1eb9b01.tar.bz2 xv6-labs-2ea6c764c34d3025b5f3121a0919fda7d1eb9b01.zip | |
even more fabulous exec
| -rw-r--r-- | exec.c | 27 | 
1 files changed, 8 insertions, 19 deletions
| @@ -81,30 +81,19 @@ exec(char *path, char **argv)      copyout(pgdir, sp, argv[i], strlen(argv[i]) + 1);    } -  // push 0 for argv[argc] -  sp -= 4; -  int zero = 0; -  copyout(pgdir, sp, &zero, 4); +#define PUSH(x) { int xx = (int)(x); sp -= 4; copyout(pgdir, sp, &xx, 4); } + +  PUSH(0); // argv[argc] is zero    // push argv[] elements -  for(i = argc - 1; i >= 0; --i){ -    sp -= 4; -    copyout(pgdir, sp, &strings[i], 4); -  } +  for(i = argc - 1; i >= 0; --i) +    PUSH(strings[i]); -  // push argv -  uint argvaddr = sp; -  sp -= 4; -  copyout(pgdir, sp, &argvaddr, 4); +  PUSH(sp); // argv -  // push argc -  sp -= 4; -  copyout(pgdir, sp, &argc, 4); +  PUSH(argc); -  // push 0 in case main returns -  sp -= 4; -  uint ffffffff = 0xffffffff; -  copyout(pgdir, sp, &ffffffff, 4); +  PUSH(0xffffffff); // in case main tries to return    if(sp < sz - PGSIZE)      goto bad; | 
