1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h> 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h> 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <signal.h> 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "tests/sys_mman.h" 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void handler(int sig, siginfo_t *info, void *v) 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("info: sig=%d code=%d addr=%p\n", 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown info->si_signo, info->si_code, info->si_addr); 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(0); 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Blocking a fault, ie SIGSEGV, won't work, and is the same as having 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the default handler */ 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main() 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int* unmapped_page = get_unmapped_page(); 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct sigaction sa; 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sigset_t mask; 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sa.sa_sigaction = handler; 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sigemptyset(&sa.sa_mask); 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sa.sa_flags = SA_SIGINFO; 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sigaction(SIGSEGV, &sa, NULL); 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sigfillset(&mask); 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sigprocmask(SIG_BLOCK, &mask, NULL); 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *(volatile int *)unmapped_page = 213; 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 0; 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 34