Go to the documentation of this file.
45 #include "debug/MemCheckerMonitor.hh"
49 memSidePort(
name() +
"-memSidePort", *this),
50 cpuSidePort(
name() +
"-cpuSidePort", *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 ==
"request" || if_name ==
"mem_side_port") {
77 }
else if (if_name ==
"response" || if_name ==
"cpu_side_port") {
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, "
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, "
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 fatal(...)
This implements a cprintf based fatal() function.
bool recvTimingResp(PacketPtr pkt)
void abortWrite(Serial serial, Addr addr, size_t size)
Aborts a previously started write transaction.
AddrRangeList getAddrRanges() const
bool cacheResponding() const
void recvFunctional(PacketPtr pkt)
bool sendTimingResp(PacketPtr pkt)
Attempt to send a timing response to the request port by calling its corresponding receive function.
void writeData(uint8_t *p) const
Copy data from the packet to the memory at the provided pointer.
uint64_t Tick
Tick count type.
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
AddrRangeList getAddrRanges() const
Get the address ranges of the connected responder port.
RequestPtr req
A pointer to the original request.
const std::string & getErrorMessage() const
In completeRead, if an error is encountered, this does not print nor cause an error,...
void sendFunctional(PacketPtr pkt) const
Send a functional request packet, where the data is instantly updated everywhere in the memory system...
MemCheckerMonitorParams Params
Parameters of memchecker monitor.
MemChecker::Serial serial
bool sendTimingSnoopResp(PacketPtr pkt)
Attempt to send a timing snoop response packet to the response port by calling its corresponding rece...
MonitorRequestPort memSidePort
Instance of request port, facing the memory side.
void sendTimingSnoopReq(PacketPtr pkt)
Attempt to send a timing snoop request packet to the request port by calling its corresponding receiv...
void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
bool sendTimingReq(PacketPtr pkt)
Attempt to send a timing request to the responder port by calling its corresponding receive function.
virtual Port & getPort(const std::string &if_name, PortID idx=InvalidPortID)
Get a port with a given name and index.
void reset()
Resets the entire checker.
Ports are used to interface objects to each other.
bool needsResponse() const
Implements a MemChecker monitor, to be inserted between two ports.
virtual void sendRetryResp()
Send a retry to the response port that previously attempted a sendTimingResp to this request port and...
bool recvTimingSnoopResp(PacketPtr pkt)
bool isSnooping() const
Find out if the peer request port is snooping or not.
Serial startWrite(Tick start, Addr addr, size_t size, const uint8_t *data)
Starts a write transaction.
void recvTimingSnoopReq(PacketPtr pkt)
MemCheckerMonitor(Params *params)
Constructor based on the Python params.
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
const std::string & name()
virtual const std::string name() const
void completeWrite(Serial serial, Tick complete, Addr addr, size_t size)
Completes a previously started write transaction.
#define panic_if(cond,...)
Conditional panic macro that checks the supplied condition and only panics if the condition is true a...
MonitorResponsePort cpuSidePort
Instance of response port, i.e.
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...
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
SenderState * popSenderState()
Pop the top of the state stack and return a pointer to it.
bool recvTimingReq(PacketPtr pkt)
void sendFunctionalSnoop(PacketPtr pkt) const
Send a functional snoop request packet, where the data is instantly updated everywhere in the memory ...
bool isConnected() const
Is this port currently connected to a peer?
Serial startRead(Tick start, Addr addr, size_t size)
Starts a read transaction.
void recvFunctionalSnoop(PacketPtr pkt)
~MemCheckerMonitor()
Destructor.
void sendRetryReq()
Send a retry to the request port that previously attempted a sendTimingReq to this response port and ...
SenderState * senderState
This packet's sender state.
Tick recvAtomicSnoop(PacketPtr pkt)
SenderState * predecessor
void sendRangeChange() const
Called by the owner to send a range change.
bool completeRead(Serial serial, Tick complete, Addr addr, size_t size, uint8_t *data)
Completes a previously started read transaction.
Port & getPort(const std::string &if_name, PortID idx=InvalidPortID) override
Get a port with a given name and index.
uint64_t Serial
The Serial type is used to be able to uniquely identify a transaction as it passes through the system...
Tick recvAtomic(PacketPtr pkt)
#define panic(...)
This implements a cprintf based panic() function.
Tick curTick()
The current simulated tick.
Abstract superclass for simulation objects.
Generated on Wed Sep 30 2020 14:02:13 for gem5 by doxygen 1.8.17