pc_event.hh revision 1762
12810Srdreslin@umich.edu/* 212500Snikos.nikoleris@arm.com * Copyright (c) 2002-2005 The Regents of The University of Michigan 311051Sandreas.hansson@arm.com * All rights reserved. 411051Sandreas.hansson@arm.com * 511051Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 611051Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 711051Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 811051Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 911051Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 1011051Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 1111051Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 1211051Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 1311051Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 1411051Sandreas.hansson@arm.com * this software without specific prior written permission. 1511051Sandreas.hansson@arm.com * 162810Srdreslin@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172810Srdreslin@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182810Srdreslin@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192810Srdreslin@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202810Srdreslin@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212810Srdreslin@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222810Srdreslin@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232810Srdreslin@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242810Srdreslin@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252810Srdreslin@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262810Srdreslin@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272810Srdreslin@umich.edu */ 282810Srdreslin@umich.edu 292810Srdreslin@umich.edu#ifndef __PC_EVENT_HH__ 302810Srdreslin@umich.edu#define __PC_EVENT_HH__ 312810Srdreslin@umich.edu 322810Srdreslin@umich.edu#include <vector> 332810Srdreslin@umich.edu 342810Srdreslin@umich.edu#include "mem/mem_req.hh" 352810Srdreslin@umich.edu 362810Srdreslin@umich.educlass ExecContext; 372810Srdreslin@umich.educlass PCEventQueue; 382810Srdreslin@umich.edu 392810Srdreslin@umich.educlass PCEvent 402810Srdreslin@umich.edu{ 412810Srdreslin@umich.edu protected: 4211051Sandreas.hansson@arm.com static const Addr badpc = MemReq::inval_addr; 4311051Sandreas.hansson@arm.com 442810Srdreslin@umich.edu protected: 4511051Sandreas.hansson@arm.com std::string description; 4611051Sandreas.hansson@arm.com PCEventQueue *queue; 4712349Snikos.nikoleris@arm.com Addr evpc; 482810Srdreslin@umich.edu 492810Srdreslin@umich.edu public: 502810Srdreslin@umich.edu PCEvent() : queue(0), evpc(badpc) { } 512810Srdreslin@umich.edu 5211051Sandreas.hansson@arm.com PCEvent(const std::string &desc) 532810Srdreslin@umich.edu : description(desc), queue(0), evpc(badpc) { } 542810Srdreslin@umich.edu 5511051Sandreas.hansson@arm.com PCEvent(PCEventQueue *q, Addr pc = badpc) : queue(q), evpc(pc) { } 562810Srdreslin@umich.edu 5712334Sgabeblack@google.com PCEvent(PCEventQueue *q, const std::string &desc, Addr pc = badpc) 5811051Sandreas.hansson@arm.com : description(desc), queue(q), evpc(pc) { } 5911051Sandreas.hansson@arm.com 6011051Sandreas.hansson@arm.com virtual ~PCEvent() { if (queue) remove(); } 6111051Sandreas.hansson@arm.com 6211288Ssteve.reinhardt@amd.com std::string descr() const { return description; } 6311051Sandreas.hansson@arm.com Addr pc() const { return evpc; } 6411051Sandreas.hansson@arm.com 6511051Sandreas.hansson@arm.com bool remove(); 6611051Sandreas.hansson@arm.com bool schedule(); 6711051Sandreas.hansson@arm.com bool schedule(Addr pc); 6811053Sandreas.hansson@arm.com bool schedule(PCEventQueue *q, Addr pc); 6911053Sandreas.hansson@arm.com virtual void process(ExecContext *xc) = 0; 7011051Sandreas.hansson@arm.com}; 7111051Sandreas.hansson@arm.com 7211051Sandreas.hansson@arm.comclass PCEventQueue 7311197Sandreas.hansson@arm.com{ 7411197Sandreas.hansson@arm.com protected: 7511199Sandreas.hansson@arm.com typedef PCEvent * record_t; 7611197Sandreas.hansson@arm.com class MapCompare { 7712084Sspwilson2@wisc.edu public: 7812084Sspwilson2@wisc.edu bool operator()(const record_t &l, const record_t &r) const { 7911197Sandreas.hansson@arm.com return l->pc() < r->pc(); 8011051Sandreas.hansson@arm.com } 8111051Sandreas.hansson@arm.com bool operator()(const record_t &l, Addr pc) const { 8211051Sandreas.hansson@arm.com return l->pc() < pc; 8311051Sandreas.hansson@arm.com } 8411051Sandreas.hansson@arm.com bool operator()(Addr pc, const record_t &r) const { 8511051Sandreas.hansson@arm.com return pc < r->pc(); 8611051Sandreas.hansson@arm.com } 8711051Sandreas.hansson@arm.com }; 8811051Sandreas.hansson@arm.com typedef std::vector<record_t> map_t; 8911051Sandreas.hansson@arm.com 9011051Sandreas.hansson@arm.com public: 9111051Sandreas.hansson@arm.com typedef map_t::iterator iterator; 9211051Sandreas.hansson@arm.com typedef map_t::const_iterator const_iterator; 9311051Sandreas.hansson@arm.com 9411051Sandreas.hansson@arm.com protected: 9511051Sandreas.hansson@arm.com typedef std::pair<iterator, iterator> range_t; 9611051Sandreas.hansson@arm.com typedef std::pair<const_iterator, const_iterator> const_range_t; 9711051Sandreas.hansson@arm.com 9811051Sandreas.hansson@arm.com protected: 9911051Sandreas.hansson@arm.com map_t pc_map; 10011051Sandreas.hansson@arm.com 10111051Sandreas.hansson@arm.com bool doService(ExecContext *xc); 10211051Sandreas.hansson@arm.com 10311051Sandreas.hansson@arm.com public: 10411051Sandreas.hansson@arm.com PCEventQueue(); 10511051Sandreas.hansson@arm.com ~PCEventQueue(); 10611051Sandreas.hansson@arm.com 10711051Sandreas.hansson@arm.com bool remove(PCEvent *event); 10811051Sandreas.hansson@arm.com bool schedule(PCEvent *event); 10911051Sandreas.hansson@arm.com bool service(ExecContext *xc) 11011051Sandreas.hansson@arm.com { 11111051Sandreas.hansson@arm.com if (pc_map.empty()) 11211051Sandreas.hansson@arm.com return false; 11311051Sandreas.hansson@arm.com 11411051Sandreas.hansson@arm.com return doService(xc); 11511051Sandreas.hansson@arm.com } 11611051Sandreas.hansson@arm.com 11711051Sandreas.hansson@arm.com range_t equal_range(Addr pc); 11811051Sandreas.hansson@arm.com range_t equal_range(PCEvent *event) { return equal_range(event->pc()); } 11911051Sandreas.hansson@arm.com 12011051Sandreas.hansson@arm.com void dump() const; 12111051Sandreas.hansson@arm.com}; 12211051Sandreas.hansson@arm.com 12311051Sandreas.hansson@arm.cominline bool 12411051Sandreas.hansson@arm.comPCEvent::remove() 12511051Sandreas.hansson@arm.com{ 12611051Sandreas.hansson@arm.com if (!queue) 12711051Sandreas.hansson@arm.com panic("cannot remove an uninitialized event;"); 12811051Sandreas.hansson@arm.com 12911051Sandreas.hansson@arm.com return queue->remove(this); 13011051Sandreas.hansson@arm.com} 13111051Sandreas.hansson@arm.com 13211051Sandreas.hansson@arm.cominline bool 13311051Sandreas.hansson@arm.comPCEvent::schedule() 13411051Sandreas.hansson@arm.com{ 13511051Sandreas.hansson@arm.com if (!queue || evpc == badpc) 13611051Sandreas.hansson@arm.com panic("cannot schedule an uninitialized event;"); 13711051Sandreas.hansson@arm.com 13811051Sandreas.hansson@arm.com return queue->schedule(this); 13911051Sandreas.hansson@arm.com} 14011051Sandreas.hansson@arm.com 14111051Sandreas.hansson@arm.cominline bool 14211051Sandreas.hansson@arm.comPCEvent::schedule(Addr pc) 14311051Sandreas.hansson@arm.com{ 14411051Sandreas.hansson@arm.com if (evpc != badpc) 14511051Sandreas.hansson@arm.com panic("cannot switch PC"); 14611051Sandreas.hansson@arm.com evpc = pc & ~0x3; 14711051Sandreas.hansson@arm.com 14811051Sandreas.hansson@arm.com return schedule(); 14911051Sandreas.hansson@arm.com} 15011051Sandreas.hansson@arm.com 15111601Sandreas.hansson@arm.cominline bool 15211601Sandreas.hansson@arm.comPCEvent::schedule(PCEventQueue *q, Addr pc) 15311051Sandreas.hansson@arm.com{ 15411051Sandreas.hansson@arm.com if (queue) 15511051Sandreas.hansson@arm.com panic("cannot switch event queues"); 15611051Sandreas.hansson@arm.com 15711051Sandreas.hansson@arm.com if (evpc != badpc) 15811051Sandreas.hansson@arm.com panic("cannot switch addresses"); 15911051Sandreas.hansson@arm.com 16011051Sandreas.hansson@arm.com queue = q; 16111051Sandreas.hansson@arm.com evpc = pc & ~0x3; 16211051Sandreas.hansson@arm.com 16311284Sandreas.hansson@arm.com return schedule(); 16411051Sandreas.hansson@arm.com} 16511051Sandreas.hansson@arm.com 16611051Sandreas.hansson@arm.comclass BreakPCEvent : public PCEvent 16711051Sandreas.hansson@arm.com{ 16811051Sandreas.hansson@arm.com protected: 16911051Sandreas.hansson@arm.com bool remove; 17011051Sandreas.hansson@arm.com 17111284Sandreas.hansson@arm.com public: 17211284Sandreas.hansson@arm.com BreakPCEvent(PCEventQueue *q, const std::string &desc, bool del = false); 17311284Sandreas.hansson@arm.com virtual void process(ExecContext *xc); 17411284Sandreas.hansson@arm.com}; 17511051Sandreas.hansson@arm.com 17611284Sandreas.hansson@arm.com#endif // __PC_EVENT_HH__ 17711051Sandreas.hansson@arm.com