xv6

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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:
Mkernel/exec.c | 13+++++++++----
Mkernel/proc.c | 4++++
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 }