diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/ia64/ia64/vm_machdep.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/sys/ia64/ia64/vm_machdep.c b/sys/ia64/ia64/vm_machdep.c index d5007dc..d945ded 100644 --- a/sys/ia64/ia64/vm_machdep.c +++ b/sys/ia64/ia64/vm_machdep.c @@ -94,6 +94,8 @@ #include <sys/user.h> +#include <i386/include/psl.h> + /* * quick version of vm_fault */ @@ -198,9 +200,15 @@ cpu_fork(td1, p2, td2, flags) * Set up return-value registers as fork() libc stub expects. */ p2tf = td2->td_frame; - p2tf->tf_r[FRAME_R8] = 0; /* child's pid (linux) */ - p2tf->tf_r[FRAME_R9] = 1; /* is child (FreeBSD) */ - p2tf->tf_r[FRAME_R10] = 0; /* no error */ + if (p2tf->tf_cr_ipsr & IA64_PSR_IS) { + p2tf->tf_r[FRAME_R8] = 0; /* child returns zero (eax) */ + p2tf->tf_r[FRAME_R10] = 1; /* is child (edx) */ + td2->td_pcb->pcb_eflag &= ~PSL_C; /* no error */ + } else { + p2tf->tf_r[FRAME_R8] = 0; /* child's pid (linux) */ + p2tf->tf_r[FRAME_R9] = 1; /* is child (FreeBSD) */ + p2tf->tf_r[FRAME_R10] = 0; /* no error */ + } /* * Turn off RSE for a moment and work out our current |