dev: Avoid invalid sized reads in PL390 with DPRINTF enabled
authorMitch Hayenga <mitch.hayenga@arm.com>
Wed, 3 Sep 2014 11:42:27 +0000 (07:42 -0400)
committerMitch Hayenga <mitch.hayenga@arm.com>
Wed, 3 Sep 2014 11:42:27 +0000 (07:42 -0400)
The first DPRINTF() in PL390::writeDistributor always read a uint32_t, though a
packet may have only been 1 or 2 bytes.  This caused an assertion in
packet->get().

src/dev/arm/gic_pl390.cc

index 7fc65b2b7dca85b4a6e64801b77f53a3882dd083..b93cdd028a5ffa112dfa637b99a0c942b03311e3 100644 (file)
@@ -395,8 +395,25 @@ Pl390::writeDistributor(PacketPtr pkt)
     assert(pkt->req->hasContextId());
     int ctx_id = pkt->req->contextId();
 
+    uint32_t pkt_data M5_VAR_USED;
+    switch (pkt->getSize())
+    {
+      case 1:
+        pkt_data = pkt->get<uint8_t>();
+        break;
+      case 2:
+        pkt_data = pkt->get<uint16_t>();
+        break;
+      case 4:
+        pkt_data = pkt->get<uint32_t>();
+        break;
+      default:
+        panic("Invalid size when writing to priority regs in Gic: %d\n",
+              pkt->getSize());
+    }
+
     DPRINTF(GIC, "gic distributor write register %#x size %#x value %#x \n",
-            daddr, pkt->getSize(), pkt->get<uint32_t>());
+            daddr, pkt->getSize(), pkt_data);
 
     if (daddr >= ICDISER_ST && daddr < ICDISER_ED + 4) {
         assert((daddr-ICDISER_ST) >> 2 < 32);