diff options
-rw-r--r-- | src/dev/Ethernet.py | 2 | ||||
-rw-r--r-- | src/dev/etherdevice.hh | 28 | ||||
-rw-r--r-- | src/dev/ns_gige.cc | 2 | ||||
-rw-r--r-- | src/dev/ns_gige.hh | 7 | ||||
-rw-r--r-- | src/dev/sinic.cc | 170 | ||||
-rw-r--r-- | src/dev/sinic.hh | 29 |
6 files changed, 42 insertions, 196 deletions
diff --git a/src/dev/Ethernet.py b/src/dev/Ethernet.py index 57d867fbe..a8b5555d9 100644 --- a/src/dev/Ethernet.py +++ b/src/dev/Ethernet.py @@ -132,6 +132,8 @@ class IGbE_igb(IGbE): class EtherDevBase(EtherDevice): type = 'EtherDevBase' abstract = True + cxx_header = "dev/etherdevice.hh" + hardware_address = Param.EthernetAddr(NextEthernetAddr, "Ethernet Hardware Address") diff --git a/src/dev/etherdevice.hh b/src/dev/etherdevice.hh index 5d86275b4..81e5535b0 100644 --- a/src/dev/etherdevice.hh +++ b/src/dev/etherdevice.hh @@ -39,6 +39,7 @@ #include "base/statistics.hh" #include "dev/pcidev.hh" #include "params/EtherDevice.hh" +#include "params/EtherDevBase.hh" #include "sim/sim_object.hh" class EtherInt; @@ -120,4 +121,31 @@ class EtherDevice : public PciDev Stats::Scalar droppedPackets; }; +/** + * Dummy class to keep the Python class hierarchy in sync with the C++ + * object hierarchy. + * + * The Python object hierarchy includes the EtherDevBase class which + * is used by some ethernet devices as a way to share common + * configuration information in the generated param structs. Since the + * Python hierarchy is used to generate a SWIG interface for all C++ + * SimObjects, we need to reflect this in the C++ object hierarchy. If + * we don't, SWIG might end up doing 'bad things' when it down casts + * ethernet objects to their base class(es). + */ +class EtherDevBase : public EtherDevice +{ + public: + EtherDevBase(const EtherDevBaseParams *params) + : EtherDevice(params) + {} + + const EtherDevBaseParams * + params() const + { + return dynamic_cast<const EtherDevBaseParams *>(_params); + } + +}; + #endif //__DEV_ETHERDEVICE_HH__ diff --git a/src/dev/ns_gige.cc b/src/dev/ns_gige.cc index 583cdb140..0af9fbfc5 100644 --- a/src/dev/ns_gige.cc +++ b/src/dev/ns_gige.cc @@ -95,7 +95,7 @@ using namespace TheISA; // NSGigE PCI Device // NSGigE::NSGigE(Params *p) - : EtherDevice(p), ioEnable(false), + : EtherDevBase(p), ioEnable(false), txFifo(p->tx_fifo_size), rxFifo(p->rx_fifo_size), txPacket(0), rxPacket(0), txPacketBufPtr(NULL), rxPacketBufPtr(NULL), txXferLen(0), rxXferLen(0), rxDmaFree(false), txDmaFree(false), diff --git a/src/dev/ns_gige.hh b/src/dev/ns_gige.hh index 8032c0623..f4d0171d6 100644 --- a/src/dev/ns_gige.hh +++ b/src/dev/ns_gige.hh @@ -118,7 +118,7 @@ class Packet; /** * NS DP83820 Ethernet device model */ -class NSGigE : public EtherDevice +class NSGigE : public EtherDevBase { public: /** Transmit State Machine states */ @@ -346,7 +346,10 @@ class NSGigE : public EtherDevice public: typedef NSGigEParams Params; - const Params *params() const { return (const Params *)_params; } + const Params *params() const { + return dynamic_cast<const Params *>(_params); + } + NSGigE(Params *params); ~NSGigE(); diff --git a/src/dev/sinic.cc b/src/dev/sinic.cc index cdfa844d9..2d109cbbb 100644 --- a/src/dev/sinic.cc +++ b/src/dev/sinic.cc @@ -78,7 +78,7 @@ const char *TxStateStrings[] = // Sinic PCI Device // Base::Base(const Params *p) - : PciDev(p), rxEnable(false), txEnable(false), + : EtherDevBase(p), rxEnable(false), txEnable(false), intrDelay(p->intr_delay), intrTick(0), cpuIntrEnable(false), cpuPendingIntr(false), intrEvent(0), interface(NULL) { @@ -104,171 +104,7 @@ Device::~Device() void Device::regStats() { - rxBytes - .name(name() + ".rxBytes") - .desc("Bytes Received") - .prereq(rxBytes) - ; - - rxBandwidth - .name(name() + ".rxBandwidth") - .desc("Receive Bandwidth (bits/s)") - .precision(0) - .prereq(rxBytes) - ; - - rxPackets - .name(name() + ".rxPackets") - .desc("Number of Packets Received") - .prereq(rxBytes) - ; - - rxPacketRate - .name(name() + ".rxPPS") - .desc("Packet Reception Rate (packets/s)") - .precision(0) - .prereq(rxBytes) - ; - - rxIpPackets - .name(name() + ".rxIpPackets") - .desc("Number of IP Packets Received") - .prereq(rxBytes) - ; - - rxTcpPackets - .name(name() + ".rxTcpPackets") - .desc("Number of Packets Received") - .prereq(rxBytes) - ; - - rxUdpPackets - .name(name() + ".rxUdpPackets") - .desc("Number of UDP Packets Received") - .prereq(rxBytes) - ; - - rxIpChecksums - .name(name() + ".rxIpChecksums") - .desc("Number of rx IP Checksums done by device") - .precision(0) - .prereq(rxBytes) - ; - - rxTcpChecksums - .name(name() + ".rxTcpChecksums") - .desc("Number of rx TCP Checksums done by device") - .precision(0) - .prereq(rxBytes) - ; - - rxUdpChecksums - .name(name() + ".rxUdpChecksums") - .desc("Number of rx UDP Checksums done by device") - .precision(0) - .prereq(rxBytes) - ; - - totBandwidth - .name(name() + ".totBandwidth") - .desc("Total Bandwidth (bits/s)") - .precision(0) - .prereq(totBytes) - ; - - totPackets - .name(name() + ".totPackets") - .desc("Total Packets") - .precision(0) - .prereq(totBytes) - ; - - totBytes - .name(name() + ".totBytes") - .desc("Total Bytes") - .precision(0) - .prereq(totBytes) - ; - - totPacketRate - .name(name() + ".totPPS") - .desc("Total Tranmission Rate (packets/s)") - .precision(0) - .prereq(totBytes) - ; - - txBytes - .name(name() + ".txBytes") - .desc("Bytes Transmitted") - .prereq(txBytes) - ; - - txBandwidth - .name(name() + ".txBandwidth") - .desc("Transmit Bandwidth (bits/s)") - .precision(0) - .prereq(txBytes) - ; - - txPackets - .name(name() + ".txPackets") - .desc("Number of Packets Transmitted") - .prereq(txBytes) - ; - - txPacketRate - .name(name() + ".txPPS") - .desc("Packet Tranmission Rate (packets/s)") - .precision(0) - .prereq(txBytes) - ; - - txIpPackets - .name(name() + ".txIpPackets") - .desc("Number of IP Packets Transmitted") - .prereq(txBytes) - ; - - txTcpPackets - .name(name() + ".txTcpPackets") - .desc("Number of TCP Packets Transmitted") - .prereq(txBytes) - ; - - txUdpPackets - .name(name() + ".txUdpPackets") - .desc("Number of Packets Transmitted") - .prereq(txBytes) - ; - - txIpChecksums - .name(name() + ".txIpChecksums") - .desc("Number of tx IP Checksums done by device") - .precision(0) - .prereq(txBytes) - ; - - txTcpChecksums - .name(name() + ".txTcpChecksums") - .desc("Number of tx TCP Checksums done by device") - .precision(0) - .prereq(txBytes) - ; - - txUdpChecksums - .name(name() + ".txUdpChecksums") - .desc("Number of tx UDP Checksums done by device") - .precision(0) - .prereq(txBytes) - ; - - txBandwidth = txBytes * Stats::constant(8) / simSeconds; - rxBandwidth = rxBytes * Stats::constant(8) / simSeconds; - totBandwidth = txBandwidth + rxBandwidth; - totBytes = txBytes + rxBytes; - totPackets = txPackets + rxPackets; - txPacketRate = txPackets / simSeconds; - rxPacketRate = rxPackets / simSeconds; + Base::regStats(); _maxVnicDistance = 0; @@ -297,6 +133,8 @@ Device::regStats() void Device::resetStats() { + Base::resetStats(); + _maxVnicDistance = 0; } diff --git a/src/dev/sinic.hh b/src/dev/sinic.hh index 5532650c3..8189ce39a 100644 --- a/src/dev/sinic.hh +++ b/src/dev/sinic.hh @@ -33,6 +33,7 @@ #include "base/inet.hh" #include "base/statistics.hh" +#include "dev/etherdevice.hh" #include "dev/etherint.hh" #include "dev/etherpkt.hh" #include "dev/io_device.hh" @@ -45,7 +46,7 @@ namespace Sinic { class Interface; -class Base : public PciDev +class Base : public EtherDevBase { protected: bool rxEnable; @@ -281,32 +282,6 @@ class Device : public Base * Statistics */ private: - Stats::Scalar rxBytes; - Stats::Formula rxBandwidth; - Stats::Scalar rxPackets; - Stats::Formula rxPacketRate; - Stats::Scalar rxIpPackets; - Stats::Scalar rxTcpPackets; - Stats::Scalar rxUdpPackets; - Stats::Scalar rxIpChecksums; - Stats::Scalar rxTcpChecksums; - Stats::Scalar rxUdpChecksums; - - Stats::Scalar txBytes; - Stats::Formula txBandwidth; - Stats::Formula totBandwidth; - Stats::Formula totPackets; - Stats::Formula totBytes; - Stats::Formula totPacketRate; - Stats::Scalar txPackets; - Stats::Formula txPacketRate; - Stats::Scalar txIpPackets; - Stats::Scalar txTcpPackets; - Stats::Scalar txUdpPackets; - Stats::Scalar txIpChecksums; - Stats::Scalar txTcpChecksums; - Stats::Scalar txUdpChecksums; - Stats::Scalar totalVnicDistance; Stats::Scalar numVnicDistance; Stats::Scalar maxVnicDistance; |