@@ -220,6 +220,11 @@ int kvm_arch_init_vcpu(CPUState *cs)
return kvm_arm_init_cpreg_list(cpu);
}
+bool kvm_arm_is_invariant(struct kvm_one_reg *r)
+{
+ return false;
+}
+
typedef struct Reg {
uint64_t id;
int offset;
@@ -491,6 +491,7 @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
return true;
}
+#define ARM_CPU_ID_MIDR 3, 0, 0, 0, 0
#define ARM_CPU_ID_MPIDR 3, 0, 0, 0, 5
int kvm_arch_init_vcpu(CPUState *cs)
@@ -549,6 +550,21 @@ int kvm_arch_init_vcpu(CPUState *cs)
return kvm_arm_init_cpreg_list(cpu);
}
+static uint64_t invariant_sys_regs[] = {
+ ARM64_SYS_REG(ARM_CPU_ID_MIDR),
+};
+
+bool kvm_arm_is_invariant(struct kvm_one_reg *r)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(invariant_sys_regs); i++)
+ if (invariant_sys_regs[i] == r->id)
+ return true;
+
+ return false;
+}
+
bool kvm_arm_reg_syncs_via_cpreg_list(uint64_t regidx)
{
/* Return true if the regidx is a register we should synchronize
@@ -61,6 +61,13 @@ void kvm_arm_register_device(MemoryRegion *mr, uint64_t devid, uint64_t group,
int kvm_arm_init_cpreg_list(ARMCPU *cpu);
/**
+ * kvm_arm_is_invariant
+ *
+ * Returns: true if r is invariant
+ */
+bool kvm_arm_is_invariant(struct kvm_one_reg *r);
+
+/**
* kvm_arm_reg_syncs_via_cpreg_list
* regidx: KVM register index
*