xref: /openbsd-src/gnu/usr.bin/binutils/gdb/signals/signals.c (revision b725ae7711052a2233e31a66fefb8a752c388d7a)
1*b725ae77Skettenis /* Target signal translation functions for GDB.
2*b725ae77Skettenis    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3*b725ae77Skettenis    2000, 2001, 2002 Free Software Foundation, Inc.
4*b725ae77Skettenis    Contributed by Cygnus Support.
5*b725ae77Skettenis 
6*b725ae77Skettenis    This file is part of GDB.
7*b725ae77Skettenis 
8*b725ae77Skettenis    This program is free software; you can redistribute it and/or modify
9*b725ae77Skettenis    it under the terms of the GNU General Public License as published by
10*b725ae77Skettenis    the Free Software Foundation; either version 2 of the License, or
11*b725ae77Skettenis    (at your option) any later version.
12*b725ae77Skettenis 
13*b725ae77Skettenis    This program is distributed in the hope that it will be useful,
14*b725ae77Skettenis    but WITHOUT ANY WARRANTY; without even the implied warranty of
15*b725ae77Skettenis    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16*b725ae77Skettenis    GNU General Public License for more details.
17*b725ae77Skettenis 
18*b725ae77Skettenis    You should have received a copy of the GNU General Public License
19*b725ae77Skettenis    along with this program; if not, write to the Free Software
20*b725ae77Skettenis    Foundation, Inc., 59 Temple Place - Suite 330,
21*b725ae77Skettenis    Boston, MA 02111-1307, USA.  */
22*b725ae77Skettenis 
23*b725ae77Skettenis #ifdef GDBSERVER
24*b725ae77Skettenis #include "server.h"
25*b725ae77Skettenis #else
26*b725ae77Skettenis #include "defs.h"
27*b725ae77Skettenis #include "target.h"
28*b725ae77Skettenis #include "gdb_string.h"
29*b725ae77Skettenis #endif
30*b725ae77Skettenis 
31*b725ae77Skettenis #include <signal.h>
32*b725ae77Skettenis 
33*b725ae77Skettenis /* Always use __SIGRTMIN if it's available.  SIGRTMIN is the lowest
34*b725ae77Skettenis    _available_ realtime signal, not the lowest supported; glibc takes
35*b725ae77Skettenis    several for its own use.  */
36*b725ae77Skettenis 
37*b725ae77Skettenis #ifndef REALTIME_LO
38*b725ae77Skettenis # if defined(__SIGRTMIN)
39*b725ae77Skettenis #  define REALTIME_LO __SIGRTMIN
40*b725ae77Skettenis #  define REALTIME_HI __SIGRTMAX
41*b725ae77Skettenis # elif defined(SIGRTMIN)
42*b725ae77Skettenis #  define REALTIME_LO SIGRTMIN
43*b725ae77Skettenis #  define REALTIME_HI SIGRTMAX
44*b725ae77Skettenis # endif
45*b725ae77Skettenis #endif
46*b725ae77Skettenis 
47*b725ae77Skettenis /* This table must match in order and size the signals in enum target_signal
48*b725ae77Skettenis    in target.h.  */
49*b725ae77Skettenis /* *INDENT-OFF* */
50*b725ae77Skettenis static struct {
51*b725ae77Skettenis   char *name;
52*b725ae77Skettenis   char *string;
53*b725ae77Skettenis   } signals [] =
54*b725ae77Skettenis {
55*b725ae77Skettenis   {"0", "Signal 0"},
56*b725ae77Skettenis   {"SIGHUP", "Hangup"},
57*b725ae77Skettenis   {"SIGINT", "Interrupt"},
58*b725ae77Skettenis   {"SIGQUIT", "Quit"},
59*b725ae77Skettenis   {"SIGILL", "Illegal instruction"},
60*b725ae77Skettenis   {"SIGTRAP", "Trace/breakpoint trap"},
61*b725ae77Skettenis   {"SIGABRT", "Aborted"},
62*b725ae77Skettenis   {"SIGEMT", "Emulation trap"},
63*b725ae77Skettenis   {"SIGFPE", "Arithmetic exception"},
64*b725ae77Skettenis   {"SIGKILL", "Killed"},
65*b725ae77Skettenis   {"SIGBUS", "Bus error"},
66*b725ae77Skettenis   {"SIGSEGV", "Segmentation fault"},
67*b725ae77Skettenis   {"SIGSYS", "Bad system call"},
68*b725ae77Skettenis   {"SIGPIPE", "Broken pipe"},
69*b725ae77Skettenis   {"SIGALRM", "Alarm clock"},
70*b725ae77Skettenis   {"SIGTERM", "Terminated"},
71*b725ae77Skettenis   {"SIGURG", "Urgent I/O condition"},
72*b725ae77Skettenis   {"SIGSTOP", "Stopped (signal)"},
73*b725ae77Skettenis   {"SIGTSTP", "Stopped (user)"},
74*b725ae77Skettenis   {"SIGCONT", "Continued"},
75*b725ae77Skettenis   {"SIGCHLD", "Child status changed"},
76*b725ae77Skettenis   {"SIGTTIN", "Stopped (tty input)"},
77*b725ae77Skettenis   {"SIGTTOU", "Stopped (tty output)"},
78*b725ae77Skettenis   {"SIGIO", "I/O possible"},
79*b725ae77Skettenis   {"SIGXCPU", "CPU time limit exceeded"},
80*b725ae77Skettenis   {"SIGXFSZ", "File size limit exceeded"},
81*b725ae77Skettenis   {"SIGVTALRM", "Virtual timer expired"},
82*b725ae77Skettenis   {"SIGPROF", "Profiling timer expired"},
83*b725ae77Skettenis   {"SIGWINCH", "Window size changed"},
84*b725ae77Skettenis   {"SIGLOST", "Resource lost"},
85*b725ae77Skettenis   {"SIGUSR1", "User defined signal 1"},
86*b725ae77Skettenis   {"SIGUSR2", "User defined signal 2"},
87*b725ae77Skettenis   {"SIGPWR", "Power fail/restart"},
88*b725ae77Skettenis   {"SIGPOLL", "Pollable event occurred"},
89*b725ae77Skettenis   {"SIGWIND", "SIGWIND"},
90*b725ae77Skettenis   {"SIGPHONE", "SIGPHONE"},
91*b725ae77Skettenis   {"SIGWAITING", "Process's LWPs are blocked"},
92*b725ae77Skettenis   {"SIGLWP", "Signal LWP"},
93*b725ae77Skettenis   {"SIGDANGER", "Swap space dangerously low"},
94*b725ae77Skettenis   {"SIGGRANT", "Monitor mode granted"},
95*b725ae77Skettenis   {"SIGRETRACT", "Need to relinquish monitor mode"},
96*b725ae77Skettenis   {"SIGMSG", "Monitor mode data available"},
97*b725ae77Skettenis   {"SIGSOUND", "Sound completed"},
98*b725ae77Skettenis   {"SIGSAK", "Secure attention"},
99*b725ae77Skettenis   {"SIGPRIO", "SIGPRIO"},
100*b725ae77Skettenis   {"SIG33", "Real-time event 33"},
101*b725ae77Skettenis   {"SIG34", "Real-time event 34"},
102*b725ae77Skettenis   {"SIG35", "Real-time event 35"},
103*b725ae77Skettenis   {"SIG36", "Real-time event 36"},
104*b725ae77Skettenis   {"SIG37", "Real-time event 37"},
105*b725ae77Skettenis   {"SIG38", "Real-time event 38"},
106*b725ae77Skettenis   {"SIG39", "Real-time event 39"},
107*b725ae77Skettenis   {"SIG40", "Real-time event 40"},
108*b725ae77Skettenis   {"SIG41", "Real-time event 41"},
109*b725ae77Skettenis   {"SIG42", "Real-time event 42"},
110*b725ae77Skettenis   {"SIG43", "Real-time event 43"},
111*b725ae77Skettenis   {"SIG44", "Real-time event 44"},
112*b725ae77Skettenis   {"SIG45", "Real-time event 45"},
113*b725ae77Skettenis   {"SIG46", "Real-time event 46"},
114*b725ae77Skettenis   {"SIG47", "Real-time event 47"},
115*b725ae77Skettenis   {"SIG48", "Real-time event 48"},
116*b725ae77Skettenis   {"SIG49", "Real-time event 49"},
117*b725ae77Skettenis   {"SIG50", "Real-time event 50"},
118*b725ae77Skettenis   {"SIG51", "Real-time event 51"},
119*b725ae77Skettenis   {"SIG52", "Real-time event 52"},
120*b725ae77Skettenis   {"SIG53", "Real-time event 53"},
121*b725ae77Skettenis   {"SIG54", "Real-time event 54"},
122*b725ae77Skettenis   {"SIG55", "Real-time event 55"},
123*b725ae77Skettenis   {"SIG56", "Real-time event 56"},
124*b725ae77Skettenis   {"SIG57", "Real-time event 57"},
125*b725ae77Skettenis   {"SIG58", "Real-time event 58"},
126*b725ae77Skettenis   {"SIG59", "Real-time event 59"},
127*b725ae77Skettenis   {"SIG60", "Real-time event 60"},
128*b725ae77Skettenis   {"SIG61", "Real-time event 61"},
129*b725ae77Skettenis   {"SIG62", "Real-time event 62"},
130*b725ae77Skettenis   {"SIG63", "Real-time event 63"},
131*b725ae77Skettenis   {"SIGCANCEL", "LWP internal signal"},
132*b725ae77Skettenis   {"SIG32", "Real-time event 32"},
133*b725ae77Skettenis   {"SIG64", "Real-time event 64"},
134*b725ae77Skettenis   {"SIG65", "Real-time event 65"},
135*b725ae77Skettenis   {"SIG66", "Real-time event 66"},
136*b725ae77Skettenis   {"SIG67", "Real-time event 67"},
137*b725ae77Skettenis   {"SIG68", "Real-time event 68"},
138*b725ae77Skettenis   {"SIG69", "Real-time event 69"},
139*b725ae77Skettenis   {"SIG70", "Real-time event 70"},
140*b725ae77Skettenis   {"SIG71", "Real-time event 71"},
141*b725ae77Skettenis   {"SIG72", "Real-time event 72"},
142*b725ae77Skettenis   {"SIG73", "Real-time event 73"},
143*b725ae77Skettenis   {"SIG74", "Real-time event 74"},
144*b725ae77Skettenis   {"SIG75", "Real-time event 75"},
145*b725ae77Skettenis   {"SIG76", "Real-time event 76"},
146*b725ae77Skettenis   {"SIG77", "Real-time event 77"},
147*b725ae77Skettenis   {"SIG78", "Real-time event 78"},
148*b725ae77Skettenis   {"SIG79", "Real-time event 79"},
149*b725ae77Skettenis   {"SIG80", "Real-time event 80"},
150*b725ae77Skettenis   {"SIG81", "Real-time event 81"},
151*b725ae77Skettenis   {"SIG82", "Real-time event 82"},
152*b725ae77Skettenis   {"SIG83", "Real-time event 83"},
153*b725ae77Skettenis   {"SIG84", "Real-time event 84"},
154*b725ae77Skettenis   {"SIG85", "Real-time event 85"},
155*b725ae77Skettenis   {"SIG86", "Real-time event 86"},
156*b725ae77Skettenis   {"SIG87", "Real-time event 87"},
157*b725ae77Skettenis   {"SIG88", "Real-time event 88"},
158*b725ae77Skettenis   {"SIG89", "Real-time event 89"},
159*b725ae77Skettenis   {"SIG90", "Real-time event 90"},
160*b725ae77Skettenis   {"SIG91", "Real-time event 91"},
161*b725ae77Skettenis   {"SIG92", "Real-time event 92"},
162*b725ae77Skettenis   {"SIG93", "Real-time event 93"},
163*b725ae77Skettenis   {"SIG94", "Real-time event 94"},
164*b725ae77Skettenis   {"SIG95", "Real-time event 95"},
165*b725ae77Skettenis   {"SIG96", "Real-time event 96"},
166*b725ae77Skettenis   {"SIG97", "Real-time event 97"},
167*b725ae77Skettenis   {"SIG98", "Real-time event 98"},
168*b725ae77Skettenis   {"SIG99", "Real-time event 99"},
169*b725ae77Skettenis   {"SIG100", "Real-time event 100"},
170*b725ae77Skettenis   {"SIG101", "Real-time event 101"},
171*b725ae77Skettenis   {"SIG102", "Real-time event 102"},
172*b725ae77Skettenis   {"SIG103", "Real-time event 103"},
173*b725ae77Skettenis   {"SIG104", "Real-time event 104"},
174*b725ae77Skettenis   {"SIG105", "Real-time event 105"},
175*b725ae77Skettenis   {"SIG106", "Real-time event 106"},
176*b725ae77Skettenis   {"SIG107", "Real-time event 107"},
177*b725ae77Skettenis   {"SIG108", "Real-time event 108"},
178*b725ae77Skettenis   {"SIG109", "Real-time event 109"},
179*b725ae77Skettenis   {"SIG110", "Real-time event 110"},
180*b725ae77Skettenis   {"SIG111", "Real-time event 111"},
181*b725ae77Skettenis   {"SIG112", "Real-time event 112"},
182*b725ae77Skettenis   {"SIG113", "Real-time event 113"},
183*b725ae77Skettenis   {"SIG114", "Real-time event 114"},
184*b725ae77Skettenis   {"SIG115", "Real-time event 115"},
185*b725ae77Skettenis   {"SIG116", "Real-time event 116"},
186*b725ae77Skettenis   {"SIG117", "Real-time event 117"},
187*b725ae77Skettenis   {"SIG118", "Real-time event 118"},
188*b725ae77Skettenis   {"SIG119", "Real-time event 119"},
189*b725ae77Skettenis   {"SIG120", "Real-time event 120"},
190*b725ae77Skettenis   {"SIG121", "Real-time event 121"},
191*b725ae77Skettenis   {"SIG122", "Real-time event 122"},
192*b725ae77Skettenis   {"SIG123", "Real-time event 123"},
193*b725ae77Skettenis   {"SIG124", "Real-time event 124"},
194*b725ae77Skettenis   {"SIG125", "Real-time event 125"},
195*b725ae77Skettenis   {"SIG126", "Real-time event 126"},
196*b725ae77Skettenis   {"SIG127", "Real-time event 127"},
197*b725ae77Skettenis 
198*b725ae77Skettenis   {"SIGINFO", "Information request"},
199*b725ae77Skettenis 
200*b725ae77Skettenis   {NULL, "Unknown signal"},
201*b725ae77Skettenis   {NULL, "Internal error: printing TARGET_SIGNAL_DEFAULT"},
202*b725ae77Skettenis 
203*b725ae77Skettenis   /* Mach exceptions */
204*b725ae77Skettenis   {"EXC_BAD_ACCESS", "Could not access memory"},
205*b725ae77Skettenis   {"EXC_BAD_INSTRUCTION", "Illegal instruction/operand"},
206*b725ae77Skettenis   {"EXC_ARITHMETIC", "Arithmetic exception"},
207*b725ae77Skettenis   {"EXC_EMULATION", "Emulation instruction"},
208*b725ae77Skettenis   {"EXC_SOFTWARE", "Software generated exception"},
209*b725ae77Skettenis   {"EXC_BREAKPOINT", "Breakpoint"},
210*b725ae77Skettenis 
211*b725ae77Skettenis   /* Last entry, used to check whether the table is the right size.  */
212*b725ae77Skettenis   {NULL, "TARGET_SIGNAL_MAGIC"}
213*b725ae77Skettenis };
214*b725ae77Skettenis /* *INDENT-ON* */
215*b725ae77Skettenis 
216*b725ae77Skettenis 
217*b725ae77Skettenis 
218*b725ae77Skettenis /* Return the string for a signal.  */
219*b725ae77Skettenis char *
target_signal_to_string(enum target_signal sig)220*b725ae77Skettenis target_signal_to_string (enum target_signal sig)
221*b725ae77Skettenis {
222*b725ae77Skettenis   if ((sig >= TARGET_SIGNAL_FIRST) && (sig <= TARGET_SIGNAL_LAST))
223*b725ae77Skettenis     return signals[sig].string;
224*b725ae77Skettenis   else
225*b725ae77Skettenis     return signals[TARGET_SIGNAL_UNKNOWN].string;
226*b725ae77Skettenis }
227*b725ae77Skettenis 
228*b725ae77Skettenis /* Return the name for a signal.  */
229*b725ae77Skettenis char *
target_signal_to_name(enum target_signal sig)230*b725ae77Skettenis target_signal_to_name (enum target_signal sig)
231*b725ae77Skettenis {
232*b725ae77Skettenis   if ((sig >= TARGET_SIGNAL_FIRST) && (sig <= TARGET_SIGNAL_LAST)
233*b725ae77Skettenis       && signals[sig].name != NULL)
234*b725ae77Skettenis     return signals[sig].name;
235*b725ae77Skettenis   else
236*b725ae77Skettenis     /* I think the code which prints this will always print it along
237*b725ae77Skettenis        with the string, so no need to be verbose (very old comment).  */
238*b725ae77Skettenis     return "?";
239*b725ae77Skettenis }
240*b725ae77Skettenis 
241*b725ae77Skettenis /* Given a name, return its signal.  */
242*b725ae77Skettenis enum target_signal
target_signal_from_name(char * name)243*b725ae77Skettenis target_signal_from_name (char *name)
244*b725ae77Skettenis {
245*b725ae77Skettenis   enum target_signal sig;
246*b725ae77Skettenis 
247*b725ae77Skettenis   /* It's possible we also should allow "SIGCLD" as well as "SIGCHLD"
248*b725ae77Skettenis      for TARGET_SIGNAL_SIGCHLD.  SIGIOT, on the other hand, is more
249*b725ae77Skettenis      questionable; seems like by now people should call it SIGABRT
250*b725ae77Skettenis      instead.  */
251*b725ae77Skettenis 
252*b725ae77Skettenis   /* This ugly cast brought to you by the native VAX compiler.  */
253*b725ae77Skettenis   for (sig = TARGET_SIGNAL_HUP;
254*b725ae77Skettenis        sig < TARGET_SIGNAL_LAST;
255*b725ae77Skettenis        sig = (enum target_signal) ((int) sig + 1))
256*b725ae77Skettenis     if (signals[sig].name != NULL
257*b725ae77Skettenis 	&& strcmp (name, signals[sig].name) == 0)
258*b725ae77Skettenis       return sig;
259*b725ae77Skettenis   return TARGET_SIGNAL_UNKNOWN;
260*b725ae77Skettenis }
261*b725ae77Skettenis 
262*b725ae77Skettenis /* The following functions are to help certain targets deal
263*b725ae77Skettenis    with the signal/waitstatus stuff.  They could just as well be in
264*b725ae77Skettenis    a file called native-utils.c or unixwaitstatus-utils.c or whatever.  */
265*b725ae77Skettenis 
266*b725ae77Skettenis /* Convert host signal to our signals.  */
267*b725ae77Skettenis enum target_signal
target_signal_from_host(int hostsig)268*b725ae77Skettenis target_signal_from_host (int hostsig)
269*b725ae77Skettenis {
270*b725ae77Skettenis   /* A switch statement would make sense but would require special kludges
271*b725ae77Skettenis      to deal with the cases where more than one signal has the same number.  */
272*b725ae77Skettenis 
273*b725ae77Skettenis   if (hostsig == 0)
274*b725ae77Skettenis     return TARGET_SIGNAL_0;
275*b725ae77Skettenis 
276*b725ae77Skettenis #if defined (SIGHUP)
277*b725ae77Skettenis   if (hostsig == SIGHUP)
278*b725ae77Skettenis     return TARGET_SIGNAL_HUP;
279*b725ae77Skettenis #endif
280*b725ae77Skettenis #if defined (SIGINT)
281*b725ae77Skettenis   if (hostsig == SIGINT)
282*b725ae77Skettenis     return TARGET_SIGNAL_INT;
283*b725ae77Skettenis #endif
284*b725ae77Skettenis #if defined (SIGQUIT)
285*b725ae77Skettenis   if (hostsig == SIGQUIT)
286*b725ae77Skettenis     return TARGET_SIGNAL_QUIT;
287*b725ae77Skettenis #endif
288*b725ae77Skettenis #if defined (SIGILL)
289*b725ae77Skettenis   if (hostsig == SIGILL)
290*b725ae77Skettenis     return TARGET_SIGNAL_ILL;
291*b725ae77Skettenis #endif
292*b725ae77Skettenis #if defined (SIGTRAP)
293*b725ae77Skettenis   if (hostsig == SIGTRAP)
294*b725ae77Skettenis     return TARGET_SIGNAL_TRAP;
295*b725ae77Skettenis #endif
296*b725ae77Skettenis #if defined (SIGABRT)
297*b725ae77Skettenis   if (hostsig == SIGABRT)
298*b725ae77Skettenis     return TARGET_SIGNAL_ABRT;
299*b725ae77Skettenis #endif
300*b725ae77Skettenis #if defined (SIGEMT)
301*b725ae77Skettenis   if (hostsig == SIGEMT)
302*b725ae77Skettenis     return TARGET_SIGNAL_EMT;
303*b725ae77Skettenis #endif
304*b725ae77Skettenis #if defined (SIGFPE)
305*b725ae77Skettenis   if (hostsig == SIGFPE)
306*b725ae77Skettenis     return TARGET_SIGNAL_FPE;
307*b725ae77Skettenis #endif
308*b725ae77Skettenis #if defined (SIGKILL)
309*b725ae77Skettenis   if (hostsig == SIGKILL)
310*b725ae77Skettenis     return TARGET_SIGNAL_KILL;
311*b725ae77Skettenis #endif
312*b725ae77Skettenis #if defined (SIGBUS)
313*b725ae77Skettenis   if (hostsig == SIGBUS)
314*b725ae77Skettenis     return TARGET_SIGNAL_BUS;
315*b725ae77Skettenis #endif
316*b725ae77Skettenis #if defined (SIGSEGV)
317*b725ae77Skettenis   if (hostsig == SIGSEGV)
318*b725ae77Skettenis     return TARGET_SIGNAL_SEGV;
319*b725ae77Skettenis #endif
320*b725ae77Skettenis #if defined (SIGSYS)
321*b725ae77Skettenis   if (hostsig == SIGSYS)
322*b725ae77Skettenis     return TARGET_SIGNAL_SYS;
323*b725ae77Skettenis #endif
324*b725ae77Skettenis #if defined (SIGPIPE)
325*b725ae77Skettenis   if (hostsig == SIGPIPE)
326*b725ae77Skettenis     return TARGET_SIGNAL_PIPE;
327*b725ae77Skettenis #endif
328*b725ae77Skettenis #if defined (SIGALRM)
329*b725ae77Skettenis   if (hostsig == SIGALRM)
330*b725ae77Skettenis     return TARGET_SIGNAL_ALRM;
331*b725ae77Skettenis #endif
332*b725ae77Skettenis #if defined (SIGTERM)
333*b725ae77Skettenis   if (hostsig == SIGTERM)
334*b725ae77Skettenis     return TARGET_SIGNAL_TERM;
335*b725ae77Skettenis #endif
336*b725ae77Skettenis #if defined (SIGUSR1)
337*b725ae77Skettenis   if (hostsig == SIGUSR1)
338*b725ae77Skettenis     return TARGET_SIGNAL_USR1;
339*b725ae77Skettenis #endif
340*b725ae77Skettenis #if defined (SIGUSR2)
341*b725ae77Skettenis   if (hostsig == SIGUSR2)
342*b725ae77Skettenis     return TARGET_SIGNAL_USR2;
343*b725ae77Skettenis #endif
344*b725ae77Skettenis #if defined (SIGCLD)
345*b725ae77Skettenis   if (hostsig == SIGCLD)
346*b725ae77Skettenis     return TARGET_SIGNAL_CHLD;
347*b725ae77Skettenis #endif
348*b725ae77Skettenis #if defined (SIGCHLD)
349*b725ae77Skettenis   if (hostsig == SIGCHLD)
350*b725ae77Skettenis     return TARGET_SIGNAL_CHLD;
351*b725ae77Skettenis #endif
352*b725ae77Skettenis #if defined (SIGPWR)
353*b725ae77Skettenis   if (hostsig == SIGPWR)
354*b725ae77Skettenis     return TARGET_SIGNAL_PWR;
355*b725ae77Skettenis #endif
356*b725ae77Skettenis #if defined (SIGWINCH)
357*b725ae77Skettenis   if (hostsig == SIGWINCH)
358*b725ae77Skettenis     return TARGET_SIGNAL_WINCH;
359*b725ae77Skettenis #endif
360*b725ae77Skettenis #if defined (SIGURG)
361*b725ae77Skettenis   if (hostsig == SIGURG)
362*b725ae77Skettenis     return TARGET_SIGNAL_URG;
363*b725ae77Skettenis #endif
364*b725ae77Skettenis #if defined (SIGIO)
365*b725ae77Skettenis   if (hostsig == SIGIO)
366*b725ae77Skettenis     return TARGET_SIGNAL_IO;
367*b725ae77Skettenis #endif
368*b725ae77Skettenis #if defined (SIGPOLL)
369*b725ae77Skettenis   if (hostsig == SIGPOLL)
370*b725ae77Skettenis     return TARGET_SIGNAL_POLL;
371*b725ae77Skettenis #endif
372*b725ae77Skettenis #if defined (SIGSTOP)
373*b725ae77Skettenis   if (hostsig == SIGSTOP)
374*b725ae77Skettenis     return TARGET_SIGNAL_STOP;
375*b725ae77Skettenis #endif
376*b725ae77Skettenis #if defined (SIGTSTP)
377*b725ae77Skettenis   if (hostsig == SIGTSTP)
378*b725ae77Skettenis     return TARGET_SIGNAL_TSTP;
379*b725ae77Skettenis #endif
380*b725ae77Skettenis #if defined (SIGCONT)
381*b725ae77Skettenis   if (hostsig == SIGCONT)
382*b725ae77Skettenis     return TARGET_SIGNAL_CONT;
383*b725ae77Skettenis #endif
384*b725ae77Skettenis #if defined (SIGTTIN)
385*b725ae77Skettenis   if (hostsig == SIGTTIN)
386*b725ae77Skettenis     return TARGET_SIGNAL_TTIN;
387*b725ae77Skettenis #endif
388*b725ae77Skettenis #if defined (SIGTTOU)
389*b725ae77Skettenis   if (hostsig == SIGTTOU)
390*b725ae77Skettenis     return TARGET_SIGNAL_TTOU;
391*b725ae77Skettenis #endif
392*b725ae77Skettenis #if defined (SIGVTALRM)
393*b725ae77Skettenis   if (hostsig == SIGVTALRM)
394*b725ae77Skettenis     return TARGET_SIGNAL_VTALRM;
395*b725ae77Skettenis #endif
396*b725ae77Skettenis #if defined (SIGPROF)
397*b725ae77Skettenis   if (hostsig == SIGPROF)
398*b725ae77Skettenis     return TARGET_SIGNAL_PROF;
399*b725ae77Skettenis #endif
400*b725ae77Skettenis #if defined (SIGXCPU)
401*b725ae77Skettenis   if (hostsig == SIGXCPU)
402*b725ae77Skettenis     return TARGET_SIGNAL_XCPU;
403*b725ae77Skettenis #endif
404*b725ae77Skettenis #if defined (SIGXFSZ)
405*b725ae77Skettenis   if (hostsig == SIGXFSZ)
406*b725ae77Skettenis     return TARGET_SIGNAL_XFSZ;
407*b725ae77Skettenis #endif
408*b725ae77Skettenis #if defined (SIGWIND)
409*b725ae77Skettenis   if (hostsig == SIGWIND)
410*b725ae77Skettenis     return TARGET_SIGNAL_WIND;
411*b725ae77Skettenis #endif
412*b725ae77Skettenis #if defined (SIGPHONE)
413*b725ae77Skettenis   if (hostsig == SIGPHONE)
414*b725ae77Skettenis     return TARGET_SIGNAL_PHONE;
415*b725ae77Skettenis #endif
416*b725ae77Skettenis #if defined (SIGLOST)
417*b725ae77Skettenis   if (hostsig == SIGLOST)
418*b725ae77Skettenis     return TARGET_SIGNAL_LOST;
419*b725ae77Skettenis #endif
420*b725ae77Skettenis #if defined (SIGWAITING)
421*b725ae77Skettenis   if (hostsig == SIGWAITING)
422*b725ae77Skettenis     return TARGET_SIGNAL_WAITING;
423*b725ae77Skettenis #endif
424*b725ae77Skettenis #if defined (SIGCANCEL)
425*b725ae77Skettenis   if (hostsig == SIGCANCEL)
426*b725ae77Skettenis     return TARGET_SIGNAL_CANCEL;
427*b725ae77Skettenis #endif
428*b725ae77Skettenis #if defined (SIGLWP)
429*b725ae77Skettenis   if (hostsig == SIGLWP)
430*b725ae77Skettenis     return TARGET_SIGNAL_LWP;
431*b725ae77Skettenis #endif
432*b725ae77Skettenis #if defined (SIGDANGER)
433*b725ae77Skettenis   if (hostsig == SIGDANGER)
434*b725ae77Skettenis     return TARGET_SIGNAL_DANGER;
435*b725ae77Skettenis #endif
436*b725ae77Skettenis #if defined (SIGGRANT)
437*b725ae77Skettenis   if (hostsig == SIGGRANT)
438*b725ae77Skettenis     return TARGET_SIGNAL_GRANT;
439*b725ae77Skettenis #endif
440*b725ae77Skettenis #if defined (SIGRETRACT)
441*b725ae77Skettenis   if (hostsig == SIGRETRACT)
442*b725ae77Skettenis     return TARGET_SIGNAL_RETRACT;
443*b725ae77Skettenis #endif
444*b725ae77Skettenis #if defined (SIGMSG)
445*b725ae77Skettenis   if (hostsig == SIGMSG)
446*b725ae77Skettenis     return TARGET_SIGNAL_MSG;
447*b725ae77Skettenis #endif
448*b725ae77Skettenis #if defined (SIGSOUND)
449*b725ae77Skettenis   if (hostsig == SIGSOUND)
450*b725ae77Skettenis     return TARGET_SIGNAL_SOUND;
451*b725ae77Skettenis #endif
452*b725ae77Skettenis #if defined (SIGSAK)
453*b725ae77Skettenis   if (hostsig == SIGSAK)
454*b725ae77Skettenis     return TARGET_SIGNAL_SAK;
455*b725ae77Skettenis #endif
456*b725ae77Skettenis #if defined (SIGPRIO)
457*b725ae77Skettenis   if (hostsig == SIGPRIO)
458*b725ae77Skettenis     return TARGET_SIGNAL_PRIO;
459*b725ae77Skettenis #endif
460*b725ae77Skettenis 
461*b725ae77Skettenis   /* Mach exceptions.  Assumes that the values for EXC_ are positive! */
462*b725ae77Skettenis #if defined (EXC_BAD_ACCESS) && defined (_NSIG)
463*b725ae77Skettenis   if (hostsig == _NSIG + EXC_BAD_ACCESS)
464*b725ae77Skettenis     return TARGET_EXC_BAD_ACCESS;
465*b725ae77Skettenis #endif
466*b725ae77Skettenis #if defined (EXC_BAD_INSTRUCTION) && defined (_NSIG)
467*b725ae77Skettenis   if (hostsig == _NSIG + EXC_BAD_INSTRUCTION)
468*b725ae77Skettenis     return TARGET_EXC_BAD_INSTRUCTION;
469*b725ae77Skettenis #endif
470*b725ae77Skettenis #if defined (EXC_ARITHMETIC) && defined (_NSIG)
471*b725ae77Skettenis   if (hostsig == _NSIG + EXC_ARITHMETIC)
472*b725ae77Skettenis     return TARGET_EXC_ARITHMETIC;
473*b725ae77Skettenis #endif
474*b725ae77Skettenis #if defined (EXC_EMULATION) && defined (_NSIG)
475*b725ae77Skettenis   if (hostsig == _NSIG + EXC_EMULATION)
476*b725ae77Skettenis     return TARGET_EXC_EMULATION;
477*b725ae77Skettenis #endif
478*b725ae77Skettenis #if defined (EXC_SOFTWARE) && defined (_NSIG)
479*b725ae77Skettenis   if (hostsig == _NSIG + EXC_SOFTWARE)
480*b725ae77Skettenis     return TARGET_EXC_SOFTWARE;
481*b725ae77Skettenis #endif
482*b725ae77Skettenis #if defined (EXC_BREAKPOINT) && defined (_NSIG)
483*b725ae77Skettenis   if (hostsig == _NSIG + EXC_BREAKPOINT)
484*b725ae77Skettenis     return TARGET_EXC_BREAKPOINT;
485*b725ae77Skettenis #endif
486*b725ae77Skettenis 
487*b725ae77Skettenis #if defined (SIGINFO)
488*b725ae77Skettenis   if (hostsig == SIGINFO)
489*b725ae77Skettenis     return TARGET_SIGNAL_INFO;
490*b725ae77Skettenis #endif
491*b725ae77Skettenis 
492*b725ae77Skettenis #if defined (REALTIME_LO)
493*b725ae77Skettenis   if (hostsig >= REALTIME_LO && hostsig < REALTIME_HI)
494*b725ae77Skettenis     {
495*b725ae77Skettenis       /* This block of TARGET_SIGNAL_REALTIME value is in order.  */
496*b725ae77Skettenis       if (33 <= hostsig && hostsig <= 63)
497*b725ae77Skettenis 	return (enum target_signal)
498*b725ae77Skettenis 	  (hostsig - 33 + (int) TARGET_SIGNAL_REALTIME_33);
499*b725ae77Skettenis       else if (hostsig == 32)
500*b725ae77Skettenis 	return TARGET_SIGNAL_REALTIME_32;
501*b725ae77Skettenis       else if (64 <= hostsig && hostsig <= 127)
502*b725ae77Skettenis 	return (enum target_signal)
503*b725ae77Skettenis 	  (hostsig - 64 + (int) TARGET_SIGNAL_REALTIME_64);
504*b725ae77Skettenis       else
505*b725ae77Skettenis 	error ("GDB bug: target.c (target_signal_from_host): unrecognized real-time signal");
506*b725ae77Skettenis     }
507*b725ae77Skettenis #endif
508*b725ae77Skettenis 
509*b725ae77Skettenis   return TARGET_SIGNAL_UNKNOWN;
510*b725ae77Skettenis }
511*b725ae77Skettenis 
512*b725ae77Skettenis /* Convert a OURSIG (an enum target_signal) to the form used by the
513*b725ae77Skettenis    target operating system (refered to as the ``host'') or zero if the
514*b725ae77Skettenis    equivalent host signal is not available.  Set/clear OURSIG_OK
515*b725ae77Skettenis    accordingly. */
516*b725ae77Skettenis 
517*b725ae77Skettenis static int
do_target_signal_to_host(enum target_signal oursig,int * oursig_ok)518*b725ae77Skettenis do_target_signal_to_host (enum target_signal oursig,
519*b725ae77Skettenis 			  int *oursig_ok)
520*b725ae77Skettenis {
521*b725ae77Skettenis   int retsig;
522*b725ae77Skettenis 
523*b725ae77Skettenis   *oursig_ok = 1;
524*b725ae77Skettenis   switch (oursig)
525*b725ae77Skettenis     {
526*b725ae77Skettenis     case TARGET_SIGNAL_0:
527*b725ae77Skettenis       return 0;
528*b725ae77Skettenis 
529*b725ae77Skettenis #if defined (SIGHUP)
530*b725ae77Skettenis     case TARGET_SIGNAL_HUP:
531*b725ae77Skettenis       return SIGHUP;
532*b725ae77Skettenis #endif
533*b725ae77Skettenis #if defined (SIGINT)
534*b725ae77Skettenis     case TARGET_SIGNAL_INT:
535*b725ae77Skettenis       return SIGINT;
536*b725ae77Skettenis #endif
537*b725ae77Skettenis #if defined (SIGQUIT)
538*b725ae77Skettenis     case TARGET_SIGNAL_QUIT:
539*b725ae77Skettenis       return SIGQUIT;
540*b725ae77Skettenis #endif
541*b725ae77Skettenis #if defined (SIGILL)
542*b725ae77Skettenis     case TARGET_SIGNAL_ILL:
543*b725ae77Skettenis       return SIGILL;
544*b725ae77Skettenis #endif
545*b725ae77Skettenis #if defined (SIGTRAP)
546*b725ae77Skettenis     case TARGET_SIGNAL_TRAP:
547*b725ae77Skettenis       return SIGTRAP;
548*b725ae77Skettenis #endif
549*b725ae77Skettenis #if defined (SIGABRT)
550*b725ae77Skettenis     case TARGET_SIGNAL_ABRT:
551*b725ae77Skettenis       return SIGABRT;
552*b725ae77Skettenis #endif
553*b725ae77Skettenis #if defined (SIGEMT)
554*b725ae77Skettenis     case TARGET_SIGNAL_EMT:
555*b725ae77Skettenis       return SIGEMT;
556*b725ae77Skettenis #endif
557*b725ae77Skettenis #if defined (SIGFPE)
558*b725ae77Skettenis     case TARGET_SIGNAL_FPE:
559*b725ae77Skettenis       return SIGFPE;
560*b725ae77Skettenis #endif
561*b725ae77Skettenis #if defined (SIGKILL)
562*b725ae77Skettenis     case TARGET_SIGNAL_KILL:
563*b725ae77Skettenis       return SIGKILL;
564*b725ae77Skettenis #endif
565*b725ae77Skettenis #if defined (SIGBUS)
566*b725ae77Skettenis     case TARGET_SIGNAL_BUS:
567*b725ae77Skettenis       return SIGBUS;
568*b725ae77Skettenis #endif
569*b725ae77Skettenis #if defined (SIGSEGV)
570*b725ae77Skettenis     case TARGET_SIGNAL_SEGV:
571*b725ae77Skettenis       return SIGSEGV;
572*b725ae77Skettenis #endif
573*b725ae77Skettenis #if defined (SIGSYS)
574*b725ae77Skettenis     case TARGET_SIGNAL_SYS:
575*b725ae77Skettenis       return SIGSYS;
576*b725ae77Skettenis #endif
577*b725ae77Skettenis #if defined (SIGPIPE)
578*b725ae77Skettenis     case TARGET_SIGNAL_PIPE:
579*b725ae77Skettenis       return SIGPIPE;
580*b725ae77Skettenis #endif
581*b725ae77Skettenis #if defined (SIGALRM)
582*b725ae77Skettenis     case TARGET_SIGNAL_ALRM:
583*b725ae77Skettenis       return SIGALRM;
584*b725ae77Skettenis #endif
585*b725ae77Skettenis #if defined (SIGTERM)
586*b725ae77Skettenis     case TARGET_SIGNAL_TERM:
587*b725ae77Skettenis       return SIGTERM;
588*b725ae77Skettenis #endif
589*b725ae77Skettenis #if defined (SIGUSR1)
590*b725ae77Skettenis     case TARGET_SIGNAL_USR1:
591*b725ae77Skettenis       return SIGUSR1;
592*b725ae77Skettenis #endif
593*b725ae77Skettenis #if defined (SIGUSR2)
594*b725ae77Skettenis     case TARGET_SIGNAL_USR2:
595*b725ae77Skettenis       return SIGUSR2;
596*b725ae77Skettenis #endif
597*b725ae77Skettenis #if defined (SIGCHLD) || defined (SIGCLD)
598*b725ae77Skettenis     case TARGET_SIGNAL_CHLD:
599*b725ae77Skettenis #if defined (SIGCHLD)
600*b725ae77Skettenis       return SIGCHLD;
601*b725ae77Skettenis #else
602*b725ae77Skettenis       return SIGCLD;
603*b725ae77Skettenis #endif
604*b725ae77Skettenis #endif /* SIGCLD or SIGCHLD */
605*b725ae77Skettenis #if defined (SIGPWR)
606*b725ae77Skettenis     case TARGET_SIGNAL_PWR:
607*b725ae77Skettenis       return SIGPWR;
608*b725ae77Skettenis #endif
609*b725ae77Skettenis #if defined (SIGWINCH)
610*b725ae77Skettenis     case TARGET_SIGNAL_WINCH:
611*b725ae77Skettenis       return SIGWINCH;
612*b725ae77Skettenis #endif
613*b725ae77Skettenis #if defined (SIGURG)
614*b725ae77Skettenis     case TARGET_SIGNAL_URG:
615*b725ae77Skettenis       return SIGURG;
616*b725ae77Skettenis #endif
617*b725ae77Skettenis #if defined (SIGIO)
618*b725ae77Skettenis     case TARGET_SIGNAL_IO:
619*b725ae77Skettenis       return SIGIO;
620*b725ae77Skettenis #endif
621*b725ae77Skettenis #if defined (SIGPOLL)
622*b725ae77Skettenis     case TARGET_SIGNAL_POLL:
623*b725ae77Skettenis       return SIGPOLL;
624*b725ae77Skettenis #endif
625*b725ae77Skettenis #if defined (SIGSTOP)
626*b725ae77Skettenis     case TARGET_SIGNAL_STOP:
627*b725ae77Skettenis       return SIGSTOP;
628*b725ae77Skettenis #endif
629*b725ae77Skettenis #if defined (SIGTSTP)
630*b725ae77Skettenis     case TARGET_SIGNAL_TSTP:
631*b725ae77Skettenis       return SIGTSTP;
632*b725ae77Skettenis #endif
633*b725ae77Skettenis #if defined (SIGCONT)
634*b725ae77Skettenis     case TARGET_SIGNAL_CONT:
635*b725ae77Skettenis       return SIGCONT;
636*b725ae77Skettenis #endif
637*b725ae77Skettenis #if defined (SIGTTIN)
638*b725ae77Skettenis     case TARGET_SIGNAL_TTIN:
639*b725ae77Skettenis       return SIGTTIN;
640*b725ae77Skettenis #endif
641*b725ae77Skettenis #if defined (SIGTTOU)
642*b725ae77Skettenis     case TARGET_SIGNAL_TTOU:
643*b725ae77Skettenis       return SIGTTOU;
644*b725ae77Skettenis #endif
645*b725ae77Skettenis #if defined (SIGVTALRM)
646*b725ae77Skettenis     case TARGET_SIGNAL_VTALRM:
647*b725ae77Skettenis       return SIGVTALRM;
648*b725ae77Skettenis #endif
649*b725ae77Skettenis #if defined (SIGPROF)
650*b725ae77Skettenis     case TARGET_SIGNAL_PROF:
651*b725ae77Skettenis       return SIGPROF;
652*b725ae77Skettenis #endif
653*b725ae77Skettenis #if defined (SIGXCPU)
654*b725ae77Skettenis     case TARGET_SIGNAL_XCPU:
655*b725ae77Skettenis       return SIGXCPU;
656*b725ae77Skettenis #endif
657*b725ae77Skettenis #if defined (SIGXFSZ)
658*b725ae77Skettenis     case TARGET_SIGNAL_XFSZ:
659*b725ae77Skettenis       return SIGXFSZ;
660*b725ae77Skettenis #endif
661*b725ae77Skettenis #if defined (SIGWIND)
662*b725ae77Skettenis     case TARGET_SIGNAL_WIND:
663*b725ae77Skettenis       return SIGWIND;
664*b725ae77Skettenis #endif
665*b725ae77Skettenis #if defined (SIGPHONE)
666*b725ae77Skettenis     case TARGET_SIGNAL_PHONE:
667*b725ae77Skettenis       return SIGPHONE;
668*b725ae77Skettenis #endif
669*b725ae77Skettenis #if defined (SIGLOST)
670*b725ae77Skettenis     case TARGET_SIGNAL_LOST:
671*b725ae77Skettenis       return SIGLOST;
672*b725ae77Skettenis #endif
673*b725ae77Skettenis #if defined (SIGWAITING)
674*b725ae77Skettenis     case TARGET_SIGNAL_WAITING:
675*b725ae77Skettenis       return SIGWAITING;
676*b725ae77Skettenis #endif
677*b725ae77Skettenis #if defined (SIGCANCEL)
678*b725ae77Skettenis     case TARGET_SIGNAL_CANCEL:
679*b725ae77Skettenis       return SIGCANCEL;
680*b725ae77Skettenis #endif
681*b725ae77Skettenis #if defined (SIGLWP)
682*b725ae77Skettenis     case TARGET_SIGNAL_LWP:
683*b725ae77Skettenis       return SIGLWP;
684*b725ae77Skettenis #endif
685*b725ae77Skettenis #if defined (SIGDANGER)
686*b725ae77Skettenis     case TARGET_SIGNAL_DANGER:
687*b725ae77Skettenis       return SIGDANGER;
688*b725ae77Skettenis #endif
689*b725ae77Skettenis #if defined (SIGGRANT)
690*b725ae77Skettenis     case TARGET_SIGNAL_GRANT:
691*b725ae77Skettenis       return SIGGRANT;
692*b725ae77Skettenis #endif
693*b725ae77Skettenis #if defined (SIGRETRACT)
694*b725ae77Skettenis     case TARGET_SIGNAL_RETRACT:
695*b725ae77Skettenis       return SIGRETRACT;
696*b725ae77Skettenis #endif
697*b725ae77Skettenis #if defined (SIGMSG)
698*b725ae77Skettenis     case TARGET_SIGNAL_MSG:
699*b725ae77Skettenis       return SIGMSG;
700*b725ae77Skettenis #endif
701*b725ae77Skettenis #if defined (SIGSOUND)
702*b725ae77Skettenis     case TARGET_SIGNAL_SOUND:
703*b725ae77Skettenis       return SIGSOUND;
704*b725ae77Skettenis #endif
705*b725ae77Skettenis #if defined (SIGSAK)
706*b725ae77Skettenis     case TARGET_SIGNAL_SAK:
707*b725ae77Skettenis       return SIGSAK;
708*b725ae77Skettenis #endif
709*b725ae77Skettenis #if defined (SIGPRIO)
710*b725ae77Skettenis     case TARGET_SIGNAL_PRIO:
711*b725ae77Skettenis       return SIGPRIO;
712*b725ae77Skettenis #endif
713*b725ae77Skettenis 
714*b725ae77Skettenis       /* Mach exceptions.  Assumes that the values for EXC_ are positive! */
715*b725ae77Skettenis #if defined (EXC_BAD_ACCESS) && defined (_NSIG)
716*b725ae77Skettenis     case TARGET_EXC_BAD_ACCESS:
717*b725ae77Skettenis       return _NSIG + EXC_BAD_ACCESS;
718*b725ae77Skettenis #endif
719*b725ae77Skettenis #if defined (EXC_BAD_INSTRUCTION) && defined (_NSIG)
720*b725ae77Skettenis     case TARGET_EXC_BAD_INSTRUCTION:
721*b725ae77Skettenis       return _NSIG + EXC_BAD_INSTRUCTION;
722*b725ae77Skettenis #endif
723*b725ae77Skettenis #if defined (EXC_ARITHMETIC) && defined (_NSIG)
724*b725ae77Skettenis     case TARGET_EXC_ARITHMETIC:
725*b725ae77Skettenis       return _NSIG + EXC_ARITHMETIC;
726*b725ae77Skettenis #endif
727*b725ae77Skettenis #if defined (EXC_EMULATION) && defined (_NSIG)
728*b725ae77Skettenis     case TARGET_EXC_EMULATION:
729*b725ae77Skettenis       return _NSIG + EXC_EMULATION;
730*b725ae77Skettenis #endif
731*b725ae77Skettenis #if defined (EXC_SOFTWARE) && defined (_NSIG)
732*b725ae77Skettenis     case TARGET_EXC_SOFTWARE:
733*b725ae77Skettenis       return _NSIG + EXC_SOFTWARE;
734*b725ae77Skettenis #endif
735*b725ae77Skettenis #if defined (EXC_BREAKPOINT) && defined (_NSIG)
736*b725ae77Skettenis     case TARGET_EXC_BREAKPOINT:
737*b725ae77Skettenis       return _NSIG + EXC_BREAKPOINT;
738*b725ae77Skettenis #endif
739*b725ae77Skettenis 
740*b725ae77Skettenis #if defined (SIGINFO)
741*b725ae77Skettenis     case TARGET_SIGNAL_INFO:
742*b725ae77Skettenis       return SIGINFO;
743*b725ae77Skettenis #endif
744*b725ae77Skettenis 
745*b725ae77Skettenis     default:
746*b725ae77Skettenis #if defined (REALTIME_LO)
747*b725ae77Skettenis       retsig = 0;
748*b725ae77Skettenis 
749*b725ae77Skettenis       if (oursig >= TARGET_SIGNAL_REALTIME_33
750*b725ae77Skettenis 	  && oursig <= TARGET_SIGNAL_REALTIME_63)
751*b725ae77Skettenis 	{
752*b725ae77Skettenis 	  /* This block of signals is continuous, and
753*b725ae77Skettenis              TARGET_SIGNAL_REALTIME_33 is 33 by definition.  */
754*b725ae77Skettenis 	  retsig = (int) oursig - (int) TARGET_SIGNAL_REALTIME_33 + 33;
755*b725ae77Skettenis 	}
756*b725ae77Skettenis       else if (oursig == TARGET_SIGNAL_REALTIME_32)
757*b725ae77Skettenis 	{
758*b725ae77Skettenis 	  /* TARGET_SIGNAL_REALTIME_32 isn't contiguous with
759*b725ae77Skettenis              TARGET_SIGNAL_REALTIME_33.  It is 32 by definition.  */
760*b725ae77Skettenis 	  retsig = 32;
761*b725ae77Skettenis 	}
762*b725ae77Skettenis       else if (oursig >= TARGET_SIGNAL_REALTIME_64
763*b725ae77Skettenis 	  && oursig <= TARGET_SIGNAL_REALTIME_127)
764*b725ae77Skettenis 	{
765*b725ae77Skettenis 	  /* This block of signals is continuous, and
766*b725ae77Skettenis              TARGET_SIGNAL_REALTIME_64 is 64 by definition.  */
767*b725ae77Skettenis 	  retsig = (int) oursig - (int) TARGET_SIGNAL_REALTIME_64 + 64;
768*b725ae77Skettenis 	}
769*b725ae77Skettenis 
770*b725ae77Skettenis       if (retsig >= REALTIME_LO && retsig < REALTIME_HI)
771*b725ae77Skettenis 	return retsig;
772*b725ae77Skettenis #endif
773*b725ae77Skettenis 
774*b725ae77Skettenis       *oursig_ok = 0;
775*b725ae77Skettenis       return 0;
776*b725ae77Skettenis     }
777*b725ae77Skettenis }
778*b725ae77Skettenis 
779*b725ae77Skettenis int
target_signal_to_host_p(enum target_signal oursig)780*b725ae77Skettenis target_signal_to_host_p (enum target_signal oursig)
781*b725ae77Skettenis {
782*b725ae77Skettenis   int oursig_ok;
783*b725ae77Skettenis   do_target_signal_to_host (oursig, &oursig_ok);
784*b725ae77Skettenis   return oursig_ok;
785*b725ae77Skettenis }
786*b725ae77Skettenis 
787*b725ae77Skettenis int
target_signal_to_host(enum target_signal oursig)788*b725ae77Skettenis target_signal_to_host (enum target_signal oursig)
789*b725ae77Skettenis {
790*b725ae77Skettenis   int oursig_ok;
791*b725ae77Skettenis   int targ_signo = do_target_signal_to_host (oursig, &oursig_ok);
792*b725ae77Skettenis   if (!oursig_ok)
793*b725ae77Skettenis     {
794*b725ae77Skettenis       /* The user might be trying to do "signal SIGSAK" where this system
795*b725ae77Skettenis          doesn't have SIGSAK.  */
796*b725ae77Skettenis       warning ("Signal %s does not exist on this system.\n",
797*b725ae77Skettenis 	       target_signal_to_name (oursig));
798*b725ae77Skettenis       return 0;
799*b725ae77Skettenis     }
800*b725ae77Skettenis   else
801*b725ae77Skettenis     return targ_signo;
802*b725ae77Skettenis }
803*b725ae77Skettenis 
804*b725ae77Skettenis /* In some circumstances we allow a command to specify a numeric
805*b725ae77Skettenis    signal.  The idea is to keep these circumstances limited so that
806*b725ae77Skettenis    users (and scripts) develop portable habits.  For comparison,
807*b725ae77Skettenis    POSIX.2 `kill' requires that 1,2,3,6,9,14, and 15 work (and using a
808*b725ae77Skettenis    numeric signal at all is obsolescent.  We are slightly more
809*b725ae77Skettenis    lenient and allow 1-15 which should match host signal numbers on
810*b725ae77Skettenis    most systems.  Use of symbolic signal names is strongly encouraged.  */
811*b725ae77Skettenis 
812*b725ae77Skettenis enum target_signal
target_signal_from_command(int num)813*b725ae77Skettenis target_signal_from_command (int num)
814*b725ae77Skettenis {
815*b725ae77Skettenis   if (num >= 1 && num <= 15)
816*b725ae77Skettenis     return (enum target_signal) num;
817*b725ae77Skettenis   error ("Only signals 1-15 are valid as numeric signals.\n\
818*b725ae77Skettenis Use \"info signals\" for a list of symbolic signals.");
819*b725ae77Skettenis }
820*b725ae77Skettenis 
821*b725ae77Skettenis #ifndef GDBSERVER
822*b725ae77Skettenis extern initialize_file_ftype _initialize_signals; /* -Wmissing-prototype */
823*b725ae77Skettenis 
824*b725ae77Skettenis void
_initialize_signals(void)825*b725ae77Skettenis _initialize_signals (void)
826*b725ae77Skettenis {
827*b725ae77Skettenis   if (strcmp (signals[TARGET_SIGNAL_LAST].string, "TARGET_SIGNAL_MAGIC") != 0)
828*b725ae77Skettenis     internal_error (__FILE__, __LINE__, "failed internal consistency check");
829*b725ae77Skettenis }
830*b725ae77Skettenis #endif
831