gem5 [DEVELOP-FOR-25.1]
Loading...
Searching...
No Matches
plic.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2021 Huawei International
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 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 */
37
38
39#include "dev/riscv/plic.hh"
40
41#include <algorithm>
42
43#include "cpu/base.hh"
44#include "debug/Plic.hh"
45#include "mem/packet.hh"
46#include "mem/packet_access.hh"
47#include "params/Plic.hh"
48#include "params/PlicBase.hh"
49#include "sim/system.hh"
50
51namespace gem5
52{
53
54using namespace RiscvISA;
55
59 nSrc(params.n_src),
60 outputLatency(params.output_latency),
62 update([this]{updateOutput();}, name() + ".update")
63{
64 fatal_if(params.hart_config != "" && params.n_contexts != 0,
65 "the hart_config and n_contexts can't be set simultaneously");
66
67 if (params.n_contexts != 0) {
68 initContextFromNContexts(params.n_contexts);
69 }
70 if (params.hart_config != "") {
71 initContextFromHartConfig(params.hart_config);
72 }
73}
74
75void
76Plic::post(int src_id)
77{
78 // Sanity check
79 assert(src_id < nSrc && src_id >= 0);
80
81 // Update pending bit
82 int src_index = src_id >> 5;
83 int src_offset = src_id & 0x1F;
84
85 uint32_t& pending = registers.pending[src_index].get();
86 std::bitset<32> pending_bits(pending);
87 pending_bits[src_offset] = 1;
88 pending = (uint32_t) pending_bits.to_ulong();
89
90 // Update states
91 pendingPriority[src_id] = registers.priority[src_id].get();
92 for (int i = 0; i < contextConfigs.size(); i++) {
93 bool enabled = bits(registers.enable[i][src_index].get(), src_offset);
94 effPriority[i][src_id] = enabled ? pendingPriority[src_id] : 0;
95 }
97 "Int post request - source: %#x, current priority: %#x\n",
98 src_id, pendingPriority[src_id]);
99
100 // Propagate output changes
102}
103
104void
105Plic::clear(int src_id)
106{
107 // Sanity check
108 assert(src_id < nSrc);
109 assert(src_id >= 0);
110
111 // Update pending bit
112 int src_index = src_id >> 5;
113 int src_offset = src_id & 0x1F;
114 uint32_t& pending = registers.pending[src_index].get();
115 std::bitset<32> pending_bits(pending);
116 pending_bits[src_offset] = 0;
117 pending = (uint32_t) pending_bits.to_ulong();
118
119 // Update states
120 pendingPriority[src_id] = 0;
121 for (int i = 0; i < contextConfigs.size(); i++) {
122 effPriority[i][src_id] = 0;
123 }
125 "Int clear request - source: %#x, current priority: %#x\n",
126 src_id, pendingPriority[src_id]);
127
128 // Propagate output changes
130}
131
132Tick
134{
135 // Check for atomic operation
136 bool is_atomic = pkt->isAtomicOp() && pkt->cmd == MemCmd::SwapReq;
138 "Read request - addr: %#x, size: %#x, atomic:%d\n",
139 pkt->getAddr(), pkt->getSize(), is_atomic);
140
141 // Perform register read
142 registers.read(pkt->getAddr(), pkt->getPtr<void>(), pkt->getSize());
143
144 if (is_atomic) {
145 // Perform atomic operation
146 (*(pkt->getAtomicOp()))(pkt->getPtr<uint8_t>());
147 return write(pkt);
148 } else {
149 pkt->makeResponse();
150 return pioDelay;
151 }
152}
153
154Tick
156{
158 "Write request - addr: %#x, size: %#x\n",
159 pkt->getAddr(), pkt->getSize());
160
161 // Perform register write
162 registers.write(pkt->getAddr(), pkt->getPtr<void>(), pkt->getSize());
163
164 // Propagate output changes
166
167 // Apply threshold changes
168 updateInt();
169
170 pkt->makeResponse();
171 return pioDelay;
172}
173
174void
176{
177 // Number of 32-bit pending registesrs where
178 // each bit correspondings to one interrupt source
179 nSrc32 = divCeil(nSrc, 32);
180
181 // Setup register bank
182 registers.init();
183
184 // Setup internal states
185 pendingPriority.resize(nSrc, 0x0);
186 for (int i = 0; i < contextConfigs.size(); i++) {
187 std::vector<uint32_t> context_priority(nSrc, 0x0);
188 effPriority.push_back(context_priority);
189 }
190 lastID.resize(contextConfigs.size(), 0x0);
191
192 // Setup outputs
196
198 "Device init - %d contexts, %d sources, %d pending registers\n",
199 contextConfigs.size(), nSrc, nSrc32);
200
202}
203
204void
206{
207 using namespace std::placeholders;
208
209 // Calculate reserved space size
210 const size_t reserve0_size = pendingStart - plic->nSrc * 4;
211 reserved.emplace_back("reserved0", reserve0_size);
212 const size_t reserve1_size = enableStart - pendingStart
213 - plic->nSrc32 * 4;
214 reserved.emplace_back("reserved1", reserve1_size);
215 const size_t reserve2_size = thresholdStart - enableStart
216 - plic->contextConfigs.size() * enablePadding;
217 reserved.emplace_back("reserved2", reserve2_size);
218 const size_t reserve3_size = plic->pioSize - thresholdStart
219 - plic->contextConfigs.size() * thresholdPadding;
220 reserved.emplace_back("reserved3", reserve3_size);
221
222 // Sanity check
223 assert(plic->pioSize >= thresholdStart
224 + plic->contextConfigs.size() * thresholdPadding);
225 assert((int) plic->pioSize <= maxBankSize);
226
227 // Calculate hole sizes
228 const size_t enable_hole_size = enablePadding - plic->nSrc32 * 4;
229 const size_t claim_hole_size = thresholdPadding - 0x8;
230
231 // Initialize registers
232 for (int i = 0; i < plic->nSrc; i++) {
233 priority.emplace_back(
234 std::string("priority") + std::to_string(i), 0);
235 }
236 for (int i = 0; i < plic->nSrc32; i++) {
237 pending.emplace_back(
238 std::string("pending") + std::to_string(i), 0);
239 }
240 for (int i = 0; i < plic->contextConfigs.size(); i++) {
241
242 enable.push_back(std::vector<Register32>());
243 for (int j = 0; j < plic->nSrc32; j++) {
244 enable[i].emplace_back(
245 std::string("enable") + std::to_string(i)
246 + "_" + std::to_string(j), 0);
247 }
248 enable_holes.emplace_back(
249 std::string("enable_hole") + std::to_string(i), enable_hole_size);
250
251 threshold.emplace_back(
252 std::string("threshold") + std::to_string(i), 0);
253 claim.emplace_back(
254 std::string("claim") + std::to_string(i), 0);
255 claim_holes.emplace_back(
256 std::string("claim_hole") + std::to_string(i), claim_hole_size);
257 }
258
259 // Add registers to bank
260 // Priority
261 for (int i = 0; i < plic->nSrc; i++) {
262 auto write_cb = std::bind(&Plic::writePriority, plic, _1, _2, i);
263 priority[i].writer(write_cb);
265 }
267
268 // Pending
269 for (int i = 0; i < plic->nSrc32; i++) {
270 pending[i].readonly();
272 }
274
275 // Enable
276 for (int i = 0; i < plic->contextConfigs.size(); i++) {
277 for (int j = 0; j < plic->nSrc32; j++) {
278 auto write_cb = std::bind(&Plic::writeEnable, plic, _1, _2, j, i);
279 enable[i][j].writer(write_cb);
280 addRegister(enable[i][j]);
281 }
283 }
285
286 // Threshold and claim
287 for (int i = 0; i < plic->contextConfigs.size(); i++) {
288 auto threshold_cb = std::bind(&Plic::writeThreshold, plic, _1, _2, i);
289 threshold[i].writer(threshold_cb);
290 auto read_cb = std::bind(&Plic::readClaim, plic, _1, i);
291 auto write_cb = std::bind(&Plic::writeClaim, plic, _1, _2, i);
292 claim[i].reader(read_cb)
293 .writer(write_cb);
297 }
299}
300
301void
302Plic::writePriority(Register32& reg, const uint32_t& data, const int src_id)
303{
304 reg.update(data);
305
306 // Calculate indices
307 int src_index = src_id >> 5;
308 int src_offset = src_id & 0x1F;
309
310 // Update states
311 bool pending = bits(registers.pending[src_index].get(), src_offset);
312 pendingPriority[src_id] = pending ? reg.get() : 0;
313 for (int i = 0; i < contextConfigs.size(); i++) {
314 bool enabled = bits(
315 registers.enable[i][src_index].get(), src_offset);
316 effPriority[i][src_id] = enabled ? pendingPriority[src_id] : 0;
317 }
318
320 "Priority updated - src: %d, val: %d\n",
321 src_id, reg.get());
322}
323
324void
326 const int src32_id, const int context_id)
327{
328 reg.update(data);
329
330 for (int i = 0; i < 32; i ++) {
331 int src_id = (src32_id << 5) + i;
332 if (src_id < nSrc) {
333 effPriority[context_id][src_id] =
334 bits(reg.get(), i) ? pendingPriority[src_id] : 0;
335 }
336 }
338 "Enable updated - context: %d, src32: %d, val: %#x\n",
339 context_id, src32_id, reg.get());
340}
341
342void
344 const int context_id)
345{
346 reg.update(data);
347
349 "Threshold updated - context: %d, val: %d\n",
350 context_id, reg.get());
351}
352
353uint32_t
354Plic::readClaim(Register32& reg, const int context_id)
355{
356 if (lastID[context_id] == 0) {
357 // Calculate indices
358 uint32_t max_int_id = output.maxID[context_id];
359 int src_index = max_int_id >> 5;
360 int src_offset = max_int_id & 0x1F;
361
362 // Check pending bits
363 if (bits(registers.pending[src_index].get(), src_offset)) {
364 lastID[context_id] = max_int_id;
366 "Claim success - context: %d, interrupt ID: %d\n",
367 context_id, max_int_id);
368 clear(max_int_id);
369 reg.update(max_int_id);
370 return reg.get();
371 } else {
373 "Claim already cleared - context: %d, interrupt ID: %d\n",
374 context_id, max_int_id);
375 return 0;
376 }
377 } else {
378 warn("PLIC claim repeated (not completed) - context: %d, last: %d",
379 context_id, lastID[context_id]);
380 return lastID[context_id];
381 }
382}
383
384void
385Plic::writeClaim(Register32& reg, const uint32_t& data, const int context_id)
386{
387 reg.update(data);
388
393 assert(lastID[context_id] == reg.get());
394 lastID[context_id] = 0;
396 "Complete - context: %d, interrupt ID: %d\n",
397 context_id, reg.get());
398 updateInt();
399}
400
401void
403{
404 // Calculate new output
405 PlicOutput new_output{
408 uint32_t max_id;
409 uint32_t max_priority;
410 for (int i = 0; i < contextConfigs.size(); i++) {
411 max_id = max_element(effPriority[i].begin(),
412 effPriority[i].end()) - effPriority[i].begin();
413 max_priority = effPriority[i][max_id];
414 new_output.maxID[i] = max_id;
415 new_output.maxPriority[i] = max_priority;
416 }
417
418 // Add new output to outputQueue
419 Tick next_update = clockEdge(Cycles(outputLatency));
420 if (outputQueue.find(next_update) != outputQueue.end()) {
421 outputQueue[next_update] = new_output;
422 } else {
423 outputQueue.insert({next_update, new_output});
424 }
425
426 // Schedule next update event
427 if (!update.scheduled()) {
428 DPRINTF(Plic, "Update scheduled - tick: %d\n", next_update);
429 schedule(update, next_update);
430 }
431}
432
433void
435{
436 contextConfigs.reserve(n_contexts);
437 for (uint32_t i = 0; i < (uint32_t)n_contexts; i += 2) {
438 contextConfigs.emplace_back((i >> 1), ExceptionCode::INT_EXT_MACHINE);
439 contextConfigs.emplace_back((i >> 1), ExceptionCode::INT_EXT_SUPER);
440 }
441}
442
443void
444Plic::initContextFromHartConfig(const std::string& hart_config)
445{
446 contextConfigs.reserve(hart_config.size());
447 uint32_t hart_id = 0;
448 for (char c: hart_config) {
449 switch (c) {
450 case ',':
451 hart_id++;
452 break;
453 case 'M':
454 contextConfigs.emplace_back(hart_id, ExceptionCode::INT_EXT_MACHINE);
455 break;
456 case 'S':
457 contextConfigs.emplace_back(hart_id, ExceptionCode::INT_EXT_SUPER);
458 break;
459 default:
460 fatal("hart_config should not contains the value: %c", c);
461 break;
462 }
463 }
464}
465
466void
468{
469 DPRINTF(Plic, "Update triggered\n");
470 // Set current output to new output
471 output = outputQueue.begin()->second;
472 outputQueue.erase(outputQueue.begin()->first);
473
474 // Schedule next update event (if any)
475 if (!outputQueue.empty()) {
476 DPRINTF(Plic, "Update scheduled - tick: %d\n",
477 outputQueue.begin()->first);
478 schedule(update, outputQueue.begin()->first);
479 }
480
481 updateInt();
482}
483
484void
486{
487 // Update xEIP lines
488 for (int i = 0; i < contextConfigs.size(); i++) {
489 auto [thread_id, int_id] = contextConfigs[i];
490
491 auto tc = system->threads[thread_id];
492 uint32_t max_id = output.maxID[i];
493 uint32_t priority = output.maxPriority[i];
494 uint32_t threshold = registers.threshold[i].get();
495 if (priority > threshold && max_id > 0 && lastID[i] == 0) {
496 DPRINTF(Plic, "Int posted - thread: %d, int id: %d, ",
497 thread_id, int_id);
498 DPRINTFR(Plic, "pri: %d, thres: %d\n", priority, threshold);
499 tc->getCpuPtr()->postInterrupt(tc->threadId(), int_id, 0);
500 } else {
501 if (priority > 0) {
502 DPRINTF(Plic, "Int filtered - thread: %d, int id: %d, ",
503 thread_id, int_id);
504 DPRINTFR(Plic, "pri: %d, thres: %d\n", priority, threshold);
505 }
506 tc->getCpuPtr()->clearInterrupt(tc->threadId(), int_id, 0);
507 }
508 }
509}
510
511void
513{
514 int n_outputs = 0;
515
516 for (auto const &reg: registers.pending) {
517 paramOut(cp, reg.name(), reg);
518 }
519 for (auto const &reg: registers.priority) {
520 paramOut(cp, reg.name(), reg);
521 }
522 for (auto const &reg: registers.enable) {
523 for (auto const &reg_inner: reg) {
524 paramOut(cp, reg_inner.name(), reg_inner);
525 }
526 }
527 for (auto const &reg: registers.threshold) {
528 paramOut(cp, reg.name(), reg);
529 }
530 for (auto const &reg: registers.claim) {
531 paramOut(cp, reg.name(), reg);
532 }
533 for (auto const & it : outputQueue) {
534 paramOut(cp, std::string("output_tick") +
535 std::to_string(n_outputs), it.first);
536 arrayParamOut(cp, std::string("output_id") +
537 std::to_string(n_outputs), it.second.maxID);
538 arrayParamOut(cp, std::string("output_pri") +
539 std::to_string(n_outputs), it.second.maxPriority);
540 n_outputs++;
541 }
542 SERIALIZE_SCALAR(n_outputs);
544 SERIALIZE_CONTAINER(output.maxPriority);
546 for (int i=0; i < effPriority.size(); i++) {
547 arrayParamOut(cp, std::string("effPriority") +
548 std::to_string(i), effPriority[i]);
549 }
551}
552
553void
555{
556 int n_outputs;
557 UNSERIALIZE_SCALAR(n_outputs);
558
559 for (auto &reg: registers.pending) {
560 paramIn(cp, reg.name(), reg);
561 }
562 for (auto &reg: registers.priority) {
563 paramIn(cp, reg.name(), reg);
564 }
565 for (auto &reg: registers.enable) {
566 for (auto &reg_inner: reg) {
567 paramIn(cp, reg_inner.name(), reg_inner);
568 }
569 }
570 for (auto &reg: registers.threshold) {
571 paramIn(cp, reg.name(), reg);
572 }
573 for (auto &reg: registers.claim) {
574 paramIn(cp, reg.name(), reg);
575 }
576 for (int i = 0; i < n_outputs; i++) {
577 Tick output_tick;
578 std::vector<uint32_t> output_id;
579 std::vector<uint32_t> output_pri;
580 paramIn(cp, std::string("output_tick") +
581 std::to_string(i), output_tick);
582 arrayParamIn(cp, std::string("output_id") +
583 std::to_string(i), output_id);
584 arrayParamIn(cp, std::string("output_pri") +
585 std::to_string(i), output_pri);
586 outputQueue[output_tick] = PlicOutput{output_id, output_pri};
587 }
588 if (!outputQueue.empty()) {
589 schedule(update, outputQueue.begin()->first);
590 }
592 UNSERIALIZE_CONTAINER(output.maxPriority);
594 for (int i=0; i < effPriority.size(); i++) {
595 arrayParamIn(cp, std::string("effPriority") +
596 std::to_string(i), effPriority[i]);
597 }
599 updateInt();
600}
601
602} // namespace gem5
#define DPRINTFR(x,...)
Definition trace.hh:223
#define DPRINTF(x,...)
Definition trace.hh:209
const char data[]
Addr pioAddr
Address that the device listens to.
Definition io_device.hh:151
Tick pioDelay
Delay that the device experinces on an access.
Definition io_device.hh:157
Tick clockEdge(Cycles cycles=Cycles(0)) const
Determine the tick when a cycle begins, by default the current one, but the argument also enables the...
Cycles is a wrapper class for representing cycle counts, i.e.
Definition types.hh:79
Addr getAddr() const
Definition packet.hh:807
bool isAtomicOp() const
Definition packet.hh:846
void makeResponse()
Take a request packet and modify it in place to be suitable for returning as a response to that reque...
Definition packet.hh:1062
T * getPtr()
get a pointer to the data ptr.
Definition packet.hh:1225
unsigned getSize() const
Definition packet.hh:817
AtomicOpFunctor * getAtomicOp() const
Accessor function to atomic op.
Definition packet.hh:845
MemCmd cmd
The command field of the packet.
Definition packet.hh:372
void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
Definition io_device.cc:59
PlicBase(const Params &params)
Definition plic.hh:101
std::vector< Register32 > priority
Definition plic.hh:213
const Addr thresholdPadding
Definition plic.hh:209
std::vector< Register32 > pending
Definition plic.hh:214
const Addr enablePadding
Definition plic.hh:208
std::vector< RegisterRaz > enable_holes
Definition plic.hh:218
const Addr enableStart
Definition plic.hh:206
const Addr maxBankSize
Definition plic.hh:210
const Addr thresholdStart
Definition plic.hh:207
std::vector< Register32 > threshold
Definition plic.hh:216
std::vector< std::vector< Register32 > > enable
Definition plic.hh:215
const Addr pendingStart
Definition plic.hh:205
std::vector< RegisterRaz > reserved
Definition plic.hh:220
std::vector< RegisterRaz > claim_holes
Definition plic.hh:219
std::vector< Register32 > claim
Definition plic.hh:217
Tick write(PacketPtr pkt) override
Pure virtual function that the device must implement.
Definition plic.cc:155
int nSrc
Definition plic.hh:118
std::vector< uint32_t > lastID
Definition plic.hh:260
std::map< Tick, PlicOutput > outputQueue
Definition plic.hh:281
uint64_t outputLatency
Cycle latency from received interrupt signal to output.
Definition plic.hh:132
void updateOutput()
Trigger:
Definition plic.cc:467
gem5::Plic::PlicRegisters registers
Plic(const Params &params)
Definition plic.cc:56
void post(int src_id) override
Interrupt interface.
Definition plic.cc:76
PlicOutput output
Definition plic.hh:261
std::vector< std::pair< uint32_t, ExceptionCode > > contextConfigs
PLIC hart/pmode address configs, stored in the format {hartID, pmode}.
Definition plic.hh:127
EventFunctionWrapper update
Definition plic.hh:282
Tick read(PacketPtr pkt) override
PioDevice funcitons.
Definition plic.cc:133
PlicRegisters::Register32 Register32
Definition plic.hh:232
void writeEnable(Register32 &reg, const uint32_t &data, const int src32_id, const int context_id)
Definition plic.cc:325
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition plic.cc:554
void clear(int src_id) override
Definition plic.cc:105
void writeThreshold(Register32 &reg, const uint32_t &data, const int context_id)
Definition plic.cc:343
void updateInt()
Trigger:
Definition plic.cc:485
uint32_t readClaim(Register32 &reg, const int context_id)
Definition plic.cc:354
System * system
Definition plic.hh:115
void initContextFromHartConfig(const std::string &hart_config)
Definition plic.cc:444
std::vector< std::vector< uint32_t > > effPriority
Definition plic.hh:258
void propagateOutput()
Trigger:
Definition plic.cc:402
int nSrc32
Number of 32-bit pending registers needed = ceil(nSrc / 32)
Definition plic.hh:123
PlicParams Params
Definition plic.hh:135
void init() override
SimObject functions.
Definition plic.cc:175
std::vector< uint32_t > pendingPriority
Definition plic.hh:256
void writeClaim(Register32 &reg, const uint32_t &data, const int context_id)
Definition plic.cc:385
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition plic.cc:512
void initContextFromNContexts(int n_contexts)
The function for handling context config from params.
Definition plic.cc:434
void writePriority(Register32 &reg, const uint32_t &data, const int src_id)
Register read / write callbacks.
Definition plic.cc:302
void addRegister(RegisterAdder reg)
Definition reg_bank.hh:1024
STL vector class.
Definition stl.hh:37
static constexpr T divCeil(const T &a, const U &b)
Definition intmath.hh:110
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 schedule(Event &event, Tick when)
Definition eventq.hh:1012
#define fatal_if(cond,...)
Conditional fatal macro that checks the supplied condition and only causes a fatal error if the condi...
Definition logging.hh:268
#define fatal(...)
This implements a cprintf based fatal() function.
Definition logging.hh:232
#define UNSERIALIZE_CONTAINER(member)
Definition serialize.hh:651
#define SERIALIZE_CONTAINER(member)
Definition serialize.hh:643
const Params & params() const
#define warn(...)
Definition logging.hh:288
Bitfield< 7 > i
Definition misc_types.hh:67
Bitfield< 29 > c
Definition misc_types.hh:53
Bitfield< 3, 0 > priority
Bitfield< 5, 3 > reg
Definition types.hh:92
Copyright (c) 2024 Arm Limited All rights reserved.
Definition binary32.hh:36
std::ostream CheckpointOut
Definition serialize.hh:66
void paramOut(CheckpointOut &cp, const std::string &name, ExtMachInst const &machInst)
Definition types.cc:40
void paramIn(CheckpointIn &cp, const std::string &name, ExtMachInst &machInst)
Definition types.cc:72
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
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
NOTE: This implementation of PLIC is based on he riscv-plic-spec repository: https://github....
Definition plic.hh:92
std::vector< uint32_t > maxPriority
Definition plic.hh:94
std::vector< uint32_t > maxID
Definition plic.hh:93
const std::string & name()
Definition trace.cc:48

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