提交 69d390f1 创建 作者: Silas Boyd-Wickizer's avatar Silas Boyd-Wickizer

Update exec for 64-bit ABI.

上级 04cad1f2
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
#include "elf.h" #include "elf.h"
#include "cpu.h" #include "cpu.h"
#define USTACKPAGES 2
int int
exec(char *path, char **argv) exec(char *path, char **argv)
{ {
...@@ -28,7 +30,7 @@ exec(char *path, char **argv) ...@@ -28,7 +30,7 @@ exec(char *path, char **argv)
int i; int i;
uptr sp; uptr sp;
int argc; int argc;
uptr ustack[3+MAXARG+1]; uptr ustack[1+MAXARG+1];
char *s, *last; char *s, *last;
struct vmap *oldvmap; struct vmap *oldvmap;
...@@ -56,6 +58,7 @@ exec(char *path, char **argv) ...@@ -56,6 +58,7 @@ exec(char *path, char **argv)
continue; continue;
if(ph.memsz < ph.filesz) if(ph.memsz < ph.filesz)
goto bad; goto bad;
// XXX(sbw) vaddr doesn't have to be page aligned..
if(ph.vaddr % PGSIZE) { if(ph.vaddr % PGSIZE) {
cprintf("unaligned ph.va\n"); cprintf("unaligned ph.va\n");
goto bad; goto bad;
...@@ -98,9 +101,9 @@ exec(char *path, char **argv) ...@@ -98,9 +101,9 @@ exec(char *path, char **argv)
vmn = 0; vmn = 0;
// Allocate a one-page stack at the top of the (user) address space // Allocate a one-page stack at the top of the (user) address space
if((vmn = vmn_allocpg(1)) == 0) if((vmn = vmn_allocpg(USTACKPAGES)) == 0)
goto bad; goto bad;
if(vmap_insert(vmap, vmn, USERTOP-PGSIZE) < 0) if(vmap_insert(vmap, vmn, USERTOP-(USTACKPAGES*PGSIZE)) < 0)
goto bad; goto bad;
vmn = 0; vmn = 0;
...@@ -113,16 +116,16 @@ exec(char *path, char **argv) ...@@ -113,16 +116,16 @@ exec(char *path, char **argv)
sp &= ~7; sp &= ~7;
if(copyout(vmap, sp, argv[argc], strlen(argv[argc]) + 1) < 0) if(copyout(vmap, sp, argv[argc], strlen(argv[argc]) + 1) < 0)
goto bad; goto bad;
ustack[3+argc] = sp; ustack[1+argc] = sp;
} }
ustack[3+argc] = 0; ustack[1+argc] = 0;
ustack[0] = 0xffffffff; // fake return PC ustack[0] = 0xffffffffffffffffull; // fake return PC
ustack[1] = argc; myproc()->tf->rdi = argc;
ustack[2] = sp - (argc+1)*8; // argv pointer myproc()->tf->rsi = sp - (argc+1)*8;
sp -= (3+argc+1) * 8; sp -= (1+argc+1) * 8;
if(copyout(vmap, sp, ustack, (3+argc+1)*8) < 0) if(copyout(vmap, sp, ustack, (1+argc+1)*8) < 0)
goto bad; goto bad;
// Save program name for debugging. // Save program name for debugging.
...@@ -137,6 +140,7 @@ exec(char *path, char **argv) ...@@ -137,6 +140,7 @@ exec(char *path, char **argv)
myproc()->brk = brk + 8; // XXX so that brk-1 points within heap vma.. myproc()->brk = brk + 8; // XXX so that brk-1 points within heap vma..
myproc()->tf->rip = elf.entry; // main myproc()->tf->rip = elf.entry; // main
myproc()->tf->rsp = sp; myproc()->tf->rsp = sp;
switchuvm(myproc()); switchuvm(myproc());
vmap_decref(oldvmap); vmap_decref(oldvmap);
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论