1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h> 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h> 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <signal.h> 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void handler(int sig, siginfo_t *info, void *v) 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("info: sig=%d code=%d addr=0x%lx\n", 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown info->si_signo, info->si_code, (unsigned long)info->si_addr); 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(0); 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main() 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct sigaction sa; 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int val; 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sa.sa_sigaction = handler; 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sigfillset(&sa.sa_mask); 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sa.sa_flags = SA_SIGINFO; 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sigaction(SIGSEGV, &sa, NULL); 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown asm volatile("mov %1, %%fs; mov %%fs:0, %0" : "=r" (val) : "r"(4)); 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("val=%d\n", val); 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 0; 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 29