commit c081fa81205eadb0821b9eba09eada2a4e371305
parent 5eda3e41b82ede156b329c90c2b10bd6e771bbe6
Author: Brian Swetland <swetland@frotz.net>
Date: Fri, 3 Jan 2014 20:32:13 -0800
64bit support in exec.c and proc.c
- correct word size on the userspace startup stack
- correct argument passing for 64bit
- correct trapframe setup for 64bit
Diffstat:
2 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/kernel/exec.c b/kernel/exec.c
@@ -61,7 +61,7 @@ exec(char *path, char **argv)
for(argc = 0; argv[argc]; argc++) {
if(argc >= MAXARG)
goto bad;
- sp = (sp - (strlen(argv[argc]) + 1)) & ~3;
+ sp = (sp - (strlen(argv[argc]) + 1)) & ~(sizeof(uintp)-1);
if(copyout(pgdir, sp, argv[argc], strlen(argv[argc]) + 1) < 0)
goto bad;
ustack[3+argc] = sp;
@@ -70,10 +70,15 @@ exec(char *path, char **argv)
ustack[0] = 0xffffffff; // fake return PC
ustack[1] = argc;
- ustack[2] = sp - (argc+1)*4; // argv pointer
+ ustack[2] = sp - (argc+1)*sizeof(uintp); // argv pointer
- sp -= (3+argc+1) * 4;
- if(copyout(pgdir, sp, ustack, (3+argc+1)*4) < 0)
+#if X64
+ proc->tf->rdi = argc;
+ proc->tf->rsi = sp - (argc+1)*sizeof(uintp);
+#endif
+
+ sp -= (3+argc+1) * sizeof(uintp);
+ if(copyout(pgdir, sp, ustack, (3+argc+1)*sizeof(uintp)) < 0)
goto bad;
// Save program name for debugging.
diff --git a/kernel/proc.c b/kernel/proc.c
@@ -90,8 +90,10 @@ userinit(void)
memset(p->tf, 0, sizeof(*p->tf));
p->tf->cs = (SEG_UCODE << 3) | DPL_USER;
p->tf->ds = (SEG_UDATA << 3) | DPL_USER;
+#ifndef X64
p->tf->es = p->tf->ds;
p->tf->ss = p->tf->ds;
+#endif
p->tf->eflags = FL_IF;
p->tf->esp = PGSIZE;
p->tf->eip = 0; // beginning of initcode.S
@@ -431,6 +433,7 @@ kill(int pid)
void
procdump(void)
{
+#ifndef X64
static char *states[] = {
[UNUSED] "unused",
[EMBRYO] "embryo",
@@ -459,6 +462,7 @@ procdump(void)
}
cprintf("\n");
}
+#endif
}