gem5  v22.1.0.0
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 
48 namespace gem5
49 {
50 
51 using 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.
55 constexpr static unsigned NUM_XREGS = int_reg::NumArchRegs - 1;
56 static_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.
60 constexpr static unsigned NUM_QREGS = NumVecV8ArchRegs;
61 static_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 
76 constexpr uint64_t
77 kvmXReg(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 
83 constexpr uint64_t
84 kvmFPReg(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 
90 union KvmFPReg
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 
125 const std::set<MiscRegIndex> ArmV8KvmCPU::deviceRegSet = {
129 };
130 
133 };
134 
135 ArmV8KvmCPU::ArmV8KvmCPU(const ArmV8KvmCPUParams &params)
136  : BaseArmKvmCPU(params)
137 {
138 }
139 
141 {
142 }
143 
144 void
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 
157 void
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 
224 void
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) {
261  KvmFPReg reg;
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 
294 void
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) {
337  KvmFPReg reg;
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] ||
402  info[MISCREG_MON_NS0_WR] || info[MISCREG_MON_NS1_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:186
const char data[]
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:872
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:889
EventQueue * deviceEventQueue()
Get a pointer to the event queue owning devices.
Definition: base.hh:447
void setOneReg(uint64_t id, const void *addr)
Get/Set single register using the KVM_(SET|GET)_ONE_REG API.
Definition: base.cc:855
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:107
virtual void * getWritableReg(const RegId &reg)=0
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 const PCStateBase & pcState() const =0
virtual void setReg(const RegId &reg, RegVal val)
Vector Register Abstraction This generic class is the model in a particularization of MVC,...
Definition: vec_reg.hh:124
VecElem * as()
View interposers.
Definition: vec_reg.hh:189
STL vector class.
Definition: stl.hh:37
#define inform(...)
Definition: logging.hh:247
constexpr RegId V
Definition: cc.hh:75
constexpr RegId C
Definition: cc.hh:74
constexpr RegId Ge
Definition: cc.hh:76
constexpr RegId Nz
Definition: cc.hh:73
constexpr RegId Sp0
Definition: int.hh:233
constexpr RegId Sp1
Definition: int.hh:234
constexpr RegClass flatIntRegClass
Definition: int.hh:178
const int NumVecV8ArchRegs
Definition: vec.hh:80
void syncVecRegsToElems(ThreadContext *tc)
Definition: utility.cc:1327
Bitfield< 4 > s
Definition: misc_types.hh:568
MiscRegIndex decodeAArch64SysReg(unsigned op0, unsigned op1, unsigned crn, unsigned crm, unsigned op2)
Definition: misc.cc:1975
Bitfield< 7 > i
Definition: misc_types.hh:67
Bitfield< 33 > id
Definition: misc_types.hh:257
constexpr RegClass intRegClass
Definition: int.hh:173
MiscRegIndex
Definition: misc.hh:64
@ MISCREG_CNTV_CTL_EL0
Definition: misc.hh:764
@ MISCREG_MPIDR_EL1
Definition: misc.hh:545
@ MISCREG_FPSR
Definition: misc.hh:627
@ MISCREG_SPSR_UND
Definition: misc.hh:73
@ MISCREG_SPSR_IRQ
Definition: misc.hh:68
@ MISCREG_SPSR_ABT
Definition: misc.hh:71
@ MISCREG_CPSR
Definition: misc.hh:65
@ MISCREG_FPCR
Definition: misc.hh:626
@ MISCREG_CNTKCTL_EL1
Definition: misc.hh:773
@ MISCREG_SPSR_EL1
Definition: misc.hh:617
@ MISCREG_ELR_EL1
Definition: misc.hh:619
@ MISCREG_SPSR_FIQ
Definition: misc.hh:67
@ MISCREG_CNTV_CVAL_EL0
Definition: misc.hh:765
void syncVecElemsToRegs(ThreadContext *tc)
Definition: utility.cc:1339
@ MISCREG_PRI_NS_WR
Definition: misc.hh:1131
@ MISCREG_PRI_S_WR
Definition: misc.hh:1133
@ MISCREG_WARN_NOT_FAIL
Definition: misc.hh:1108
@ MISCREG_MON_NS1_WR
Definition: misc.hh:1144
@ MISCREG_HYP_NS_WR
Definition: misc.hh:1136
@ MISCREG_IMPLEMENTED
Definition: misc.hh:1105
@ MISCREG_USR_NS_WR
Definition: misc.hh:1126
@ MISCREG_USR_S_WR
Definition: misc.hh:1128
@ MISCREG_MON_NS0_WR
Definition: misc.hh:1141
const char *const miscRegName[]
Definition: misc.hh:1697
bool inAArch64(ThreadContext *tc)
Definition: utility.cc:117
Bitfield< 9 > d
Definition: misc_types.hh:64
std::vector< struct MiscRegLUTEntry > lookUpMiscReg(NUM_MISCREGS)
Definition: misc.hh:1576
Bitfield< 24 > j
Definition: misc_types.hh:57
constexpr RegClass vecRegClass
Definition: vec.hh:101
uint32_t VecElem
Definition: vec.hh:63
Bitfield< 4 > pc
Bitfield< 1 > ri
Definition: misc.hh:125
Bitfield< 4 > x
Definition: pagetable.hh:61
Bitfield< 0 > v
Definition: pagetable.hh:65
Bitfield< 5, 3 > reg
Definition: types.hh:92
Bitfield< 63 > val
Definition: misc.hh:776
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
constexpr uint64_t kvmFPReg(const int num)
Definition: armv8_cpu.cc:84
constexpr static unsigned NUM_XREGS
Definition: armv8_cpu.cc:55
constexpr uint64_t kvmXReg(const int num)
Definition: armv8_cpu.cc:77
constexpr static unsigned NUM_QREGS
Definition: armv8_cpu.cc:60
uint64_t i
Definition: armv8_cpu.cc:100
uint32_t i
Definition: armv8_cpu.cc:94

Generated on Wed Dec 21 2022 10:22:26 for gem5 by doxygen 1.9.1