pc_event.hh revision 2632:1bb2f91485ea
1/* 2 * Copyright (c) 2002-2005 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; 9 * redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * 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#ifndef __PC_EVENT_HH__ 30#define __PC_EVENT_HH__ 31 32#include <vector> 33 34#include "base/misc.hh" 35 36class ExecContext; 37class PCEventQueue; 38 39class PCEvent 40{ 41 protected: 42 std::string description; 43 PCEventQueue *queue; 44 Addr evpc; 45 46 public: 47 PCEvent(PCEventQueue *q, const std::string &desc, Addr pc); 48 49 virtual ~PCEvent() { if (queue) remove(); } 50 51 // for DPRINTF 52 virtual const std::string name() const { return description; } 53 54 std::string descr() const { return description; } 55 Addr pc() const { return evpc; } 56 57 bool remove(); 58 virtual void process(ExecContext *xc) = 0; 59}; 60 61class PCEventQueue 62{ 63 protected: 64 typedef PCEvent * record_t; 65 class MapCompare { 66 public: 67 bool operator()(const record_t &l, const record_t &r) const { 68 return l->pc() < r->pc(); 69 } 70 bool operator()(const record_t &l, Addr pc) const { 71 return l->pc() < pc; 72 } 73 bool operator()(Addr pc, const record_t &r) const { 74 return pc < r->pc(); 75 } 76 }; 77 typedef std::vector<record_t> map_t; 78 79 public: 80 typedef map_t::iterator iterator; 81 typedef map_t::const_iterator const_iterator; 82 83 protected: 84 typedef std::pair<iterator, iterator> range_t; 85 typedef std::pair<const_iterator, const_iterator> const_range_t; 86 87 protected: 88 map_t pc_map; 89 90 bool doService(ExecContext *xc); 91 92 public: 93 PCEventQueue(); 94 ~PCEventQueue(); 95 96 bool remove(PCEvent *event); 97 bool schedule(PCEvent *event); 98 bool service(ExecContext *xc) 99 { 100 if (pc_map.empty()) 101 return false; 102 103 return doService(xc); 104 } 105 106 range_t equal_range(Addr pc); 107 range_t equal_range(PCEvent *event) { return equal_range(event->pc()); } 108 109 void dump() const; 110}; 111 112 113inline 114PCEvent::PCEvent(PCEventQueue *q, const std::string &desc, Addr pc) 115 : description(desc), queue(q), evpc(pc) 116{ 117 queue->schedule(this); 118} 119 120inline bool 121PCEvent::remove() 122{ 123 if (!queue) 124 panic("cannot remove an uninitialized event;"); 125 126 return queue->remove(this); 127} 128 129class BreakPCEvent : public PCEvent 130{ 131 protected: 132 bool remove; 133 134 public: 135 BreakPCEvent(PCEventQueue *q, const std::string &desc, Addr addr, 136 bool del = false); 137 virtual void process(ExecContext *xc); 138}; 139 140#endif // __PC_EVENT_HH__ 141