Gcc expects to be able to pick up the return

address off the stack, so put one there for it.
(Bug was hidden by bad segment limits.)
feat/start
rsc 2007-08-14 04:56:30 +00:00
parent 2ef3a64bb4
commit 8c4b5fc5b3
1 changed files with 11 additions and 4 deletions

15
main.c
View File

@ -128,12 +128,12 @@ process0(void)
p0->cwd = iget(rootdev, 1); p0->cwd = iget(rootdev, 1);
iunlock(p0->cwd); iunlock(p0->cwd);
// dummy user memory to make copyproc() happy. // Dummy user memory to make copyproc() happy.
// must be big enough to hold the init binary. // Must be big enough to hold the init binary and stack.
p0->sz = PAGE; p0->sz = 2*PAGE;
p0->mem = kalloc(p0->sz); p0->mem = kalloc(p0->sz);
// fake a trap frame as if a user process had made a system // Fake a trap frame as if a user process had made a system
// call, so that copyproc will have a place for the new // call, so that copyproc will have a place for the new
// process to return to. // process to return to.
p0->tf = &tf; p0->tf = &tf;
@ -143,6 +143,13 @@ process0(void)
p0->tf->eflags = FL_IF; p0->tf->eflags = FL_IF;
p0->tf->esp = p0->sz; p0->tf->esp = p0->sz;
// Push bogus return address, both to cause problems
// if main returns and also because gcc can generate
// function prologs that expect to be able to read the
// return address off the stack without causing a fault.
p0->tf->esp -= 4;
*(uint*)(p0->mem + p0->tf->esp) = 0xefefefef;
p1 = copyproc(p0); p1 = copyproc(p0);
load_icode(p1, _binary__init_start, (uint) _binary__init_size); load_icode(p1, _binary__init_start, (uint) _binary__init_size);