gem5 v23.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
init_signals.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2012, 2015 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
13 *
14 * Copyright (c) 2000-2005 The Regents of The University of Michigan
15 * Copyright (c) 2008 The Hewlett-Packard Development Company
16 * All rights reserved.
17 *
18 * Redistribution and use in source and binary forms, with or without
19 * modification, are permitted provided that the following conditions are
20 * met: redistributions of source code must retain the above copyright
21 * notice, this list of conditions and the following disclaimer;
22 * redistributions in binary form must reproduce the above copyright
23 * notice, this list of conditions and the following disclaimer in the
24 * documentation and/or other materials provided with the distribution;
25 * neither the name of the copyright holders nor the names of its
26 * contributors may be used to endorse or promote products derived from
27 * this software without specific prior written permission.
28 *
29 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
30 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
31 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
32 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
33 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
34 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
35 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
36 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
37 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
38 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
39 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
40 */
41
42#include "sim/init_signals.hh"
43
44#include <sys/types.h>
45#include <unistd.h>
46
47#include <csignal>
48#include <iostream>
49#include <string>
50
51#if defined(__FreeBSD__)
52#include <sys/param.h>
53
54#endif
55
56#include "base/atomicio.hh"
57#include "base/cprintf.hh"
58#include "base/logging.hh"
59#include "sim/async.hh"
60#include "sim/backtrace.hh"
61#include "sim/eventq.hh"
62
63namespace gem5
64{
65
66// Use an separate stack for fatal signal handlers
67
68static bool
70{
71 const auto stack_size = 2 * SIGSTKSZ;
72 static uint8_t *fatal_sig_stack = new uint8_t[stack_size];
73 stack_t stack;
74#if defined(__FreeBSD__) && (__FreeBSD_version < 1100097)
75 stack.ss_sp = (char *)fatal_sig_stack;
76#else
77 stack.ss_sp = fatal_sig_stack;
78#endif
79 stack.ss_size = stack_size;
80 stack.ss_flags = 0;
81
82 return sigaltstack(&stack, NULL) == 0;
83}
84
85static void
86installSignalHandler(int signal, void (*handler)(int sigtype),
87 int flags = SA_RESTART)
88{
89 struct sigaction sa;
90
91 memset(&sa, 0, sizeof(sa));
92 sigemptyset(&sa.sa_mask);
93 sa.sa_handler = handler;
94 sa.sa_flags = flags;
95
96 if (sigaction(signal, &sa, NULL) == -1)
97 panic("Failed to setup handler for signal %i\n", signal);
98}
99
100static void
102{
103 // The signal handler should have been reset and unmasked (it was
104 // registered with SA_RESETHAND | SA_NODEFER), just raise the
105 // signal again to invoke the default handler.
106 STATIC_ERR("For more info on how to address this issue, please visit "
107 "https://www.gem5.org/documentation/general_docs/common-errors/ \n\n");
108 pthread_kill(pthread_self(), signo);
109
110 // Something is really wrong if the process is alive at this
111 // point, manually try to exit it.
112 STATIC_ERR("Failed to execute default signal handler!\n");
113 _exit(127);
114}
115
117void
119{
120 async_event = true;
121 async_statdump = true;
122 /* Wake up some event queue to handle event */
123 getEventQueue(0)->wakeup();
124}
125
126void
128{
129 async_event = true;
130 async_statdump = true;
131 async_statreset = true;
132 /* Wake up some event queue to handle event */
133 getEventQueue(0)->wakeup();
134}
135
137void
138exitNowHandler(int sigtype)
139{
140 async_event = true;
141 async_exit = true;
142 /* Wake up some event queue to handle event */
143 getEventQueue(0)->wakeup();
144}
145
147void
148abortHandler(int sigtype)
149{
150 const EventQueue *const eq(curEventQueue());
151 if (eq) {
152 ccprintf(std::cerr, "Program aborted at tick %llu\n",
153 eq->getCurTick());
154 } else {
155 STATIC_ERR("Program aborted\n\n");
156 }
157
159 raiseFatalSignal(sigtype);
160}
161
163static void
164segvHandler(int sigtype)
165{
166 STATIC_ERR("gem5 has encountered a segmentation fault!\n\n");
167
169 raiseFatalSignal(SIGSEGV);
170}
171
172// Handle SIGIO
173static void
174ioHandler(int sigtype)
175{
176 async_event = true;
177 async_io = true;
178 /* Wake up some event queue to handle event */
179 getEventQueue(0)->wakeup();
180}
181
182/*
183 * M5 can do several special things when various signals are sent.
184 * None are mandatory.
185 */
186void
188{
189 // Floating point exceptions may happen on misspeculated paths, so
190 // ignore them
191 signal(SIGFPE, SIG_IGN);
192
193 // Dump intermediate stats
195
196 // Dump intermediate stats and reset them
198
199 // Exit cleanly on Interrupt (Ctrl-C)
201
202 // Print the current cycle number and a backtrace on abort. Make
203 // sure the signal is unmasked and the handler reset when a signal
204 // is delivered to be able to invoke the default handler.
205 installSignalHandler(SIGABRT, abortHandler, SA_RESETHAND | SA_NODEFER);
206
207 // Setup a SIGSEGV handler with a private stack
208 if (setupAltStack()) {
210 SA_RESETHAND | SA_NODEFER | SA_ONSTACK);
211 } else {
212 warn("Failed to setup stack for SIGSEGV handler, "
213 "using default signal handler.\n");
214 }
215
216 // Install a SIGIO handler to handle asynchronous file IO. See the
217 // PollQueue class.
219}
220
221} // namespace gem5
This file defines flags used to handle asynchronous simulator events.
#define STATIC_ERR(m)
Statically allocate a string and write it to STDERR.
Definition atomicio.hh:67
Queue of events sorted in time order.
Definition eventq.hh:616
virtual void wakeup(Tick when=(Tick) -1)
Function to signal that the event loop should be woken up because an event has been scheduled by an a...
Definition eventq.hh:923
#define panic(...)
This implements a cprintf based panic() function.
Definition logging.hh:188
uint8_t flags
Definition helpers.cc:66
#define warn(...)
Definition logging.hh:256
Bitfield< 3 > sa
Bitfield< 29 > eq
Definition misc.hh:58
Bitfield< 17, 16 > stack
Definition misc.hh:592
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
static void installSignalHandler(int signal, void(*handler)(int sigtype), int flags=SA_RESTART)
volatile bool async_event
Some asynchronous event has happened.
Definition async.cc:32
static void raiseFatalSignal(int signo)
volatile bool async_statdump
Async request to dump stats.
Definition async.cc:33
void dumpStatsHandler(int sigtype)
Stats signal handler.
static void ioHandler(int sigtype)
void print_backtrace()
Print a gem5 post-mortem report.
void dumprstStatsHandler(int sigtype)
static bool setupAltStack()
static void segvHandler(int sigtype)
Segmentation fault signal handler.
void exitNowHandler(int sigtype)
Exit signal handler.
volatile bool async_io
Async I/O request (SIGIO).
Definition async.cc:36
volatile bool async_exit
Async request to exit simulator.
Definition async.cc:35
volatile bool async_statreset
Async request to reset stats.
Definition async.cc:34
EventQueue * curEventQueue()
Definition eventq.hh:91
void initSignals()
EventQueue * getEventQueue(uint32_t index)
Function for returning eventq queue for the provided index.
Definition eventq.cc:62
void ccprintf(cp::Print &print)
Definition cprintf.hh:130
void abortHandler(int sigtype)
Abort signal handler.

Generated on Mon Jul 10 2023 14:24:33 for gem5 by doxygen 1.9.7