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; 12 * neither the name of the copyright holders nor the names of its 13 * contributors may be used to endorse or promote products derived from 14 * this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29#include <sys/types.h> 30#include <signal.h> 31#include <unistd.h> 32 33#include <string> 34#include <vector> 35 36#include "debug.hh" 37#include "eventq.hh" 38#include "param.hh" 39#include "sim_events.hh" 40 41using namespace std; 42 43void 44debug_break() 45{ 46 kill(getpid(), SIGTRAP); 47} 48 49// 50// Debug event: place a breakpoint on the process function and 51// schedule the event to break at a particular cycle 52// 53class DebugBreakEvent : public Event 54{ 55 public: 56 57 DebugBreakEvent(EventQueue *q, Tick _when); 58 59 void process(); // process event 60 virtual const char *description(); 61}; 62 63// 64// constructor: schedule at specified time 65// 66DebugBreakEvent::DebugBreakEvent(EventQueue *q, Tick _when) 67 : Event(q) 68{ 69 schedule(_when, -20000); 70} 71 72// 73// handle debug event: set debugger breakpoint on this function 74// 75void 76DebugBreakEvent::process() 77{ 78 debug_break(); 79 delete this; 80} 81 82 83const char * 84DebugBreakEvent::description() 85{ 86 return "debug break"; 87} 88 89// 90// Parameter context for global debug options 91// 92class DebugContext : public ParamContext 93{ 94 public: 95 DebugContext(const string &_iniSection) 96 : ParamContext(_iniSection) {} 97 void checkParams(); 98}; 99 100DebugContext debugParams("debug"); 101 102VectorParam<Tick> break_cycles(&debugParams, "break_cycles", 103 "cycle(s) to create breakpoint events"); 104 105void 106DebugContext::checkParams() 107{ 108 if (break_cycles.isValid()) { 109 vector<Tick> &cycles = break_cycles; 110 111 vector<Tick>::iterator i = cycles.begin(); 112 vector<Tick>::iterator end = cycles.end(); 113 114 for (; i < end; ++i) 115 new DebugBreakEvent(&mainEventQueue, *i); 116 } 117} 118 119// 120// handy function to schedule DebugBreakEvent on main event queue 121// (callable from debugger) 122// 123extern "C" void sched_break_cycle(Tick when) 124{ 125 new DebugBreakEvent(&mainEventQueue, when); 126} 127 128extern "C" void dump_stats() 129{ 130 new DumpStatsEvent(); 131} 132 133extern "C" void eventq_dump() 134{ 135 mainEventQueue.dump(); 136} 137 138