45 #include "debug/MemCheckerMonitor.hh" 49 masterPort(
name() +
"-master", *this),
50 slavePort(
name() +
"-slave", *this),
51 warnOnly(params->warn_only),
52 memchecker(params->memchecker)
59 MemCheckerMonitorParams::create()
69 fatal(
"Communication monitor is not connected on both sides.\n");
75 if (if_name ==
"master" || if_name ==
"mem_side") {
77 }
else if (if_name ==
"slave" || if_name ==
"cpu_side") {
98 "Forwarded functional access: addr = %#llx, size = %d\n",
106 unsigned size = pkt->
getSize();
114 "Received functional snoop: addr = %#llx, size = %d\n",
121 panic(
"Atomic not supported");
127 panic(
"Atomic not supported");
141 bool is_read = pkt->
isRead() && !pkt->
req->isPrefetch();
142 bool is_write = pkt->
isWrite();
143 unsigned size = pkt->
getSize();
146 std::unique_ptr<uint8_t[]> pkt_data;
149 if (expects_response && is_write) {
153 pkt_data.reset(
new uint8_t[size]);
161 if (expects_response && (is_read || is_write)) {
170 if (!successful && expects_response && (is_read || is_write)) {
174 if (successful && expects_response) {
194 "Forwarded read request: serial = %d, addr = %#llx, " 197 }
else if (is_write) {
206 "Forwarded write request: serial = %d, addr = %#llx, " 211 "Forwarded non read/write request: addr = %#llx\n", addr);
213 }
else if (successful) {
215 "Forwarded request marked for cache response: addr = %#llx\n",
230 bool is_read = pkt->
isRead() && !pkt->
req->isPrefetch();
231 bool is_write = pkt->
isWrite();
232 bool is_failed_LLSC = pkt->
isLLSC() && pkt->
req->getExtraData() == 0;
233 unsigned size = pkt->
getSize();
235 std::unique_ptr<uint8_t[]> pkt_data;
242 pkt_data.reset(
new uint8_t[size]);
246 if (is_read || is_write) {
252 "Monitor got a response without monitor sender state\n");
266 "Received read response: serial = %d, addr = %#llx, " 268 received_state->
serial, addr, size);
277 warn(
"%s: read of %#llx @ cycle %d failed:\n%s\n",
285 delete received_state;
286 }
else if (is_write) {
288 "Received write response: serial = %d, addr = %#llx, " 290 received_state->
serial, addr, size);
292 if (is_failed_LLSC) {
304 delete received_state;
307 "Received non read/write response: addr = %#llx\n", addr);
309 }
else if (is_read || is_write) {
#define panic(...)
This implements a cprintf based panic() function.
~MemCheckerMonitor()
Destructor.
Ports are used to interface objects to each other.
Tick recvAtomicSnoop(PacketPtr pkt)
bool recvTimingReq(PacketPtr pkt)
void completeWrite(Serial serial, Tick complete, Addr addr, size_t size)
Completes a previously started write transaction.
void sendRangeChange() const
Called by the owner to send a range change.
#define fatal(...)
This implements a cprintf based fatal() function.
const std::string & name()
void abortWrite(Serial serial, Addr addr, size_t size)
Aborts a previously started write transaction.
bool sendTimingSnoopResp(PacketPtr pkt)
Attempt to send a timing snoop response packet to the slave port by calling its corresponding receive...
void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
bool completeRead(Serial serial, Tick complete, Addr addr, size_t size, uint8_t *data)
Completes a previously started read transaction.
bool cacheResponding() const
Port & getPort(const std::string &if_name, PortID idx=InvalidPortID) override
Get a port with a given name and index.
AddrRangeList getAddrRanges() const
Tick recvAtomic(PacketPtr pkt)
bool sendTimingReq(PacketPtr pkt)
Attempt to send a timing request to the slave port by calling its corresponding receive function...
bool isConnected() const
Is this port currently connected to a peer?
virtual void sendRetryResp()
Send a retry to the slave port that previously attempted a sendTimingResp to this master port and fai...
uint64_t Serial
The Serial type is used to be able to uniquely identify a transaction as it passes through the system...
void sendFunctionalSnoop(PacketPtr pkt) const
Send a functional snoop request packet, where the data is instantly updated everywhere in the memory ...
MemCheckerMonitor(Params *params)
Constructor based on the Python params.
RequestPtr req
A pointer to the original request.
MonitorMasterPort masterPort
Instance of master port, facing the memory side.
const std::string & getErrorMessage() const
In completeRead, if an error is encountered, this does not print nor cause an error, but instead should be handled by the caller.
bool sendTimingResp(PacketPtr pkt)
Attempt to send a timing response to the master port by calling its corresponding receive function...
Tick curTick()
The current simulated tick.
virtual Port & getPort(const std::string &if_name, PortID idx=InvalidPortID)
Get a port with a given name and index.
bool needsResponse() const
SenderState * predecessor
uint64_t Tick
Tick count type.
void reset()
Resets the entire checker.
MemCheckerMonitorParams Params
Parameters of memchecker monitor.
void writeData(uint8_t *p) const
Copy data from the packet to the memory at the provided pointer.
void recvFunctionalSnoop(PacketPtr pkt)
bool isSnooping() const
Find out if the peer master port is snooping or not.
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
A Packet is used to encapsulate a transfer between two objects in the memory system (e...
Implements a MemChecker monitor, to be inserted between two ports.
MonitorSlavePort slavePort
Instance of slave port, i.e.
virtual const std::string name() const
AddrRangeList getAddrRanges() const
Get the address ranges of the connected slave port.
void sendRetryReq()
Send a retry to the master port that previously attempted a sendTimingReq to this slave port and fail...
SenderState * senderState
This packet's sender state.
void recvTimingSnoopReq(PacketPtr pkt)
Serial startWrite(Tick start, Addr addr, size_t size, const uint8_t *data)
Starts a write transaction.
void sendTimingSnoopReq(PacketPtr pkt)
Attempt to send a timing snoop request packet to the master port by calling its corresponding receive...
bool recvTimingSnoopResp(PacketPtr pkt)
void recvFunctional(PacketPtr pkt)
void pushSenderState(SenderState *sender_state)
Push a new sender state to the packet and make the current sender state the predecessor of the new on...
SenderState * popSenderState()
Pop the top of the state stack and return a pointer to it.
void sendFunctional(PacketPtr pkt) const
Send a functional request packet, where the data is instantly updated everywhere in the memory system...
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
bool recvTimingResp(PacketPtr pkt)
#define panic_if(cond,...)
Conditional panic macro that checks the supplied condition and only panics if the condition is true a...
Serial startRead(Tick start, Addr addr, size_t size)
Starts a read transaction.
Abstract superclass for simulation objects.
MemChecker::Serial serial