[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC] [PATCH 1/3] arm: API to check if the register is inva
From: |
mjaggi |
Subject: |
[Qemu-devel] [RFC] [PATCH 1/3] arm: API to check if the register is invariant |
Date: |
Thu, 27 Sep 2018 01:13:51 +0000 |
From: Manish Jaggi <address@hidden>
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 <address@hidden>
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
*
--
1.8.3.1