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