Subject: finding faulted address
To: None <vax@ccwf.cc.utexas.edu>
From: Gordon W. Ross <gwr@mc.com>
List: current-users
Date: 08/22/1995 10:09:20
> From: VaX#n8 <vax@ccwf.cc.utexas.edu>
> Date: Mon, 21 Aug 1995 23:06:27 -0500 (CDT)
> I'm trying to find the faulted-on address in a SIGBUS handler.
> StunOS passes the address as another parameter to the signal handler,
> but I'm afraid I'm a bit confused as to how to get this from NetBSD.
>
> I'm looking over the machine/signal.h, but it appears to my untrained eye
> that I'd have to do some decoding of machine instructions (blech) and
> stuff.
>
> Mainly I'm mprotecting some heap pages and I want to find out which ones
> are being accessed, munprotect them, allow the access, and then later
> mprotect them.
Well, if our signal delivery conformed to POSIX 1003.1b (not yet)
then you would normally find that address as follows:
int segv_catch(signum, si, ctx)
int signum;
struct siginfo *si;
void *ctx;
{
void *va;
va = si->si_value.sival_ptr;
printf("segv touching address 0x%lx\n", va);
exit(1);
}
P.S. Typical struct definitions would be: (in sys/signal.h)
union sigval {
int sival_int; /* integer value */
void *sival_ptr; /* pointer value */
};
struct siginfo {
int si_signo; /* same as handler arg one */
int si_code; /* like old handler 2nd arg */
union sigval si_value; /* data relevant to the signal */
};