insttracer.hh revision 4776:8c8407243a2c
12810Srdreslin@umich.edu/*
212665Snikos.nikoleris@arm.com * Copyright (c) 2001-2005 The Regents of The University of Michigan
39347SAndreas.Sandberg@arm.com * All rights reserved.
49347SAndreas.Sandberg@arm.com *
59347SAndreas.Sandberg@arm.com * Redistribution and use in source and binary forms, with or without
69347SAndreas.Sandberg@arm.com * modification, are permitted provided that the following conditions are
79347SAndreas.Sandberg@arm.com * met: redistributions of source code must retain the above copyright
89347SAndreas.Sandberg@arm.com * notice, this list of conditions and the following disclaimer;
99347SAndreas.Sandberg@arm.com * redistributions in binary form must reproduce the above copyright
109347SAndreas.Sandberg@arm.com * notice, this list of conditions and the following disclaimer in the
119347SAndreas.Sandberg@arm.com * documentation and/or other materials provided with the distribution;
129347SAndreas.Sandberg@arm.com * neither the name of the copyright holders nor the names of its
139347SAndreas.Sandberg@arm.com * contributors may be used to endorse or promote products derived from
142810Srdreslin@umich.edu * this software without specific prior written permission.
152810Srdreslin@umich.edu *
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 * Authors: Steve Reinhardt
292810Srdreslin@umich.edu *          Nathan Binkert
302810Srdreslin@umich.edu */
312810Srdreslin@umich.edu
322810Srdreslin@umich.edu#ifndef __INSTRECORD_HH__
332810Srdreslin@umich.edu#define __INSTRECORD_HH__
342810Srdreslin@umich.edu
352810Srdreslin@umich.edu#include "base/trace.hh"
362810Srdreslin@umich.edu#include "cpu/inst_seq.hh"	// for InstSeqNum
372810Srdreslin@umich.edu#include "cpu/static_inst.hh"
382810Srdreslin@umich.edu#include "sim/host.hh"
392810Srdreslin@umich.edu#include "sim/sim_object.hh"
402810Srdreslin@umich.edu
4112665Snikos.nikoleris@arm.comclass ThreadContext;
422810Srdreslin@umich.edu
432810Srdreslin@umich.edunamespace Trace {
442810Srdreslin@umich.edu
452810Srdreslin@umich.educlass InstRecord
462810Srdreslin@umich.edu{
472810Srdreslin@umich.edu  protected:
482810Srdreslin@umich.edu    Tick when;
496216Snate@binkert.org
506216Snate@binkert.org    // The following fields are initialized by the constructor and
512810Srdreslin@umich.edu    // thus guaranteed to be valid.
5212727Snikos.nikoleris@arm.com    ThreadContext *thread;
5312728Snikos.nikoleris@arm.com    // need to make this ref-counted so it doesn't go away before we
5412727Snikos.nikoleris@arm.com    // dump the record
5511168Sandreas.hansson@arm.com    StaticInstPtr staticInst;
5613163Sodanrc@yahoo.com.br    Addr PC;
572810Srdreslin@umich.edu    bool misspeculating;
5812727Snikos.nikoleris@arm.com
5912665Snikos.nikoleris@arm.com    // The remaining fields are only valid for particular instruction
6012727Snikos.nikoleris@arm.com    // types (e.g, addresses for memory ops) or when particular
6112727Snikos.nikoleris@arm.com    // options are enabled (e.g., tracing full register contents).
6212727Snikos.nikoleris@arm.com    // Each data field has an associated valid flag to indicate
6311486Snikos.nikoleris@arm.com    // whether the data field is valid.
648229Snate@binkert.org    Addr addr;
652810Srdreslin@umich.edu    bool addr_valid;
669796Sprakash.ramrakhyani@arm.com
672810Srdreslin@umich.edu    union {
6812665Snikos.nikoleris@arm.com        uint64_t as_int;
6912665Snikos.nikoleris@arm.com        double as_double;
7012665Snikos.nikoleris@arm.com    } data;
7112665Snikos.nikoleris@arm.com    enum {
7212773Sodanrc@yahoo.com.br        DataInvalid = 0,
7312773Sodanrc@yahoo.com.br        DataInt8 = 1,	// set to equal number of bytes
7412665Snikos.nikoleris@arm.com        DataInt16 = 2,
7512665Snikos.nikoleris@arm.com        DataInt32 = 4,
7612665Snikos.nikoleris@arm.com        DataInt64 = 8,
7712665Snikos.nikoleris@arm.com        DataDouble = 3
7812665Snikos.nikoleris@arm.com    } data_status;
7912665Snikos.nikoleris@arm.com
802810Srdreslin@umich.edu    InstSeqNum fetch_seq;
812810Srdreslin@umich.edu    bool fetch_seq_valid;
822810Srdreslin@umich.edu
832810Srdreslin@umich.edu    InstSeqNum cp_seq;
842810Srdreslin@umich.edu    bool cp_seq_valid;
8512636Sodanrc@yahoo.com.br
8613162Sodanrc@yahoo.com.br  public:
8713162Sodanrc@yahoo.com.br    InstRecord(Tick _when, ThreadContext *_thread,
882810Srdreslin@umich.edu               const StaticInstPtr &_staticInst,
892810Srdreslin@umich.edu               Addr _pc, bool spec)
902810Srdreslin@umich.edu        : when(_when), thread(_thread),
912810Srdreslin@umich.edu          staticInst(_staticInst), PC(_pc),
922810Srdreslin@umich.edu          misspeculating(spec)
9312665Snikos.nikoleris@arm.com    {
9412665Snikos.nikoleris@arm.com        data_status = DataInvalid;
952810Srdreslin@umich.edu        addr_valid = false;
962810Srdreslin@umich.edu
972810Srdreslin@umich.edu        fetch_seq_valid = false;
982810Srdreslin@umich.edu        cp_seq_valid = false;
992810Srdreslin@umich.edu    }
1002810Srdreslin@umich.edu
1012810Srdreslin@umich.edu    virtual ~InstRecord() { }
1022810Srdreslin@umich.edu
1032810Srdreslin@umich.edu    void setAddr(Addr a) { addr = a; addr_valid = true; }
1042810Srdreslin@umich.edu
1052810Srdreslin@umich.edu    void setData(Twin64_t d) { data.as_int = d.a; data_status = DataInt64; }
1066227Snate@binkert.org    void setData(Twin32_t d) { data.as_int = d.a; data_status = DataInt32; }
1072810Srdreslin@umich.edu    void setData(uint64_t d) { data.as_int = d; data_status = DataInt64; }
1082810Srdreslin@umich.edu    void setData(uint32_t d) { data.as_int = d; data_status = DataInt32; }
1092810Srdreslin@umich.edu    void setData(uint16_t d) { data.as_int = d; data_status = DataInt16; }
1102810Srdreslin@umich.edu    void setData(uint8_t d) { data.as_int = d; data_status = DataInt8; }
1112810Srdreslin@umich.edu
1122810Srdreslin@umich.edu    void setData(int64_t d) { setData((uint64_t)d); }
1132810Srdreslin@umich.edu    void setData(int32_t d) { setData((uint32_t)d); }
1142810Srdreslin@umich.edu    void setData(int16_t d) { setData((uint16_t)d); }
1152810Srdreslin@umich.edu    void setData(int8_t d)  { setData((uint8_t)d); }
1162810Srdreslin@umich.edu
11712775Snikos.nikoleris@arm.com    void setData(double d) { data.as_double = d; data_status = DataDouble; }
11812775Snikos.nikoleris@arm.com
11912775Snikos.nikoleris@arm.com    void setFetchSeq(InstSeqNum seq)
12012775Snikos.nikoleris@arm.com    { fetch_seq = seq; fetch_seq_valid = true; }
12112775Snikos.nikoleris@arm.com
12212775Snikos.nikoleris@arm.com    void setCPSeq(InstSeqNum seq)
12312775Snikos.nikoleris@arm.com    { cp_seq = seq; cp_seq_valid = true; }
12412775Snikos.nikoleris@arm.com
12512775Snikos.nikoleris@arm.com    virtual void dump() = 0;
12612775Snikos.nikoleris@arm.com};
1272810Srdreslin@umich.edu
1282810Srdreslin@umich.educlass InstTracer : public SimObject
12912775Snikos.nikoleris@arm.com{
1302810Srdreslin@umich.edu  public:
1312810Srdreslin@umich.edu    InstTracer(const std::string & name) : SimObject(name)
1322810Srdreslin@umich.edu    {}
13312648Sodanrc@yahoo.com.br
1342810Srdreslin@umich.edu    virtual ~InstTracer()
1352810Srdreslin@umich.edu    {};
1362810Srdreslin@umich.edu
1372810Srdreslin@umich.edu    virtual InstRecord *
1382810Srdreslin@umich.edu        getInstRecord(Tick when, ThreadContext *tc,
13912648Sodanrc@yahoo.com.br                const StaticInstPtr staticInst, Addr pc) = 0;
14012648Sodanrc@yahoo.com.br};
14112648Sodanrc@yahoo.com.br
14212648Sodanrc@yahoo.com.br
14312648Sodanrc@yahoo.com.br
14412648Sodanrc@yahoo.com.br}; // namespace Trace
14512636Sodanrc@yahoo.com.br
1469796Sprakash.ramrakhyani@arm.com#endif // __INSTRECORD_HH__
1479796Sprakash.ramrakhyani@arm.com