debug.cc revision 1762
111507SCurtis.Dunham@arm.com/*
211507SCurtis.Dunham@arm.com * Copyright (c) 2003-2005 The Regents of The University of Michigan
311860Sandreas.hansson@arm.com * All rights reserved.
411860Sandreas.hansson@arm.com *
511860Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
611507SCurtis.Dunham@arm.com * modification, are permitted provided that the following conditions are
711860Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright
811860Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer;
911860Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright
1011860Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the
1111860Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution;
1211570SCurtis.Dunham@arm.com * neither the name of the copyright holders nor the names of its
1311570SCurtis.Dunham@arm.com * contributors may be used to endorse or promote products derived from
1411507SCurtis.Dunham@arm.com * this software without specific prior written permission.
1511507SCurtis.Dunham@arm.com *
1611860Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1711860Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1811507SCurtis.Dunham@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1911860Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2011860Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2111860Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2211860Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2311507SCurtis.Dunham@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2411860Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2511860Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2611860Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2711860Sandreas.hansson@arm.com */
2811860Sandreas.hansson@arm.com
2911860Sandreas.hansson@arm.com#include <sys/types.h>
3011860Sandreas.hansson@arm.com#include <signal.h>
3111860Sandreas.hansson@arm.com#include <unistd.h>
3211860Sandreas.hansson@arm.com
3311860Sandreas.hansson@arm.com#include <string>
3411507SCurtis.Dunham@arm.com#include <vector>
3511860Sandreas.hansson@arm.com
3611507SCurtis.Dunham@arm.com#include "sim/debug.hh"
3711860Sandreas.hansson@arm.com#include "sim/eventq.hh"
3811507SCurtis.Dunham@arm.com#include "sim/param.hh"
3911507SCurtis.Dunham@arm.com#include "sim/sim_events.hh"
4011860Sandreas.hansson@arm.com
4111507SCurtis.Dunham@arm.comusing namespace std;
4211507SCurtis.Dunham@arm.com
4311507SCurtis.Dunham@arm.comvoid
4411507SCurtis.Dunham@arm.comdebug_break()
4511507SCurtis.Dunham@arm.com{
4611507SCurtis.Dunham@arm.com#ifndef NDEBUG
4711507SCurtis.Dunham@arm.com    kill(getpid(), SIGTRAP);
4811507SCurtis.Dunham@arm.com#else
4911507SCurtis.Dunham@arm.com    cprintf("debug_break suppressed, compiled with NDEBUG\n");
5011507SCurtis.Dunham@arm.com#endif
5111507SCurtis.Dunham@arm.com}
5211507SCurtis.Dunham@arm.com
5311507SCurtis.Dunham@arm.com//
5411570SCurtis.Dunham@arm.com// Debug event: place a breakpoint on the process function and
5511507SCurtis.Dunham@arm.com// schedule the event to break at a particular cycle
5611507SCurtis.Dunham@arm.com//
5711507SCurtis.Dunham@arm.comclass DebugBreakEvent : public Event
5811507SCurtis.Dunham@arm.com{
5911570SCurtis.Dunham@arm.com  public:
6011860Sandreas.hansson@arm.com
6111507SCurtis.Dunham@arm.com    DebugBreakEvent(EventQueue *q, Tick _when);
6211507SCurtis.Dunham@arm.com
6311507SCurtis.Dunham@arm.com    void process();	// process event
6411507SCurtis.Dunham@arm.com    virtual const char *description();
6511507SCurtis.Dunham@arm.com};
6611507SCurtis.Dunham@arm.com
6711507SCurtis.Dunham@arm.com//
6811507SCurtis.Dunham@arm.com// constructor: schedule at specified time
6911507SCurtis.Dunham@arm.com//
7011507SCurtis.Dunham@arm.comDebugBreakEvent::DebugBreakEvent(EventQueue *q, Tick _when)
7111507SCurtis.Dunham@arm.com    : Event(q, Debug_Break_Pri)
7211507SCurtis.Dunham@arm.com{
7311507SCurtis.Dunham@arm.com    setFlags(AutoDelete);
7411507SCurtis.Dunham@arm.com    schedule(_when);
7511507SCurtis.Dunham@arm.com}
7611507SCurtis.Dunham@arm.com
7711507SCurtis.Dunham@arm.com//
7811507SCurtis.Dunham@arm.com// handle debug event: set debugger breakpoint on this function
7911860Sandreas.hansson@arm.com//
8011507SCurtis.Dunham@arm.comvoid
8111507SCurtis.Dunham@arm.comDebugBreakEvent::process()
8211507SCurtis.Dunham@arm.com{
8311507SCurtis.Dunham@arm.com    debug_break();
8411507SCurtis.Dunham@arm.com}
8511507SCurtis.Dunham@arm.com
8611860Sandreas.hansson@arm.com
8711507SCurtis.Dunham@arm.comconst char *
8811507SCurtis.Dunham@arm.comDebugBreakEvent::description()
8911507SCurtis.Dunham@arm.com{
9011507SCurtis.Dunham@arm.com    return "debug break";
9111507SCurtis.Dunham@arm.com}
9211507SCurtis.Dunham@arm.com
9311507SCurtis.Dunham@arm.com//
9411860Sandreas.hansson@arm.com// Parameter context for global debug options
9511680SCurtis.Dunham@arm.com//
9611570SCurtis.Dunham@arm.comclass DebugContext : public ParamContext
9711507SCurtis.Dunham@arm.com{
9811507SCurtis.Dunham@arm.com  public:
9911507SCurtis.Dunham@arm.com    DebugContext(const string &_iniSection)
10011507SCurtis.Dunham@arm.com        : ParamContext(_iniSection) {}
10111507SCurtis.Dunham@arm.com    void checkParams();
10211507SCurtis.Dunham@arm.com};
10311507SCurtis.Dunham@arm.com
10411507SCurtis.Dunham@arm.comDebugContext debugParams("debug");
10511507SCurtis.Dunham@arm.com
10611507SCurtis.Dunham@arm.comVectorParam<Tick> break_cycles(&debugParams, "break_cycles",
10711507SCurtis.Dunham@arm.com                                 "cycle(s) to create breakpoint events");
10811507SCurtis.Dunham@arm.com
10911507SCurtis.Dunham@arm.comvoid
11011507SCurtis.Dunham@arm.comDebugContext::checkParams()
11111507SCurtis.Dunham@arm.com{
11211507SCurtis.Dunham@arm.com    if (break_cycles.isValid()) {
11311507SCurtis.Dunham@arm.com        vector<Tick> &cycles = break_cycles;
11411507SCurtis.Dunham@arm.com
11511507SCurtis.Dunham@arm.com        vector<Tick>::iterator i = cycles.begin();
11611507SCurtis.Dunham@arm.com        vector<Tick>::iterator end = cycles.end();
11711507SCurtis.Dunham@arm.com
11811507SCurtis.Dunham@arm.com        for (; i < end; ++i)
11911507SCurtis.Dunham@arm.com            new DebugBreakEvent(&mainEventQueue, *i);
12011507SCurtis.Dunham@arm.com    }
12111507SCurtis.Dunham@arm.com}
12211507SCurtis.Dunham@arm.com
12311507SCurtis.Dunham@arm.com//
12411507SCurtis.Dunham@arm.com// handy function to schedule DebugBreakEvent on main event queue
12511507SCurtis.Dunham@arm.com// (callable from debugger)
12611507SCurtis.Dunham@arm.com//
12711507SCurtis.Dunham@arm.comextern "C" void sched_break_cycle(Tick when)
12811507SCurtis.Dunham@arm.com{
12911507SCurtis.Dunham@arm.com    new DebugBreakEvent(&mainEventQueue, when);
13011507SCurtis.Dunham@arm.com}
13111507SCurtis.Dunham@arm.com
13211507SCurtis.Dunham@arm.comextern "C" void eventq_dump()
13311507SCurtis.Dunham@arm.com{
13411507SCurtis.Dunham@arm.com    mainEventQueue.dump();
13511507SCurtis.Dunham@arm.com}
13611507SCurtis.Dunham@arm.com
13711507SCurtis.Dunham@arm.com