summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>1997-01-27 01:16:15 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>1997-01-27 01:16:15 +0000
commitec9340243cdfcec33e21aa6741c8359ece354645 (patch)
tree10bdeb4ab9ebfc92df5d5e8fbba978076c4bf3f9 /sys/arch
parentbc11aca5b92d3ec0b32ecd050fa17553c784682c (diff)
i386 part of siginfo
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/i386/i386/machdep.c88
-rw-r--r--sys/arch/i386/include/frame.h2
2 files changed, 88 insertions, 2 deletions
diff --git a/sys/arch/i386/i386/machdep.c b/sys/arch/i386/i386/machdep.c
index f71fa034c0b..a114f1715bb 100644
--- a/sys/arch/i386/i386/machdep.c
+++ b/sys/arch/i386/i386/machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: machdep.c,v 1.34 1997/01/16 19:57:17 kstailey Exp $ */
+/* $OpenBSD: machdep.c,v 1.35 1997/01/27 01:16:12 deraadt Exp $ */
/* $NetBSD: machdep.c,v 1.202 1996/05/18 15:54:59 christos Exp $ */
/*-
@@ -625,6 +625,7 @@ sendsig(catcher, sig, mask, code)
frame.sf_code = code;
frame.sf_scp = &fp->sf_sc;
frame.sf_handler = catcher;
+ frame.sf_sip = NULL;
/*
* Build the signal context to be used by sigreturn.
@@ -661,6 +662,20 @@ sendsig(catcher, sig, mask, code)
frame.sf_sc.sc_esp = tf->tf_esp;
frame.sf_sc.sc_ss = tf->tf_ss;
+ if (psp->ps_siginfo & sigmask(sig)) {
+ frame.sf_sip = &fp->sf_si;
+ initsiginfo(frame.sf_sip, sig);
+ fixsiginfo(frame.sf_sip, sig, code, (caddr_t)rcr2());
+ if (sig == SIGSEGV) {
+ /* try to be more specific about read or write */
+ if (tf->tf_err & PGEX_W)
+ frame.sf_si.si_code = SEGV_ACCERR;
+ else
+ frame.sf_si.si_code = SEGV_MAPERR;
+ }
+ }
+
+ /* XXX don't copyout siginfo if not needed? */
if (copyout(&frame, fp, sizeof(frame)) != 0) {
/*
* Process has trashed its stack; give it an illegal
@@ -766,6 +781,75 @@ sys_sigreturn(p, v, retval)
return (EJUSTRETURN);
}
+void
+fixsiginfo(si, sig, code, addr)
+ siginfo_t *si;
+ int sig;
+ u_long code;
+ caddr_t addr;
+{
+ si->si_addr = addr;
+
+ switch (code) {
+ case T_PRIVINFLT:
+ si->si_code = ILL_PRVOPC;
+ si->si_trapno = T_PRIVINFLT;
+ break;
+ case T_BPTFLT:
+ si->si_code = TRAP_BRKPT;
+ si->si_trapno = T_BPTFLT;
+ break;
+ case T_ARITHTRAP:
+ si->si_code = FPE_INTOVF;
+ si->si_trapno = T_DIVIDE;
+ break;
+ case T_PROTFLT:
+ si->si_code = SEGV_ACCERR;
+ si->si_trapno = T_PROTFLT;
+ break;
+ case T_TRCTRAP:
+ si->si_code = TRAP_TRACE;
+ si->si_trapno = T_TRCTRAP;
+ break;
+ case T_PAGEFLT:
+ si->si_code = SEGV_ACCERR;
+ si->si_trapno = T_PAGEFLT;
+ break;
+ case T_ALIGNFLT:
+ si->si_code = BUS_ADRALN;
+ si->si_trapno = T_ALIGNFLT;
+ break;
+ case T_DIVIDE:
+ si->si_code = FPE_FLTDIV;
+ si->si_trapno = T_DIVIDE;
+ break;
+ case T_OFLOW:
+ si->si_code = FPE_FLTOVF;
+ si->si_trapno = T_DIVIDE;
+ break;
+ case T_BOUND:
+ si->si_code = FPE_FLTSUB;
+ si->si_trapno = T_BOUND;
+ break;
+ case T_DNA:
+ si->si_code = FPE_FLTINV;
+ si->si_trapno = T_DNA;
+ break;
+ case T_FPOPFLT:
+ si->si_code = FPE_FLTINV;
+ si->si_trapno = T_FPOPFLT;
+ break;
+ case T_SEGNPFLT:
+ si->si_code = SEGV_MAPERR;
+ si->si_trapno = T_SEGNPFLT;
+ break;
+ case T_STKFLT:
+ si->si_code = ILL_BADSTK;
+ si->si_trapno = T_STKFLT;
+ break;
+ }
+}
+
int waittime = -1;
struct pcb dumppcb;
@@ -929,7 +1013,7 @@ dumpsys()
}
#if 0 /* XXX this doesn't work. grr. */
- /* toss any characters present prior to dump */
+ /* toss any characters present prior to dump */
while (sget() != NULL); /*syscons and pccons differ */
#endif
diff --git a/sys/arch/i386/include/frame.h b/sys/arch/i386/include/frame.h
index 6b7e395bc66..8b9d043d00d 100644
--- a/sys/arch/i386/include/frame.h
+++ b/sys/arch/i386/include/frame.h
@@ -117,6 +117,8 @@ struct sigframe {
int sf_signum;
int sf_code;
struct sigcontext *sf_scp;
+ siginfo_t *sf_sip;
sig_t sf_handler;
struct sigcontext sf_sc;
+ siginfo_t sf_si;
};