summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Hansson <andreas.hansson@arm.com>2015-02-16 03:34:35 -0500
committerAndreas Hansson <andreas.hansson@arm.com>2015-02-16 03:34:35 -0500
commit661dac1598183f13d83435aa2f8ccf317284a055 (patch)
tree45620962e7679ae4695fbbb6daf8a39a30425d6f
parent0a2ee7761617355dd981ce255aa082102d7316b4 (diff)
downloadgem5-661dac1598183f13d83435aa2f8ccf317284a055.tar.xz
dev: Fix undefined behaviuor in i8254xGBe
This patch fixes a rather unfortunate oversight where the annotation pointer was used even though it is null. Somehow the code still works, but UBSan is rather unhappy. The use is now guarded, and the variable is initialised in the constructor (as well as init()).
-rw-r--r--src/dev/i8254xGBe.cc4
-rw-r--r--src/dev/i8254xGBe.hh23
2 files changed, 17 insertions, 10 deletions
diff --git a/src/dev/i8254xGBe.cc b/src/dev/i8254xGBe.cc
index 70dba7c22..213ad580a 100644
--- a/src/dev/i8254xGBe.cc
+++ b/src/dev/i8254xGBe.cc
@@ -58,7 +58,7 @@ using namespace iGbReg;
using namespace Net;
IGbE::IGbE(const Params *p)
- : EtherDevice(p), etherInt(NULL), drainManager(NULL),
+ : EtherDevice(p), etherInt(NULL), cpa(NULL), drainManager(NULL),
rxFifo(p->rx_fifo_size), txFifo(p->tx_fifo_size), rxTick(false),
txTick(false), txFifoTick(false), rxDmaPacket(false), pktOffset(0),
fetchDelay(p->fetch_delay), wbDelay(p->wb_delay),
@@ -2390,7 +2390,7 @@ IGbE::txWire()
anPq("TXQ", "TX FIFO Q");
if (etherInt->sendPacket(txFifo.front())) {
- cpa->hwQ(CPA::FL_NONE, sys, macAddr, "TXQ", "WireQ", 0);
+ anQ("TXQ", "WireQ");
if (DTRACE(EthernetSM)) {
IpPtr ip(txFifo.front());
if (ip)
diff --git a/src/dev/i8254xGBe.hh b/src/dev/i8254xGBe.hh
index 295712717..27439740d 100644
--- a/src/dev/i8254xGBe.hh
+++ b/src/dev/i8254xGBe.hh
@@ -182,31 +182,38 @@ class IGbE : public EtherDevice
void checkDrain();
void anBegin(std::string sm, std::string st, int flags = CPA::FL_NONE) {
- cpa->hwBegin((CPA::flags)flags, sys, macAddr, sm, st);
+ if (cpa)
+ cpa->hwBegin((CPA::flags)flags, sys, macAddr, sm, st);
}
- void anQ(std::string sm, std::string q) {
- cpa->hwQ(CPA::FL_NONE, sys, macAddr, sm, q, macAddr);
+ void anQ(std::string sm, std::string q) {
+ if (cpa)
+ cpa->hwQ(CPA::FL_NONE, sys, macAddr, sm, q, macAddr);
}
void anDq(std::string sm, std::string q) {
- cpa->hwDq(CPA::FL_NONE, sys, macAddr, sm, q, macAddr);
+ if (cpa)
+ cpa->hwDq(CPA::FL_NONE, sys, macAddr, sm, q, macAddr);
}
void anPq(std::string sm, std::string q, int num = 1) {
- cpa->hwPq(CPA::FL_NONE, sys, macAddr, sm, q, macAddr, NULL, num);
+ if (cpa)
+ cpa->hwPq(CPA::FL_NONE, sys, macAddr, sm, q, macAddr, NULL, num);
}
void anRq(std::string sm, std::string q, int num = 1) {
- cpa->hwRq(CPA::FL_NONE, sys, macAddr, sm, q, macAddr, NULL, num);
+ if (cpa)
+ cpa->hwRq(CPA::FL_NONE, sys, macAddr, sm, q, macAddr, NULL, num);
}
void anWe(std::string sm, std::string q) {
- cpa->hwWe(CPA::FL_NONE, sys, macAddr, sm, q, macAddr);
+ if (cpa)
+ cpa->hwWe(CPA::FL_NONE, sys, macAddr, sm, q, macAddr);
}
void anWf(std::string sm, std::string q) {
- cpa->hwWf(CPA::FL_NONE, sys, macAddr, sm, q, macAddr);
+ if (cpa)
+ cpa->hwWf(CPA::FL_NONE, sys, macAddr, sm, q, macAddr);
}