Blame sim/common/sim-signal.c

Packit Service 706eca
/* Simulator signal support
Packit Service 706eca
   Copyright (C) 1997-2018 Free Software Foundation, Inc.
Packit Service 706eca
   Contributed by Cygnus Support
Packit Service 706eca
Packit Service 706eca
This file is part of the GNU Simulators.
Packit Service 706eca
Packit Service 706eca
This program is free software; you can redistribute it and/or modify
Packit Service 706eca
it under the terms of the GNU General Public License as published by
Packit Service 706eca
the Free Software Foundation; either version 3 of the License, or
Packit Service 706eca
(at your option) any later version.
Packit Service 706eca
Packit Service 706eca
This program is distributed in the hope that it will be useful,
Packit Service 706eca
but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 706eca
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 706eca
GNU General Public License for more details.
Packit Service 706eca
Packit Service 706eca
You should have received a copy of the GNU General Public License
Packit Service 706eca
along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit Service 706eca
Packit Service 706eca
#include <signal.h>
Packit Service 706eca
#include "sim-main.h"
Packit Service 706eca
Packit Service 706eca
/* Convert SIM_SIGFOO to SIGFOO.
Packit Service 706eca
   What to do when the host doesn't have SIGFOO is handled on a case by case
Packit Service 706eca
   basis.  Generally, in the case of passing a value back to gdb, we want gdb
Packit Service 706eca
   to not think the process has died (so it can be debugged at the point of
Packit Service 706eca
   failure).  */
Packit Service 706eca
Packit Service 706eca
#ifdef _WIN32
Packit Service 706eca
#ifndef SIGTRAP
Packit Service 706eca
#define SIGTRAP 5
Packit Service 706eca
#endif
Packit Service 706eca
#ifndef SIGBUS
Packit Service 706eca
#define SIGBUS 10
Packit Service 706eca
#endif
Packit Service 706eca
#ifndef SIGQUIT
Packit Service 706eca
#define SIGQUIT 3
Packit Service 706eca
#endif
Packit Service 706eca
#endif
Packit Service 706eca
Packit Service 706eca
int
Packit Service 706eca
sim_signal_to_host (SIM_DESC sd, SIM_SIGNAL sig)
Packit Service 706eca
{
Packit Service 706eca
  switch (sig)
Packit Service 706eca
    {
Packit Service 706eca
    case SIM_SIGINT :
Packit Service 706eca
      return SIGINT;
Packit Service 706eca
Packit Service 706eca
    case SIM_SIGABRT :
Packit Service 706eca
      return SIGABRT;
Packit Service 706eca
Packit Service 706eca
    case SIM_SIGILL :
Packit Service 706eca
#ifdef SIGILL
Packit Service 706eca
      return SIGILL;
Packit Service 706eca
#else
Packit Service 706eca
      return SIGSEGV;
Packit Service 706eca
#endif
Packit Service 706eca
Packit Service 706eca
    case SIM_SIGTRAP :
Packit Service 706eca
      return SIGTRAP;
Packit Service 706eca
Packit Service 706eca
    case SIM_SIGBUS :
Packit Service 706eca
#ifdef SIGBUS
Packit Service 706eca
      return SIGBUS;
Packit Service 706eca
#else
Packit Service 706eca
      return SIGSEGV;
Packit Service 706eca
#endif
Packit Service 706eca
Packit Service 706eca
    case SIM_SIGSEGV :
Packit Service 706eca
      return SIGSEGV;
Packit Service 706eca
Packit Service 706eca
    case SIM_SIGXCPU :
Packit Service 706eca
#ifdef SIGXCPU
Packit Service 706eca
      return SIGXCPU;
Packit Service 706eca
#endif
Packit Service 706eca
      break;
Packit Service 706eca
Packit Service 706eca
    case SIM_SIGFPE:
Packit Service 706eca
#ifdef SIGFPE
Packit Service 706eca
      return SIGFPE;
Packit Service 706eca
#endif
Packit Service 706eca
      break;
Packit Service 706eca
Packit Service 706eca
    case SIM_SIGNONE:
Packit Service 706eca
      return 0;
Packit Service 706eca
      break;
Packit Service 706eca
    }
Packit Service 706eca
Packit Service 706eca
  sim_io_eprintf (sd, "sim_signal_to_host: unknown signal: %d\n", sig);
Packit Service 706eca
#ifdef SIGHUP
Packit Service 706eca
  return SIGHUP;  /* FIXME: Suggestions?  */
Packit Service 706eca
#else
Packit Service 706eca
  return 1;
Packit Service 706eca
#endif
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
enum gdb_signal
Packit Service 706eca
sim_signal_to_gdb_signal (SIM_DESC sd, SIM_SIGNAL sig)
Packit Service 706eca
{
Packit Service 706eca
  switch (sig)
Packit Service 706eca
    {
Packit Service 706eca
    case SIM_SIGINT :
Packit Service 706eca
      return GDB_SIGNAL_INT;
Packit Service 706eca
Packit Service 706eca
    case SIM_SIGABRT :
Packit Service 706eca
      return GDB_SIGNAL_ABRT;
Packit Service 706eca
Packit Service 706eca
    case SIM_SIGILL :
Packit Service 706eca
      return GDB_SIGNAL_ILL;
Packit Service 706eca
Packit Service 706eca
    case SIM_SIGTRAP :
Packit Service 706eca
      return GDB_SIGNAL_TRAP;
Packit Service 706eca
Packit Service 706eca
    case SIM_SIGBUS :
Packit Service 706eca
      return GDB_SIGNAL_BUS;
Packit Service 706eca
Packit Service 706eca
    case SIM_SIGSEGV :
Packit Service 706eca
      return GDB_SIGNAL_SEGV;
Packit Service 706eca
Packit Service 706eca
    case SIM_SIGXCPU :
Packit Service 706eca
      return GDB_SIGNAL_XCPU;
Packit Service 706eca
Packit Service 706eca
    case SIM_SIGFPE:
Packit Service 706eca
      return GDB_SIGNAL_FPE;
Packit Service 706eca
      break;
Packit Service 706eca
Packit Service 706eca
    case SIM_SIGNONE:
Packit Service 706eca
      return GDB_SIGNAL_0;
Packit Service 706eca
      break;
Packit Service 706eca
    }
Packit Service 706eca
Packit Service 706eca
  sim_io_eprintf (sd, "sim_signal_to_host: unknown signal: %d\n", sig);
Packit Service 706eca
  return GDB_SIGNAL_HUP;
Packit Service 706eca
}