x86: Templatize IntSlavePort.
This makes the device IntSlavePort calls back into based on a template parameter so that IntDevice doesn't have to be in the inheritance hierarchy to use it. It also makes IntSlavePort inherit from SimpleTimingPort directly, skipping over MessageSlavePort. Change-Id: Ic3213edc9c3ed5e506ee1e9f5e082cd47d7c7998 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/20820 Maintainer: Gabe Black <gabeblack@google.com> Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
This commit is contained in:
@@ -172,7 +172,7 @@ class Interrupts : public PioDevice, IntDevice
|
||||
int initialApicId;
|
||||
|
||||
// Port for receiving interrupts
|
||||
IntSlavePort intSlavePort;
|
||||
IntSlavePort<Interrupts> intSlavePort;
|
||||
|
||||
Tick pioDelay;
|
||||
Addr pioAddr = MaxAddr;
|
||||
@@ -200,11 +200,11 @@ class Interrupts : public PioDevice, IntDevice
|
||||
void init() override;
|
||||
|
||||
/*
|
||||
* Functions to interact with the interrupt port from IntDevice.
|
||||
* Functions to interact with the interrupt port.
|
||||
*/
|
||||
Tick read(PacketPtr pkt) override;
|
||||
Tick write(PacketPtr pkt) override;
|
||||
Tick recvMessage(PacketPtr pkt) override;
|
||||
Tick recvMessage(PacketPtr pkt);
|
||||
Tick recvResponse(PacketPtr pkt) override;
|
||||
|
||||
bool
|
||||
@@ -217,7 +217,7 @@ class Interrupts : public PioDevice, IntDevice
|
||||
}
|
||||
|
||||
AddrRangeList getAddrRanges() const override;
|
||||
AddrRangeList getIntAddrRange() const override;
|
||||
AddrRangeList getIntAddrRange() const;
|
||||
|
||||
Port &getPort(const std::string &if_name,
|
||||
PortID idx=InvalidPortID) override
|
||||
|
||||
@@ -85,16 +85,6 @@ X86ISA::I82094AA::getPort(const std::string &if_name, PortID idx)
|
||||
return BasicPioDevice::getPort(if_name, idx);
|
||||
}
|
||||
|
||||
AddrRangeList
|
||||
X86ISA::I82094AA::getIntAddrRange() const
|
||||
{
|
||||
AddrRangeList ranges;
|
||||
ranges.push_back(RangeEx(x86InterruptAddress(initialApicId, 0),
|
||||
x86InterruptAddress(initialApicId, 0) +
|
||||
PhysAddrAPICRangeSize));
|
||||
return ranges;
|
||||
}
|
||||
|
||||
Tick
|
||||
X86ISA::I82094AA::recvResponse(PacketPtr pkt)
|
||||
{
|
||||
|
||||
@@ -100,8 +100,6 @@ class I82094AA : public BasicPioDevice, public IntDevice
|
||||
Tick read(PacketPtr pkt) override;
|
||||
Tick write(PacketPtr pkt) override;
|
||||
|
||||
AddrRangeList getIntAddrRange() const override;
|
||||
|
||||
void writeReg(uint8_t offset, uint32_t value);
|
||||
uint32_t readReg(uint8_t offset);
|
||||
|
||||
|
||||
@@ -54,34 +54,40 @@
|
||||
|
||||
namespace X86ISA {
|
||||
|
||||
template <class Device>
|
||||
class IntSlavePort : public SimpleTimingPort
|
||||
{
|
||||
Device * device;
|
||||
|
||||
public:
|
||||
IntSlavePort(const std::string& _name, SimObject* _parent,
|
||||
Device* dev) :
|
||||
SimpleTimingPort(_name, _parent), device(dev)
|
||||
{
|
||||
}
|
||||
|
||||
AddrRangeList
|
||||
getAddrRanges() const
|
||||
{
|
||||
return device->getIntAddrRange();
|
||||
}
|
||||
|
||||
Tick
|
||||
recvAtomic(PacketPtr pkt)
|
||||
{
|
||||
panic_if(pkt->cmd != MemCmd::MessageReq,
|
||||
"%s received unexpected command %s from %s.\n",
|
||||
name(), pkt->cmd.toString(), getPeer());
|
||||
pkt->headerDelay = pkt->payloadDelay = 0;
|
||||
return device->recvMessage(pkt);
|
||||
}
|
||||
};
|
||||
|
||||
typedef std::list<int> ApicList;
|
||||
|
||||
class IntDevice
|
||||
{
|
||||
protected:
|
||||
class IntSlavePort : public MessageSlavePort
|
||||
{
|
||||
IntDevice * device;
|
||||
|
||||
public:
|
||||
IntSlavePort(const std::string& _name, SimObject* _parent,
|
||||
IntDevice* dev) :
|
||||
MessageSlavePort(_name, _parent), device(dev)
|
||||
{
|
||||
}
|
||||
|
||||
AddrRangeList getAddrRanges() const
|
||||
{
|
||||
return device->getIntAddrRange();
|
||||
}
|
||||
|
||||
Tick recvMessage(PacketPtr pkt)
|
||||
{
|
||||
// @todo someone should pay for this
|
||||
pkt->headerDelay = pkt->payloadDelay = 0;
|
||||
return device->recvMessage(pkt);
|
||||
}
|
||||
};
|
||||
|
||||
class IntMasterPort : public MessageMasterPort
|
||||
{
|
||||
@@ -118,25 +124,12 @@ class IntDevice
|
||||
|
||||
virtual void init();
|
||||
|
||||
virtual Tick
|
||||
recvMessage(PacketPtr pkt)
|
||||
{
|
||||
panic("recvMessage not implemented.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
virtual Tick
|
||||
recvResponse(PacketPtr pkt)
|
||||
{
|
||||
panic("recvResponse not implemented.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
virtual AddrRangeList
|
||||
getIntAddrRange() const
|
||||
{
|
||||
panic("intAddrRange not implemented.\n");
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace X86ISA
|
||||
|
||||
Reference in New Issue
Block a user