summaryrefslogtreecommitdiffstats
path: root/sys/i386/svr4
diff options
context:
space:
mode:
authornewton <newton@FreeBSD.org>1999-02-25 14:32:29 +0000
committernewton <newton@FreeBSD.org>1999-02-25 14:32:29 +0000
commit1985c3db8a6636e2fbb18f31a09bea9df2d8d4e4 (patch)
tree97032bb71490bd251fec4350b2211c2fcb16d15f /sys/i386/svr4
parent84c729ad70c12f9c228264648e31fec730f85357 (diff)
downloadFreeBSD-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.c29
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;*/
}
OpenPOWER on IntegriCloud