1/* Simulator signal support
2   Copyright (C) 1997-2023 Free Software Foundation, Inc.
3   Contributed by Cygnus Support
4
5This file is part of the GNU Simulators.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 3 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
20/* This must come before any other includes.  */
21#include "defs.h"
22
23#include <signal.h>
24
25#include "sim-main.h"
26#include "sim-signal.h"
27
28/* Convert SIM_SIGFOO to SIGFOO.
29   What to do when the host doesn't have SIGFOO is handled on a case by case
30   basis.  Generally, in the case of passing a value back to gdb, we want gdb
31   to not think the process has died (so it can be debugged at the point of
32   failure).  */
33
34#ifdef _WIN32
35#ifndef SIGTRAP
36#define SIGTRAP 5
37#endif
38#ifndef SIGBUS
39#define SIGBUS 10
40#endif
41#ifndef SIGQUIT
42#define SIGQUIT 3
43#endif
44#endif
45
46int
47sim_signal_to_host (SIM_DESC sd, SIM_SIGNAL sig)
48{
49  switch (sig)
50    {
51    case SIM_SIGINT :
52      return SIGINT;
53
54    case SIM_SIGABRT :
55      return SIGABRT;
56
57    case SIM_SIGILL :
58#ifdef SIGILL
59      return SIGILL;
60#else
61      return SIGSEGV;
62#endif
63
64    case SIM_SIGTRAP :
65      return SIGTRAP;
66
67    case SIM_SIGBUS :
68#ifdef SIGBUS
69      return SIGBUS;
70#else
71      return SIGSEGV;
72#endif
73
74    case SIM_SIGSEGV :
75      return SIGSEGV;
76
77    case SIM_SIGXCPU :
78#ifdef SIGXCPU
79      return SIGXCPU;
80#endif
81      break;
82
83    case SIM_SIGFPE:
84#ifdef SIGFPE
85      return SIGFPE;
86#endif
87      break;
88
89    case SIM_SIGNONE:
90      return 0;
91      break;
92    }
93
94  sim_io_eprintf (sd, "sim_signal_to_host: unknown signal: %d\n", sig);
95#ifdef SIGHUP
96  return SIGHUP;  /* FIXME: Suggestions?  */
97#else
98  return 1;
99#endif
100}
101
102enum gdb_signal
103sim_signal_to_gdb_signal (SIM_DESC sd, SIM_SIGNAL sig)
104{
105  switch (sig)
106    {
107    case SIM_SIGINT :
108      return GDB_SIGNAL_INT;
109
110    case SIM_SIGABRT :
111      return GDB_SIGNAL_ABRT;
112
113    case SIM_SIGILL :
114      return GDB_SIGNAL_ILL;
115
116    case SIM_SIGTRAP :
117      return GDB_SIGNAL_TRAP;
118
119    case SIM_SIGBUS :
120      return GDB_SIGNAL_BUS;
121
122    case SIM_SIGSEGV :
123      return GDB_SIGNAL_SEGV;
124
125    case SIM_SIGXCPU :
126      return GDB_SIGNAL_XCPU;
127
128    case SIM_SIGFPE:
129      return GDB_SIGNAL_FPE;
130      break;
131
132    case SIM_SIGNONE:
133      return GDB_SIGNAL_0;
134      break;
135    }
136
137  sim_io_eprintf (sd, "sim_signal_to_host: unknown signal: %d\n", sig);
138  return GDB_SIGNAL_HUP;
139}
140