gem5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
gic.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015-2017 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  * 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  * Authors: Andreas Sandberg
38  * Curtis Dunham
39  */
40 
41 #include "arch/arm/kvm/gic.hh"
42 
43 #include <linux/kvm.h>
44 
45 #include "arch/arm/kvm/base_cpu.hh"
46 #include "debug/GIC.hh"
47 #include "debug/Interrupt.hh"
48 #include "params/MuxingKvmGic.hh"
49 
50 KvmKernelGicV2::KvmKernelGicV2(KvmVM &_vm, Addr cpu_addr, Addr dist_addr,
51  unsigned it_lines)
52  : cpuRange(RangeSize(cpu_addr, KVM_VGIC_V2_CPU_SIZE)),
53  distRange(RangeSize(dist_addr, KVM_VGIC_V2_DIST_SIZE)),
54  vm(_vm),
55  kdev(vm.createDevice(KVM_DEV_TYPE_ARM_VGIC_V2))
56 {
57  kdev.setAttr<uint64_t>(
58  KVM_DEV_ARM_VGIC_GRP_ADDR, KVM_VGIC_V2_ADDR_TYPE_DIST, dist_addr);
59  kdev.setAttr<uint64_t>(
60  KVM_DEV_ARM_VGIC_GRP_ADDR, KVM_VGIC_V2_ADDR_TYPE_CPU, cpu_addr);
61 
62  kdev.setAttr<uint32_t>(KVM_DEV_ARM_VGIC_GRP_NR_IRQS, 0, it_lines);
63 }
64 
66 {
67 }
68 
69 void
71 {
72  setIntState(KVM_ARM_IRQ_TYPE_SPI, 0, spi, true);
73 }
74 
75 void
77 {
78  setIntState(KVM_ARM_IRQ_TYPE_SPI, 0, spi, false);
79 }
80 
81 void
82 KvmKernelGicV2::setPPI(unsigned vcpu, unsigned ppi)
83 {
84  setIntState(KVM_ARM_IRQ_TYPE_PPI, vcpu, ppi, true);
85 }
86 
87 void
88 KvmKernelGicV2::clearPPI(unsigned vcpu, unsigned ppi)
89 {
90  setIntState(KVM_ARM_IRQ_TYPE_PPI, vcpu, ppi, false);
91 }
92 
93 void
94 KvmKernelGicV2::setIntState(unsigned type, unsigned vcpu, unsigned irq,
95  bool high)
96 {
97  assert(type <= KVM_ARM_IRQ_TYPE_MASK);
98  assert(vcpu <= KVM_ARM_IRQ_VCPU_MASK);
99  assert(irq <= KVM_ARM_IRQ_NUM_MASK);
100  const uint32_t line(
101  (type << KVM_ARM_IRQ_TYPE_SHIFT) |
102  (vcpu << KVM_ARM_IRQ_VCPU_SHIFT) |
103  (irq << KVM_ARM_IRQ_NUM_SHIFT));
104 
105  vm.setIRQLine(line, high);
106 }
107 
108 uint32_t
109 KvmKernelGicV2::getGicReg(unsigned group, unsigned vcpu, unsigned offset)
110 {
111  uint64_t reg;
112 
113  assert(vcpu <= KVM_ARM_IRQ_VCPU_MASK);
114  const uint32_t attr(
115  (vcpu << KVM_DEV_ARM_VGIC_CPUID_SHIFT) |
116  (offset << KVM_DEV_ARM_VGIC_OFFSET_SHIFT));
117 
118  kdev.getAttrPtr(group, attr, &reg);
119  return (uint32_t) reg;
120 }
121 
122 void
123 KvmKernelGicV2::setGicReg(unsigned group, unsigned vcpu, unsigned offset,
124  unsigned value)
125 {
126  uint64_t reg = value;
127 
128  assert(vcpu <= KVM_ARM_IRQ_VCPU_MASK);
129  const uint32_t attr(
130  (vcpu << KVM_DEV_ARM_VGIC_CPUID_SHIFT) |
131  (offset << KVM_DEV_ARM_VGIC_OFFSET_SHIFT));
132 
133  kdev.setAttrPtr(group, attr, &reg);
134 }
135 
136 uint32_t
138 {
139  auto vcpu = vm.contextIdToVCpuId(ctx);
140  return getGicReg(KVM_DEV_ARM_VGIC_GRP_DIST_REGS, vcpu, daddr);
141 }
142 
143 uint32_t
145 {
146  auto vcpu = vm.contextIdToVCpuId(ctx);
147  return getGicReg(KVM_DEV_ARM_VGIC_GRP_CPU_REGS, vcpu, daddr);
148 }
149 
150 void
152 {
153  auto vcpu = vm.contextIdToVCpuId(ctx);
154  setGicReg(KVM_DEV_ARM_VGIC_GRP_DIST_REGS, vcpu, daddr, data);
155 }
156 
157 void
159 {
160  auto vcpu = vm.contextIdToVCpuId(ctx);
161  setGicReg(KVM_DEV_ARM_VGIC_GRP_CPU_REGS, vcpu, daddr, data);
162 }
163 
164 
165 
166 MuxingKvmGic::MuxingKvmGic(const MuxingKvmGicParams *p)
167  : Pl390(p),
168  system(*p->system),
169  kernelGic(nullptr),
170  usingKvm(false)
171 {
172  if (auto vm = system.getKvmVM()) {
173  kernelGic = new KvmKernelGicV2(*vm, p->cpu_addr, p->dist_addr,
174  p->it_lines);
175  }
176 }
177 
179 {
180 }
181 
182 void
184 {
185  Pl390::loadState(cp);
186 }
187 
188 void
190 {
191  Pl390::startup();
192  usingKvm = (kernelGic != nullptr) && validKvmEnvironment();
193  if (usingKvm)
194  fromPl390ToKvm();
195 }
196 
199 {
200  if (usingKvm)
201  fromKvmToPl390();
202  return Pl390::drain();
203 }
204 
205 void
207 {
209  bool use_kvm = (kernelGic != nullptr) && validKvmEnvironment();
210  if (use_kvm != usingKvm) {
211  // Should only occur due to CPU switches
212  if (use_kvm) // from simulation to KVM emulation
213  fromPl390ToKvm();
214  // otherwise, drain() already sync'd the state back to the Pl390
215 
216  usingKvm = use_kvm;
217  }
218 }
219 
220 void
222 {
223  // drain() already ensured Pl390 updated with KvmGic state if necessary
224  Pl390::serialize(cp);
225 }
226 
227 void
229 {
230  Pl390::unserialize(cp);
231 }
232 
233 Tick
235 {
236  if (!usingKvm)
237  return Pl390::read(pkt);
238 
239  panic("MuxingKvmGic: PIO from gem5 is currently unsupported\n");
240 }
241 
242 Tick
244 {
245  if (!usingKvm)
246  return Pl390::write(pkt);
247 
248  panic("MuxingKvmGic: PIO from gem5 is currently unsupported\n");
249 }
250 
251 void
253 {
254  if (!usingKvm)
255  return Pl390::sendInt(num);
256 
257  DPRINTF(Interrupt, "Set SPI %d\n", num);
258  kernelGic->setSPI(num);
259 }
260 
261 void
263 {
264  if (!usingKvm)
265  return Pl390::clearInt(num);
266 
267  DPRINTF(Interrupt, "Clear SPI %d\n", num);
268  kernelGic->clearSPI(num);
269 }
270 
271 void
272 MuxingKvmGic::sendPPInt(uint32_t num, uint32_t cpu)
273 {
274  if (!usingKvm)
275  return Pl390::sendPPInt(num, cpu);
276  DPRINTF(Interrupt, "Set PPI %d:%d\n", cpu, num);
277  kernelGic->setPPI(cpu, num);
278 }
279 
280 void
281 MuxingKvmGic::clearPPInt(uint32_t num, uint32_t cpu)
282 {
283  if (!usingKvm)
284  return Pl390::clearPPInt(num, cpu);
285 
286  DPRINTF(Interrupt, "Clear PPI %d:%d\n", cpu, num);
287  kernelGic->clearPPI(cpu, num);
288 }
289 
290 bool
292 {
293  if (system.threadContexts.empty())
294  return false;
295 
296  for (auto tc : system.threadContexts) {
297  if (dynamic_cast<BaseArmKvmCPU*>(tc->getCpuPtr()) == nullptr) {
298  return false;
299  }
300  }
301  return true;
302 }
303 
304 void
306  ContextID ctx, Addr daddr)
307 {
308  auto val = from->readDistributor(ctx, daddr);
309  DPRINTF(GIC, "copy dist 0x%x 0x%08x\n", daddr, val);
310  to->writeDistributor(ctx, daddr, val);
311 }
312 
313 void
315  ContextID ctx, Addr daddr)
316 {
317  auto val = from->readCpu(ctx, daddr);
318  DPRINTF(GIC, "copy cpu 0x%x 0x%08x\n", daddr, val);
319  to->writeCpu(ctx, daddr, val);
320 }
321 
322 void
324  Addr daddr, size_t size)
325 {
326  for (int ctx = 0; ctx < system._numContexts; ++ctx)
327  for (auto a = daddr; a < daddr + size; a += 4)
328  copyDistRegister(from, to, ctx, a);
329 }
330 
331 void
333  Addr daddr, size_t size)
334 {
335  for (int ctx = 0; ctx < system._numContexts; ++ctx)
336  for (auto a = daddr; a < daddr + size; a += 4)
337  to->writeDistributor(ctx, a, 0xFFFFFFFF);
338 }
339 
340 void
342  Addr daddr, size_t size)
343 {
344  for (auto a = daddr; a < daddr + size; a += 4)
345  copyDistRegister(from, to, 0, a);
346 }
347 
348 void
350  Addr daddr, size_t size)
351 {
352  for (auto a = daddr; a < daddr + size; a += 4)
353  to->writeDistributor(0, a, 0xFFFFFFFF);
354 }
355 
356 void
358 {
359  Addr set, clear;
360  size_t size;
361 
363  // Copy CPU Interface Control Register (CTLR),
364  // Interrupt Priority Mask Register (PMR), and
365  // Binary Point Register (BPR)
366  for (int ctx = 0; ctx < system._numContexts; ++ctx) {
367  copyCpuRegister(from, to, ctx, GICC_CTLR);
368  copyCpuRegister(from, to, ctx, GICC_PMR);
369  copyCpuRegister(from, to, ctx, GICC_BPR);
370  }
371 
372 
374  // Copy Distributor Control Register (CTLR)
375  copyDistRegister(from, to, 0, GICD_CTLR);
376 
377  // Copy interrupt-enabled statuses (I[CS]ENABLERn; R0 is per-CPU banked)
379  clear = Pl390::GICD_ICENABLER.start();
380  size = Pl390::itLines / 8;
381  clearBankedDistRange(to, clear, 4);
382  copyBankedDistRange(from, to, set, 4);
383 
384  set += 4, clear += 4, size -= 4;
385  clearDistRange(to, clear, size);
386  copyDistRange(from, to, set, size);
387 
388  // Copy pending interrupts (I[CS]PENDRn; R0 is per-CPU banked)
389  set = Pl390::GICD_ISPENDR.start();
390  clear = Pl390::GICD_ICPENDR.start();
391  size = Pl390::itLines / 8;
392  clearBankedDistRange(to, clear, 4);
393  copyBankedDistRange(from, to, set, 4);
394 
395  set += 4, clear += 4, size -= 4;
396  clearDistRange(to, clear, size);
397  copyDistRange(from, to, set, size);
398 
399  // Copy active interrupts (I[CS]ACTIVERn; R0 is per-CPU banked)
401  clear = Pl390::GICD_ICACTIVER.start();
402  size = Pl390::itLines / 8;
403  clearBankedDistRange(to, clear, 4);
404  copyBankedDistRange(from, to, set, 4);
405 
406  set += 4, clear += 4, size -= 4;
407  clearDistRange(to, clear, size);
408  copyDistRange(from, to, set, size);
409 
410  // Copy interrupt priorities (IPRIORITYRn; R0-7 are per-CPU banked)
412  copyBankedDistRange(from, to, set, 32);
413 
414  set += 32;
415  size = Pl390::itLines - 32;
416  copyDistRange(from, to, set, size);
417 
418  // Copy interrupt processor target regs (ITARGETRn; R0-7 are read-only)
419  set = Pl390::GICD_ITARGETSR.start() + 32;
420  size = Pl390::itLines - 32;
421  copyDistRange(from, to, set, size);
422 
423  // Copy interrupt configuration registers (ICFGRn)
424  set = Pl390::GICD_ICFGR.start();
425  size = Pl390::itLines / 4;
426  copyDistRange(from, to, set, size);
427 }
428 
429 void
431 {
432  copyGicState(static_cast<Pl390*>(this), kernelGic);
433 }
434 
435 void
437 {
438  copyGicState(kernelGic, static_cast<Pl390*>(this));
439 
440  // the values read for the Interrupt Priority Mask Register (PMR)
441  // have been shifted by three bits due to its having been emulated by
442  // a VGIC with only 5 PMR bits in its VMCR register. Presently the
443  // Linux kernel does not repair this inaccuracy, so we correct it here.
444  for (int cpu = 0; cpu < system._numContexts; ++cpu) {
445  cpuPriority[cpu] <<= 3;
446  assert((cpuPriority[cpu] & ~0xff) == 0);
447  }
448 }
449 
450 MuxingKvmGic *
451 MuxingKvmGicParams::create()
452 {
453  return new MuxingKvmGic(this);
454 }
void writeDistributor(ContextID ctx, Addr daddr, uint32_t data) override
Definition: gic.cc:151
#define DPRINTF(x,...)
Definition: trace.hh:212
AddrRange RangeSize(Addr start, Addr size)
Definition: addr_range.hh:398
Tick write(PacketPtr pkt) override
A PIO read to the device, immediately split up into writeDistributor() or writeCpu() ...
Definition: gic_pl390.cc:113
void setAttrPtr(uint32_t group, uint64_t attr, const void *data) const
Definition: device.cc:82
void fromPl390ToKvm()
Multiplexing implementation.
Definition: gic.cc:430
uint32_t getGicReg(unsigned group, unsigned vcpu, unsigned offset)
Get value of GIC register "from" a cpu.
Definition: gic.cc:109
System & system
System this interrupt controller belongs to.
Definition: gic.hh:202
void sendInt(uint32_t num) override
Post an interrupt from a device that is connected to the GIC.
Definition: gic.cc:252
void setPPI(unsigned vcpu, unsigned ppi)
Raise a private peripheral interrupt.
Definition: gic.cc:82
virtual uint32_t readCpu(ContextID ctx, Addr daddr)=0
void clearInt(uint32_t number) override
Clear an interrupt from a device that is connected to the GIC.
Definition: gic_pl390.cc:825
Bitfield< 5, 3 > reg
Definition: types.hh:89
Tick read(PacketPtr pkt) override
Pure virtual function that the device must implement.
Definition: gic.cc:234
void clearPPInt(uint32_t num, uint32_t cpu) override
Definition: gic.cc:281
virtual uint32_t readDistributor(ContextID ctx, Addr daddr)=0
Addr start() const
Get the start address of the range.
Definition: addr_range.hh:227
void fromKvmToPl390()
Definition: gic.cc:436
DrainState
Object drain/handover states.
Definition: drain.hh:71
void copyDistRange(BaseGicRegisters *from, BaseGicRegisters *to, Addr daddr, size_t size)
Definition: gic.cc:341
static const AddrRange GICD_ITARGETSR
Definition: gic_pl390.hh:82
#define panic(...)
Definition: misc.hh:153
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: gic.cc:221
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: gic_pl390.cc:869
uint32_t itLines
Number of itLines enabled.
Definition: gic_pl390.hh:160
void loadState(CheckpointIn &cp) override
loadState() is called on each SimObject when restoring from a checkpoint.
Definition: gic.cc:183
Bitfield< 8 > a
Definition: miscregs.hh:1377
int _numContexts
Definition: system.hh:200
long contextIdToVCpuId(ContextID ctx) const
Get the VCPUID for a given context.
Definition: vm.cc:540
static const AddrRange GICD_ISACTIVER
Definition: gic_pl390.hh:79
void sendPPInt(uint32_t num, uint32_t cpu) override
Interface call for private peripheral interrupts.
Definition: gic.cc:272
Bitfield< 23, 0 > offset
Definition: types.hh:149
Tick read(PacketPtr pkt) override
A PIO read to the device, immediately split up into readDistributor() or readCpu() ...
Definition: gic_pl390.cc:99
static const AddrRange GICD_ISENABLER
Definition: gic_pl390.hh:75
static const AddrRange GICD_ISPENDR
Definition: gic_pl390.hh:77
void setIntState(unsigned type, unsigned vcpu, unsigned irq, bool high)
Update the kernel's VGIC interrupt state.
Definition: gic.cc:94
static const AddrRange GICD_ICACTIVER
Definition: gic_pl390.hh:80
void clearPPInt(uint32_t num, uint32_t cpu) override
Definition: gic_pl390.cc:831
void setIRQLine(uint32_t irq, bool high)
Set the status of an IRQ line using KVM_IRQ_LINE.
Definition: vm.cc:502
bool usingKvm
Definition: gic.hh:208
Bitfield< 63 > val
Definition: misc.hh:770
const char data[]
Definition: circlebuf.cc:43
void getAttrPtr(uint32_t group, uint64_t attr, void *data) const
Definition: device.cc:62
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition: gic.cc:228
bool validKvmEnvironment() const
Verify gem5 configuration will support KVM emulation.
Definition: gic.cc:291
void clearDistRange(BaseGicRegisters *to, Addr daddr, size_t size)
Definition: gic.cc:349
system
Definition: isa.cc:226
~MuxingKvmGic()
Definition: gic.cc:178
Tick write(PacketPtr pkt) override
Pure virtual function that the device must implement.
Definition: gic.cc:243
void sendInt(uint32_t number) override
Post an interrupt from a device that is connected to the GIC.
Definition: gic_pl390.cc:802
uint64_t Tick
Tick count type.
Definition: types.hh:63
void copyCpuRegister(BaseGicRegisters *from, BaseGicRegisters *to, ContextID ctx, Addr daddr)
Definition: gic.cc:314
void clearBankedDistRange(BaseGicRegisters *to, Addr daddr, size_t size)
Definition: gic.cc:332
KvmVM * getKvmVM()
Get a pointer to the Kernel Virtual Machine (KVM) SimObject, if present.
Definition: system.hh:261
std::vector< ThreadContext * > threadContexts
Definition: system.hh:199
static const AddrRange GICD_ICPENDR
Definition: gic_pl390.hh:78
DrainState drain() override
Notify an object that it needs to drain its state.
Definition: gic.cc:198
void copyBankedDistRange(BaseGicRegisters *from, BaseGicRegisters *to, Addr daddr, size_t size)
Definition: gic.cc:323
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:142
DrainState drain() override
Notify an object that it needs to drain its state.
Definition: gic_pl390.cc:859
void clearPPI(unsigned vcpu, unsigned ppi)
Clear a private peripheral interrupt.
Definition: gic.cc:88
A Packet is used to encapsulate a transfer between two objects in the memory system (e...
Definition: packet.hh:245
virtual void writeDistributor(ContextID ctx, Addr daddr, uint32_t data)=0
void copyDistRegister(BaseGicRegisters *from, BaseGicRegisters *to, ContextID ctx, Addr daddr)
Definition: gic.cc:305
uint8_t cpuPriority[CPU_MAX]
CPU priority.
Definition: gic_pl390.hh:283
KvmKernelGicV2 * kernelGic
Kernel GIC device.
Definition: gic.hh:205
void startup() override
startup() is the final initialization call before simulation.
Definition: gic.cc:189
void writeCpu(ContextID ctx, Addr daddr, uint32_t data) override
Definition: gic.cc:158
type
Definition: misc.hh:728
KVM VM container.
Definition: vm.hh:291
int size()
Definition: pagetable.hh:146
Bitfield< 1 > irq
Definition: miscregs.hh:1520
KVM in-kernel GIC abstraction.
Definition: gic.hh:57
std::ostream CheckpointOut
Definition: serialize.hh:67
KvmVM & vm
KVM VM in the parent system.
Definition: gic.hh:162
virtual ~KvmKernelGicV2()
Definition: gic.cc:65
static const AddrRange GICD_ICFGR
Definition: gic_pl390.hh:83
virtual void drainResume()
Resume execution after a successful drain.
Definition: drain.hh:257
static const AddrRange GICD_IPRIORITYR
Definition: gic_pl390.hh:81
virtual void writeCpu(ContextID ctx, Addr daddr, uint32_t data)=0
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition: gic_pl390.cc:912
void drainResume() override
Resume execution after a successful drain.
Definition: gic.cc:206
static const AddrRange GICD_ICENABLER
Definition: gic_pl390.hh:76
void copyGicState(BaseGicRegisters *from, BaseGicRegisters *to)
Definition: gic.cc:357
KvmDevice kdev
Kernel interface to the GIC.
Definition: gic.hh:165
KvmKernelGicV2(KvmVM &vm, Addr cpu_addr, Addr dist_addr, unsigned it_lines)
Instantiate a KVM in-kernel GIC model.
Definition: gic.cc:50
void setSPI(unsigned spi)
Raise a shared peripheral interrupt.
Definition: gic.cc:70
void setGicReg(unsigned group, unsigned vcpu, unsigned offset, unsigned value)
Set value of GIC register "from" a cpu.
Definition: gic.cc:123
void sendPPInt(uint32_t num, uint32_t cpu) override
Interface call for private peripheral interrupts.
Definition: gic_pl390.cc:816
void setAttr(uint32_t group, uint64_t attr, const T &data) const
Get the value of an attribute.
Definition: device.hh:94
void clearSPI(unsigned spi)
Clear a shared peripheral interrupt.
Definition: gic.cc:76
Bitfield< 0 > vm
Definition: miscregs.hh:1482
void clearInt(uint32_t num) override
Clear an interrupt from a device that is connected to the GIC.
Definition: gic.cc:262
Bitfield< 0 > p
MuxingKvmGic(const MuxingKvmGicParams *p)
Definition: gic.cc:166
int ContextID
Globally unique thread context ID.
Definition: types.hh:175
uint32_t readDistributor(ContextID ctx, Addr daddr) override
BaseGicRegisters interface.
Definition: gic.cc:137
uint32_t readCpu(ContextID ctx, Addr daddr) override
Definition: gic.cc:144
virtual void loadState(CheckpointIn &cp)
loadState() is called on each SimObject when restoring from a checkpoint.
Definition: sim_object.cc:79
virtual void startup()
startup() is the final initialization call before simulation.
Definition: sim_object.cc:97

Generated on Fri Jun 9 2017 13:03:39 for gem5 by doxygen 1.8.6