From: Doug Evans Date: Wed, 19 Nov 1997 08:00:37 +0000 (+0000) Subject: * sim-signal.c, sim-signal.h: New files. X-Git-Tag: gdb-4_18~4249 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1ebc7e0e243040693a2cf9b4d702d293ee5e6769;p=platform%2Fupstream%2Fbinutils.git * sim-signal.c, sim-signal.h: New files. * Make-common.in (sim-signal.o): Add rule for. (SIM_NEW_COMMON_OBJS): Add sim-signal.o. * sim-abort.c: Don't include . * sim-basics.h: #include "sim-signal.h". * sim-break.c: Don't include . (sim_handle_breakpoint): Replace SIGTRAP with SIM_SIGTRAP. * sim-core.c: Don't include . (SIGBUS): Delete definition. (sim_core_signal): Replace SIGSEGV,SIGBUS with SIM_SIGSEGV,SIM_SIGBUS. * sim-engine.c: Don't include . (sim_engine_abort): Replace SIGABRT with SIM_SIGABRT. * sim-reason.c (sim_stop_reason): Call sim_signal_to_host. * sim-resume.c: Don't include . (SIGTRAP): Delete definition. (has_stepped): Replace SIGTRAP with SIM_SIGTRAP. * sim-stop.c: Don't include . (control_c_simulation): Replace SIGINT with SIM_SIGINT. * sim-watch.c: Don't include . (handle_watchpoint): Replace SIGINT with SIM_SIGINT. --- diff --git a/sim/common/.Sanitize b/sim/common/.Sanitize index e61d75e..daea730 100644 --- a/sim/common/.Sanitize +++ b/sim/common/.Sanitize @@ -93,6 +93,8 @@ sim-profile.h sim-reason.c sim-resume.c sim-run.c +sim-signal.c +sim-signal.h sim-stop.c sim-trace.c sim-trace.h diff --git a/sim/common/ChangeLog b/sim/common/ChangeLog index 1073dfd..4e2cf4a 100644 --- a/sim/common/ChangeLog +++ b/sim/common/ChangeLog @@ -1,5 +1,26 @@ Tue Nov 18 15:53:45 1997 Doug Evans + * sim-signal.c, sim-signal.h: New files. + * Make-common.in (sim-signal.o): Add rule for. + (SIM_NEW_COMMON_OBJS): Add sim-signal.o. + * sim-abort.c: Don't include . + * sim-basics.h: #include "sim-signal.h". + * sim-break.c: Don't include . + (sim_handle_breakpoint): Replace SIGTRAP with SIM_SIGTRAP. + * sim-core.c: Don't include . + (SIGBUS): Delete definition. + (sim_core_signal): Replace SIGSEGV,SIGBUS with SIM_SIGSEGV,SIM_SIGBUS. + * sim-engine.c: Don't include . + (sim_engine_abort): Replace SIGABRT with SIM_SIGABRT. + * sim-reason.c (sim_stop_reason): Call sim_signal_to_host. + * sim-resume.c: Don't include . + (SIGTRAP): Delete definition. + (has_stepped): Replace SIGTRAP with SIM_SIGTRAP. + * sim-stop.c: Don't include . + (control_c_simulation): Replace SIGINT with SIM_SIGINT. + * sim-watch.c: Don't include . + (handle_watchpoint): Replace SIGINT with SIM_SIGINT. + * Make-common.in (SIM_NEW_COMMON_OBJS): New variable. * sim-base.h (CIA_ADDR): Provide default definition. diff --git a/sim/common/Make-common.in b/sim/common/Make-common.in index f782e05..344edad 100644 --- a/sim/common/Make-common.in +++ b/sim/common/Make-common.in @@ -148,6 +148,7 @@ SIM_NEW_COMMON_OBJS = \ sim-module.o \ sim-options.o \ sim-profile.o \ + sim-signal.o \ sim-trace.o \ sim-utils.o \ sim-watch.o @@ -279,6 +280,7 @@ sim-fpu_h = $(srccom)/sim-fpu.h sim-io_h = $(srccom)/sim-io.h sim-options_h = $(srccom)/sim-options.h sim-break_h = $(srccom)/sim-break.h +sim-signal_h = $(srccom)/sim-signal.h # FIXME: If this complicated way of building .o files from ../common is # necessary, the reason should be documented here. @@ -355,6 +357,9 @@ sim-resume.o: $(srccom)/sim-resume.c $(sim_main_headers) sim-run.o: $(srccom)/sim-run.c $(sim_main_headers) $(CC) -c $(srccom)/sim-run.c $(ALL_CFLAGS) +sim-signal.o: $(srccom)/sim-signal.c $(sim_main_headers) $(sim-signal_h) + $(CC) -c $(srccom)/sim-signal.c $(ALL_CFLAGS) + sim-stop.o: $(srccom)/sim-stop.c $(sim_main_headers) $(CC) -c $(srccom)/sim-stop.c $(ALL_CFLAGS) diff --git a/sim/common/sim-break.c b/sim/common/sim-break.c index 1478278..d40d35b 100644 --- a/sim/common/sim-break.c +++ b/sim/common/sim-break.c @@ -19,7 +19,6 @@ with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include -#include #include "sim-main.h" #include "sim-assert.h" @@ -104,7 +103,7 @@ sim_handle_breakpoint (sd, cpu, cia) if (!bp || !(bp->flags & SIM_BREAK_INSERTED)) return; - sim_engine_halt (sd, STATE_CPU (sd, 0), NULL, cia, sim_stopped, SIGTRAP); + sim_engine_halt (sd, STATE_CPU (sd, 0), NULL, cia, sim_stopped, SIM_SIGTRAP); } /* Handler functions for simulator resume and suspend events. */ diff --git a/sim/common/sim-core.c b/sim/common/sim-core.c index 82ba245..b411026 100644 --- a/sim/common/sim-core.c +++ b/sim/common/sim-core.c @@ -25,15 +25,6 @@ #include "sim-main.h" #include "sim-assert.h" -#include - -/* for Windows builds. signal numbers used by MSVC are mostly - the same as non-linux unixen. */ -#ifndef SIGBUS -# define SIGBUS 10 -#endif - - /* "core" module install handler. This is called via sim_module_install to install the "core" subsystem @@ -114,12 +105,12 @@ sim_core_signal (SIM_DESC sd, case sim_core_unmapped_signal: sim_io_eprintf (sd, "core: %d byte %s to unmaped address 0x%lx at 0x%lx\n", nr_bytes, copy, (unsigned long) addr, (unsigned long) ip); - sim_engine_halt (sd, cpu, NULL, cia, sim_signalled, SIGSEGV); + sim_engine_halt (sd, cpu, NULL, cia, sim_signalled, SIM_SIGSEGV); break; case sim_core_unaligned_signal: sim_io_eprintf (sd, "core: %d byte misaligned %s to address 0x%lx at 0x%lx\n", nr_bytes, copy, (unsigned long) addr, (unsigned long) ip); - sim_engine_halt (sd, cpu, NULL, cia, sim_signalled, SIGBUS); + sim_engine_halt (sd, cpu, NULL, cia, sim_signalled, SIM_SIGBUS); break; default: sim_engine_abort (sd, cpu, cia, diff --git a/sim/common/sim-reason.c b/sim/common/sim-reason.c new file mode 100644 index 0000000..e3cba19 --- /dev/null +++ b/sim/common/sim-reason.c @@ -0,0 +1,45 @@ +/* Generic simulator stop_reason. + Copyright (C) 1997 Free Software Foundation, Inc. + Contributed by Cygnus Support. + +This file is part of GDB, the GNU debugger. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include "sim-main.h" +#include "sim-assert.h" + +/* Generic implementation of sim_stop_reason */ + +void +sim_stop_reason (SIM_DESC sd, enum sim_stop *reason, int *sigrc) +{ + sim_engine *engine = NULL; + SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); + engine = STATE_ENGINE (sd); + *reason = engine->reason; + switch (*reason) + { + case sim_exited : + *sigrc = engine->sigrc; + break; + case sim_stopped : + case sim_signalled : + *sigrc = sim_signal_to_host (sd, engine->sigrc); + break; + default : + abort (); + } +} diff --git a/sim/common/sim-signal.c b/sim/common/sim-signal.c new file mode 100644 index 0000000..23d4c97 --- /dev/null +++ b/sim/common/sim-signal.c @@ -0,0 +1,83 @@ +/* Simulator signal support + Copyright (C) 1997 Free Software Foundation, Inc. + Contributed by Cygnus Support + +This file is part of the GNU Simulators. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include +#include "sim-main.h" + +/* Convert SIM_SIGFOO to SIGFOO. + What to do when the host doesn't have SIGFOO is handled on a case by case + basis. Generally, in the case of passing a value back to gdb, we want gdb + to not think the process has died (so it can be debugged at the point of + failure). */ + +#ifdef _MSC_VER +#ifndef SIGTRAP +#define SIGTRAP 5 +#endif +#ifndef SIGBUS +#define SIGBUS 10 +#endif +#endif + +int +sim_signal_to_host (SIM_DESC sd, SIM_SIGNAL sig) +{ + switch (sig) + { + case SIM_SIGINT : + return SIGINT; + + case SIM_SIGABRT : + return SIGABRT; + + case SIM_SIGILL : +#ifdef SIGILL + return SIGILL; +#else + return SIGSEGV; +#endif + + case SIM_SIGTRAP : + return SIGTRAP; + + case SIM_SIGBUS : +#ifdef SIGBUS + return SIGBUS; +#else + return SIGSEGV; +#endif + + case SIM_SIGSEGV : + return SIGSEGV; + + case SIM_SIGXCPU : +#ifdef SIGXCPU + return SIGXCPU; +#endif + break; + } + + sim_io_eprintf (sd, "sim_signal_to_host: unknown signal: %d\n", sig); +#ifdef SIGHUP + return SIGHUP; /* FIXME: Suggestions? */ +#else + return 1; +#endif +} diff --git a/sim/common/sim-signal.h b/sim/common/sim-signal.h new file mode 100644 index 0000000..5df113a --- /dev/null +++ b/sim/common/sim-signal.h @@ -0,0 +1,47 @@ +/* Simulator signal support + Copyright (C) 1997 Free Software Foundation, Inc. + Contributed by Cygnus Support + +This file is part of the GNU Simulators. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef SIM_SIGNAL_H +#define SIM_SIGNAL_H + +/* Signals we use. + This provides a layer between our values and host/target values. */ + +typedef enum { + SIM_SIGNONE, + /* illegal insn */ + SIM_SIGILL, + /* breakpoint */ + SIM_SIGTRAP, + /* misaligned memory access */ + SIM_SIGBUS, + /* tried to read/write memory that's not readable/writable */ + SIM_SIGSEGV, + /* cpu limit exceeded */ + SIM_SIGXCPU, + /* simulation interrupted (sim_stop called) */ + SIM_SIGINT, + /* simulation aborted */ + SIM_SIGABRT +} SIM_SIGNAL; + +int sim_signal_to_host (SIM_DESC sd, SIM_SIGNAL); + +#endif /* SIM_SIGNAL_H */