summaryrefslogtreecommitdiff
path: root/exec.c
diff options
context:
space:
mode:
authorRobert Morris <[email protected]>2010-09-29 14:12:26 -0400
committerRobert Morris <[email protected]>2010-09-29 14:12:26 -0400
commit2ea6c764c34d3025b5f3121a0919fda7d1eb9b01 (patch)
treea224084f23defb1d9cf24fee3a09827deae3485c /exec.c
parent06feabeceeccc8dbd2658e9f10dd139c14f01ba6 (diff)
downloadxv6-labs-2ea6c764c34d3025b5f3121a0919fda7d1eb9b01.tar.gz
xv6-labs-2ea6c764c34d3025b5f3121a0919fda7d1eb9b01.tar.bz2
xv6-labs-2ea6c764c34d3025b5f3121a0919fda7d1eb9b01.zip
even more fabulous exec
Diffstat (limited to 'exec.c')
-rw-r--r--exec.c27
1 files changed, 8 insertions, 19 deletions
diff --git a/exec.c b/exec.c
index c0ea515..1673a38 100644
--- a/exec.c
+++ b/exec.c
@@ -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;