diff options
author | newton <newton@FreeBSD.org> | 1999-02-25 14:32:29 +0000 |
---|---|---|
committer | newton <newton@FreeBSD.org> | 1999-02-25 14:32:29 +0000 |
commit | 1985c3db8a6636e2fbb18f31a09bea9df2d8d4e4 (patch) | |
tree | 97032bb71490bd251fec4350b2211c2fcb16d15f /sys/i386/svr4 | |
parent | 84c729ad70c12f9c228264648e31fec730f85357 (diff) | |
download | FreeBSD-src-1985c3db8a6636e2fbb18f31a09bea9df2d8d4e4.zip FreeBSD-src-1985c3db8a6636e2fbb18f31a09bea9df2d8d4e4.tar.gz |
Integrated a patch provided by Guido to more correctly work out the
flags returned from getcontext().
Submitted by: Guido van Rooij <guido@gvr.org>
Diffstat (limited to 'sys/i386/svr4')
-rw-r--r-- | sys/i386/svr4/svr4_machdep.c | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/sys/i386/svr4/svr4_machdep.c b/sys/i386/svr4/svr4_machdep.c index 155fabe..381a9bc 100644 --- a/sys/i386/svr4/svr4_machdep.c +++ b/sys/i386/svr4/svr4_machdep.c @@ -113,6 +113,7 @@ svr4_getcontext(p, uc, mask, oonstack) memset(uc, 0, sizeof(struct svr4_ucontext)); + uc->uc_link = p->p_emuldata; /* * Set the general purpose registers */ @@ -140,8 +141,8 @@ svr4_getcontext(p, uc, mask, oonstack) r[SVR4_X86_EDX] = tf->tf_edx; r[SVR4_X86_ECX] = tf->tf_ecx; r[SVR4_X86_EAX] = tf->tf_eax; - r[SVR4_X86_TRAPNO] = 0; - r[SVR4_X86_ERR] = 0; + r[SVR4_X86_TRAPNO] = tf->tf_trapno; + r[SVR4_X86_ERR] = tf->tf_err; r[SVR4_X86_EIP] = tf->tf_eip; r[SVR4_X86_CS] = tf->tf_cs; r[SVR4_X86_UESP] = 0; @@ -150,7 +151,13 @@ svr4_getcontext(p, uc, mask, oonstack) /* * Set the signal stack */ +#if 0 bsd_to_svr4_sigaltstack(sf, s); +#else + s->ss_sp = (void *)(((u_long) tf->tf_esp) & ~(16384 - 1)); + s->ss_size = 16384; + s->ss_flags = 0; +#endif /* * Set the signal mask @@ -160,7 +167,7 @@ svr4_getcontext(p, uc, mask, oonstack) /* * Set the flags */ - uc->uc_flags = SVR4_UC_ALL; + uc->uc_flags = SVR4_UC_STACK|SVR4_UC_SIGMASK|SVR4_UC_CPU; } @@ -195,6 +202,9 @@ svr4_setcontext(p, uc) * set to 0 right now? */ + if ((uc->uc_flags & SVR4_UC_CPU) == 0) + return 0; + tf = p->p_md.md_regs; /* @@ -232,21 +242,28 @@ svr4_setcontext(p, uc) tf->tf_edx = r[SVR4_X86_EDX]; tf->tf_ecx = r[SVR4_X86_ECX]; tf->tf_eax = r[SVR4_X86_EAX]; + tf->tf_trapno = r[SVR4_X86_TRAPNO]; + tf->tf_err = r[SVR4_X86_ERR]; tf->tf_eip = r[SVR4_X86_EIP]; tf->tf_cs = r[SVR4_X86_CS]; tf->tf_ss = r[SVR4_X86_SS]; tf->tf_esp = r[SVR4_X86_ESP]; + p->p_emuldata = uc->uc_link; /* * restore signal stack */ - svr4_to_bsd_sigaltstack(s, sf); + if (uc->uc_flags & SVR4_UC_STACK) { + svr4_to_bsd_sigaltstack(s, sf); + } /* * restore signal mask */ - svr4_to_bsd_sigset(&uc->uc_sigmask, &mask); - p->p_sigmask = mask & ~sigcantmask; + if (uc->uc_flags & SVR4_UC_SIGMASK) { + svr4_to_bsd_sigset(&uc->uc_sigmask, &mask); + p->p_sigmask = mask & ~sigcantmask; + } return 0; /*EJUSTRETURN;*/ } |