diff options
Diffstat (limited to 'src/arch/arm/kvm/armv8_cpu.cc')
-rw-r--r-- | src/arch/arm/kvm/armv8_cpu.cc | 14 |
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; |