Re: Serious compatibility breakage in -current.

From: Kostik Belousov <kostikbel_at_gmail.com>
Date: Thu, 29 Nov 2007 13:28:24 +0200
On Thu, Nov 29, 2007 at 02:26:11AM -0800, Carl Shapiro wrote:
> Developers,
> 
> FreeBSD 7 has changed the protection violation signal from SIGBUS to
> SIGSEGV.  Unfortunately, when an old binary is run on a current
> FreeBSD system, protection violations cause a SIGSEGV to be delivered
> to the executable instead of the anticipated SIGBUS.  Binaries
> compiled on older versions of FreeBSD are not prepared to handle
> SIGSEGV in response to page protection violations.
> 
> One consequence of this change is that applications that handle page
> protection violations, such as the CMUCL Lisp compiler have broken.
> CMUCL binaries compiled for FreeBSD 4, FreeBSD 5, and FreeBSD 6 crash
> on -current.  Investments FreeBSD users have in binaries that handle
> page protection violations, such as things that link against boehm-gc,
> are lost forever.  This significantly increases the cost of an upgrade
> to FreeBSD 7.
> 
> The switch from SIGBUS to SIGSEGV is well motivated.  However, it is
> not clear that consideration was given to binaries running under
> compat{4,5,6}x.  One would expect the compat infrastructure to
> translate protection violation signals from SIGSEGV to SIGBUS while
> executing older binaries.  This would ensure that the applications
> that establish SIGBUS handlers to catch protection violations continue
> to work.
> 
> Among the open source operating systems the FreeBSD project has one of
> the best traditions of supporting old binaries.  It would truly be a
> shame for this tradition to abruptly end as of the next major release.
>  As a developer who supports several versions of FreeBSD through
> binary compatibility anything that can help us avoid breakage as of
> the next FreeBSD release would be appreciated.
> 
> Thanks,
> 
> Carl (and the many FreeBSD users of CMUCL)

I can confirm that FreeBSD-6 binary of the CMUCL 19d does not work. It
is interesting that sbcl has no problems on RELENG_7.

The change of the raised signal was introduced in the following commit:
i386/i386/trap.c, revision 1.282
amd64/amd64/trap.c, revision 1.295
date: 2005/10/14 12:43:45;  author: davidxu;  state: Exp;  lines: +41 -12

Please, try the patch below and report whether it is enough to fix cmucl
and any other regressions.

diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c
index 62d81f6..ba32fc7 100644
--- a/sys/amd64/amd64/trap.c
+++ b/sys/amd64/amd64/trap.c
_at__at_ -311,10 +311,8 _at__at_ trap(struct trapframe *frame)
 
 			if (i == SIGSEGV)
 				ucode = SEGV_MAPERR;
-			else {
-				i = SIGSEGV; /* XXX hack */
-				ucode = SEGV_ACCERR;
-			}
+			else
+				ucode = BUS_ADRERR;
 			break;
 
 		case T_DIVIDE:		/* integer divide fault */
diff --git a/sys/i386/i386/trap.c b/sys/i386/i386/trap.c
index e66fa1e..3127488 100644
--- a/sys/i386/i386/trap.c
+++ b/sys/i386/i386/trap.c
_at__at_ -374,10 +374,8 _at__at_ trap(struct trapframe *frame)
 
 			if (i == SIGSEGV)
 				ucode = SEGV_MAPERR;
-			else {
-				i = SIGSEGV; /* XXX hack */
-				ucode = SEGV_ACCERR;
-			}
+			else 
+				ucode = BUS_ADRERR;
 			addr = eva;
 			break;
 

Received on Thu Nov 29 2007 - 10:28:33 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:23 UTC