debug.cc revision 2
111986Sandreas.sandberg@arm.com/*
211986Sandreas.sandberg@arm.com * Copyright (c) 2003 The Regents of The University of Michigan
311986Sandreas.sandberg@arm.com * All rights reserved.
411986Sandreas.sandberg@arm.com *
511986Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without
611986Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are
711986Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright
811986Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer;
911986Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright
1011986Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the
1111986Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution;
1211986Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its
1311986Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from
1411986Sandreas.sandberg@arm.com * this software without specific prior written permission.
1511986Sandreas.sandberg@arm.com *
1611986Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1711986Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1811986Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1911986Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2011986Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2111986Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2211986Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2311986Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2411986Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2511986Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2611986Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2711986Sandreas.sandberg@arm.com */
2811986Sandreas.sandberg@arm.com
2911986Sandreas.sandberg@arm.com#include <sys/types.h>
3011986Sandreas.sandberg@arm.com#include <signal.h>
3111986Sandreas.sandberg@arm.com#include <unistd.h>
3212391Sjason@lowepower.com
3311986Sandreas.sandberg@arm.com#include <string>
3411986Sandreas.sandberg@arm.com#include <vector>
3512391Sjason@lowepower.com
3611986Sandreas.sandberg@arm.com#include "debug.hh"
3712391Sjason@lowepower.com#include "eventq.hh"
3812037Sandreas.sandberg@arm.com#include "param.hh"
3912037Sandreas.sandberg@arm.com#include "sim_events.hh"
4012037Sandreas.sandberg@arm.com
4111986Sandreas.sandberg@arm.comusing namespace std;
4212037Sandreas.sandberg@arm.com
4311986Sandreas.sandberg@arm.comvoid
4411986Sandreas.sandberg@arm.comdebug_break()
4511986Sandreas.sandberg@arm.com{
4611986Sandreas.sandberg@arm.com    kill(getpid(), SIGTRAP);
4711986Sandreas.sandberg@arm.com}
4811986Sandreas.sandberg@arm.com
4911986Sandreas.sandberg@arm.com//
5011986Sandreas.sandberg@arm.com// Debug event: place a breakpoint on the process function and
5111986Sandreas.sandberg@arm.com// schedule the event to break at a particular cycle
5211986Sandreas.sandberg@arm.com//
5311986Sandreas.sandberg@arm.comclass DebugBreakEvent : public Event
5411986Sandreas.sandberg@arm.com{
5511986Sandreas.sandberg@arm.com  public:
5611986Sandreas.sandberg@arm.com
5711986Sandreas.sandberg@arm.com    DebugBreakEvent(EventQueue *q, Tick _when);
5811986Sandreas.sandberg@arm.com
5911986Sandreas.sandberg@arm.com    void process();	// process event
6011986Sandreas.sandberg@arm.com    virtual const char *description();
6111986Sandreas.sandberg@arm.com};
6211986Sandreas.sandberg@arm.com
6311986Sandreas.sandberg@arm.com//
6411986Sandreas.sandberg@arm.com// constructor: schedule at specified time
6511986Sandreas.sandberg@arm.com//
6611986Sandreas.sandberg@arm.comDebugBreakEvent::DebugBreakEvent(EventQueue *q, Tick _when)
6711986Sandreas.sandberg@arm.com    : Event(q)
6811986Sandreas.sandberg@arm.com{
6911986Sandreas.sandberg@arm.com    schedule(_when, -20000);
7011986Sandreas.sandberg@arm.com}
7111986Sandreas.sandberg@arm.com
7211986Sandreas.sandberg@arm.com//
7311986Sandreas.sandberg@arm.com// handle debug event: set debugger breakpoint on this function
7411986Sandreas.sandberg@arm.com//
7511986Sandreas.sandberg@arm.comvoid
7611986Sandreas.sandberg@arm.comDebugBreakEvent::process()
7711986Sandreas.sandberg@arm.com{
7811986Sandreas.sandberg@arm.com    debug_break();
7911986Sandreas.sandberg@arm.com    delete this;
8011986Sandreas.sandberg@arm.com}
8111986Sandreas.sandberg@arm.com
8211986Sandreas.sandberg@arm.com
8311986Sandreas.sandberg@arm.comconst char *
8411986Sandreas.sandberg@arm.comDebugBreakEvent::description()
8511986Sandreas.sandberg@arm.com{
8611986Sandreas.sandberg@arm.com    return "debug break";
8711986Sandreas.sandberg@arm.com}
8811986Sandreas.sandberg@arm.com
8911986Sandreas.sandberg@arm.com//
9011986Sandreas.sandberg@arm.com// Parameter context for global debug options
9111986Sandreas.sandberg@arm.com//
9211986Sandreas.sandberg@arm.comclass DebugContext : public ParamContext
9311986Sandreas.sandberg@arm.com{
9411986Sandreas.sandberg@arm.com  public:
9511986Sandreas.sandberg@arm.com    DebugContext(const string &_iniSection)
9611986Sandreas.sandberg@arm.com        : ParamContext(_iniSection) {}
9711986Sandreas.sandberg@arm.com    void checkParams();
9811986Sandreas.sandberg@arm.com};
9911986Sandreas.sandberg@arm.com
10011986Sandreas.sandberg@arm.comDebugContext debugParams("debug");
10111986Sandreas.sandberg@arm.com
10211986Sandreas.sandberg@arm.comVectorParam<Tick> break_cycles(&debugParams, "break_cycles",
10311986Sandreas.sandberg@arm.com                                 "cycle(s) to create breakpoint events");
10411986Sandreas.sandberg@arm.com
10511986Sandreas.sandberg@arm.comvoid
10611986Sandreas.sandberg@arm.comDebugContext::checkParams()
10711986Sandreas.sandberg@arm.com{
10811986Sandreas.sandberg@arm.com    if (break_cycles.isValid()) {
10911986Sandreas.sandberg@arm.com        vector<Tick> &cycles = break_cycles;
11011986Sandreas.sandberg@arm.com
11111986Sandreas.sandberg@arm.com        vector<Tick>::iterator i = cycles.begin();
11211986Sandreas.sandberg@arm.com        vector<Tick>::iterator end = cycles.end();
11312037Sandreas.sandberg@arm.com
11412037Sandreas.sandberg@arm.com        for (; i < end; ++i)
11511986Sandreas.sandberg@arm.com            new DebugBreakEvent(&mainEventQueue, *i);
11611986Sandreas.sandberg@arm.com    }
11712037Sandreas.sandberg@arm.com}
11811986Sandreas.sandberg@arm.com
11911986Sandreas.sandberg@arm.com//
12011986Sandreas.sandberg@arm.com// handy function to schedule DebugBreakEvent on main event queue
12111986Sandreas.sandberg@arm.com// (callable from debugger)
12211986Sandreas.sandberg@arm.com//
12311986Sandreas.sandberg@arm.comextern "C" void sched_break_cycle(Tick when)
12411986Sandreas.sandberg@arm.com{
12511986Sandreas.sandberg@arm.com    new DebugBreakEvent(&mainEventQueue, when);
12611986Sandreas.sandberg@arm.com}
12711986Sandreas.sandberg@arm.com
12811986Sandreas.sandberg@arm.comextern "C" void dump_stats()
12911986Sandreas.sandberg@arm.com{
13011986Sandreas.sandberg@arm.com    new DumpStatsEvent();
13111986Sandreas.sandberg@arm.com}
13212391Sjason@lowepower.com
13312391Sjason@lowepower.comextern "C" void eventq_dump()
13412391Sjason@lowepower.com{
13512391Sjason@lowepower.com    mainEventQueue.dump();
13612391Sjason@lowepower.com}
13711986Sandreas.sandberg@arm.com
13811986Sandreas.sandberg@arm.com