x86: Simplify and consolidate the code that assembles an MSI on x86.

There is no interrupt response message, and so no need for a function
which would construct one. The other functions which construct the
request can be consolidated since the work being done by each is
incremental. The template parameters can be used to support multiple
types and offsets in a single function, and since that function also
doesn't have to do much work, it makes sense to do everything in one
shot.

Change-Id: I41b202a263a697c5ada6817f3ab2a4728281b894
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/20826
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Brandon Potter <Brandon.Potter@amd.com>
This commit is contained in:
Gabe Black
2019-09-11 14:44:09 -07:00
parent 54646f5cd2
commit 6ad5f1516e
2 changed files with 7 additions and 29 deletions

View File

@@ -76,40 +76,17 @@ namespace X86ISA
static const Addr TriggerIntOffset = 0;
static inline PacketPtr
prepIntRequest(const uint8_t id, Addr offset, Addr size)
{
RequestPtr req = std::make_shared<Request>(
x86InterruptAddress(id, offset),
size, Request::UNCACHEABLE,
Request::intMasterId);
PacketPtr pkt = new Packet(req, MemCmd::WriteReq);
pkt->allocate();
return pkt;
}
template<class T>
PacketPtr
buildIntRequest(const uint8_t id, T payload, Addr offset, Addr size)
buildIntPacket(Addr addr, T payload)
{
PacketPtr pkt = prepIntRequest(id, offset, size);
RequestPtr req = std::make_shared<Request>(
addr, sizeof(T), Request::UNCACHEABLE, Request::intMasterId);
PacketPtr pkt = new Packet(req, MemCmd::WriteReq);
pkt->allocate();
pkt->setRaw<T>(payload);
return pkt;
}
static inline PacketPtr
buildIntRequest(const uint8_t id, TriggerIntMessage payload)
{
return buildIntRequest(id, payload, TriggerIntOffset,
sizeof(TriggerIntMessage));
}
static inline PacketPtr
buildIntResponse()
{
panic("buildIntResponse not implemented.\n");
}
}
#endif

View File

@@ -115,7 +115,8 @@ class IntMasterPort : public QueuedMasterPort
sendMessage(X86ISA::ApicList apics, TriggerIntMessage message, bool timing)
{
for (auto id: apics) {
PacketPtr pkt = buildIntRequest(id, message);
Addr addr = x86InterruptAddress(id, TriggerIntOffset);
PacketPtr pkt = buildIntPacket(addr, message);
if (timing) {
schedTimingReq(pkt, curTick() + latency);
// The target handles cleaning up the packet in timing mode.