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