#include #include #include #include #include void *faultAddress = 0; jmp_buf env; void getFaultAddress(int signo, struct siginfo *info, void *data) { faultAddress = info->si_addr; longjmp(env, 1); } int main() { long *l; struct sigaction sa; sa.sa_sigaction = getFaultAddress; sa.sa_flags = SA_SIGINFO | SA_ONESHOT; l = (long *)mmap(0,4096, PROT_READ, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); printf("Read only write address = %08x\n", l); sigaction(SIGSEGV, &sa, NULL); if (!setjmp(env)) l[0] = 1; else printf("fault address = %08x\n", faultAddress); l = (long *)mmap(0,8192, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); l[0] = 2; l[1024] = 3; l = (long *)(((char *)l)+1); printf("Unaligned write address = %08x\n", l); sigaction(SIGBUS, &sa, NULL); __asm__ __volatile__("pushfl\n\t" "orl $0x40000,(%esp)\n\t" "popfl"); if (!setjmp(env)) l[0] = 4; else printf("fault address = %08x\n", faultAddress); }