summaryrefslogtreecommitdiff
path: root/src/arch/arm/kvm/armv8_cpu.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/arm/kvm/armv8_cpu.cc')
-rw-r--r--src/arch/arm/kvm/armv8_cpu.cc14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/arch/arm/kvm/armv8_cpu.cc b/src/arch/arm/kvm/armv8_cpu.cc
index 352fb2c80..db2b9c07a 100644
--- a/src/arch/arm/kvm/armv8_cpu.cc
+++ b/src/arch/arm/kvm/armv8_cpu.cc
@@ -114,6 +114,12 @@ const std::vector<ArmV8KvmCPU::MiscRegInfo> ArmV8KvmCPU::miscRegMap = {
MiscRegInfo(INT_REG(fp_regs.fpcr), MISCREG_FPCR, "FPCR"),
};
+const std::set<MiscRegIndex> ArmV8KvmCPU::deviceRegSet = {
+ MISCREG_CNTV_CTL_EL0,
+ MISCREG_CNTV_CVAL_EL0,
+ MISCREG_CNTKCTL_EL1,
+};
+
const std::vector<ArmV8KvmCPU::MiscRegInfo> ArmV8KvmCPU::miscRegIdMap = {
MiscRegInfo(SYS_MPIDR_EL1, MISCREG_MPIDR_EL1, "MPIDR(EL1)"),
};
@@ -317,7 +323,10 @@ ArmV8KvmCPU::updateThreadContext()
for (const auto &ri : getSysRegMap()) {
const auto value(getOneRegU64(ri.kvm));
DPRINTF(KvmContext, " %s := 0x%x\n", ri.name, value);
- tc->setMiscRegNoEffect(ri.idx, value);
+ if (ri.is_device)
+ tc->setMiscReg(ri.idx, value);
+ else
+ tc->setMiscRegNoEffect(ri.idx, value);
}
PCState pc(getOneRegU64(INT_REG(regs.pc)));
@@ -366,7 +375,8 @@ ArmV8KvmCPU::getSysRegMap() const
// Only add implemented registers that we are going to be able
// to write.
if (implemented && writeable)
- sysRegMap.emplace_back(reg, idx, miscRegName[idx]);
+ sysRegMap.emplace_back(reg, idx, miscRegName[idx],
+ deviceRegSet.find(idx) != deviceRegSet.end());
}
return sysRegMap;