summaryrefslogtreecommitdiffstats
path: root/sys/i386
diff options
context:
space:
mode:
authoreivind <eivind@FreeBSD.org>1998-04-28 18:15:08 +0000
committereivind <eivind@FreeBSD.org>1998-04-28 18:15:08 +0000
commit67c7bb9c04ed76649b6be0484dcfaa84fa554bcd (patch)
tree1a99fec62896b96dd22a726554f4d62d24de741f /sys/i386
parent470efec49a7164af77eed73b6ff91740609ea273 (diff)
downloadFreeBSD-src-67c7bb9c04ed76649b6be0484dcfaa84fa554bcd.zip
FreeBSD-src-67c7bb9c04ed76649b6be0484dcfaa84fa554bcd.tar.gz
Translate T_PROTFLT to SIGSEGV instead of SIGBUS when running under
Linux emulation. This make Allegro Common Lisp 4.3 work under FreeBSD! Submitted by: Fred Gilham <gilham@csl.sri.com> Commented on by: bde, dg, msmith, tg Hoping he got everything right: eivind
Diffstat (limited to 'sys/i386')
-rw-r--r--sys/i386/i386/trap.c6
-rw-r--r--sys/i386/ibcs2/ibcs2_sysvec.c3
-rw-r--r--sys/i386/linux/linux_sysvec.c27
3 files changed, 33 insertions, 3 deletions
diff --git a/sys/i386/i386/trap.c b/sys/i386/i386/trap.c
index 7f0f801..3325d32 100644
--- a/sys/i386/i386/trap.c
+++ b/sys/i386/i386/trap.c
@@ -35,7 +35,7 @@
* SUCH DAMAGE.
*
* from: @(#)trap.c 7.4 (Berkeley) 5/13/91
- * $Id: trap.c,v 1.125 1998/03/30 09:48:27 phk Exp $
+ * $Id: trap.c,v 1.126 1998/04/15 17:45:07 bde Exp $
*/
/*
@@ -545,6 +545,10 @@ kernel_trap:
return;
}
+ /* Translate fault for emulators (e.g. Linux) */
+ if (*p->p_sysent->sv_transtrap)
+ i = (*p->p_sysent->sv_transtrap)(i, type);
+
trapsignal(p, i, ucode);
#ifdef DEBUG
diff --git a/sys/i386/ibcs2/ibcs2_sysvec.c b/sys/i386/ibcs2/ibcs2_sysvec.c
index b7ecbca..7eefe14 100644
--- a/sys/i386/ibcs2/ibcs2_sysvec.c
+++ b/sys/i386/ibcs2/ibcs2_sysvec.c
@@ -27,7 +27,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id$
+ * $Id: ibcs2_sysvec.c,v 1.6 1997/02/22 09:33:28 peter Exp $
*/
#include <sys/param.h>
@@ -49,6 +49,7 @@ struct sysentvec ibcs2_svr3_sysvec = {
bsd_to_ibcs2_sig,
ELAST,
bsd_to_ibcs2_errno,
+ 0, /* trap-to-signal translation function */
0, /* fixup */
sendsig,
sigcode, /* use generic trampoline */
diff --git a/sys/i386/linux/linux_sysvec.c b/sys/i386/linux/linux_sysvec.c
index 134ff9e..a7da306 100644
--- a/sys/i386/linux/linux_sysvec.c
+++ b/sys/i386/linux/linux_sysvec.c
@@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: linux_sysvec.c,v 1.26 1998/02/13 07:34:52 bde Exp $
+ * $Id: linux_sysvec.c,v 1.27 1998/04/13 17:49:51 sos Exp $
*/
/* XXX we use functions that might not exist. */
@@ -98,6 +98,29 @@ int linux_to_bsd_signal[LINUX_NSIG] = {
SIGXCPU, SIGXFSZ, SIGVTALRM, SIGPROF, SIGWINCH, SIGURG, SIGURG, 0
};
+/*
+ * If FreeBSD & Linux have a difference of opinion about what a trap
+ * means, deal with it here.
+ */
+static int
+translate_traps(int signal, int trap_code)
+{
+ switch(signal) {
+ case SIGBUS:
+ switch(trap_code) {
+ case T_PROTFLT:
+ case T_TSSFLT:
+ case T_DOUBLEFLT:
+ case T_PAGEFLT:
+ return SIGSEGV;
+ default:
+ return signal;
+ }
+ default:
+ return signal;
+ }
+}
+
static int
linux_fixup(int **stack_base, struct image_params *imgp)
{
@@ -374,6 +397,7 @@ struct sysentvec linux_sysvec = {
bsd_to_linux_signal,
ELAST,
bsd_to_linux_errno,
+ translate_traps,
linux_fixup,
linux_sendsig,
linux_sigcode,
@@ -390,6 +414,7 @@ struct sysentvec elf_linux_sysvec = {
bsd_to_linux_signal,
ELAST,
bsd_to_linux_errno,
+ translate_traps,
elf_linux_fixup,
linux_sendsig,
linux_sigcode,
OpenPOWER on IntegriCloud