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