gem5  v21.1.0.2
pktfifo.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2004-2005 The Regents of The University of Michigan
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met: redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer;
9  * redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution;
12  * neither the name of the copyright holders nor the names of its
13  * contributors may be used to endorse or promote products derived from
14  * this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 #include "dev/net/pktfifo.hh"
30 
31 #include "base/logging.hh"
32 
33 namespace gem5
34 {
35 
36 bool
37 PacketFifo::copyout(void *dest, unsigned offset, unsigned len)
38 {
39  char *data = (char *)dest;
40  if (offset + len >= size())
41  return false;
42 
43  iterator i = fifo.begin();
44  iterator end = fifo.end();
45  while (len > 0) {
46  EthPacketPtr &pkt = i->packet;
47  while (offset >= pkt->length) {
48  offset -= pkt->length;
49  ++i;
50  }
51 
52  if (i == end)
53  panic("invalid fifo");
54 
55  unsigned size = std::min(pkt->length - offset, len);
56  memcpy(data, pkt->data, size);
57  offset = 0;
58  len -= size;
59  data += size;
60  ++i;
61  }
62 
63  return true;
64 }
65 
66 
67 void
68 PacketFifoEntry::serialize(const std::string &base, CheckpointOut &cp) const
69 {
70  packet->serialize(base + ".packet", cp);
71  paramOut(cp, base + ".slack", slack);
72  paramOut(cp, base + ".number", number);
73  paramOut(cp, base + ".priv", priv);
74 }
75 
76 void
78 {
79  packet = std::make_shared<EthPacketData>();
80  packet->unserialize(base + ".packet", cp);
81  paramIn(cp, base + ".slack", slack);
82  paramIn(cp, base + ".number", number);
83  paramIn(cp, base + ".priv", priv);
84 }
85 
86 void
87 PacketFifo::serialize(const std::string &base, CheckpointOut &cp) const
88 {
89  paramOut(cp, base + ".size", _size);
90  paramOut(cp, base + ".maxsize", _maxsize);
91  paramOut(cp, base + ".reserved", _reserved);
92  paramOut(cp, base + ".packets", fifo.size());
93 
94  int i = 0;
95  for (const auto &entry : fifo)
96  entry.serialize(csprintf("%s.entry%d", base, i++), cp);
97 }
98 
99 void
100 PacketFifo::unserialize(const std::string &base, CheckpointIn &cp)
101 {
102  paramIn(cp, base + ".size", _size);
103 // paramIn(cp, base + ".maxsize", _maxsize);
104  paramIn(cp, base + ".reserved", _reserved);
105  int fifosize;
106  paramIn(cp, base + ".packets", fifosize);
107 
108  fifo.clear();
109 
110  for (int i = 0; i < fifosize; ++i) {
111  PacketFifoEntry entry;
112  entry.unserialize(csprintf("%s.entry%d", base, i), cp);
113  fifo.push_back(entry);
114  }
115 }
116 
117 } // namespace gem5
gem5::ArmISA::len
Bitfield< 18, 16 > len
Definition: misc_types.hh:444
gem5::PacketFifo::fifo
std::list< PacketFifoEntry > fifo
Definition: pktfifo.hh:88
data
const char data[]
Definition: circlebuf.test.cc:48
gem5::PacketFifoEntry
Definition: pktfifo.hh:45
gem5::CheckpointIn
Definition: serialize.hh:68
gem5::csprintf
std::string csprintf(const char *format, const Args &...args)
Definition: cprintf.hh:161
gem5::PacketFifoEntry::priv
int priv
Definition: pktfifo.hh:50
gem5::X86ISA::base
Bitfield< 51, 12 > base
Definition: pagetable.hh:141
gem5::ArmISA::i
Bitfield< 7 > i
Definition: misc_types.hh:66
gem5::PacketFifo::size
unsigned size() const
Definition: pktfifo.hh:101
gem5::PacketFifo::_size
unsigned _size
Definition: pktfifo.hh:91
gem5::PacketFifo::unserialize
void unserialize(const std::string &base, CheckpointIn &cp)
Definition: pktfifo.cc:100
gem5::PacketFifoEntry::serialize
void serialize(const std::string &base, CheckpointOut &cp) const
Definition: pktfifo.cc:68
gem5::PacketFifo::end
iterator end()
Definition: pktfifo.hh:116
gem5::PacketFifo::_maxsize
unsigned _maxsize
Definition: pktfifo.hh:90
gem5::EthPacketPtr
std::shared_ptr< EthPacketData > EthPacketPtr
Definition: etherpkt.hh:90
gem5::PacketFifoEntry::packet
EthPacketPtr packet
Definition: pktfifo.hh:47
gem5::ArmISA::offset
Bitfield< 23, 0 > offset
Definition: types.hh:144
gem5::PacketFifo::iterator
fifo_list::iterator iterator
Definition: pktfifo.hh:84
gem5::PacketFifoEntry::number
uint64_t number
Definition: pktfifo.hh:48
gem5::PacketFifoEntry::unserialize
void unserialize(const std::string &base, CheckpointIn &cp)
Definition: pktfifo.cc:77
gem5::paramOut
void paramOut(CheckpointOut &cp, const std::string &name, ExtMachInst const &machInst)
Definition: types.cc:40
gem5::paramIn
void paramIn(CheckpointIn &cp, const std::string &name, ExtMachInst &machInst)
Definition: types.cc:72
logging.hh
pktfifo.hh
gem5::CheckpointOut
std::ostream CheckpointOut
Definition: serialize.hh:66
gem5
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
Definition: decoder.cc:40
gem5::PacketFifo::copyout
bool copyout(void *dest, unsigned offset, unsigned len)
Definition: pktfifo.cc:37
gem5::PacketFifo::_reserved
unsigned _reserved
Definition: pktfifo.hh:92
gem5::PacketFifo::serialize
void serialize(const std::string &base, CheckpointOut &cp) const
Serialization stuff.
Definition: pktfifo.cc:87
panic
#define panic(...)
This implements a cprintf based panic() function.
Definition: logging.hh:177
gem5::PacketFifoEntry::slack
unsigned slack
Definition: pktfifo.hh:49

Generated on Tue Sep 21 2021 12:25:17 for gem5 by doxygen 1.8.17