1/* Simulator signal support 2 Copyright (C) 1997, 2007 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#include <signal.h> 21#include "sim-main.h" 22 23/* Convert SIM_SIGFOO to SIGFOO. 24 What to do when the host doesn't have SIGFOO is handled on a case by case 25 basis. Generally, in the case of passing a value back to gdb, we want gdb 26 to not think the process has died (so it can be debugged at the point of 27 failure). */ 28 29#ifdef _MSC_VER 30#ifndef SIGTRAP 31#define SIGTRAP 5 32#endif 33#ifndef SIGBUS 34#define SIGBUS 10 35#endif 36#ifndef SIGQUIT 37#define SIGQUIT 3 38#endif 39#endif 40 41int 42sim_signal_to_host (SIM_DESC sd, SIM_SIGNAL sig) 43{ 44 switch (sig) 45 { 46 case SIM_SIGINT : 47 return SIGINT; 48 49 case SIM_SIGABRT : 50 return SIGABRT; 51 52 case SIM_SIGILL : 53#ifdef SIGILL 54 return SIGILL; 55#else 56 return SIGSEGV; 57#endif 58 59 case SIM_SIGTRAP : 60 return SIGTRAP; 61 62 case SIM_SIGBUS : 63#ifdef SIGBUS 64 return SIGBUS; 65#else 66 return SIGSEGV; 67#endif 68 69 case SIM_SIGSEGV : 70 return SIGSEGV; 71 72 case SIM_SIGXCPU : 73#ifdef SIGXCPU 74 return SIGXCPU; 75#endif 76 break; 77 78 case SIM_SIGFPE: 79#ifdef SIGFPE 80 return SIGFPE; 81#endif 82 break; 83 84 case SIM_SIGNONE: 85 return 0; 86 break; 87 } 88 89 sim_io_eprintf (sd, "sim_signal_to_host: unknown signal: %d\n", sig); 90#ifdef SIGHUP 91 return SIGHUP; /* FIXME: Suggestions? */ 92#else 93 return 1; 94#endif 95} 96 97enum target_signal 98sim_signal_to_target (SIM_DESC sd, SIM_SIGNAL sig) 99{ 100 switch (sig) 101 { 102 case SIM_SIGINT : 103 return TARGET_SIGNAL_INT; 104 105 case SIM_SIGABRT : 106 return TARGET_SIGNAL_ABRT; 107 108 case SIM_SIGILL : 109 return TARGET_SIGNAL_ILL; 110 111 case SIM_SIGTRAP : 112 return TARGET_SIGNAL_TRAP; 113 114 case SIM_SIGBUS : 115 return TARGET_SIGNAL_BUS; 116 117 case SIM_SIGSEGV : 118 return TARGET_SIGNAL_SEGV; 119 120 case SIM_SIGXCPU : 121 return TARGET_SIGNAL_XCPU; 122 123 case SIM_SIGFPE: 124 return TARGET_SIGNAL_FPE; 125 break; 126 127 case SIM_SIGNONE: 128 return TARGET_SIGNAL_0; 129 break; 130 } 131 132 sim_io_eprintf (sd, "sim_signal_to_host: unknown signal: %d\n", sig); 133 return TARGET_SIGNAL_HUP; 134} 135