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