gem5 v24.0.0.0
Loading...
Searching...
No Matches
armv8_cpu.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2015, 2017, 2019 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
39
40#include <linux/kvm.h>
41
42#include "arch/arm/regs/int.hh"
43#include "arch/arm/regs/vec.hh"
44#include "arch/arm/utility.hh"
45#include "debug/KvmContext.hh"
46#include "params/ArmV8KvmCPU.hh"
47
48namespace gem5
49{
50
51using namespace ArmISA;
52
53// Unlike gem5, kvm doesn't count the SP as a normal integer register,
54// which means we only have 31 normal integer registers.
55constexpr static unsigned NUM_XREGS = int_reg::NumArchRegs - 1;
56static_assert(NUM_XREGS == 31, "Unexpected number of aarch64 int. regs.");
57
58// The KVM interface accesses vector registers of 4 single precision
59// floats instead of individual registers.
60constexpr static unsigned NUM_QREGS = NumVecV8ArchRegs;
61static_assert(NUM_QREGS == 32, "Unexpected number of aarch64 vector regs.");
62
63#define EXTRACT_FIELD(v, name) \
64 (((v) & name ## _MASK) >> name ## _SHIFT)
65
66#define CORE_REG(name, size) \
67 (KVM_REG_ARM64 | KVM_REG_ARM_CORE | \
68 KVM_REG_SIZE_ ## size | \
69 KVM_REG_ARM_CORE_REG(name))
70
71#define INT_REG(name) CORE_REG(name, U64)
72#define SIMD_REG(name) CORE_REG(name, U128)
73
74#define SYS_MPIDR_EL1 ARM64_SYS_REG(0b11, 0b000, 0b0000, 0b0000, 0b101)
75
76constexpr uint64_t
77kvmXReg(const int num)
78{
79 return INT_REG(regs.regs[0]) +
80 (INT_REG(regs.regs[1]) - INT_REG(regs.regs[0])) * num;
81}
82
83constexpr uint64_t
84kvmFPReg(const int num)
85{
86 return SIMD_REG(fp_regs.vregs[0]) +
87 (SIMD_REG(fp_regs.vregs[1]) - SIMD_REG(fp_regs.vregs[0])) * num;
88}
89
91{
92 union
93 {
94 uint32_t i;
95 float f;
96 } s[4];
97
98 union
99 {
100 uint64_t i;
101 double f;
102 } d[2];
103
104 uint8_t data[32];
105};
106
107#define FP_REGS_PER_VFP_REG 4
108
110 { INT_REG(regs.sp), int_reg::Sp0, "SP(EL0)" },
111 { INT_REG(sp_el1), int_reg::Sp1, "SP(EL1)" },
112};
113
115 MiscRegInfo(INT_REG(elr_el1), MISCREG_ELR_EL1, "ELR(EL1)"),
116 MiscRegInfo(INT_REG(spsr[KVM_SPSR_EL1]), MISCREG_SPSR_EL1, "SPSR(EL1)"),
117 MiscRegInfo(INT_REG(spsr[KVM_SPSR_ABT]), MISCREG_SPSR_ABT, "SPSR(ABT)"),
118 MiscRegInfo(INT_REG(spsr[KVM_SPSR_UND]), MISCREG_SPSR_UND, "SPSR(UND)"),
119 MiscRegInfo(INT_REG(spsr[KVM_SPSR_IRQ]), MISCREG_SPSR_IRQ, "SPSR(IRQ)"),
120 MiscRegInfo(INT_REG(spsr[KVM_SPSR_FIQ]), MISCREG_SPSR_FIQ, "SPSR(FIQ)"),
121 MiscRegInfo(CORE_REG(fp_regs.fpsr, U32), MISCREG_FPSR, "FPSR"),
122 MiscRegInfo(CORE_REG(fp_regs.fpcr, U32), MISCREG_FPCR, "FPCR"),
123};
124
125const std::set<MiscRegIndex> ArmV8KvmCPU::deviceRegSet = {
129};
130
133};
134
135ArmV8KvmCPU::ArmV8KvmCPU(const ArmV8KvmCPUParams &params)
136 : BaseArmKvmCPU(params)
137{
138}
139
143
144void
146{
148
149 // Override ID registers that KVM should "inherit" from gem5.
150 for (const auto &ri : miscRegIdMap) {
151 const uint64_t value(tc->readMiscReg(ri.idx));
152 DPRINTF(KvmContext, " %s := 0x%x\n", ri.name, value);
153 setOneReg(ri.kvm, value);
154 }
155}
156
157void
159{
160 inform("Integer registers:\n");
161 inform(" PC: %s\n", getAndFormatOneReg(INT_REG(regs.pc)));
162 for (int i = 0; i < NUM_XREGS; ++i)
163 inform(" X%i: %s\n", i, getAndFormatOneReg(kvmXReg(i)));
164
165 for (int i = 0; i < NUM_QREGS; ++i)
166 inform(" Q%i: %s\n", i, getAndFormatOneReg(kvmFPReg(i)));
167
168 for (const auto &ri : intRegMap)
169 inform(" %s: %s\n", ri.name, getAndFormatOneReg(ri.kvm));
170
171 inform(" %s: %s\n", "PSTATE", getAndFormatOneReg(INT_REG(regs.pstate)));
172
173 for (const auto &ri : miscRegMap)
174 inform(" %s: %s\n", ri.name, getAndFormatOneReg(ri.kvm));
175
176 for (const auto &ri : miscRegIdMap)
177 inform(" %s: %s\n", ri.name, getAndFormatOneReg(ri.kvm));
178
179 for (const auto &reg : getRegList()) {
180 const uint64_t arch(reg & KVM_REG_ARCH_MASK);
181 if (arch != KVM_REG_ARM64) {
182 inform("0x%x: %s\n", reg, getAndFormatOneReg(reg));
183 continue;
184 }
185
186 const uint64_t type(reg & KVM_REG_ARM_COPROC_MASK);
187 switch (type) {
188 case KVM_REG_ARM_CORE:
189 // These have already been printed
190 break;
191
192 case KVM_REG_ARM64_SYSREG: {
193 const uint64_t op0(EXTRACT_FIELD(reg, KVM_REG_ARM64_SYSREG_OP0));
194 const uint64_t op1(EXTRACT_FIELD(reg, KVM_REG_ARM64_SYSREG_OP1));
195 const uint64_t crn(EXTRACT_FIELD(reg, KVM_REG_ARM64_SYSREG_CRN));
196 const uint64_t crm(EXTRACT_FIELD(reg, KVM_REG_ARM64_SYSREG_CRM));
197 const uint64_t op2(EXTRACT_FIELD(reg, KVM_REG_ARM64_SYSREG_OP2));
198 const MiscRegIndex idx(
199 decodeAArch64SysReg(op0, op1, crn, crm, op2));
200
201 inform(" %s (op0: %i, op1: %i, crn: %i, crm: %i, op2: %i): %s",
202 miscRegName[idx], op0, op1, crn, crm, op2,
204 } break;
205
206 case KVM_REG_ARM_DEMUX: {
207 const uint64_t id(EXTRACT_FIELD(reg, KVM_REG_ARM_DEMUX_ID));
208 const uint64_t val(EXTRACT_FIELD(reg, KVM_REG_ARM_DEMUX_VAL));
209 if (id == KVM_REG_ARM_DEMUX_ID_CCSIDR) {
210 inform(" CSSIDR[%i]: %s\n", val,
212 } else {
213 inform(" UNKNOWN[%i:%i]: %s\n", id, val,
215 }
216 } break;
217
218 default:
219 inform("0x%x: %s\n", reg, getAndFormatOneReg(reg));
220 }
221 }
222}
223
224void
226{
227 DPRINTF(KvmContext, "In updateKvmState():\n");
228
229 // update pstate register state
230 CPSR cpsr(tc->readMiscReg(MISCREG_CPSR));
231 cpsr.nz = tc->getReg(cc_reg::Nz);
232 cpsr.c = tc->getReg(cc_reg::C);
233 cpsr.v = tc->getReg(cc_reg::V);
234 if (cpsr.width) {
235 cpsr.ge = tc->getReg(cc_reg::Ge);
236 } else {
237 cpsr.ge = 0;
238 }
239 DPRINTF(KvmContext, " %s := 0x%x\n", "PSTATE", cpsr);
240 setOneReg(INT_REG(regs.pstate), static_cast<uint64_t>(cpsr));
241
242 for (const auto &ri : miscRegMap) {
243 const uint64_t value(tc->readMiscReg(ri.idx));
244 DPRINTF(KvmContext, " %s := 0x%x\n", ri.name, value);
245 setOneReg(ri.kvm, value);
246 }
247
248 for (int i = 0; i < NUM_XREGS; ++i) {
249 const uint64_t value = tc->getReg(int_reg::x(i));
250 DPRINTF(KvmContext, " X%i := 0x%x\n", i, value);
251 setOneReg(kvmXReg(i), value);
252 }
253
254 for (const auto &ri : intRegMap) {
255 const uint64_t value = tc->getReg(intRegClass[ri.idx]);
256 DPRINTF(KvmContext, " %s := 0x%x\n", ri.name, value);
257 setOneReg(ri.kvm, value);
258 }
259
260 for (int i = 0; i < NUM_QREGS; ++i) {
262 if (!inAArch64(tc))
265 tc->getReg(vecRegClass[i], &vc);
266 auto v = vc.as<VecElem>();
267 for (int j = 0; j < FP_REGS_PER_VFP_REG; j++)
268 reg.s[j].i = v[j];
269
270 setOneReg(kvmFPReg(i), reg.data);
271 DPRINTF(KvmContext, " Q%i: %s\n", i, getAndFormatOneReg(kvmFPReg(i)));
272 }
273
274 for (const auto &ri : getSysRegMap()) {
275 uint64_t value;
276 if (ri.is_device) {
277 // This system register is backed by a device. This means
278 // we need to lock the device event queue.
280
281 value = tc->readMiscReg(ri.idx);
282 } else {
283 value = tc->readMiscReg(ri.idx);
284 }
285
286 DPRINTF(KvmContext, " %s := 0x%x\n", ri.name, value);
287 setOneReg(ri.kvm, value);
288 }
289
290 setOneReg(INT_REG(regs.pc), tc->pcState().instAddr());
291 DPRINTF(KvmContext, " PC := 0x%x\n", tc->pcState().instAddr());
292}
293
294void
296{
297 DPRINTF(KvmContext, "In updateThreadContext():\n");
298
299 // Update pstate thread context
300 const CPSR cpsr(getOneRegU64(INT_REG(regs.pstate)));
301 DPRINTF(KvmContext, " %s := 0x%x\n", "PSTATE", cpsr);
303 tc->setReg(cc_reg::Nz, cpsr.nz);
304 tc->setReg(cc_reg::C, cpsr.c);
305 tc->setReg(cc_reg::V, cpsr.v);
306 if (cpsr.width) {
307 tc->setReg(cc_reg::Ge, cpsr.ge);
308 }
309
310 // Update core misc regs first as they
311 // affect how other registers are mapped.
312 for (const auto &ri : miscRegMap) {
313 const auto value(getOneRegU64(ri.kvm));
314 DPRINTF(KvmContext, " %s := 0x%x\n", ri.name, value);
315 tc->setMiscRegNoEffect(ri.idx, value);
316 }
317
318 for (int i = 0; i < NUM_XREGS; ++i) {
319 const auto value(getOneRegU64(kvmXReg(i)));
320 DPRINTF(KvmContext, " X%i := 0x%x\n", i, value);
321 // KVM64 returns registers in 64-bit layout. If we are in aarch32
322 // mode, we need to map these to banked ARM32 registers.
323 if (inAArch64(tc)) {
324 tc->setReg(int_reg::x(i), value);
325 } else {
326 tc->setReg(flatIntRegClass[i], value);
327 }
328 }
329
330 for (const auto &ri : intRegMap) {
331 const auto value(getOneRegU64(ri.kvm));
332 DPRINTF(KvmContext, " %s := 0x%x\n", ri.name, value);
333 tc->setReg(intRegClass[ri.idx], value);
334 }
335
336 for (int i = 0; i < NUM_QREGS; ++i) {
338 DPRINTF(KvmContext, " Q%i: %s\n", i, getAndFormatOneReg(kvmFPReg(i)));
339 getOneReg(kvmFPReg(i), reg.data);
340 auto *vc = static_cast<ArmISA::VecRegContainer *>(
342 auto v = vc->as<VecElem>();
343 for (int j = 0; j < FP_REGS_PER_VFP_REG; j++)
344 v[j] = reg.s[j].i;
345 if (!inAArch64(tc))
347 }
348
349 for (const auto &ri : getSysRegMap()) {
350 const auto value(getOneRegU64(ri.kvm));
351 DPRINTF(KvmContext, " %s := 0x%x\n", ri.name, value);
352 if (ri.is_device) {
353 // This system register is backed by a device. This means
354 // we need to lock the device event queue.
356
357 tc->setMiscReg(ri.idx, value);
358 } else {
359 tc->setMiscRegNoEffect(ri.idx, value);
360 }
361 }
362
363 PCState pc(getOneRegU64(INT_REG(regs.pc)));
364 pc.aarch64(inAArch64(tc));
365 pc.thumb(cpsr.t);
366 pc.nextAArch64(inAArch64(tc));
367 // TODO: This is a massive assumption that will break when
368 // switching to thumb.
369 pc.nextThumb(cpsr.t);
370 DPRINTF(KvmContext, " PC := 0x%x (t: %i, a64: %i)\n",
371 pc.instAddr(), pc.thumb(), pc.aarch64());
372 tc->pcState(pc);
373}
374
377{
378 // Try to use the cached map
379 if (!sysRegMap.empty())
380 return sysRegMap;
381
382 for (const auto &reg : getRegList()) {
383 const uint64_t arch(reg & KVM_REG_ARCH_MASK);
384 if (arch != KVM_REG_ARM64)
385 continue;
386
387 const uint64_t type(reg & KVM_REG_ARM_COPROC_MASK);
388 if (type != KVM_REG_ARM64_SYSREG)
389 continue;
390
391 const uint64_t op0(EXTRACT_FIELD(reg, KVM_REG_ARM64_SYSREG_OP0));
392 const uint64_t op1(EXTRACT_FIELD(reg, KVM_REG_ARM64_SYSREG_OP1));
393 const uint64_t crn(EXTRACT_FIELD(reg, KVM_REG_ARM64_SYSREG_CRN));
394 const uint64_t crm(EXTRACT_FIELD(reg, KVM_REG_ARM64_SYSREG_CRM));
395 const uint64_t op2(EXTRACT_FIELD(reg, KVM_REG_ARM64_SYSREG_OP2));
396 const MiscRegIndex idx(decodeAArch64SysReg(op0, op1, crn, crm, op2));
397 const auto &info(lookUpMiscReg[idx].info);
398 const bool writeable(
399 info[MISCREG_USR_NS_WR] || info[MISCREG_USR_S_WR] ||
400 info[MISCREG_PRI_S_WR] || info[MISCREG_PRI_NS_WR] ||
401 info[MISCREG_HYP_NS_WR] ||
403 const bool implemented(
405
406 // Only add implemented registers that we are going to be able
407 // to write.
408 if (implemented && writeable)
409 sysRegMap.emplace_back(reg, idx, miscRegName[idx],
410 deviceRegSet.find(idx) != deviceRegSet.end());
411 }
412
413 return sysRegMap;
414}
415
416} // namespace gem5
#define INT_REG(name)
Definition armv8_cpu.cc:71
#define CORE_REG(name, size)
Definition armv8_cpu.cc:66
#define FP_REGS_PER_VFP_REG
Definition armv8_cpu.cc:107
#define EXTRACT_FIELD(v, name)
Definition armv8_cpu.cc:63
#define SYS_MPIDR_EL1
Definition armv8_cpu.cc:74
#define SIMD_REG(name)
Definition armv8_cpu.cc:72
#define DPRINTF(x,...)
Definition trace.hh:210
void updateKvmState() override
Update the KVM state from the current thread context.
Definition armv8_cpu.cc:225
static const std::set< ArmISA::MiscRegIndex > deviceRegSet
Device registers (needing "effectful" MiscReg writes)
Definition armv8_cpu.hh:145
void dump() const override
Dump the internal state to the terminal.
Definition armv8_cpu.cc:158
ArmV8KvmCPU(const ArmV8KvmCPUParams &params)
Definition armv8_cpu.cc:135
static const std::vector< ArmV8KvmCPU::IntRegInfo > intRegMap
Mapping between gem5 integer registers and integer registers in kvm.
Definition armv8_cpu.hh:141
static const std::vector< ArmV8KvmCPU::MiscRegInfo > miscRegMap
Mapping between gem5 misc registers and registers in kvm.
Definition armv8_cpu.hh:143
const std::vector< ArmV8KvmCPU::MiscRegInfo > & getSysRegMap() const
Get a map between system registers in kvm and gem5 registers.
Definition armv8_cpu.cc:376
void startup() override
startup() is the final initialization call before simulation.
Definition armv8_cpu.cc:145
std::vector< ArmV8KvmCPU::MiscRegInfo > sysRegMap
Cached mapping between system registers in kvm and misc regs in gem5.
Definition armv8_cpu.hh:150
virtual ~ArmV8KvmCPU()
Definition armv8_cpu.cc:140
static const std::vector< ArmV8KvmCPU::MiscRegInfo > miscRegIdMap
Mapping between gem5 ID misc registers and registers in kvm.
Definition armv8_cpu.hh:147
void updateThreadContext() override
Update the current thread context with the KVM state.
Definition armv8_cpu.cc:295
const RegIndexVector & getRegList() const
Get a list of registers supported by getOneReg() and setOneReg().
Definition base_cpu.cc:191
void startup() override
startup() is the final initialization call before simulation.
Definition base_cpu.cc:94
void getOneReg(uint64_t id, void *addr) const
Definition base.cc:902
uint64_t getOneRegU64(uint64_t id) const
Definition base.hh:390
std::string getAndFormatOneReg(uint64_t id) const
Get and format one register for printout.
Definition base.cc:919
void setOneReg(uint64_t id, const void *addr)
Get/Set single register using the KVM_(SET|GET)_ONE_REG API.
Definition base.cc:885
EventQueue * deviceEventQueue()
Get a pointer to the event queue owning devices.
Definition base.hh:447
ThreadContext * tc
ThreadContext object, provides an interface for external objects to modify this thread's state.
Definition base.hh:158
Addr instAddr() const
Returns the memory address of the instruction this PC points to.
Definition pcstate.hh:108
virtual RegVal readMiscReg(RegIndex misc_reg)=0
virtual void setMiscReg(RegIndex misc_reg, RegVal val)=0
virtual RegVal getReg(const RegId &reg) const
virtual void setMiscRegNoEffect(RegIndex misc_reg, RegVal val)=0
virtual void setReg(const RegId &reg, RegVal val)
virtual void * getWritableReg(const RegId &reg)=0
virtual const PCStateBase & pcState() const =0
Vector Register Abstraction This generic class is the model in a particularization of MVC,...
Definition vec_reg.hh:126
VecElem * as()
View interposers.
Definition vec_reg.hh:191
STL vector class.
Definition stl.hh:37
#define inform(...)
Definition logging.hh:257
constexpr RegId V
Definition cc.hh:96
constexpr RegId C
Definition cc.hh:95
constexpr RegId Ge
Definition cc.hh:97
constexpr RegId Nz
Definition cc.hh:94
constexpr RegId Sp0
Definition int.hh:233
static RegId x(unsigned index)
Definition int.hh:445
constexpr RegId Sp1
Definition int.hh:234
Bitfield< 28 > v
Definition misc_types.hh:54
constexpr RegClass flatIntRegClass
Definition int.hh:178
const int NumVecV8ArchRegs
Definition vec.hh:80
void syncVecRegsToElems(ThreadContext *tc)
Definition utility.cc:1334
MiscRegIndex decodeAArch64SysReg(unsigned op0, unsigned op1, unsigned crn, unsigned crm, unsigned op2)
Definition misc.cc:2749
Bitfield< 7 > i
Definition misc_types.hh:67
Bitfield< 33 > id
constexpr RegClass intRegClass
Definition int.hh:173
@ MISCREG_CNTV_CTL_EL0
Definition misc.hh:819
@ MISCREG_MPIDR_EL1
Definition misc.hh:546
@ MISCREG_FPSR
Definition misc.hh:636
@ MISCREG_SPSR_UND
Definition misc.hh:75
@ MISCREG_SPSR_IRQ
Definition misc.hh:70
@ MISCREG_SPSR_ABT
Definition misc.hh:73
@ MISCREG_CPSR
Definition misc.hh:67
@ MISCREG_FPCR
Definition misc.hh:635
@ MISCREG_CNTKCTL_EL1
Definition misc.hh:828
@ MISCREG_SPSR_EL1
Definition misc.hh:626
@ MISCREG_ELR_EL1
Definition misc.hh:628
@ MISCREG_SPSR_FIQ
Definition misc.hh:69
@ MISCREG_CNTV_CVAL_EL0
Definition misc.hh:820
void syncVecElemsToRegs(ThreadContext *tc)
Definition utility.cc:1346
@ MISCREG_PRI_NS_WR
Definition misc.hh:1230
@ MISCREG_PRI_S_WR
Definition misc.hh:1232
@ MISCREG_WARN_NOT_FAIL
Definition misc.hh:1207
@ MISCREG_MON_NS1_WR
Definition misc.hh:1243
@ MISCREG_HYP_NS_WR
Definition misc.hh:1235
@ MISCREG_IMPLEMENTED
Definition misc.hh:1203
@ MISCREG_USR_NS_WR
Definition misc.hh:1225
@ MISCREG_USR_S_WR
Definition misc.hh:1227
@ MISCREG_MON_NS0_WR
Definition misc.hh:1240
const char *const miscRegName[]
Definition misc.hh:1815
uint32_t VecElem
Definition vec.hh:63
bool inAArch64(ThreadContext *tc)
Definition utility.cc:126
std::vector< struct MiscRegLUTEntry > lookUpMiscReg(NUM_MISCREGS)
Definition misc.hh:1694
constexpr RegClass vecRegClass
Definition vec.hh:101
Bitfield< 4 > pc
Bitfield< 1 > ri
Definition misc.hh:125
Bitfield< 5, 3 > reg
Definition types.hh:92
Bitfield< 63 > val
Definition misc.hh:804
Copyright (c) 2024 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
Definition binary32.hh:36
static constexpr unsigned NUM_XREGS
Definition armv8_cpu.cc:55
constexpr uint64_t kvmFPReg(const int num)
Definition armv8_cpu.cc:84
constexpr uint64_t kvmXReg(const int num)
Definition armv8_cpu.cc:77
static constexpr unsigned NUM_QREGS
Definition armv8_cpu.cc:60
uint8_t data[32]
Definition armv8_cpu.cc:104
union gem5::KvmFPReg::@10 s[4]
union gem5::KvmFPReg::@11 d[2]

Generated on Tue Jun 18 2024 16:23:56 for gem5 by doxygen 1.11.0