* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Authors: Andrew Bardsley
*/
#include "mem/external_slave.hh"
#include <cctype>
#include <iomanip>
+#include "base/trace.hh"
#include "debug/ExternalPort.hh"
/** Implement a `stub' port which just responds to requests by printing
* a message. The stub port can be used to configure and test a system
* where the external port is used for a peripheral before connecting
* the external port */
-class StubSlavePort : public ExternalSlave::Port
+class StubSlavePort : public ExternalSlave::ExternalPort
{
public:
- class ResponseEvent : public Event
- {
- public:
- StubSlavePort &owner;
-
- ResponseEvent(StubSlavePort &owner_) : owner(owner_) { }
-
- void process();
- };
+ void processResponseEvent();
- ResponseEvent responseEvent;
+ EventFunctionWrapper responseEvent;
/** Stub can handle a single request at a time. This will be
* NULL when no packet is in flight */
StubSlavePort(const std::string &name_,
ExternalSlave &owner_) :
- ExternalSlave::Port(name_, owner_),
- responseEvent(*this), responsePacket(NULL), mustRetry(false)
+ ExternalSlave::ExternalPort(name_, owner_),
+ responseEvent([this]{ processResponseEvent(); }, name()),
+ responsePacket(NULL), mustRetry(false)
{ }
Tick recvAtomic(PacketPtr packet);
ExternalSlave::Handler
{
public:
- ExternalSlave::Port *getExternalPort(
+ ExternalSlave::ExternalPort *getExternalPort(
const std::string &name_,
ExternalSlave &owner,
const std::string &port_data)
StubSlavePort::recvAtomic(PacketPtr packet)
{
if (DTRACE(ExternalPort)) {
- unsigned int M5_VAR_USED size = packet->getSize();
+ M5_VAR_USED unsigned int size = packet->getSize();
DPRINTF(ExternalPort, "StubSlavePort: recvAtomic a: 0x%x size: %d"
" data: ...\n", packet->getAddr(), size);
}
void
-StubSlavePort::ResponseEvent::process()
+StubSlavePort::processResponseEvent()
{
- owner.responsePacket->makeResponse();
- owner.responsePacket->headerDelay = 0;
- owner.responsePacket->payloadDelay = 0;
+ responsePacket->makeResponse();
+ responsePacket->headerDelay = 0;
+ responsePacket->payloadDelay = 0;
- if (owner.sendTimingResp(owner.responsePacket)) {
- owner.responsePacket = NULL;
+ if (sendTimingResp(responsePacket)) {
+ responsePacket = NULL;
- if (owner.mustRetry)
- owner.sendRetryReq();
- owner.mustRetry = false;
+ if (mustRetry)
+ sendRetryReq();
+ mustRetry = false;
}
}
ExternalSlave::portHandlers;
AddrRangeList
-ExternalSlave::Port::getAddrRanges() const
+ExternalSlave::ExternalPort::getAddrRanges() const
{
return owner.addrRanges;
}
-ExternalSlave::ExternalSlave(ExternalSlaveParams *params) :
- MemObject(params),
+ExternalSlave::ExternalSlave(const ExternalSlaveParams ¶ms) :
+ SimObject(params),
externalPort(NULL),
- portName(params->name + ".port"),
- portType(params->port_type),
- portData(params->port_data),
- addrRanges(params->addr_ranges.begin(), params->addr_ranges.end())
+ portName(params.name + ".port"),
+ portType(params.port_type),
+ portData(params.port_data),
+ addrRanges(params.addr_ranges.begin(), params.addr_ranges.end())
{
/* Register the stub handler if it hasn't already been registered */
if (portHandlers.find("stub") == portHandlers.end())
registerHandler("stub", new StubSlavePortHandler);
}
-BaseSlavePort &
-ExternalSlave::getSlavePort(const std::string &if_name,
- PortID idx)
+Port &
+ExternalSlave::getPort(const std::string &if_name, PortID idx)
{
if (if_name == "port") {
DPRINTF(ExternalPort, "Trying to bind external port: %s %s\n",
}
return *externalPort;
} else {
- return MemObject::getSlavePort(if_name, idx);
+ return SimObject::getPort(if_name, idx);
}
}
}
ExternalSlave *
-ExternalSlaveParams::create()
+ExternalSlaveParams::create() const
{
- return new ExternalSlave(this);
+ return new ExternalSlave(*this);
}
void