insttracer.hh revision 4832
15643Sgblack@eecs.umich.edu/*
25643Sgblack@eecs.umich.edu * Copyright (c) 2001-2005 The Regents of The University of Michigan
35643Sgblack@eecs.umich.edu * All rights reserved.
45643Sgblack@eecs.umich.edu *
55643Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
65643Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
75643Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
85643Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
95643Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
105643Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
115643Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
125643Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
135643Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
145643Sgblack@eecs.umich.edu * this software without specific prior written permission.
155643Sgblack@eecs.umich.edu *
165643Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
175643Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
185643Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
195643Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
205643Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
215643Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
225643Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
235643Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
245643Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
255643Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
265643Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
275643Sgblack@eecs.umich.edu *
285643Sgblack@eecs.umich.edu * Authors: Steve Reinhardt
295643Sgblack@eecs.umich.edu *          Nathan Binkert
305643Sgblack@eecs.umich.edu */
315651Sgblack@eecs.umich.edu
325643Sgblack@eecs.umich.edu#ifndef __INSTRECORD_HH__
335657Sgblack@eecs.umich.edu#define __INSTRECORD_HH__
345643Sgblack@eecs.umich.edu
355643Sgblack@eecs.umich.edu#include "base/bigint.hh"
365643Sgblack@eecs.umich.edu#include "base/trace.hh"
375643Sgblack@eecs.umich.edu#include "cpu/inst_seq.hh"	// for InstSeqNum
385651Sgblack@eecs.umich.edu#include "cpu/static_inst.hh"
395827Sgblack@eecs.umich.edu#include "sim/host.hh"
405827Sgblack@eecs.umich.edu#include "sim/sim_object.hh"
415643Sgblack@eecs.umich.edu
425643Sgblack@eecs.umich.educlass ThreadContext;
435720Snate@binkert.org
445643Sgblack@eecs.umich.edunamespace Trace {
455643Sgblack@eecs.umich.edu
465643Sgblack@eecs.umich.educlass InstRecord
475653Sgblack@eecs.umich.edu{
485653Sgblack@eecs.umich.edu  protected:
495653Sgblack@eecs.umich.edu    Tick when;
505653Sgblack@eecs.umich.edu
515827Sgblack@eecs.umich.edu    // The following fields are initialized by the constructor and
525653Sgblack@eecs.umich.edu    // thus guaranteed to be valid.
535643Sgblack@eecs.umich.edu    ThreadContext *thread;
545643Sgblack@eecs.umich.edu    // need to make this ref-counted so it doesn't go away before we
555643Sgblack@eecs.umich.edu    // dump the record
565643Sgblack@eecs.umich.edu    StaticInstPtr staticInst;
575643Sgblack@eecs.umich.edu    Addr PC;
585643Sgblack@eecs.umich.edu    bool misspeculating;
595643Sgblack@eecs.umich.edu
605643Sgblack@eecs.umich.edu    // The remaining fields are only valid for particular instruction
615643Sgblack@eecs.umich.edu    // types (e.g, addresses for memory ops) or when particular
625643Sgblack@eecs.umich.edu    // options are enabled (e.g., tracing full register contents).
635643Sgblack@eecs.umich.edu    // Each data field has an associated valid flag to indicate
645643Sgblack@eecs.umich.edu    // whether the data field is valid.
655643Sgblack@eecs.umich.edu    Addr addr;
665643Sgblack@eecs.umich.edu    bool addr_valid;
675643Sgblack@eecs.umich.edu
685643Sgblack@eecs.umich.edu    union {
695643Sgblack@eecs.umich.edu        uint64_t as_int;
705643Sgblack@eecs.umich.edu        double as_double;
715643Sgblack@eecs.umich.edu    } data;
725643Sgblack@eecs.umich.edu    enum {
735643Sgblack@eecs.umich.edu        DataInvalid = 0,
745643Sgblack@eecs.umich.edu        DataInt8 = 1,	// set to equal number of bytes
755643Sgblack@eecs.umich.edu        DataInt16 = 2,
765643Sgblack@eecs.umich.edu        DataInt32 = 4,
775643Sgblack@eecs.umich.edu        DataInt64 = 8,
785643Sgblack@eecs.umich.edu        DataDouble = 3
795643Sgblack@eecs.umich.edu    } data_status;
805643Sgblack@eecs.umich.edu
815643Sgblack@eecs.umich.edu    InstSeqNum fetch_seq;
825643Sgblack@eecs.umich.edu    bool fetch_seq_valid;
835643Sgblack@eecs.umich.edu
845643Sgblack@eecs.umich.edu    InstSeqNum cp_seq;
855643Sgblack@eecs.umich.edu    bool cp_seq_valid;
865643Sgblack@eecs.umich.edu
875643Sgblack@eecs.umich.edu  public:
885643Sgblack@eecs.umich.edu    InstRecord(Tick _when, ThreadContext *_thread,
895643Sgblack@eecs.umich.edu               const StaticInstPtr &_staticInst,
905643Sgblack@eecs.umich.edu               Addr _pc, bool spec)
915643Sgblack@eecs.umich.edu        : when(_when), thread(_thread),
925643Sgblack@eecs.umich.edu          staticInst(_staticInst), PC(_pc),
935643Sgblack@eecs.umich.edu          misspeculating(spec)
945643Sgblack@eecs.umich.edu    {
955643Sgblack@eecs.umich.edu        data_status = DataInvalid;
965643Sgblack@eecs.umich.edu        addr_valid = false;
975643Sgblack@eecs.umich.edu
985643Sgblack@eecs.umich.edu        fetch_seq_valid = false;
995643Sgblack@eecs.umich.edu        cp_seq_valid = false;
1005643Sgblack@eecs.umich.edu    }
1015643Sgblack@eecs.umich.edu
1025643Sgblack@eecs.umich.edu    virtual ~InstRecord() { }
1035643Sgblack@eecs.umich.edu
1045643Sgblack@eecs.umich.edu    void setAddr(Addr a) { addr = a; addr_valid = true; }
1055643Sgblack@eecs.umich.edu
1065643Sgblack@eecs.umich.edu    void setData(Twin64_t d) { data.as_int = d.a; data_status = DataInt64; }
1075643Sgblack@eecs.umich.edu    void setData(Twin32_t d) { data.as_int = d.a; data_status = DataInt32; }
1085643Sgblack@eecs.umich.edu    void setData(uint64_t d) { data.as_int = d; data_status = DataInt64; }
1095643Sgblack@eecs.umich.edu    void setData(uint32_t d) { data.as_int = d; data_status = DataInt32; }
1105643Sgblack@eecs.umich.edu    void setData(uint16_t d) { data.as_int = d; data_status = DataInt16; }
1115643Sgblack@eecs.umich.edu    void setData(uint8_t d) { data.as_int = d; data_status = DataInt8; }
1125643Sgblack@eecs.umich.edu
1135643Sgblack@eecs.umich.edu    void setData(int64_t d) { setData((uint64_t)d); }
1145643Sgblack@eecs.umich.edu    void setData(int32_t d) { setData((uint32_t)d); }
1155643Sgblack@eecs.umich.edu    void setData(int16_t d) { setData((uint16_t)d); }
1165643Sgblack@eecs.umich.edu    void setData(int8_t d)  { setData((uint8_t)d); }
1175643Sgblack@eecs.umich.edu
1185643Sgblack@eecs.umich.edu    void setData(double d) { data.as_double = d; data_status = DataDouble; }
1195643Sgblack@eecs.umich.edu
1205643Sgblack@eecs.umich.edu    void setFetchSeq(InstSeqNum seq)
1215643Sgblack@eecs.umich.edu    { fetch_seq = seq; fetch_seq_valid = true; }
1225643Sgblack@eecs.umich.edu
1235643Sgblack@eecs.umich.edu    void setCPSeq(InstSeqNum seq)
1245643Sgblack@eecs.umich.edu    { cp_seq = seq; cp_seq_valid = true; }
1255643Sgblack@eecs.umich.edu
1265643Sgblack@eecs.umich.edu    virtual void dump() = 0;
1275643Sgblack@eecs.umich.edu};
1285643Sgblack@eecs.umich.edu
1295643Sgblack@eecs.umich.educlass InstTracer : public SimObject
1305643Sgblack@eecs.umich.edu{
1315643Sgblack@eecs.umich.edu  public:
1325643Sgblack@eecs.umich.edu    InstTracer(const std::string & name) : SimObject(name)
1335643Sgblack@eecs.umich.edu    {}
1345643Sgblack@eecs.umich.edu
1355643Sgblack@eecs.umich.edu    virtual ~InstTracer()
1365643Sgblack@eecs.umich.edu    {};
1375643Sgblack@eecs.umich.edu
1385643Sgblack@eecs.umich.edu    virtual InstRecord *
1395643Sgblack@eecs.umich.edu        getInstRecord(Tick when, ThreadContext *tc,
1405643Sgblack@eecs.umich.edu                const StaticInstPtr staticInst, Addr pc) = 0;
1415643Sgblack@eecs.umich.edu};
1425643Sgblack@eecs.umich.edu
1435643Sgblack@eecs.umich.edu
1445643Sgblack@eecs.umich.edu
1455643Sgblack@eecs.umich.edu}; // namespace Trace
1465643Sgblack@eecs.umich.edu
1475643Sgblack@eecs.umich.edu#endif // __INSTRECORD_HH__
1485643Sgblack@eecs.umich.edu