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