init_signals.cc revision 10453
110453SAndrew.Bardsley@arm.com/*
210453SAndrew.Bardsley@arm.com * Copyright (c) 2012 ARM Limited
310453SAndrew.Bardsley@arm.com * All rights reserved
410453SAndrew.Bardsley@arm.com *
510453SAndrew.Bardsley@arm.com * The license below extends only to copyright in the software and shall
610453SAndrew.Bardsley@arm.com * not be construed as granting a license to any other intellectual
710453SAndrew.Bardsley@arm.com * property including but not limited to intellectual property relating
810453SAndrew.Bardsley@arm.com * to a hardware implementation of the functionality of the software
910453SAndrew.Bardsley@arm.com * licensed hereunder.  You may use the software subject to the license
1010453SAndrew.Bardsley@arm.com * terms below provided that you ensure that this notice is replicated
1110453SAndrew.Bardsley@arm.com * unmodified and in its entirety in all distributions of the software,
1210453SAndrew.Bardsley@arm.com * modified or unmodified, in source code or in binary form.
1310453SAndrew.Bardsley@arm.com *
1410453SAndrew.Bardsley@arm.com * Copyright (c) 2000-2005 The Regents of The University of Michigan
1510453SAndrew.Bardsley@arm.com * Copyright (c) 2008 The Hewlett-Packard Development Company
1610453SAndrew.Bardsley@arm.com * All rights reserved.
1710453SAndrew.Bardsley@arm.com *
1810453SAndrew.Bardsley@arm.com * Redistribution and use in source and binary forms, with or without
1910453SAndrew.Bardsley@arm.com * modification, are permitted provided that the following conditions are
2010453SAndrew.Bardsley@arm.com * met: redistributions of source code must retain the above copyright
2110453SAndrew.Bardsley@arm.com * notice, this list of conditions and the following disclaimer;
2210453SAndrew.Bardsley@arm.com * redistributions in binary form must reproduce the above copyright
2310453SAndrew.Bardsley@arm.com * notice, this list of conditions and the following disclaimer in the
2410453SAndrew.Bardsley@arm.com * documentation and/or other materials provided with the distribution;
2510453SAndrew.Bardsley@arm.com * neither the name of the copyright holders nor the names of its
2610453SAndrew.Bardsley@arm.com * contributors may be used to endorse or promote products derived from
2710453SAndrew.Bardsley@arm.com * this software without specific prior written permission.
2810453SAndrew.Bardsley@arm.com *
2910453SAndrew.Bardsley@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3010453SAndrew.Bardsley@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3110453SAndrew.Bardsley@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3210453SAndrew.Bardsley@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3310453SAndrew.Bardsley@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3410453SAndrew.Bardsley@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3510453SAndrew.Bardsley@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3610453SAndrew.Bardsley@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3710453SAndrew.Bardsley@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3810453SAndrew.Bardsley@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3910453SAndrew.Bardsley@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4010453SAndrew.Bardsley@arm.com *
4110453SAndrew.Bardsley@arm.com * Authors: Nathan Binkert
4210453SAndrew.Bardsley@arm.com */
4310453SAndrew.Bardsley@arm.com
4410453SAndrew.Bardsley@arm.com#include <csignal>
4510453SAndrew.Bardsley@arm.com#include <iostream>
4610453SAndrew.Bardsley@arm.com#include <string>
4710453SAndrew.Bardsley@arm.com
4810453SAndrew.Bardsley@arm.com#include "base/cprintf.hh"
4910453SAndrew.Bardsley@arm.com#include "sim/async.hh"
5010453SAndrew.Bardsley@arm.com#include "sim/core.hh"
5110453SAndrew.Bardsley@arm.com#include "sim/init_signals.hh"
5210453SAndrew.Bardsley@arm.com
5310453SAndrew.Bardsley@arm.comusing namespace std;
5410453SAndrew.Bardsley@arm.com
5510453SAndrew.Bardsley@arm.com/// Stats signal handler.
5610453SAndrew.Bardsley@arm.comvoid
5710453SAndrew.Bardsley@arm.comdumpStatsHandler(int sigtype)
5810453SAndrew.Bardsley@arm.com{
5910453SAndrew.Bardsley@arm.com    async_event = true;
6010453SAndrew.Bardsley@arm.com    async_statdump = true;
6110453SAndrew.Bardsley@arm.com}
6210453SAndrew.Bardsley@arm.com
6310453SAndrew.Bardsley@arm.comvoid
6410453SAndrew.Bardsley@arm.comdumprstStatsHandler(int sigtype)
6510453SAndrew.Bardsley@arm.com{
6610453SAndrew.Bardsley@arm.com    async_event = true;
6710453SAndrew.Bardsley@arm.com    async_statdump = true;
6810453SAndrew.Bardsley@arm.com    async_statreset = true;
6910453SAndrew.Bardsley@arm.com}
7010453SAndrew.Bardsley@arm.com
7110453SAndrew.Bardsley@arm.com/// Exit signal handler.
7210453SAndrew.Bardsley@arm.comvoid
7310453SAndrew.Bardsley@arm.comexitNowHandler(int sigtype)
7410453SAndrew.Bardsley@arm.com{
7510453SAndrew.Bardsley@arm.com    async_event = true;
7610453SAndrew.Bardsley@arm.com    async_exit = true;
7710453SAndrew.Bardsley@arm.com}
7810453SAndrew.Bardsley@arm.com
7910453SAndrew.Bardsley@arm.com/// Abort signal handler.
8010453SAndrew.Bardsley@arm.comvoid
8110453SAndrew.Bardsley@arm.comabortHandler(int sigtype)
8210453SAndrew.Bardsley@arm.com{
8310453SAndrew.Bardsley@arm.com    ccprintf(cerr, "Program aborted at cycle %d\n", curTick());
8410453SAndrew.Bardsley@arm.com}
8510453SAndrew.Bardsley@arm.com
8610453SAndrew.Bardsley@arm.com// Handle SIGIO
8710453SAndrew.Bardsley@arm.comstatic void
8810453SAndrew.Bardsley@arm.comioHandler(int sigtype)
8910453SAndrew.Bardsley@arm.com{
9010453SAndrew.Bardsley@arm.com    async_event = true;
9110453SAndrew.Bardsley@arm.com    async_io = true;
9210453SAndrew.Bardsley@arm.com}
9310453SAndrew.Bardsley@arm.com
9410453SAndrew.Bardsley@arm.comstatic void
9510453SAndrew.Bardsley@arm.cominstallSignalHandler(int signal, void (*handler)(int sigtype))
9610453SAndrew.Bardsley@arm.com{
9710453SAndrew.Bardsley@arm.com    struct sigaction sa;
9810453SAndrew.Bardsley@arm.com
9910453SAndrew.Bardsley@arm.com    memset(&sa, 0, sizeof(sa));
10010453SAndrew.Bardsley@arm.com    sigemptyset(&sa.sa_mask);
10110453SAndrew.Bardsley@arm.com    sa.sa_handler = handler;
10210453SAndrew.Bardsley@arm.com    sa.sa_flags = SA_RESTART;
10310453SAndrew.Bardsley@arm.com
10410453SAndrew.Bardsley@arm.com    if (sigaction(signal, &sa, NULL) == -1)
10510453SAndrew.Bardsley@arm.com        panic("Failed to setup handler for signal %i\n", signal);
10610453SAndrew.Bardsley@arm.com}
10710453SAndrew.Bardsley@arm.com
10810453SAndrew.Bardsley@arm.com/*
10910453SAndrew.Bardsley@arm.com * M5 can do several special things when various signals are sent.
11010453SAndrew.Bardsley@arm.com * None are mandatory.
11110453SAndrew.Bardsley@arm.com */
11210453SAndrew.Bardsley@arm.comvoid
11310453SAndrew.Bardsley@arm.cominitSignals()
11410453SAndrew.Bardsley@arm.com{
11510453SAndrew.Bardsley@arm.com    // Floating point exceptions may happen on misspeculated paths, so
11610453SAndrew.Bardsley@arm.com    // ignore them
11710453SAndrew.Bardsley@arm.com    signal(SIGFPE, SIG_IGN);
11810453SAndrew.Bardsley@arm.com
11910453SAndrew.Bardsley@arm.com    // We use SIGTRAP sometimes for debugging
12010453SAndrew.Bardsley@arm.com    signal(SIGTRAP, SIG_IGN);
12110453SAndrew.Bardsley@arm.com
12210453SAndrew.Bardsley@arm.com    // Dump intermediate stats
12310453SAndrew.Bardsley@arm.com    installSignalHandler(SIGUSR1, dumpStatsHandler);
12410453SAndrew.Bardsley@arm.com
12510453SAndrew.Bardsley@arm.com    // Dump intermediate stats and reset them
12610453SAndrew.Bardsley@arm.com    installSignalHandler(SIGUSR2, dumprstStatsHandler);
12710453SAndrew.Bardsley@arm.com
12810453SAndrew.Bardsley@arm.com    // Exit cleanly on Interrupt (Ctrl-C)
12910453SAndrew.Bardsley@arm.com    installSignalHandler(SIGINT, exitNowHandler);
13010453SAndrew.Bardsley@arm.com
13110453SAndrew.Bardsley@arm.com    // Print out cycle number on abort
13210453SAndrew.Bardsley@arm.com    installSignalHandler(SIGABRT, abortHandler);
13310453SAndrew.Bardsley@arm.com
13410453SAndrew.Bardsley@arm.com    // Install a SIGIO handler to handle asynchronous file IO. See the
13510453SAndrew.Bardsley@arm.com    // PollQueue class.
13610453SAndrew.Bardsley@arm.com    installSignalHandler(SIGIO, ioHandler);
13710453SAndrew.Bardsley@arm.com}
13810453SAndrew.Bardsley@arm.com
139