Store the writable_map array in the CPU state and populate it in aarch64_host_initfn(). In case the retrieval fails we simply free and null the pointer: this will indicate that the writable_map is not usable in subsequent patches.
Signed-off-by: Eric Auger <[email protected]> --- target/arm/cpu.h | 3 +++ target/arm/cpu64.c | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/target/arm/cpu.h b/target/arm/cpu.h index a0a1d7fbe3..3558460333 100644 --- a/target/arm/cpu.h +++ b/target/arm/cpu.h @@ -1073,6 +1073,9 @@ struct ArchCPU { /* KVM steal time */ OnOffAuto kvm_steal_time; + /* ID reg writable bitmask */ + uint64_t *writable_map; + /* Uniprocessor system with MP extensions */ bool mp_is_up; diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c index a93ad2da5a..f2edbfc437 100644 --- a/target/arm/cpu64.c +++ b/target/arm/cpu64.c @@ -851,6 +851,7 @@ static void kvm_arm_set_cpreg_mig_tolerances(ARMCPU *cpu) static void aarch64_host_initfn(Object *obj) { ARMCPU *cpu = ARM_CPU(obj); + int ret; #if defined(CONFIG_NITRO) if (nitro_enabled()) { @@ -861,6 +862,14 @@ static void aarch64_host_initfn(Object *obj) #if defined(CONFIG_KVM) kvm_arm_set_cpreg_mig_tolerances(cpu); + + cpu->writable_map = g_new(uint64_t, KVM_ARM_FEATURE_ID_RANGE_SIZE); + + ret = kvm_arm_get_writable_id_regs(cpu->writable_map); + if (ret) { + g_free(cpu->writable_map); + cpu->writable_map = NULL; + } kvm_arm_set_cpu_features_from_host(cpu); aarch64_add_sve_properties(obj); #elif defined(CONFIG_HVF) -- 2.53.0
