pc_event.cc revision 1717
110037SARM gem5 Developers/* 28839Sandreas.hansson@arm.com * Copyright (c) 2002-2003 The Regents of The University of Michigan 38839Sandreas.hansson@arm.com * All rights reserved. 48839Sandreas.hansson@arm.com * 58839Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 68839Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 78839Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 88839Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 98839Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 108839Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 118839Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 128839Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 135335Shines@cs.fsu.edu * contributors may be used to endorse or promote products derived from 147897Shestness@cs.utexas.edu * this software without specific prior written permission. 154486Sbinkertn@umich.edu * 164486Sbinkertn@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 174486Sbinkertn@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 184486Sbinkertn@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 194486Sbinkertn@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 204486Sbinkertn@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 214486Sbinkertn@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 224486Sbinkertn@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 234486Sbinkertn@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 244486Sbinkertn@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 254486Sbinkertn@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 264486Sbinkertn@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 274486Sbinkertn@umich.edu */ 284486Sbinkertn@umich.edu 294486Sbinkertn@umich.edu#include <algorithm> 304486Sbinkertn@umich.edu#include <map> 314486Sbinkertn@umich.edu#include <string> 324486Sbinkertn@umich.edu#include <utility> 334486Sbinkertn@umich.edu 344486Sbinkertn@umich.edu#include "base/trace.hh" 354486Sbinkertn@umich.edu#include "cpu/base.hh" 364486Sbinkertn@umich.edu#include "cpu/exec_context.hh" 374486Sbinkertn@umich.edu#include "cpu/pc_event.hh" 384486Sbinkertn@umich.edu#include "sim/debug.hh" 394486Sbinkertn@umich.edu#include "sim/root.hh" 404486Sbinkertn@umich.edu 417897Shestness@cs.utexas.eduusing namespace std; 428839Sandreas.hansson@arm.com 434486Sbinkertn@umich.eduPCEventQueue::PCEventQueue() 446654Snate@binkert.org{} 456654Snate@binkert.org 466654Snate@binkert.orgPCEventQueue::~PCEventQueue() 473102SN/A{} 483102SN/A 496654Snate@binkert.orgbool 509036Sandreas.hansson@arm.comPCEventQueue::remove(PCEvent *event) 514776Sgblack@eecs.umich.edu{ 524776Sgblack@eecs.umich.edu int removed = 0; 536654Snate@binkert.org range_t range = equal_range(event); 549793Sakash.bagdia@arm.com for (iterator i = range.first; i != range.second; ++i) { 552667SN/A if (*i == event) { 564776Sgblack@eecs.umich.edu DPRINTF(PCEvent, "PC based event removed at %#x: %s\n", 574776Sgblack@eecs.umich.edu event->pc(), event->descr()); 586654Snate@binkert.org pc_map.erase(i); 596023Snate@binkert.org ++removed; 608745Sgblack@eecs.umich.edu } 619384SAndreas.Sandberg@arm.com } 629384SAndreas.Sandberg@arm.com 636654Snate@binkert.org return removed > 0; 646022Sgblack@eecs.umich.edu} 658745Sgblack@eecs.umich.edu 669384SAndreas.Sandberg@arm.combool 679384SAndreas.Sandberg@arm.comPCEventQueue::schedule(PCEvent *event) 686654Snate@binkert.org{ 696022Sgblack@eecs.umich.edu pc_map.push_back(event); 708745Sgblack@eecs.umich.edu sort(pc_map.begin(), pc_map.end(), MapCompare()); 719384SAndreas.Sandberg@arm.com 729384SAndreas.Sandberg@arm.com DPRINTF(PCEvent, "PC based event scheduled for %#x: %s\n", 736654Snate@binkert.org event->pc(), event->descr()); 746022Sgblack@eecs.umich.edu 758745Sgblack@eecs.umich.edu return true; 769384SAndreas.Sandberg@arm.com} 779384SAndreas.Sandberg@arm.com 786654Snate@binkert.orgbool 7910037SARM gem5 DevelopersPCEventQueue::doService(ExecContext *xc) 808745Sgblack@eecs.umich.edu{ 819384SAndreas.Sandberg@arm.com Addr pc = xc->regs.pc & ~0x3; 829384SAndreas.Sandberg@arm.com int serviced = 0; 836691Stjones1@inf.ed.ac.uk range_t range = equal_range(pc); 846691Stjones1@inf.ed.ac.uk for (iterator i = range.first; i != range.second; ++i) { 858745Sgblack@eecs.umich.edu // Make sure that the pc wasn't changed as the side effect of 869384SAndreas.Sandberg@arm.com // another event. This for example, prevents two invocations 879384SAndreas.Sandberg@arm.com // of the SkipFuncEvent. Maybe we should have separate PC 884486Sbinkertn@umich.edu // event queues for each processor? 895529Snate@binkert.org if (pc != (xc->regs.pc & ~0x3)) 901366SN/A continue; 911310SN/A 929338SAndreas.Sandberg@arm.com DPRINTF(PCEvent, "PC based event serviced at %#x: %s\n", 939254SAndreas.Sandberg@arm.com (*i)->pc(), (*i)->descr()); 949254SAndreas.Sandberg@arm.com 959254SAndreas.Sandberg@arm.com (*i)->process(xc); 969254SAndreas.Sandberg@arm.com ++serviced; 979254SAndreas.Sandberg@arm.com } 989254SAndreas.Sandberg@arm.com 999430SAndreas.Sandberg@ARM.com return serviced > 0; 1009446SAndreas.Sandberg@ARM.com} 1019650Stimothy.jones@arm.com 1029749Sandreas@sandberg.pp.sevoid 1039749Sandreas@sandberg.pp.sePCEventQueue::dump() const 1049254SAndreas.Sandberg@arm.com{ 1059254SAndreas.Sandberg@arm.com const_iterator i = pc_map.begin(); 1069518SAndreas.Sandberg@ARM.com const_iterator e = pc_map.end(); 1079518SAndreas.Sandberg@ARM.com 1089518SAndreas.Sandberg@ARM.com for (; i != e; ++i) 1099518SAndreas.Sandberg@ARM.com cprintf("%d: event at %#x: %s\n", curTick, (*i)->pc(), 1109518SAndreas.Sandberg@ARM.com (*i)->descr()); 1119518SAndreas.Sandberg@ARM.com} 1129518SAndreas.Sandberg@ARM.com 1139518SAndreas.Sandberg@ARM.comPCEventQueue::range_t 1149518SAndreas.Sandberg@ARM.comPCEventQueue::equal_range(Addr pc) 1159518SAndreas.Sandberg@ARM.com{ 1169518SAndreas.Sandberg@ARM.com return std::equal_range(pc_map.begin(), pc_map.end(), pc, MapCompare()); 1179518SAndreas.Sandberg@ARM.com} 1189518SAndreas.Sandberg@ARM.com 1199518SAndreas.Sandberg@ARM.comBreakPCEvent::BreakPCEvent(PCEventQueue *q, const std::string &desc, bool del) 1209518SAndreas.Sandberg@ARM.com : PCEvent(q, desc), remove(del) 1219518SAndreas.Sandberg@ARM.com{ 1229518SAndreas.Sandberg@ARM.com} 1239518SAndreas.Sandberg@ARM.com 1249518SAndreas.Sandberg@ARM.comvoid 1259254SAndreas.Sandberg@arm.comBreakPCEvent::process(ExecContext *xc) 1269254SAndreas.Sandberg@arm.com{ 1279254SAndreas.Sandberg@arm.com StringWrap name(xc->cpu->name() + ".break_event"); 1289254SAndreas.Sandberg@arm.com DPRINTFN("break event %s triggered\n", descr()); 1292901SN/A debug_break(); 1305712Shsul@eecs.umich.edu if (remove) 1315529Snate@binkert.org delete this; 1325529Snate@binkert.org} 1335529Snate@binkert.org 1349161Sandreas.hansson@arm.com#ifdef FULL_SYSTEM 1355529Snate@binkert.orgextern "C" 1365821Ssaidi@eecs.umich.eduvoid 1373170SN/Asched_break_pc_sys(System *sys, Addr addr) 1385780Ssteve.reinhardt@amd.com{ 1395780Ssteve.reinhardt@amd.com PCEvent *event = new BreakPCEvent(&sys->pcEventQueue, "debug break", true); 1405780Ssteve.reinhardt@amd.com event->schedule(addr); 1415780Ssteve.reinhardt@amd.com} 1425780Ssteve.reinhardt@amd.com 1438784Sgblack@eecs.umich.eduextern "C" 1448784Sgblack@eecs.umich.eduvoid 1458784Sgblack@eecs.umich.edusched_break_pc(Addr addr) 1468793Sgblack@eecs.umich.edu{ 1471310SN/A for (vector<System *>::iterator sysi = System::systemList.begin(); 1486654Snate@binkert.org sysi != System::systemList.end(); ++sysi) { 1496022Sgblack@eecs.umich.edu sched_break_pc_sys(*sysi, addr); 1506022Sgblack@eecs.umich.edu } 1518745Sgblack@eecs.umich.edu 1528863Snilay@cs.wisc.edu} 1539384SAndreas.Sandberg@arm.com#endif 1546654Snate@binkert.org