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