gem5  [DEVELOP-FOR-23.0]
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
gic_v3.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2019-2022 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) 2018 Metempsy Technology Consulting
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 #include "dev/arm/gic_v3.hh"
42 
43 #include "cpu/base.hh"
44 #include "debug/GIC.hh"
45 #include "debug/Interrupt.hh"
48 #include "dev/arm/gic_v3_its.hh"
50 #include "dev/platform.hh"
51 #include "mem/packet.hh"
52 #include "mem/packet_access.hh"
53 
54 namespace gem5
55 {
56 
57 void
60  Addr daddr)
61 {
62  auto val = from->readDistributor(daddr);
63  DPRINTF(GIC, "copy dist 0x%x 0x%08x\n", daddr, val);
64  to->writeDistributor(daddr, val);
65 }
66 
67 void
70  const ArmISA::Affinity &aff, Addr daddr)
71 {
72  auto val = from->readRedistributor(aff, daddr);
73  DPRINTF(GIC,
74  "copy redist (aff3: %d, aff2: %d, aff1: %d, aff0: %d) "
75  "0x%x 0x%08x\n",
76  aff.aff3, aff.aff2, aff.aff1, aff.aff0, daddr, val);
77 
78  to->writeRedistributor(aff, daddr, val);
79 }
80 
81 void
84  const ArmISA::Affinity &aff,
85  ArmISA::MiscRegIndex misc_reg)
86 {
87  auto val = from->readCpu(aff, misc_reg);
88  DPRINTF(GIC,
89  "copy cpu (aff3: %d, aff2: %d, aff1: %d, aff0: %d) "
90  "%s 0x%08x\n",
91  aff.aff3, aff.aff2, aff.aff1, aff.aff0,
92  ArmISA::miscRegName[misc_reg], val);
93 
94  to->writeCpu(aff, misc_reg, val);
95 }
96 
97 void
99  const ArmISA::Affinity &aff, Addr daddr)
100 {
101  to->writeRedistributor(aff, daddr, 0xFFFFFFFF);
102 }
103 
104 void
107  const ArmISA::Affinity &aff,
108  Addr daddr, size_t size)
109 {
110  for (auto a = daddr; a < daddr + size; a += 4)
111  copyRedistRegister(from, to, aff, a);
112 }
113 
114 void
117  Addr daddr, size_t size)
118 {
119  for (auto a = daddr; a < daddr + size; a += 4)
120  copyDistRegister(from, to, a);
121 }
122 
123 void
125 {
126  for (auto a = daddr; a < daddr + size; a += 4)
127  to->writeDistributor(a, 0xFFFFFFFF);
128 }
129 
130 
132  : BaseGic(p)
133 {
134 }
135 
136 void
138 {
139  distributor = new Gicv3Distributor(this, params().it_lines);
140  int threads = sys->threads.size();
141  redistributors.resize(threads, nullptr);
142  cpuInterfaces.resize(threads, nullptr);
143 
144  panic_if(threads > params().cpu_max,
145  "Exceeding maximum number of PEs supported by GICv3: "
146  "using %u while maximum is %u.", threads, params().cpu_max);
147 
148  for (int i = 0; i < threads; i++) {
149  redistributors[i] = new Gicv3Redistributor(this, i);
150  cpuInterfaces[i] = new Gicv3CPUInterface(this, sys->threads[i]);
151  }
152 
153  distRange = RangeSize(params().dist_addr,
155 
156  redistSize = redistributors[0]->addrRangeSize;
157  redistRange = RangeSize(params().redist_addr, redistSize * threads);
158 
160 
161  distributor->init();
162 
163  for (int i = 0; i < threads; i++) {
164  redistributors[i]->init();
165  cpuInterfaces[i]->init();
166  }
167 
168  Gicv3Its *its = params().its;
169  if (its)
170  its->setGIC(this);
171 
172  BaseGic::init();
173 }
174 
175 Tick
177 {
178  const Addr addr = pkt->getAddr();
179  const size_t size = pkt->getSize();
180  bool is_secure_access = pkt->isSecure();
181  uint64_t resp = 0;
182  Tick delay = 0;
183 
184  if (distRange.contains(addr)) {
185  const Addr daddr = addr - distRange.start();
186  panic_if(!distributor, "Distributor is null!");
187  resp = distributor->read(daddr, size, is_secure_access);
188  delay = params().dist_pio_delay;
189  DPRINTF(GIC, "Gicv3::read(): (distributor) context_id %d register %#x "
190  "size %d is_secure_access %d (value %#x)\n",
191  pkt->req->contextId(), daddr, size, is_secure_access, resp);
192  } else if (redistRange.contains(addr)) {
193  Addr daddr = (addr - redistRange.start()) % redistSize;
194 
196  resp = redist->read(daddr, size, is_secure_access);
197 
198  delay = params().redist_pio_delay;
199  DPRINTF(GIC, "Gicv3::read(): (redistributor %d) context_id %d "
200  "register %#x size %d is_secure_access %d (value %#x)\n",
201  redist->processorNumber(), pkt->req->contextId(), daddr, size,
202  is_secure_access, resp);
203  } else {
204  panic("Gicv3::read(): unknown address %#x\n", addr);
205  }
206 
207  pkt->setUintX(resp, ByteOrder::little);
208  pkt->makeAtomicResponse();
209  return delay;
210 }
211 
212 Tick
214 {
215  const size_t size = pkt->getSize();
216  uint64_t data = pkt->getUintX(ByteOrder::little);
217  const Addr addr = pkt->getAddr();
218  bool is_secure_access = pkt->isSecure();
219  Tick delay = 0;
220 
221  if (distRange.contains(addr)) {
222  const Addr daddr = addr - distRange.start();
223  panic_if(!distributor, "Distributor is null!");
224  DPRINTF(GIC, "Gicv3::write(): (distributor) context_id %d "
225  "register %#x size %d is_secure_access %d value %#x\n",
226  pkt->req->contextId(), daddr, size, is_secure_access, data);
227  distributor->write(daddr, data, size, is_secure_access);
228  delay = params().dist_pio_delay;
229  } else if (redistRange.contains(addr)) {
230  Addr daddr = (addr - redistRange.start()) % redistSize;
231 
233  DPRINTF(GIC, "Gicv3::write(): (redistributor %d) context_id %d "
234  "register %#x size %d is_secure_access %d value %#x\n",
235  redist->processorNumber(), pkt->req->contextId(), daddr, size,
236  is_secure_access, data);
237 
238  redist->write(daddr, data, size, is_secure_access);
239 
240  delay = params().redist_pio_delay;
241  } else {
242  panic("Gicv3::write(): unknown address %#x\n", addr);
243  }
244 
245  pkt->makeAtomicResponse();
246  return delay;
247 }
248 
249 void
250 Gicv3::sendInt(uint32_t int_id)
251 {
252  DPRINTF(Interrupt, "Gicv3::sendInt(): received SPI %d\n", int_id);
253  distributor->sendInt(int_id);
254 }
255 
256 void
257 Gicv3::clearInt(uint32_t int_id)
258 {
259  DPRINTF(Interrupt, "Gicv3::clearInt(): received SPI %d\n", int_id);
260  distributor->clearInt(int_id);
261 }
262 
263 void
264 Gicv3::sendPPInt(uint32_t int_id, uint32_t cpu)
265 {
266  panic_if(cpu >= redistributors.size(), "Invalid cpuID sending PPI!");
267  DPRINTF(Interrupt, "Gicv3::sendPPInt(): received PPI %d cpuTarget %#x\n",
268  int_id, cpu);
269  redistributors[cpu]->sendPPInt(int_id);
270 }
271 
272 void
273 Gicv3::clearPPInt(uint32_t int_id, uint32_t cpu)
274 {
275  panic_if(cpu >= redistributors.size(), "Invalid cpuID clearing PPI!");
276  DPRINTF(Interrupt, "Gicv3::clearPPInt(): received PPI %d cpuTarget %#x\n",
277  int_id, cpu);
278  redistributors[cpu]->clearPPInt(int_id);
279 }
280 
281 void
283 {
284  auto tc = sys->threads[cpu];
285  tc->getCpuPtr()->postInterrupt(tc->threadId(), int_type, 0);
287 }
288 
289 void
291 {
292  distributor->update();
293 }
294 
295 bool
297 {
298  return (version == GicVersion::GIC_V3) ||
299  (version == GicVersion::GIC_V4 && params().gicv4);
300 }
301 
302 void
304 {
305  auto tc = sys->threads[cpu];
306  tc->getCpuPtr()->clearInterrupt(tc->threadId(), int_type, 0);
307 }
308 
309 void
310 Gicv3::deassertAll(uint32_t cpu)
311 {
312  auto tc = sys->threads[cpu];
313  tc->getCpuPtr()->clearInterrupts(tc->threadId());
314 }
315 
316 bool
317 Gicv3::haveAsserted(uint32_t cpu) const
318 {
319  auto tc = sys->threads[cpu];
320  return tc->getCpuPtr()->checkInterrupts(tc->threadId());
321 }
322 
324 Gicv3::getCPUInterfaceByAffinity(const ArmISA::Affinity &aff) const
325 {
327 }
328 
330 Gicv3::getRedistributorByAffinity(const ArmISA::Affinity &aff) const
331 {
332  for (auto & redistributor : redistributors) {
333  if (redistributor->getAffinity() == aff) {
334  return redistributor;
335  }
336  }
337 
338  return nullptr;
339 }
340 
343 {
345  "Address not pointing to a valid redistributor\n");
346 
347  const Addr daddr = addr - redistRange.start();
348  const uint32_t redistributor_id = daddr / redistSize;
349 
350  panic_if(redistributor_id >= redistributors.size(),
351  "Invalid redistributor_id!");
352  panic_if(!redistributors[redistributor_id], "Redistributor is null!");
353 
354  return redistributors[redistributor_id];
355 }
356 
357 uint32_t
359 {
360  return distributor->read(daddr, 4, false);
361 }
362 
363 uint32_t
364 Gicv3::readRedistributor(const ArmISA::Affinity &aff, Addr daddr)
365 {
366  auto redistributor = getRedistributorByAffinity(aff);
367  assert(redistributor);
368  return redistributor->read(daddr, 4, false);
369 }
370 
371 RegVal
372 Gicv3::readCpu(const ArmISA::Affinity &aff, ArmISA::MiscRegIndex misc_reg)
373 {
374  auto cpu_interface = getCPUInterfaceByAffinity(aff);
375  assert(cpu_interface);
376  return cpu_interface->readMiscReg(misc_reg);
377 }
378 
379 void
381 {
382  distributor->write(daddr, data, sizeof(data), false);
383 }
384 
385 void
386 Gicv3::writeRedistributor(const ArmISA::Affinity &aff, Addr daddr, uint32_t data)
387 {
388  auto redistributor = getRedistributorByAffinity(aff);
389  assert(redistributor);
390  redistributor->write(daddr, data, sizeof(data), false);
391 }
392 
393 void
394 Gicv3::writeCpu(const ArmISA::Affinity &aff, ArmISA::MiscRegIndex misc_reg,
395  RegVal data)
396 {
397  auto cpu_interface = getCPUInterfaceByAffinity(aff);
398  assert(cpu_interface);
399  cpu_interface->setMiscReg(misc_reg, data);
400 }
401 
402 void
404 {
405  distributor->copy(from, to);
406  for (auto& redistributor : redistributors) {
407  redistributor->copy(from, to);
408  }
409  for (auto& cpu_interface : cpuInterfaces) {
410  cpu_interface->copy(from, to);
411  }
412 }
413 
414 void
416 {
417  distributor->serializeSection(cp, "distributor");
418 
419  for (uint32_t redistributor_id = 0;
420  redistributor_id < redistributors.size(); redistributor_id++)
421  redistributors[redistributor_id]->serializeSection(cp,
422  csprintf("redistributors.%i", redistributor_id));
423 
424  for (uint32_t cpu_interface_id = 0;
425  cpu_interface_id < cpuInterfaces.size(); cpu_interface_id++)
426  cpuInterfaces[cpu_interface_id]->serializeSection(cp,
427  csprintf("cpuInterface.%i", cpu_interface_id));
428 }
429 
430 void
432 {
433  getSystem()->setGIC(this);
434 
435  distributor->unserializeSection(cp, "distributor");
436 
437  for (uint32_t redistributor_id = 0;
438  redistributor_id < redistributors.size(); redistributor_id++)
439  redistributors[redistributor_id]->unserializeSection(cp,
440  csprintf("redistributors.%i", redistributor_id));
441 
442  for (uint32_t cpu_interface_id = 0;
443  cpu_interface_id < cpuInterfaces.size(); cpu_interface_id++)
444  cpuInterfaces[cpu_interface_id]->unserializeSection(cp,
445  csprintf("cpuInterface.%i", cpu_interface_id));
446 }
447 
448 } // namespace gem5
gem5::Gicv3::addrRanges
AddrRangeList addrRanges
Definition: gic_v3.hh:108
gem5::Gicv3::writeRedistributor
void writeRedistributor(const ArmISA::Affinity &aff, Addr daddr, uint32_t data) override
Definition: gic_v3.cc:386
gic_v3_cpu_interface.hh
gem5::BaseGic::getSystem
ArmSystem * getSystem() const
Definition: base_gic.hh:114
gem5::Gicv3Its::setGIC
void setGIC(Gicv3 *_gic)
Definition: gic_v3_its.cc:808
gic_v3_its.hh
gem5::AddrRange::start
Addr start() const
Get the start address of the range.
Definition: addr_range.hh:343
gem5::System::Threads::size
int size() const
Definition: system.hh:210
gem5::Gicv3Registers::copyDistRange
static void copyDistRange(Gicv3Registers *from, Gicv3Registers *to, Addr daddr, size_t size)
Definition: gic_v3.cc:115
gem5::RegVal
uint64_t RegVal
Definition: types.hh:173
gic_v3_redistributor.hh
gem5::Packet::getUintX
uint64_t getUintX(ByteOrder endian) const
Get the data in the packet byte swapped from the specified endianness and zero-extended to 64 bits.
Definition: packet.cc:352
gem5::Gicv3Registers
Definition: gic_v3.hh:57
gem5::Gicv3::haveAsserted
bool haveAsserted(uint32_t cpu) const
Definition: gic_v3.cc:317
gem5::Gicv3::update
void update()
Definition: gic_v3.cc:290
data
const char data[]
Definition: circlebuf.test.cc:48
gem5::Gicv3Registers::copyRedistRange
static void copyRedistRange(Gicv3Registers *from, Gicv3Registers *to, const ArmISA::Affinity &aff, Addr daddr, size_t size)
Definition: gic_v3.cc:105
gem5::RangeSize
AddrRange RangeSize(Addr start, Addr size)
Definition: addr_range.hh:831
gem5::Gicv3Redistributor::read
uint64_t read(Addr addr, size_t size, bool is_secure_access)
Definition: gic_v3_redistributor.cc:94
gem5::Gicv3Redistributor
Definition: gic_v3_redistributor.hh:55
gem5::Gicv3Distributor::init
void init()
Definition: gic_v3_distributor.cc:137
gem5::Gicv3::its
Gicv3Its * its
Definition: gic_v3.hh:105
gem5::Packet::req
RequestPtr req
A pointer to the original request.
Definition: packet.hh:377
gem5::AddrRange::contains
bool contains(const Addr &a) const
Determine if the range contains an address.
Definition: addr_range.hh:471
gem5::BaseGic::GicVersion::GIC_V3
@ GIC_V3
gem5::CheckpointIn
Definition: serialize.hh:68
sc_dt::int_type
int64 int_type
Definition: sc_nbdefs.hh:240
gem5::Serializable::serializeSection
void serializeSection(CheckpointOut &cp, const char *name) const
Serialize an object into a new section.
Definition: serialize.cc:74
gem5::Gicv3::getRedistributorByAddr
Gicv3Redistributor * getRedistributorByAddr(Addr address) const
Definition: gic_v3.cc:342
gem5::X86ISA::val
Bitfield< 63 > val
Definition: misc.hh:776
gem5::Gicv3::deassertAll
void deassertAll(uint32_t cpu)
Definition: gic_v3.cc:310
gem5::ArmISA::a
Bitfield< 8 > a
Definition: misc_types.hh:66
gem5::Gicv3::clearPPInt
void clearPPInt(uint32_t int_id, uint32_t cpu) override
Definition: gic_v3.cc:273
gem5::Packet::isSecure
bool isSecure() const
Definition: packet.hh:836
gem5::ArmISA::miscRegName
const char *const miscRegName[]
Definition: misc.hh:1748
gem5::Gicv3Distributor::update
void update()
Definition: gic_v3_distributor.cc:1086
gem5::Gicv3::Gicv3
Gicv3(const Params &p)
Definition: gic_v3.cc:131
gem5::csprintf
std::string csprintf(const char *format, const Args &...args)
Definition: cprintf.hh:161
gem5::Packet::makeAtomicResponse
void makeAtomicResponse()
Definition: packet.hh:1074
gem5::Gicv3Redistributor::write
void write(Addr addr, uint64_t data, size_t size, bool is_secure_access)
Definition: gic_v3_redistributor.cc:386
gem5::BaseGic::GicVersion::GIC_V4
@ GIC_V4
gem5::Gicv3::write
Tick write(PacketPtr pkt) override
Pure virtual function that the device must implement.
Definition: gic_v3.cc:213
gem5::Gicv3::distRange
AddrRange distRange
Definition: gic_v3.hh:106
gem5::ArmISA::i
Bitfield< 7 > i
Definition: misc_types.hh:67
gem5::Gicv3::getRedistributorByAffinity
Gicv3Redistributor * getRedistributorByAffinity(const ArmISA::Affinity &aff) const
Definition: gic_v3.cc:330
gem5::Gicv3Registers::readRedistributor
virtual uint32_t readRedistributor(const ArmISA::Affinity &aff, Addr daddr)=0
gem5::Gicv3::read
Tick read(PacketPtr pkt) override
Pure virtual function that the device must implement.
Definition: gic_v3.cc:176
gem5::Gicv3Registers::copyRedistRegister
static void copyRedistRegister(Gicv3Registers *from, Gicv3Registers *to, const ArmISA::Affinity &aff, Addr daddr)
Definition: gic_v3.cc:68
gem5::Gicv3Distributor::copy
void copy(Gicv3Registers *from, Gicv3Registers *to)
Definition: gic_v3_distributor.cc:1185
gem5::Gicv3::redistRange
AddrRange redistRange
Definition: gic_v3.hh:107
gem5::Gicv3::writeCpu
void writeCpu(const ArmISA::Affinity &aff, ArmISA::MiscRegIndex misc_reg, RegVal data) override
Definition: gic_v3.cc:394
gem5::Gicv3::sendPPInt
void sendPPInt(uint32_t int_id, uint32_t cpu) override
Interface call for private peripheral interrupts.
Definition: gic_v3.cc:264
packet.hh
gem5::Gicv3::readDistributor
uint32_t readDistributor(Addr daddr) override
Definition: gic_v3.cc:358
gem5::Gicv3::postInt
void postInt(uint32_t cpu, ArmISA::InterruptTypes int_type)
Definition: gic_v3.cc:282
gem5::Gicv3Distributor::write
void write(Addr addr, uint64_t data, size_t size, bool is_secure_access)
Definition: gic_v3_distributor.cc:514
gem5::Gicv3::unserialize
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition: gic_v3.cc:431
gem5::PowerISA::to
Bitfield< 25, 21 > to
Definition: types.hh:96
gem5::Gicv3::serialize
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: gic_v3.cc:415
gem5::Gicv3Redistributor::getCPUInterface
Gicv3CPUInterface * getCPUInterface() const
Definition: gic_v3_redistributor.hh:208
gem5::Gicv3Distributor::sendInt
void sendInt(uint32_t int_id)
Definition: gic_v3_distributor.cc:1008
gem5::BaseGic
Definition: base_gic.hh:72
gem5::Serializable::unserializeSection
void unserializeSection(CheckpointIn &cp, const char *name)
Unserialize an a child object.
Definition: serialize.cc:81
gem5::VegaISA::p
Bitfield< 54 > p
Definition: pagetable.hh:70
gem5::Gicv3::cpuInterfaces
std::vector< Gicv3CPUInterface * > cpuInterfaces
Definition: gic_v3.hh:104
DPRINTF
#define DPRINTF(x,...)
Definition: trace.hh:210
gem5::Packet
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Definition: packet.hh:294
gem5::Gicv3::init
void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
Definition: gic_v3.cc:137
gem5::Tick
uint64_t Tick
Tick count type.
Definition: types.hh:58
gem5::PioDevice::sys
System * sys
Definition: io_device.hh:105
gem5::Gicv3Redistributor::processorNumber
uint32_t processorNumber() const
Definition: gic_v3_redistributor.hh:214
gem5::Gicv3::distributor
Gicv3Distributor * distributor
Definition: gic_v3.hh:102
gem5::Gicv3Registers::readCpu
virtual RegVal readCpu(const ArmISA::Affinity &aff, ArmISA::MiscRegIndex misc_reg)=0
gem5::Gicv3::redistributors
std::vector< Gicv3Redistributor * > redistributors
Definition: gic_v3.hh:103
gem5::Gicv3::Gicv3Redistributor
friend class Gicv3Redistributor
Definition: gic_v3.hh:99
gem5::BaseGic::params
const Params & params() const
Definition: base_gic.cc:78
gem5::ArmISA::InterruptTypes
InterruptTypes
Definition: interrupts.hh:59
gem5::Gicv3Registers::copyCpuRegister
static void copyCpuRegister(Gicv3Registers *from, Gicv3Registers *to, const ArmISA::Affinity &aff, ArmISA::MiscRegIndex misc_reg)
Definition: gic_v3.cc:82
gem5::Gicv3::Gicv3CPUInterface
friend class Gicv3CPUInterface
Definition: gic_v3.hh:98
gem5::Gicv3Distributor::read
uint64_t read(Addr addr, size_t size, bool is_secure_access)
Definition: gic_v3_distributor.cc:142
gem5::BaseGic::init
void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
Definition: base_gic.cc:71
gem5::BaseGic::Params
BaseGicParams Params
Definition: base_gic.hh:75
platform.hh
gem5::Gicv3::sendInt
void sendInt(uint32_t int_id) override
Post an interrupt from a device that is connected to the GIC.
Definition: gic_v3.cc:250
gem5::Gicv3::readCpu
RegVal readCpu(const ArmISA::Affinity &aff, ArmISA::MiscRegIndex misc_reg) override
Definition: gic_v3.cc:372
gem5::Addr
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:147
gem5::ArmSystem::callClearStandByWfi
static void callClearStandByWfi(ThreadContext *tc)
Make a call to notify the power controller of STANDBYWFI deassertion.
Definition: system.cc:207
gem5::Gicv3Distributor::clearInt
void clearInt(uint32_t int_id)
Definition: gic_v3_distributor.cc:1020
gem5::ArmISA::MiscRegIndex
MiscRegIndex
Definition: misc.hh:64
packet_access.hh
gem5::BaseGic::GicVersion
GicVersion
Definition: base_gic.hh:76
gem5::Gicv3::getCPUInterfaceByAffinity
Gicv3CPUInterface * getCPUInterfaceByAffinity(const ArmISA::Affinity &aff) const
Definition: gic_v3.cc:324
panic_if
#define panic_if(cond,...)
Conditional panic macro that checks the supplied condition and only panics if the condition is true a...
Definition: logging.hh:214
gem5::Gicv3CPUInterface
Definition: gic_v3_cpu_interface.hh:58
base.hh
gem5::Gicv3Its
GICv3 ITS module.
Definition: gic_v3_its.hh:83
gem5::System::threads
Threads threads
Definition: system.hh:310
gem5::Gicv3::copyGicState
void copyGicState(Gicv3Registers *from, Gicv3Registers *to)
Definition: gic_v3.cc:403
gem5::Gicv3Registers::copyDistRegister
static void copyDistRegister(Gicv3Registers *from, Gicv3Registers *to, Addr daddr)
Definition: gic_v3.cc:58
gem5::Gicv3::Gicv3Distributor
friend class Gicv3Distributor
Definition: gic_v3.hh:100
gem5::ArmSystem::setGIC
void setGIC(BaseGic *gic)
Sets the pointer to the GIC.
Definition: system.hh:168
gem5::CheckpointOut
std::ostream CheckpointOut
Definition: serialize.hh:66
gem5::Gicv3::writeDistributor
void writeDistributor(Addr daddr, uint32_t data) override
Definition: gic_v3.cc:380
gem5::Gicv3::readRedistributor
uint32_t readRedistributor(const ArmISA::Affinity &aff, Addr daddr) override
Definition: gic_v3.cc:364
gem5::Gicv3::deassertInt
void deassertInt(uint32_t cpu, ArmISA::InterruptTypes int_type)
Definition: gic_v3.cc:303
gem5::Gicv3Registers::clearRedistRegister
static void clearRedistRegister(Gicv3Registers *to, const ArmISA::Affinity &aff, Addr daddr)
Definition: gic_v3.cc:98
gem5::Packet::getAddr
Addr getAddr() const
Definition: packet.hh:807
gem5
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
Definition: gpu_translation_state.hh:37
gem5::Gicv3Distributor::ADDR_RANGE_SIZE
static const uint32_t ADDR_RANGE_SIZE
Definition: gic_v3_distributor.hh:177
gem5::Gicv3::redistSize
uint64_t redistSize
Definition: gic_v3.hh:109
gem5::Packet::setUintX
void setUintX(uint64_t w, ByteOrder endian)
Set the value in the word w after truncating it to the length of the packet and then byteswapping it ...
Definition: packet.cc:361
gem5::Gicv3Registers::readDistributor
virtual uint32_t readDistributor(Addr daddr)=0
gic_v3_distributor.hh
gem5::ArmISA::Interrupt
Definition: faults.hh:595
gic_v3.hh
gem5::Packet::getSize
unsigned getSize() const
Definition: packet.hh:817
gem5::Gicv3::clearInt
void clearInt(uint32_t int_id) override
Clear an interrupt from a device that is connected to the GIC.
Definition: gic_v3.cc:257
panic
#define panic(...)
This implements a cprintf based panic() function.
Definition: logging.hh:188
gem5::Gicv3::supportsVersion
bool supportsVersion(GicVersion version) override
Check if version supported.
Definition: gic_v3.cc:296
gem5::X86ISA::addr
Bitfield< 3 > addr
Definition: types.hh:84
gem5::Gicv3Registers::clearDistRange
static void clearDistRange(Gicv3Registers *to, Addr daddr, size_t size)
Definition: gic_v3.cc:124

Generated on Sun Jul 30 2023 01:56:54 for gem5 by doxygen 1.8.17