diff mbox series

[RFC,1/3] arm: API to check if the register is invariant

Message ID b53a4f2ab3c77ae0485391fbc4d4c2e76a14bb42.1537868529.git.manish.jaggi@cavium.com
State New
Headers show
Series qemu: arm: Migration between machines with different MIDR values | expand

Commit Message

Manish Jaggi Sept. 27, 2018, 1:13 a.m. UTC
From: Manish Jaggi <manish.jaggi@cavium.com>

kvm_arm_is_invariant is added to return true if the register
is invariant. This patch also adds an array invariant_sys_regs
which is lookedup for invaraint register ids.

Currently this patch checks for only MIDR invaraint register.

Signed-off-by: Manish Jaggi <manish.jaggi@cavium.com>
diff mbox series

Patch

diff --git a/target/arm/kvm32.c b/target/arm/kvm32.c
index 4e91c11..35a0c38 100644
--- a/target/arm/kvm32.c
+++ b/target/arm/kvm32.c
@@ -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;
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
index e0b8246..edaf2de 100644
--- a/target/arm/kvm64.c
+++ b/target/arm/kvm64.c
@@ -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
diff --git a/target/arm/kvm_arm.h b/target/arm/kvm_arm.h
index 863f205..a834f60 100644
--- a/target/arm/kvm_arm.h
+++ b/target/arm/kvm_arm.h
@@ -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
  *