diff options
author | alm <alm@FreeBSD.org> | 1993-12-03 05:10:08 +0000 |
---|---|---|
committer | alm <alm@FreeBSD.org> | 1993-12-03 05:10:08 +0000 |
commit | 2c48c35e86d75ce81452b240cee8586254d83c52 (patch) | |
tree | 4060d6912e801000759cb2790a59c27cb2d477c6 | |
parent | db1888bf053844c4661a8e63541981d72c12ce28 (diff) | |
download | FreeBSD-src-2c48c35e86d75ce81452b240cee8586254d83c52.zip FreeBSD-src-2c48c35e86d75ce81452b240cee8586254d83c52.tar.gz |
From: Jeffrey Hsu <hsu@soda.berkeley.edu>
The following patch adds the addr argument to signal handlers.
The kernel with the patch is no more and no less in compliance or in
violation of POSIX and ANSI C than the kernel before the patch.
The added functionality this addr argument provides is quite useful. It
enables an entire class of algorithms which use mprotect to trace memory
references. Beside garbage collectors, I have heard of this technique being
applied to debuggers and profilers. The only benchmarking I've performed is
using akcl to compile maxima: without the kernel patch, it takes 7 hours to
compile maxima, while with stratified garbage collection, it only takes 50
minutes.
Basically, I can't think of a reason not to add the addr argument and there
is a compelling need for it.
If you find the patch acceptable, please let me know so I can send my
FreeBSD akcl config files to wfs for inclusion in the core akcl release.
The old 386BSD config files there won't work on either NetBSD or FreeBSD.
-rw-r--r-- | sys/amd64/amd64/machdep.c | 3 | ||||
-rw-r--r-- | sys/amd64/amd64/trap.c | 5 | ||||
-rw-r--r-- | sys/amd64/include/frame.h | 3 | ||||
-rw-r--r-- | sys/amd64/include/reg.h | 4 | ||||
-rw-r--r-- | sys/i386/i386/machdep.c | 3 | ||||
-rw-r--r-- | sys/i386/i386/trap.c | 5 | ||||
-rw-r--r-- | sys/i386/include/frame.h | 3 | ||||
-rw-r--r-- | sys/i386/include/reg.h | 4 | ||||
-rw-r--r-- | sys/kern/subr_trap.c | 5 |
9 files changed, 26 insertions, 9 deletions
diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c index e926d0e..d89bf87 100644 --- a/sys/amd64/amd64/machdep.c +++ b/sys/amd64/amd64/machdep.c @@ -35,7 +35,7 @@ * SUCH DAMAGE. * * from: @(#)machdep.c 7.4 (Berkeley) 6/3/91 - * $Id: machdep.c,v 1.18 1993/11/17 23:24:56 wollman Exp $ + * $Id: machdep.c,v 1.19 1993/11/25 01:30:55 wollman Exp $ */ #include "npx.h" @@ -460,6 +460,7 @@ sendsig(catcher, sig, mask, code) fp->sf_signum = sig; fp->sf_code = code; fp->sf_scp = &fp->sf_sc; + fp->sf_addr = (char *) regs[tERR]; fp->sf_handler = catcher; /* save scratch registers */ diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c index d413307..97a7418 100644 --- a/sys/amd64/amd64/trap.c +++ b/sys/amd64/amd64/trap.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)trap.c 7.4 (Berkeley) 5/13/91 - * $Id: trap.c,v 1.8 1993/11/25 01:31:01 wollman Exp $ + * $Id: trap.c,v 1.9 1993/11/28 09:28:54 davidg Exp $ */ /* @@ -370,6 +370,9 @@ nogo: goto we_re_toast; } i = (rv == KERN_PROTECTION_FAILURE) ? SIGBUS : SIGSEGV; + ucode = type &~ T_USER; + frame.tf_err = eva; + /* kludge to pass faulting virtual address to sendsig */ break; } diff --git a/sys/amd64/include/frame.h b/sys/amd64/include/frame.h index a591f53..a7455b6 100644 --- a/sys/amd64/include/frame.h +++ b/sys/amd64/include/frame.h @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)frame.h 5.2 (Berkeley) 1/18/91 - * $Id: frame.h,v 1.3 1993/11/07 17:42:56 wollman Exp $ + * $Id: frame.h,v 1.4 1993/11/17 23:25:03 wollman Exp $ */ #ifndef _MACHINE_FRAME_H_ @@ -105,6 +105,7 @@ struct sigframe { int sf_signum; int sf_code; struct sigcontext *sf_scp; + char *sf_addr; sig_t sf_handler; int sf_eax; int sf_edx; diff --git a/sys/amd64/include/reg.h b/sys/amd64/include/reg.h index 55f1556..969df87 100644 --- a/sys/amd64/include/reg.h +++ b/sys/amd64/include/reg.h @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)reg.h 5.5 (Berkeley) 1/18/91 - * $Id: reg.h,v 1.3 1993/11/07 17:43:07 wollman Exp $ + * $Id: reg.h,v 1.4 1993/11/16 09:54:57 davidg Exp $ */ #ifndef _MACHINE_REG_H_ @@ -60,6 +60,8 @@ #define tECX (8) #define tEAX (9) +#define tERR (11) + #define tEIP (12) #define tCS (13) #define tEFLAGS (14) diff --git a/sys/i386/i386/machdep.c b/sys/i386/i386/machdep.c index e926d0e..d89bf87 100644 --- a/sys/i386/i386/machdep.c +++ b/sys/i386/i386/machdep.c @@ -35,7 +35,7 @@ * SUCH DAMAGE. * * from: @(#)machdep.c 7.4 (Berkeley) 6/3/91 - * $Id: machdep.c,v 1.18 1993/11/17 23:24:56 wollman Exp $ + * $Id: machdep.c,v 1.19 1993/11/25 01:30:55 wollman Exp $ */ #include "npx.h" @@ -460,6 +460,7 @@ sendsig(catcher, sig, mask, code) fp->sf_signum = sig; fp->sf_code = code; fp->sf_scp = &fp->sf_sc; + fp->sf_addr = (char *) regs[tERR]; fp->sf_handler = catcher; /* save scratch registers */ diff --git a/sys/i386/i386/trap.c b/sys/i386/i386/trap.c index d413307..97a7418 100644 --- a/sys/i386/i386/trap.c +++ b/sys/i386/i386/trap.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)trap.c 7.4 (Berkeley) 5/13/91 - * $Id: trap.c,v 1.8 1993/11/25 01:31:01 wollman Exp $ + * $Id: trap.c,v 1.9 1993/11/28 09:28:54 davidg Exp $ */ /* @@ -370,6 +370,9 @@ nogo: goto we_re_toast; } i = (rv == KERN_PROTECTION_FAILURE) ? SIGBUS : SIGSEGV; + ucode = type &~ T_USER; + frame.tf_err = eva; + /* kludge to pass faulting virtual address to sendsig */ break; } diff --git a/sys/i386/include/frame.h b/sys/i386/include/frame.h index a591f53..a7455b6 100644 --- a/sys/i386/include/frame.h +++ b/sys/i386/include/frame.h @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)frame.h 5.2 (Berkeley) 1/18/91 - * $Id: frame.h,v 1.3 1993/11/07 17:42:56 wollman Exp $ + * $Id: frame.h,v 1.4 1993/11/17 23:25:03 wollman Exp $ */ #ifndef _MACHINE_FRAME_H_ @@ -105,6 +105,7 @@ struct sigframe { int sf_signum; int sf_code; struct sigcontext *sf_scp; + char *sf_addr; sig_t sf_handler; int sf_eax; int sf_edx; diff --git a/sys/i386/include/reg.h b/sys/i386/include/reg.h index 55f1556..969df87 100644 --- a/sys/i386/include/reg.h +++ b/sys/i386/include/reg.h @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)reg.h 5.5 (Berkeley) 1/18/91 - * $Id: reg.h,v 1.3 1993/11/07 17:43:07 wollman Exp $ + * $Id: reg.h,v 1.4 1993/11/16 09:54:57 davidg Exp $ */ #ifndef _MACHINE_REG_H_ @@ -60,6 +60,8 @@ #define tECX (8) #define tEAX (9) +#define tERR (11) + #define tEIP (12) #define tCS (13) #define tEFLAGS (14) diff --git a/sys/kern/subr_trap.c b/sys/kern/subr_trap.c index d413307..97a7418 100644 --- a/sys/kern/subr_trap.c +++ b/sys/kern/subr_trap.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)trap.c 7.4 (Berkeley) 5/13/91 - * $Id: trap.c,v 1.8 1993/11/25 01:31:01 wollman Exp $ + * $Id: trap.c,v 1.9 1993/11/28 09:28:54 davidg Exp $ */ /* @@ -370,6 +370,9 @@ nogo: goto we_re_toast; } i = (rv == KERN_PROTECTION_FAILURE) ? SIGBUS : SIGSEGV; + ucode = type &~ T_USER; + frame.tf_err = eva; + /* kludge to pass faulting virtual address to sendsig */ break; } |