mem_checker_monitor.hh revision 13892
111308Santhony.gutierrez@amd.com/*
211308Santhony.gutierrez@amd.com * Copyright (c) 2012-2014 ARM Limited
311308Santhony.gutierrez@amd.com * All rights reserved
411308Santhony.gutierrez@amd.com *
511308Santhony.gutierrez@amd.com * The license below extends only to copyright in the software and shall
611308Santhony.gutierrez@amd.com * not be construed as granting a license to any other intellectual
711308Santhony.gutierrez@amd.com * property including but not limited to intellectual property relating
811308Santhony.gutierrez@amd.com * to a hardware implementation of the functionality of the software
911308Santhony.gutierrez@amd.com * licensed hereunder.  You may use the software subject to the license
1011308Santhony.gutierrez@amd.com * terms below provided that you ensure that this notice is replicated
1111308Santhony.gutierrez@amd.com * unmodified and in its entirety in all distributions of the software,
1211308Santhony.gutierrez@amd.com * modified or unmodified, in source code or in binary form.
1311308Santhony.gutierrez@amd.com *
1411308Santhony.gutierrez@amd.com * Redistribution and use in source and binary forms, with or without
1511308Santhony.gutierrez@amd.com * modification, are permitted provided that the following conditions are
1611308Santhony.gutierrez@amd.com * met: redistributions of source code must retain the above copyright
1711308Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer;
1811308Santhony.gutierrez@amd.com * redistributions in binary form must reproduce the above copyright
1911308Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer in the
2011308Santhony.gutierrez@amd.com * documentation and/or other materials provided with the distribution;
2111308Santhony.gutierrez@amd.com * neither the name of the copyright holders nor the names of its
2211308Santhony.gutierrez@amd.com * contributors may be used to endorse or promote products derived from
2311308Santhony.gutierrez@amd.com * this software without specific prior written permission.
2411308Santhony.gutierrez@amd.com *
2511308Santhony.gutierrez@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2611308Santhony.gutierrez@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2711308Santhony.gutierrez@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2811308Santhony.gutierrez@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2911308Santhony.gutierrez@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3011308Santhony.gutierrez@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3111308Santhony.gutierrez@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3211308Santhony.gutierrez@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3311308Santhony.gutierrez@amd.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3411308Santhony.gutierrez@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3511308Santhony.gutierrez@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3611308Santhony.gutierrez@amd.com *
3711308Santhony.gutierrez@amd.com * Authors: Thomas Grass
3811308Santhony.gutierrez@amd.com *          Andreas Hansson
3911308Santhony.gutierrez@amd.com *          Marco Elver
4011308Santhony.gutierrez@amd.com */
4111308Santhony.gutierrez@amd.com
4211308Santhony.gutierrez@amd.com#ifndef __MEM_MEM_CHECKER_MONITOR_HH__
4311308Santhony.gutierrez@amd.com#define __MEM_MEM_CHECKER_MONITOR_HH__
4411692Santhony.gutierrez@amd.com
4511534Sjohn.kalamatianos@amd.com#include "base/statistics.hh"
4611692Santhony.gutierrez@amd.com#include "mem/mem_checker.hh"
4711692Santhony.gutierrez@amd.com#include "params/MemCheckerMonitor.hh"
4811308Santhony.gutierrez@amd.com#include "sim/sim_object.hh"
4911534Sjohn.kalamatianos@amd.com#include "sim/system.hh"
5011534Sjohn.kalamatianos@amd.com
5111534Sjohn.kalamatianos@amd.com/**
5211534Sjohn.kalamatianos@amd.com * Implements a MemChecker monitor, to be inserted between two ports.
5311534Sjohn.kalamatianos@amd.com */
5411534Sjohn.kalamatianos@amd.comclass MemCheckerMonitor : public SimObject
5511534Sjohn.kalamatianos@amd.com{
5611534Sjohn.kalamatianos@amd.com  public:
5711534Sjohn.kalamatianos@amd.com
5811534Sjohn.kalamatianos@amd.com    /** Parameters of memchecker monitor */
5911534Sjohn.kalamatianos@amd.com    typedef MemCheckerMonitorParams Params;
6011534Sjohn.kalamatianos@amd.com    const Params* params() const
6111534Sjohn.kalamatianos@amd.com    { return reinterpret_cast<const Params*>(_params); }
6211534Sjohn.kalamatianos@amd.com
6311534Sjohn.kalamatianos@amd.com    /**
6411534Sjohn.kalamatianos@amd.com     * Constructor based on the Python params
6511534Sjohn.kalamatianos@amd.com     *
6611534Sjohn.kalamatianos@amd.com     * @param params Python parameters
6711308Santhony.gutierrez@amd.com     */
6811308Santhony.gutierrez@amd.com    MemCheckerMonitor(Params* params);
6911308Santhony.gutierrez@amd.com
7011692Santhony.gutierrez@amd.com    /** Destructor */
7111308Santhony.gutierrez@amd.com    ~MemCheckerMonitor();
7211692Santhony.gutierrez@amd.com
7311308Santhony.gutierrez@amd.com    Port &getPort(const std::string &if_name,
7411308Santhony.gutierrez@amd.com                  PortID idx=InvalidPortID) override;
7511308Santhony.gutierrez@amd.com
7611308Santhony.gutierrez@amd.com    void init() override;
7711308Santhony.gutierrez@amd.com
7811692Santhony.gutierrez@amd.com  private:
7911308Santhony.gutierrez@amd.com
8011308Santhony.gutierrez@amd.com    struct MemCheckerMonitorSenderState : public Packet::SenderState
8111308Santhony.gutierrez@amd.com    {
8211308Santhony.gutierrez@amd.com        MemCheckerMonitorSenderState(MemChecker::Serial _serial)
8311308Santhony.gutierrez@amd.com            : serial(_serial)
8411692Santhony.gutierrez@amd.com        {}
8511308Santhony.gutierrez@amd.com
8611308Santhony.gutierrez@amd.com        MemChecker::Serial serial;
8711308Santhony.gutierrez@amd.com    };
8811308Santhony.gutierrez@amd.com
8911308Santhony.gutierrez@amd.com    /**
9011692Santhony.gutierrez@amd.com     * This is the master port of the communication monitor. All recv
9111308Santhony.gutierrez@amd.com     * functions call a function in MemCheckerMonitor, where the
9211308Santhony.gutierrez@amd.com     * send function of the slave port is called. Besides this, these
9311308Santhony.gutierrez@amd.com     * functions can also perform actions for capturing statistics.
9411308Santhony.gutierrez@amd.com     */
9511308Santhony.gutierrez@amd.com    class MonitorMasterPort : public MasterPort
9611692Santhony.gutierrez@amd.com    {
9711308Santhony.gutierrez@amd.com
9811308Santhony.gutierrez@amd.com      public:
9911308Santhony.gutierrez@amd.com
10011308Santhony.gutierrez@amd.com        MonitorMasterPort(const std::string& _name, MemCheckerMonitor& _mon)
10111308Santhony.gutierrez@amd.com            : MasterPort(_name, &_mon), mon(_mon)
10211692Santhony.gutierrez@amd.com        { }
10311308Santhony.gutierrez@amd.com
10411308Santhony.gutierrez@amd.com      protected:
10511308Santhony.gutierrez@amd.com
10611308Santhony.gutierrez@amd.com        void recvFunctionalSnoop(PacketPtr pkt)
10711308Santhony.gutierrez@amd.com        {
10811692Santhony.gutierrez@amd.com            mon.recvFunctionalSnoop(pkt);
10911308Santhony.gutierrez@amd.com        }
11011308Santhony.gutierrez@amd.com
11111308Santhony.gutierrez@amd.com        Tick recvAtomicSnoop(PacketPtr pkt)
11211308Santhony.gutierrez@amd.com        {
11311308Santhony.gutierrez@amd.com            return mon.recvAtomicSnoop(pkt);
11411692Santhony.gutierrez@amd.com        }
11511308Santhony.gutierrez@amd.com
11611308Santhony.gutierrez@amd.com        bool recvTimingResp(PacketPtr pkt)
11711308Santhony.gutierrez@amd.com        {
11811308Santhony.gutierrez@amd.com            return mon.recvTimingResp(pkt);
11911308Santhony.gutierrez@amd.com        }
12011692Santhony.gutierrez@amd.com
12111308Santhony.gutierrez@amd.com        void recvTimingSnoopReq(PacketPtr pkt)
12211308Santhony.gutierrez@amd.com        {
12311308Santhony.gutierrez@amd.com            mon.recvTimingSnoopReq(pkt);
12411308Santhony.gutierrez@amd.com        }
12511308Santhony.gutierrez@amd.com
12611692Santhony.gutierrez@amd.com        void recvRangeChange()
12711308Santhony.gutierrez@amd.com        {
12811308Santhony.gutierrez@amd.com            mon.recvRangeChange();
12911308Santhony.gutierrez@amd.com        }
13011308Santhony.gutierrez@amd.com
13111308Santhony.gutierrez@amd.com        bool isSnooping() const
13211692Santhony.gutierrez@amd.com        {
13311308Santhony.gutierrez@amd.com            return mon.isSnooping();
13411308Santhony.gutierrez@amd.com        }
13511308Santhony.gutierrez@amd.com
13611308Santhony.gutierrez@amd.com        void recvReqRetry()
13711308Santhony.gutierrez@amd.com        {
13811308Santhony.gutierrez@amd.com            mon.recvReqRetry();
13911308Santhony.gutierrez@amd.com        }
14011308Santhony.gutierrez@amd.com
14111308Santhony.gutierrez@amd.com      private:
14211308Santhony.gutierrez@amd.com
14311308Santhony.gutierrez@amd.com        MemCheckerMonitor& mon;
14411692Santhony.gutierrez@amd.com
14511308Santhony.gutierrez@amd.com    };
14611308Santhony.gutierrez@amd.com
14711308Santhony.gutierrez@amd.com    /** Instance of master port, facing the memory side */
14811308Santhony.gutierrez@amd.com    MonitorMasterPort masterPort;
14911308Santhony.gutierrez@amd.com
15011308Santhony.gutierrez@amd.com    /**
15111308Santhony.gutierrez@amd.com     * This is the slave port of the communication monitor. All recv
15211308Santhony.gutierrez@amd.com     * functions call a function in MemCheckerMonitor, where the
15311308Santhony.gutierrez@amd.com     * send function of the master port is called. Besides this, these
15411692Santhony.gutierrez@amd.com     * functions can also perform actions for capturing statistics.
15511308Santhony.gutierrez@amd.com     */
15611308Santhony.gutierrez@amd.com    class MonitorSlavePort : public SlavePort
15711308Santhony.gutierrez@amd.com    {
15811693Santhony.gutierrez@amd.com
15911693Santhony.gutierrez@amd.com      public:
16011693Santhony.gutierrez@amd.com
16111693Santhony.gutierrez@amd.com        MonitorSlavePort(const std::string& _name, MemCheckerMonitor& _mon)
16211693Santhony.gutierrez@amd.com            : SlavePort(_name, &_mon), mon(_mon)
16311693Santhony.gutierrez@amd.com        { }
16411692Santhony.gutierrez@amd.com
16511692Santhony.gutierrez@amd.com      protected:
16611692Santhony.gutierrez@amd.com
16711692Santhony.gutierrez@amd.com        void recvFunctional(PacketPtr pkt)
16811308Santhony.gutierrez@amd.com        {
16911692Santhony.gutierrez@amd.com            mon.recvFunctional(pkt);
17011308Santhony.gutierrez@amd.com        }
17111692Santhony.gutierrez@amd.com
17211692Santhony.gutierrez@amd.com        Tick recvAtomic(PacketPtr pkt)
17311692Santhony.gutierrez@amd.com        {
17411692Santhony.gutierrez@amd.com            return mon.recvAtomic(pkt);
17511692Santhony.gutierrez@amd.com        }
17611692Santhony.gutierrez@amd.com
17711692Santhony.gutierrez@amd.com        bool recvTimingReq(PacketPtr pkt)
17811692Santhony.gutierrez@amd.com        {
17911692Santhony.gutierrez@amd.com            return mon.recvTimingReq(pkt);
18011692Santhony.gutierrez@amd.com        }
18111692Santhony.gutierrez@amd.com
18211692Santhony.gutierrez@amd.com        bool recvTimingSnoopResp(PacketPtr pkt)
18311692Santhony.gutierrez@amd.com        {
18411692Santhony.gutierrez@amd.com            return mon.recvTimingSnoopResp(pkt);
18511692Santhony.gutierrez@amd.com        }
18611692Santhony.gutierrez@amd.com
18711692Santhony.gutierrez@amd.com        AddrRangeList getAddrRanges() const
18811692Santhony.gutierrez@amd.com        {
18911692Santhony.gutierrez@amd.com            return mon.getAddrRanges();
19011692Santhony.gutierrez@amd.com        }
19111692Santhony.gutierrez@amd.com
19211692Santhony.gutierrez@amd.com        void recvRespRetry()
19311692Santhony.gutierrez@amd.com        {
19411692Santhony.gutierrez@amd.com            mon.recvRespRetry();
19511692Santhony.gutierrez@amd.com        }
19611692Santhony.gutierrez@amd.com
19711692Santhony.gutierrez@amd.com      private:
19811692Santhony.gutierrez@amd.com
19911692Santhony.gutierrez@amd.com        MemCheckerMonitor& mon;
20011692Santhony.gutierrez@amd.com
20111692Santhony.gutierrez@amd.com    };
20211692Santhony.gutierrez@amd.com
20311692Santhony.gutierrez@amd.com    /** Instance of slave port, i.e. on the CPU side */
20411692Santhony.gutierrez@amd.com    MonitorSlavePort slavePort;
20511692Santhony.gutierrez@amd.com
20611692Santhony.gutierrez@amd.com    void recvFunctional(PacketPtr pkt);
20711692Santhony.gutierrez@amd.com
20811692Santhony.gutierrez@amd.com    void recvFunctionalSnoop(PacketPtr pkt);
20911692Santhony.gutierrez@amd.com
21011692Santhony.gutierrez@amd.com    Tick recvAtomic(PacketPtr pkt);
21111692Santhony.gutierrez@amd.com
21211692Santhony.gutierrez@amd.com    Tick recvAtomicSnoop(PacketPtr pkt);
21311692Santhony.gutierrez@amd.com
21411692Santhony.gutierrez@amd.com    bool recvTimingReq(PacketPtr pkt);
21511692Santhony.gutierrez@amd.com
21611692Santhony.gutierrez@amd.com    bool recvTimingResp(PacketPtr pkt);
21711692Santhony.gutierrez@amd.com
21811692Santhony.gutierrez@amd.com    void recvTimingSnoopReq(PacketPtr pkt);
21911692Santhony.gutierrez@amd.com
22011692Santhony.gutierrez@amd.com    bool recvTimingSnoopResp(PacketPtr pkt);
22111692Santhony.gutierrez@amd.com
22211692Santhony.gutierrez@amd.com    AddrRangeList getAddrRanges() const;
22311692Santhony.gutierrez@amd.com
22411692Santhony.gutierrez@amd.com    bool isSnooping() const;
22511692Santhony.gutierrez@amd.com
22611692Santhony.gutierrez@amd.com    void recvReqRetry();
22711692Santhony.gutierrez@amd.com
22811692Santhony.gutierrez@amd.com    void recvRespRetry();
22911692Santhony.gutierrez@amd.com
23011692Santhony.gutierrez@amd.com    void recvRangeChange();
23111692Santhony.gutierrez@amd.com
23211692Santhony.gutierrez@amd.com    bool warnOnly;
23311692Santhony.gutierrez@amd.com
23411692Santhony.gutierrez@amd.com    MemChecker *memchecker;
23511692Santhony.gutierrez@amd.com};
23611692Santhony.gutierrez@amd.com
23711692Santhony.gutierrez@amd.com#endif //__MEM_MEM_CHECKER_MONITOR_HH__
23811692Santhony.gutierrez@amd.com