1/* This testcase is part of GDB, the GNU debugger. 2 3 Copyright 1996, 1999, 2003, 2004, 2007, 2008, 2009, 2010, 2011 4 Free Software Foundation, Inc. 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 18 19#include <signal.h> 20#include <setjmp.h> 21#include <stdlib.h> 22#include <string.h> 23 24enum tests { 25 code_entry_point, code_descriptor, data_read, data_write 26}; 27 28static volatile enum tests test; 29 30/* Some basic types and zero buffers. */ 31 32typedef long data_t; 33typedef long code_t (void); 34data_t *volatile data; 35code_t *volatile code; 36/* "desc" is intentionally initialized to a data object. This is 37 needed to test function descriptors on arches like ia64. */ 38data_t zero[10]; 39code_t *volatile desc = (code_t *) (void *) zero; 40 41sigjmp_buf env; 42 43extern void 44keeper (int sig) 45{ 46 siglongjmp (env, 0); 47} 48 49extern long 50bowler (void) 51{ 52 switch (test) 53 { 54 case data_read: 55 /* Try to read address zero. */ 56 return (*data); 57 case data_write: 58 /* Try to write (the assignment) to address zero. */ 59 return (*data) = 1; 60 case code_entry_point: 61 /* For typical architectures, call a function at address 62 zero. */ 63 return (*code) (); 64 case code_descriptor: 65 /* For atypical architectures that use function descriptors, 66 call a function descriptor, the code field of which is zero 67 (which has the effect of jumping to address zero). */ 68 return (*desc) (); 69 } 70} 71 72int 73main () 74{ 75 static volatile int i; 76 77 struct sigaction act; 78 memset (&act, 0, sizeof act); 79 act.sa_handler = keeper; 80 sigaction (SIGSEGV, &act, NULL); 81 sigaction (SIGBUS, &act, NULL); 82 83 for (i = 0; i < 10; i++) 84 { 85 sigsetjmp (env, 1); 86 bowler (); 87 } 88} 89