diff options
-rw-r--r-- | src/arch/arm/kvm/armv8_cpu.cc | 21 | ||||
-rw-r--r-- | src/dev/arm/generic_timer.cc | 10 |
2 files changed, 18 insertions, 13 deletions
diff --git a/src/arch/arm/kvm/armv8_cpu.cc b/src/arch/arm/kvm/armv8_cpu.cc index db2b9c07a..209f49efa 100644 --- a/src/arch/arm/kvm/armv8_cpu.cc +++ b/src/arch/arm/kvm/armv8_cpu.cc @@ -260,7 +260,17 @@ ArmV8KvmCPU::updateKvmState() } for (const auto &ri : getSysRegMap()) { - const uint64_t value(tc->readMiscReg(ri.idx)); + uint64_t value; + if (ri.is_device) { + // This system register is backed by a device. This means + // we need to lock the device event queue. + EventQueue::ScopedMigration migrate(deviceEventQueue()); + + value = tc->readMiscReg(ri.idx); + } else { + value = tc->readMiscReg(ri.idx); + } + DPRINTF(KvmContext, " %s := 0x%x\n", ri.name, value); setOneReg(ri.kvm, value); } @@ -323,10 +333,15 @@ ArmV8KvmCPU::updateThreadContext() for (const auto &ri : getSysRegMap()) { const auto value(getOneRegU64(ri.kvm)); DPRINTF(KvmContext, " %s := 0x%x\n", ri.name, value); - if (ri.is_device) + if (ri.is_device) { + // This system register is backed by a device. This means + // we need to lock the device event queue. + EventQueue::ScopedMigration migrate(deviceEventQueue()); + tc->setMiscReg(ri.idx, value); - else + } else { tc->setMiscRegNoEffect(ri.idx, value); + } } PCState pc(getOneRegU64(INT_REG(regs.pc))); diff --git a/src/dev/arm/generic_timer.cc b/src/dev/arm/generic_timer.cc index 6332b8f4d..350867488 100644 --- a/src/dev/arm/generic_timer.cc +++ b/src/dev/arm/generic_timer.cc @@ -318,11 +318,6 @@ GenericTimer::createTimers(unsigned cpus) void GenericTimer::setMiscReg(int reg, unsigned cpu, MiscReg val) { - // This method might have been called from another context if we - // are running in multi-core KVM. Migrate to the SimObject's event - // queue to prevent surprising race conditions. - EventQueue::ScopedMigration migrate(eventQueue()); - CoreTimers &core(getTimers(cpu)); switch (reg) { @@ -415,11 +410,6 @@ GenericTimer::setMiscReg(int reg, unsigned cpu, MiscReg val) MiscReg GenericTimer::readMiscReg(int reg, unsigned cpu) { - // This method might have been called from another context if we - // are running in multi-core KVM. Migrate to the SimObject's event - // queue to prevent surprising race conditions. - EventQueue::ScopedMigration migrate(eventQueue()); - CoreTimers &core(getTimers(cpu)); switch (reg) { |