190792Sgshapiro#include <sys/types.h> 2261363Sgshapiro#include <sys/signal.h> 390792Sgshapiro#include <signal.h> 490792Sgshapiro#include <stdio.h> 590792Sgshapiro#include <unistd.h> 690792Sgshapiro#include <string.h> 790792Sgshapiro 890792Sgshapiro#define FAULTADDR 0x123123 990792Sgshapiro 1090792Sgshapirostatic void 1190792Sgshapirohandler(int sig, siginfo_t *sip, void *scp) 1290792Sgshapiro{ 1390792Sgshapiro char buf[1024]; 1490792Sgshapiro 1590792Sgshapiro if (sip == NULL) 1690792Sgshapiro _exit(1); 1790792Sgshapiro if (sip->si_addr == 0) /* wrong address */ 1890792Sgshapiro _exit(1); 1990792Sgshapiro 2090792Sgshapiro // snprintf(buf, sizeof buf, "addr %p\n", sip->si_addr); 2190792Sgshapiro // write(STDOUT_FILENO, buf, strlen(buf)); 2290792Sgshapiro _exit(0); 2390792Sgshapiro} 2490792Sgshapiro 25266692Sgshapiro 2690792Sgshapiroint 2790792Sgshapiromain(int argc, char *argv[]) 2890792Sgshapiro{ 2990792Sgshapiro struct sigaction sa; 3090792Sgshapiro 3190792Sgshapiro memset(&sa, 0, sizeof sa); 3290792Sgshapiro sigfillset(&sa.sa_mask); 3390792Sgshapiro sa.sa_sigaction = handler; 3490792Sgshapiro sa.sa_flags = SA_SIGINFO; 3590792Sgshapiro 3690792Sgshapiro sigaction(SIGSEGV, &sa, NULL); 3790792Sgshapiro sigaction(SIGBUS, &sa, NULL); 3890792Sgshapiro 3990792Sgshapiro *(char *)FAULTADDR = 0; 4090792Sgshapiro} 4190792Sgshapiro