summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arch/arm/kvm/armv8_cpu.cc21
-rw-r--r--src/dev/arm/generic_timer.cc10
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) {