From cc03cf8270fad7261f08527637325cb42615c887 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Tue, 10 Sep 2019 17:24:47 -0700 Subject: [PATCH] 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 Tested-by: kokoro Reviewed-by: Jason Lowe-Power --- src/arch/x86/interrupts.hh | 8 ++--- src/dev/x86/i82094aa.cc | 10 ------ src/dev/x86/i82094aa.hh | 2 -- src/dev/x86/intdev.hh | 65 +++++++++++++++++--------------------- 4 files changed, 33 insertions(+), 52 deletions(-) diff --git a/src/arch/x86/interrupts.hh b/src/arch/x86/interrupts.hh index bd674cc7e..48e350cfc 100644 --- a/src/arch/x86/interrupts.hh +++ b/src/arch/x86/interrupts.hh @@ -172,7 +172,7 @@ class Interrupts : public PioDevice, IntDevice int initialApicId; // Port for receiving interrupts - IntSlavePort intSlavePort; + IntSlavePort 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 diff --git a/src/dev/x86/i82094aa.cc b/src/dev/x86/i82094aa.cc index 1fae67b09..e73eec791 100644 --- a/src/dev/x86/i82094aa.cc +++ b/src/dev/x86/i82094aa.cc @@ -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) { diff --git a/src/dev/x86/i82094aa.hh b/src/dev/x86/i82094aa.hh index b0764758a..17a0da486 100644 --- a/src/dev/x86/i82094aa.hh +++ b/src/dev/x86/i82094aa.hh @@ -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); diff --git a/src/dev/x86/intdev.hh b/src/dev/x86/intdev.hh index 0cc2be032..1a198db62 100644 --- a/src/dev/x86/intdev.hh +++ b/src/dev/x86/intdev.hh @@ -54,34 +54,40 @@ namespace X86ISA { -typedef std::list ApicList; - -class IntDevice +template +class IntSlavePort : public SimpleTimingPort { - protected: - class IntSlavePort : public MessageSlavePort + Device * device; + + public: + IntSlavePort(const std::string& _name, SimObject* _parent, + Device* dev) : + SimpleTimingPort(_name, _parent), device(dev) { - IntDevice * device; + } - public: - IntSlavePort(const std::string& _name, SimObject* _parent, - IntDevice* dev) : - MessageSlavePort(_name, _parent), device(dev) - { - } + AddrRangeList + getAddrRanges() const + { + return device->getIntAddrRange(); + } - 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); + } +}; - Tick recvMessage(PacketPtr pkt) - { - // @todo someone should pay for this - pkt->headerDelay = pkt->payloadDelay = 0; - return device->recvMessage(pkt); - } - }; +typedef std::list ApicList; + +class IntDevice +{ + protected: 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 -- 2.30.2