xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/testsuite/gdb.base/bp-permanent.c (revision 796c32c94f6e154afc9de0f63da35c91bb739b45)
1 /* Copyright (C) 2014-2016 Free Software Foundation, Inc.
2 
3    This file is part of GDB.
4 
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 3 of the License, or
8    (at your option) any later version.
9 
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14 
15    You should have received a copy of the GNU General Public License
16    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
17 
18 #include <string.h>
19 #ifdef SIGNALS
20 #include <signal.h>
21 #include <unistd.h>
22 #endif
23 
24 /* NOP instruction: must have the same size as the breakpoint
25    instruction.  */
26 
27 #if defined(__s390__) || defined(__s390x__)
28 #define NOP asm("nopr 0")
29 #else
30 #define NOP asm("nop")
31 #endif
32 
33 /* Buffer holding the breakpoint instruction.  */
34 unsigned char buffer[16];
35 
36 volatile unsigned char *addr_bp;
37 volatile unsigned char *addr_after_bp;
38 int counter = 0;
39 
40 void
41 test (void)
42 {
43   NOP;
44   NOP;
45   NOP;
46   NOP; /* write permanent bp here */
47   NOP; /* after permanent bp */
48   NOP;
49   NOP;
50   NOP;
51   NOP;
52   NOP;
53 
54   counter++;
55 }
56 
57 void
58 setup (void)
59 {
60   memcpy (buffer, (void *) addr_bp, addr_after_bp - addr_bp);
61 }
62 
63 void
64 test_basics (void)
65 {
66   test (); /* for SIGTRAP */
67   test (); /* for breakpoint once */
68   test (); /* for breakpoint twice */
69   test (); /* for disabled bp SIGTRAP */
70   test (); /* for breakpoint thrice */
71 }
72 
73 void
74 test_next (void)
75 {
76   test (); /* for next */
77   counter = 0; /* after next */
78 }
79 
80 #ifdef SIGNALS
81 
82 static void
83 test_signal_handler (int sig)
84 {
85 }
86 
87 void
88 test_signal_with_handler (void)
89 {
90   signal (SIGUSR1, test_signal_handler);
91   test ();
92 }
93 
94 void
95 test_signal_no_handler (void)
96 {
97   signal (SIGUSR1, SIG_IGN);
98   test ();
99 }
100 
101 static void
102 test_signal_nested_handler ()
103 {
104   test ();
105 }
106 
107 void
108 test_signal_nested_done (void)
109 {
110 }
111 
112 void
113 test_signal_nested (void)
114 {
115   counter = 0;
116   signal (SIGALRM, test_signal_nested_handler);
117   alarm (1);
118   test ();
119   test_signal_nested_done ();
120 }
121 
122 #endif
123 
124 int
125 main (void)
126 {
127   setup ();
128   test_basics ();
129   test_next ();
130 #ifdef SIGNALS
131   test_signal_nested ();
132   test_signal_with_handler ();
133   test_signal_no_handler ();
134 #endif
135   return 0;
136 }
137