gem5 [DEVELOP-FOR-25.1]
Loading...
Searching...
No Matches
copy_engine.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2012 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
13 *
14 * Copyright (c) 2008 The Regents of The University of Michigan
15 * All rights reserved.
16 *
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions are
19 * met: redistributions of source code must retain the above copyright
20 * notice, this list of conditions and the following disclaimer;
21 * redistributions in binary form must reproduce the above copyright
22 * notice, this list of conditions and the following disclaimer in the
23 * documentation and/or other materials provided with the distribution;
24 * neither the name of the copyright holders nor the names of its
25 * contributors may be used to endorse or promote products derived from
26 * this software without specific prior written permission.
27 *
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 */
40
41/* @file
42 * Device model for Intel's I/O AT DMA copy engine.
43 */
44
46
47#include <algorithm>
48
49#include "base/compiler.hh"
50#include "base/trace.hh"
51#include "debug/DMACopyEngine.hh"
52#include "debug/Drain.hh"
53#include "mem/packet.hh"
54#include "mem/packet_access.hh"
55#include "params/CopyEngine.hh"
56#include "sim/stats.hh"
57#include "sim/system.hh"
58
59namespace gem5
60{
61
62using namespace copy_engine_reg;
63
65 : PciEndpoint(p),
66 copyEngineStats(this, p.ChanCnt)
67{
68 // All Reg regs are initialized to 0 by default
69 regs.chanCount = p.ChanCnt;
70 regs.xferCap = findMsbSet(p.XferCap);
71 regs.attnStatus = 0;
72
73 if (regs.chanCount > 64)
74 fatal("CopyEngine interface doesn't support more than 64 DMA engines\n");
75
76 for (int x = 0; x < regs.chanCount; x++) {
77 CopyEngineChannel *ch = new CopyEngineChannel(this, x);
78 chan.push_back(ch);
79 }
80}
81
82
84 : cePort(_ce, _ce->sys),
85 ce(_ce), channelId(cid), busy(false), underReset(false),
90 addrCompleteEvent([this]{ fetchAddrComplete(); }, name()),
91 readCompleteEvent([this]{ readCopyBytesComplete(); }, name()),
92 writeCompleteEvent([this]{ writeCopyBytesComplete(); }, name()),
93 statusCompleteEvent([this]{ writeStatusComplete(); }, name())
94
95{
96 cr.status.dma_transfer_status(3);
97 cr.descChainAddr = 0;
98 cr.completionAddr = 0;
99
100 curDmaDesc = new DmaDesc;
101 memset(curDmaDesc, 0, sizeof(DmaDesc));
102 copyBuffer = new uint8_t[ce->params().XferCap];
103}
104
106{
107 for (int x = 0; x < chan.size(); x++) {
108 delete chan[x];
109 }
110}
111
117
118Port &
119CopyEngine::getPort(const std::string &if_name, PortID idx)
120{
121 if (if_name != "dma") {
122 // pass it along to our super class
123 return PciEndpoint::getPort(if_name, idx);
124 } else {
125 if (idx >= static_cast<int>(chan.size())) {
126 panic("CopyEngine::getPort: unknown index %d\n", idx);
127 }
128
129 return chan[idx]->getPort();
130 }
131}
132
133
134Port &
139
140void
142{
143 if (cr.command.start_dma()) {
144 assert(!busy);
145 cr.status.dma_transfer_status(0);
147 fetchAddress = cr.descChainAddr;
148 if (ce->drainState() == DrainState::Running)
149 fetchDescriptor(cr.descChainAddr);
150 } else if (cr.command.append_dma()) {
151 if (!busy) {
153 if (ce->drainState() == DrainState::Running)
155 } else
156 refreshNext = true;
157 } else if (cr.command.reset_dma()) {
158 if (busy)
159 underReset = true;
160 else {
161 cr.status.dma_transfer_status(3);
162 nextState = Idle;
163 }
164 } else if (cr.command.resume_dma() || cr.command.abort_dma() ||
165 cr.command.suspend_dma())
166 panic("Resume, Abort, and Suspend are not supported\n");
167 cr.command(0);
168}
169
170Tick
172{
173 int bar;
174 Addr daddr;
175
176 if (!getBAR(pkt->getAddr(), bar, daddr))
177 panic("Invalid PCI memory access to unmapped memory.\n");
178
179 // Only Memory register BAR is allowed
180 assert(bar == 0);
181
182 int size = pkt->getSize();
183 if (size != sizeof(uint64_t) && size != sizeof(uint32_t) &&
184 size != sizeof(uint16_t) && size != sizeof(uint8_t)) {
185 panic("Unknown size for MMIO access: %d\n", pkt->getSize());
186 }
187
188 DPRINTF(DMACopyEngine, "Read device register %#X size: %d\n", daddr, size);
189
193
194 if (daddr < 0x80) {
195 switch (daddr) {
196 case GEN_CHANCOUNT:
197 assert(size == sizeof(regs.chanCount));
198 pkt->setLE<uint8_t>(regs.chanCount);
199 break;
200 case GEN_XFERCAP:
201 assert(size == sizeof(regs.xferCap));
202 pkt->setLE<uint8_t>(regs.xferCap);
203 break;
204 case GEN_INTRCTRL:
205 assert(size == sizeof(uint8_t));
206 pkt->setLE<uint8_t>(regs.intrctrl());
207 regs.intrctrl.master_int_enable(0);
208 break;
209 case GEN_ATTNSTATUS:
210 assert(size == sizeof(regs.attnStatus));
211 pkt->setLE<uint32_t>(regs.attnStatus);
212 regs.attnStatus = 0;
213 break;
214 default:
215 panic("Read request to unknown register number: %#x\n", daddr);
216 }
217 pkt->makeAtomicResponse();
218 return pioDelay;
219 }
220
221
222 // Find which channel we're accessing
223 int chanid = 0;
224 daddr -= 0x80;
225 while (daddr >= 0x80) {
226 chanid++;
227 daddr -= 0x80;
228 }
229
230 if (chanid >= regs.chanCount)
231 panic("Access to channel %d (device only configured for %d channels)",
232 chanid, regs.chanCount);
233
237 chan[chanid]->channelRead(pkt, daddr, size);
238
239 pkt->makeAtomicResponse();
240 return pioDelay;
241}
242
243void
245{
246 switch (daddr) {
247 case CHAN_CONTROL:
248 assert(size == sizeof(uint16_t));
249 pkt->setLE<uint16_t>(cr.ctrl());
250 cr.ctrl.in_use(1);
251 break;
252 case CHAN_STATUS:
253 assert(size == sizeof(uint64_t));
254 pkt->setLE<uint64_t>(cr.status() | (busy ? 0 : 1));
255 break;
256 case CHAN_CHAINADDR:
257 assert(size == sizeof(uint64_t) || size == sizeof(uint32_t));
258 if (size == sizeof(uint64_t))
259 pkt->setLE<uint64_t>(cr.descChainAddr);
260 else
261 pkt->setLE<uint32_t>(bits(cr.descChainAddr,0,31));
262 break;
264 assert(size == sizeof(uint32_t));
265 pkt->setLE<uint32_t>(bits(cr.descChainAddr,32,63));
266 break;
267 case CHAN_COMMAND:
268 assert(size == sizeof(uint8_t));
269 pkt->setLE<uint32_t>(cr.command());
270 break;
271 case CHAN_CMPLNADDR:
272 assert(size == sizeof(uint64_t) || size == sizeof(uint32_t));
273 if (size == sizeof(uint64_t))
274 pkt->setLE<uint64_t>(cr.completionAddr);
275 else
276 pkt->setLE<uint32_t>(bits(cr.completionAddr,0,31));
277 break;
279 assert(size == sizeof(uint32_t));
280 pkt->setLE<uint32_t>(bits(cr.completionAddr,32,63));
281 break;
282 case CHAN_ERROR:
283 assert(size == sizeof(uint32_t));
284 pkt->setLE<uint32_t>(cr.error());
285 break;
286 default:
287 panic("Read request to unknown channel register number: (%d)%#x\n",
288 channelId, daddr);
289 }
290}
291
292Tick
294{
295 int bar;
296 Addr daddr;
297
298
299 if (!getBAR(pkt->getAddr(), bar, daddr))
300 panic("Invalid PCI memory access to unmapped memory.\n");
301
302 // Only Memory register BAR is allowed
303 assert(bar == 0);
304
305 int size = pkt->getSize();
306
310
311 if (size == sizeof(uint64_t)) {
312 [[maybe_unused]] uint64_t val = pkt->getLE<uint64_t>();
313 DPRINTF(DMACopyEngine, "Wrote device register %#X value %#X\n",
314 daddr, val);
315 } else if (size == sizeof(uint32_t)) {
316 [[maybe_unused]] uint32_t val = pkt->getLE<uint32_t>();
317 DPRINTF(DMACopyEngine, "Wrote device register %#X value %#X\n",
318 daddr, val);
319 } else if (size == sizeof(uint16_t)) {
320 [[maybe_unused]] uint16_t val = pkt->getLE<uint16_t>();
321 DPRINTF(DMACopyEngine, "Wrote device register %#X value %#X\n",
322 daddr, val);
323 } else if (size == sizeof(uint8_t)) {
324 [[maybe_unused]] uint8_t val = pkt->getLE<uint8_t>();
325 DPRINTF(DMACopyEngine, "Wrote device register %#X value %#X\n",
326 daddr, val);
327 } else {
328 panic("Unknown size for MMIO access: %d\n", size);
329 }
330
331 if (daddr < 0x80) {
332 switch (daddr) {
333 case GEN_CHANCOUNT:
334 case GEN_XFERCAP:
335 case GEN_ATTNSTATUS:
336 DPRINTF(DMACopyEngine, "Warning, ignorning write to register %x\n",
337 daddr);
338 break;
339 case GEN_INTRCTRL:
340 regs.intrctrl.master_int_enable(bits(pkt->getLE<uint8_t>(), 0, 1));
341 break;
342 default:
343 panic("Read request to unknown register number: %#x\n", daddr);
344 }
345 pkt->makeAtomicResponse();
346 return pioDelay;
347 }
348
349 // Find which channel we're accessing
350 int chanid = 0;
351 daddr -= 0x80;
352 while (daddr >= 0x80) {
353 chanid++;
354 daddr -= 0x80;
355 }
356
357 if (chanid >= regs.chanCount)
358 panic("Access to channel %d (device only configured for %d channels)",
359 chanid, regs.chanCount);
360
364 chan[chanid]->channelWrite(pkt, daddr, size);
365
366 pkt->makeAtomicResponse();
367 return pioDelay;
368}
369
370void
372{
373 switch (daddr) {
374 case CHAN_CONTROL:
375 assert(size == sizeof(uint16_t));
376 int old_int_disable;
377 old_int_disable = cr.ctrl.interrupt_disable();
378 cr.ctrl(pkt->getLE<uint16_t>());
379 if (cr.ctrl.interrupt_disable())
380 cr.ctrl.interrupt_disable(0);
381 else
382 cr.ctrl.interrupt_disable(old_int_disable);
383 break;
384 case CHAN_STATUS:
385 assert(size == sizeof(uint64_t));
386 DPRINTF(DMACopyEngine, "Warning, ignorning write to register %x\n",
387 daddr);
388 break;
389 case CHAN_CHAINADDR:
390 assert(size == sizeof(uint64_t) || size == sizeof(uint32_t));
391 if (size == sizeof(uint64_t))
392 cr.descChainAddr = pkt->getLE<uint64_t>();
393 else
394 cr.descChainAddr = (uint64_t)pkt->getLE<uint32_t>() |
395 (cr.descChainAddr & ~mask(32));
396 DPRINTF(DMACopyEngine, "Chain Address %x\n", cr.descChainAddr);
397 break;
399 assert(size == sizeof(uint32_t));
400 cr.descChainAddr = ((uint64_t)pkt->getLE<uint32_t>() << 32) |
401 (cr.descChainAddr & mask(32));
402 DPRINTF(DMACopyEngine, "Chain Address %x\n", cr.descChainAddr);
403 break;
404 case CHAN_COMMAND:
405 assert(size == sizeof(uint8_t));
406 cr.command(pkt->getLE<uint8_t>());
407 recvCommand();
408 break;
409 case CHAN_CMPLNADDR:
410 assert(size == sizeof(uint64_t) || size == sizeof(uint32_t));
411 if (size == sizeof(uint64_t))
412 cr.completionAddr = pkt->getLE<uint64_t>();
413 else
414 cr.completionAddr = pkt->getLE<uint32_t>() |
415 (cr.completionAddr & ~mask(32));
416 break;
418 assert(size == sizeof(uint32_t));
419 cr.completionAddr = ((uint64_t)pkt->getLE<uint32_t>() <<32) |
420 (cr.completionAddr & mask(32));
421 break;
422 case CHAN_ERROR:
423 assert(size == sizeof(uint32_t));
424 cr.error(~pkt->getLE<uint32_t>() & cr.error());
425 break;
426 default:
427 panic("Read request to unknown channel register number: (%d)%#x\n",
428 channelId, daddr);
429 }
430}
431
434 const uint8_t &channel_count)
435 : statistics::Group(parent, "CopyEngine"),
436 ADD_STAT(bytesCopied, statistics::units::Byte::get(),
437 "Number of bytes copied by each engine"),
439 "Number of copies processed by each engine")
440{
442 .init(channel_count)
443 .flags(statistics::total)
444 ;
446 .init(channel_count)
447 .flags(statistics::total)
448 ;
449}
450
451void
453{
454 DPRINTF(DMACopyEngine, "Reading descriptor from at memory location %#x(%#x)\n",
455 address, ce->pciToDma(address));
456 assert(address);
457 busy = true;
458
459 DPRINTF(DMACopyEngine, "dmaAction: %#x, %d bytes, to addr %#x\n",
460 ce->pciToDma(address), sizeof(DmaDesc), curDmaDesc);
461
462 cePort.dmaAction(MemCmd::ReadReq, ce->pciToDma(address),
463 sizeof(DmaDesc), &fetchCompleteEvent,
464 (uint8_t*)curDmaDesc, latBeforeBegin);
465 lastDescriptorAddr = address;
466}
467
468void
470{
471 DPRINTF(DMACopyEngine, "Read of descriptor complete\n");
472
473 if ((curDmaDesc->command & DESC_CTRL_NULL)) {
474 DPRINTF(DMACopyEngine, "Got NULL descriptor, skipping\n");
475 assert(!(curDmaDesc->command & DESC_CTRL_CP_STS));
476 if (curDmaDesc->command & DESC_CTRL_CP_STS) {
477 panic("Shouldn't be able to get here\n");
479 if (inDrain()) return;
481 } else {
482 busy = false;
483 nextState = Idle;
484 inDrain();
485 }
486 return;
487 }
488
489 if (curDmaDesc->command & ~DESC_CTRL_CP_STS)
490 panic("Descriptor has flag other that completion status set\n");
491
493 if (inDrain()) return;
495}
496
497void
499{
500 DPRINTF(DMACopyEngine, "Reading %d bytes from buffer to memory location %#x(%#x)\n",
501 curDmaDesc->len, curDmaDesc->dest,
502 ce->pciToDma(curDmaDesc->src));
503 cePort.dmaAction(MemCmd::ReadReq, ce->pciToDma(curDmaDesc->src),
505}
506
507void
509{
510 DPRINTF(DMACopyEngine, "Read of bytes to copy complete\n");
511
513 if (inDrain()) return;
515}
516
517void
519{
520 DPRINTF(DMACopyEngine, "Writing %d bytes from buffer to memory location %#x(%#x)\n",
521 curDmaDesc->len, curDmaDesc->dest,
522 ce->pciToDma(curDmaDesc->dest));
523
524 cePort.dmaAction(MemCmd::WriteReq, ce->pciToDma(curDmaDesc->dest),
526
527 ce->copyEngineStats.bytesCopied[channelId] += curDmaDesc->len;
528 ce->copyEngineStats.copiesProcessed[channelId]++;
529}
530
531void
533{
534 DPRINTF(DMACopyEngine, "Write of bytes to copy complete user1: %#x\n",
535 curDmaDesc->user1);
536
537 cr.status.compl_desc_addr(lastDescriptorAddr >> 6);
538 completionDataReg = cr.status() | 1;
539
540 if (curDmaDesc->command & DESC_CTRL_CP_STS) {
542 if (inDrain()) return;
544 return;
545 }
546
548}
549
550void
552{
553 busy = false;
554
555 if (underReset) {
556 underReset = false;
557 refreshNext = false;
558 busy = false;
559 nextState = Idle;
560 return;
561 }
562
563 if (curDmaDesc->next) {
565 fetchAddress = curDmaDesc->next;
566 if (inDrain()) return;
568 } else if (refreshNext) {
570 refreshNext = false;
571 if (inDrain()) return;
573 } else {
574 inDrain();
575 nextState = Idle;
576 }
577}
578
579void
581{
582 DPRINTF(DMACopyEngine, "Writing completion status %#x to address %#x(%#x)\n",
583 completionDataReg, cr.completionAddr,
584 ce->pciToDma(cr.completionAddr));
585
586 cePort.dmaAction(MemCmd::WriteReq,
587 ce->pciToDma(cr.completionAddr),
590}
591
592void
594{
595 DPRINTF(DMACopyEngine, "Writing completion status complete\n");
597}
598
599void
601{
602 DPRINTF(DMACopyEngine, "Fetching next address...\n");
603 busy = true;
604 cePort.dmaAction(MemCmd::ReadReq,
605 ce->pciToDma(address + offsetof(DmaDesc, next)),
606 sizeof(Addr), &addrCompleteEvent,
607 (uint8_t*)curDmaDesc + offsetof(DmaDesc, next), 0);
608}
609
610void
612{
613 DPRINTF(DMACopyEngine, "Fetching next address complete: %#x\n",
614 curDmaDesc->next);
615 if (!curDmaDesc->next) {
616 DPRINTF(DMACopyEngine, "Got NULL descriptor, nothing more to do\n");
617 busy = false;
618 nextState = Idle;
619 inDrain();
620 return;
621 }
623 fetchAddress = curDmaDesc->next;
624 if (inDrain()) return;
626}
627
628bool
630{
632 DPRINTF(Drain, "CopyEngine done draining, processing drain event\n");
634 }
635
636 return ce->drainState() != DrainState::Running;
637}
638
641{
642 if (nextState == Idle || ce->drainState() != DrainState::Running) {
643 return DrainState::Drained;
644 } else {
645 DPRINTF(Drain, "CopyEngineChannel not drained\n");
647 }
648}
649
650void
652{
654 regs.serialize(cp);
655 for (int x =0; x < chan.size(); x++)
656 chan[x]->serializeSection(cp, csprintf("channel%d", x));
657}
658
659void
661{
663 regs.unserialize(cp);
664 for (int x = 0; x < chan.size(); x++)
665 chan[x]->unserializeSection(cp, csprintf("channel%d", x));
666}
667
668void
685void
703
704void
706{
707 switch(nextState) {
708 case AddressFetch:
710 break;
711 case DescriptorFetch:
713 break;
714 case DMARead:
716 break;
717 case DMAWrite:
719 break;
720 case CompletionWrite:
722 break;
723 case Idle:
724 break;
725 default:
726 panic("Unknown state for CopyEngineChannel\n");
727 }
728}
729
730void
732{
733 DPRINTF(DMACopyEngine, "Restarting state machine at state %d\n", nextState);
735}
736
737} // namespace gem5
#define DPRINTF(x,...)
Definition trace.hh:209
void unserialize(CheckpointIn &cp) override
Unserialize an object.
EventFunctionWrapper addrCompleteEvent
EventFunctionWrapper statusCompleteEvent
copy_engine_reg::DmaDesc * curDmaDesc
CopyEngineChannel(CopyEngine *_ce, int cid)
EventFunctionWrapper readCompleteEvent
void channelWrite(PacketPtr pkt, Addr daddr, int size)
EventFunctionWrapper writeCompleteEvent
DrainState drain() override
Draining is the process of clearing out the states of SimObjects.These are the SimObjects that are pa...
copy_engine_reg::ChanRegs cr
void serialize(CheckpointOut &cp) const override
Serialize an object.
void drainResume() override
Resume execution after a successful drain.
void channelRead(PacketPtr pkt, Addr daddr, int size)
EventFunctionWrapper fetchCompleteEvent
Tick readDevice(PacketPtr pkt) override
Read from the PCI device.
void unserialize(CheckpointIn &cp) override
Unserialize an object.
void serialize(CheckpointOut &cp) const override
Serialize an object.
std::vector< CopyEngineChannel * > chan
Port & getPort(const std::string &if_name, PortID idx=InvalidPortID) override
Get a port with a given name and index.
CopyEngine(const Params &params)
gem5::CopyEngine::CopyEngineStats copyEngineStats
Tick writeDevice(PacketPtr pkt) override
Write to the PCI device.
copy_engine_reg::Regs regs
Port & getPort(const std::string &if_name, PortID idx=InvalidPortID) override
Get a port with a given name and index.
DmaDeviceParams Params
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Definition packet.hh:295
Addr getAddr() const
Definition packet.hh:807
void setLE(T v)
Set the value in the data pointer to v as little endian.
unsigned getSize() const
Definition packet.hh:817
void makeAtomicResponse()
Definition packet.hh:1074
T getLE() const
Get the data in the packet byte swapped from little endian to host endian.
void serialize(CheckpointOut &cp) const override
Serialize this object to the given output stream.
Definition device.cc:412
bool getBAR(Addr addr, int &num, Addr &offs)
Which base address register (if any) maps the given address?
Definition device.hh:358
void unserialize(CheckpointIn &cp) override
Reconstruct the state of this object from a checkpoint.
Definition device.cc:703
PciEndpoint(const PciEndpointParams &params)
Constructor for PCI Dev.
Definition device.cc:603
Ports are used to interface objects to each other.
Definition port.hh:62
Statistics container.
Definition group.hh:93
#define ADD_STAT(n,...)
Convenience macro to add a stat to a statistics group.
Definition group.hh:75
constexpr int findMsbSet(uint64_t val)
Returns the bit position of the MSB that is set in the input.
Definition bitfield.hh:279
constexpr T bits(T val, unsigned first, unsigned last)
Extract the bitfield from position 'first' to 'last' (inclusive) from 'val' and right justify it.
Definition bitfield.hh:79
void signalDrainDone() const
Signal that an object is drained.
Definition drain.hh:310
DrainState drainState() const
Return the current drain state of an object.
Definition drain.hh:329
DrainState
Object drain/handover states.
Definition drain.hh:76
@ Draining
Draining buffers pending serialization/handover.
Definition drain.hh:78
@ Running
Running normally.
Definition drain.hh:77
@ Drained
Buffers drained, ready for serialization/handover.
Definition drain.hh:79
#define panic(...)
This implements a cprintf based panic() function.
Definition logging.hh:220
#define fatal(...)
This implements a cprintf based fatal() function.
Definition logging.hh:232
void serializeSection(CheckpointOut &cp, const char *name) const
Serialize an object into a new section.
Definition serialize.cc:74
#define UNSERIALIZE_ARRAY(member, size)
Definition serialize.hh:618
#define SERIALIZE_ARRAY(member, size)
Definition serialize.hh:610
void unserializeSection(CheckpointIn &cp, const char *name)
Unserialize an a child object.
Definition serialize.cc:81
const Params & params() const
Bitfield< 3, 0 > mask
Definition pcstate.hh:63
Bitfield< 29, 28 > ce
Bitfield< 0 > p
Bitfield< 3 > x
Definition pagetable.hh:78
Bitfield< 63 > val
Definition misc.hh:804
const uint32_t DESC_CTRL_NULL
const uint32_t DESC_CTRL_CP_STS
const uint32_t GEN_ATTNSTATUS
const uint32_t GEN_CHANCOUNT
const uint32_t CHAN_CMPLNADDR_HIGH
const uint32_t CHAN_CONTROL
const uint32_t CHAN_CMPLNADDR
const uint32_t CHAN_CHAINADDR
const uint32_t CHAN_CHAINADDR_HIGH
const uint32_t GEN_INTRCTRL
const uint32_t CHAN_COMMAND
Units for Stats.
Definition units.hh:113
const FlagsType total
Print the total.
Definition info.hh:59
Copyright (c) 2024 Arm Limited All rights reserved.
Definition binary32.hh:36
std::ostream CheckpointOut
Definition serialize.hh:66
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition types.hh:147
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
Definition types.hh:245
void arrayParamOut(CheckpointOut &cp, const std::string &name, const CircleBuf< T > &param)
Definition circlebuf.hh:247
uint64_t Tick
Tick count type.
Definition types.hh:58
Packet * PacketPtr
std::string csprintf(const char *format, const Args &...args)
Definition cprintf.hh:161
void arrayParamIn(CheckpointIn &cp, const std::string &name, CircleBuf< T > &param)
Definition circlebuf.hh:257
Declaration of the Packet class.
#define UNSERIALIZE_SCALAR(scalar)
Definition serialize.hh:575
#define SERIALIZE_SCALAR(scalar)
Definition serialize.hh:568
CopyEngineStats(statistics::Group *parent, const uint8_t &channel_count)
const std::string & name()
Definition trace.cc:48

Generated on Mon Oct 27 2025 04:13:02 for gem5 by doxygen 1.14.0