In case *_arm_host_cpu_features() fails, we currently
record that state in cpu->host_cpu_probe_failed to later
report the error on realize().

Replace the boolean by an error handle to allow
more precise error reports.

Signed-off-by: Eric Auger <[email protected]>
Suggested-by: Peter Maydell <[email protected]>
---
 target/arm/cpu.h           |  5 +++--
 target/arm/cpu.c           |  9 +++++----
 target/arm/hvf/hvf.c       |  3 ++-
 target/arm/kvm.c           | 24 +++++++++++-------------
 target/arm/whpx/whpx-all.c |  3 ++-
 5 files changed, 23 insertions(+), 21 deletions(-)

diff --git a/target/arm/cpu.h b/target/arm/cpu.h
index 5c5f551dac..dae79539b5 100644
--- a/target/arm/cpu.h
+++ b/target/arm/cpu.h
@@ -1075,10 +1075,11 @@ struct ArchCPU {
     /* Uniprocessor system with MP extensions */
     bool mp_is_up;
 
-    /* True if we tried kvm_arm_host_cpu_features() during CPU instance_init
+    /*
+     * Set if we tried *_set_cpu_features_from_host() during CPU instance_init
      * and the probe failed (so we need to report the error in realize)
      */
-    bool host_cpu_probe_failed;
+    Error *host_cpu_probe_err;
 
     /* QOM property to indicate we should use the back-compat CNTFRQ default */
     bool backcompat_cntfrq;
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index aba45b66f8..67d48ebc07 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -1838,12 +1838,13 @@ static void arm_cpu_realizefn(DeviceState *dev, Error 
**errp)
      * then it's possible that might have failed in the initfn, but
      * this is the first point where we can report it.
      */
-    if (cpu->host_cpu_probe_failed) {
+    if (cpu->host_cpu_probe_err) {
         if (!kvm_enabled() && !hvf_enabled() && !whpx_enabled()) {
-            error_setg(errp, "The 'host' CPU type can only be used with KVM, 
HVF or WHPX");
-        } else {
-            error_setg(errp, "Failed to retrieve host CPU features");
+            error_append_hint(&cpu->host_cpu_probe_err,
+                              "The 'host' CPU type can only be used with KVM, 
HVF or WHPX\n");
         }
+        error_propagate(errp, cpu->host_cpu_probe_err);
+        cpu->host_cpu_probe_err = NULL;
         return;
     }
 
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 4b947e9ba5..2f2a46644d 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -1287,7 +1287,8 @@ void hvf_arm_set_cpu_features_from_host(ARMCPU *cpu)
              * We can't report this error yet, so flag that we need to
              * in arm_cpu_realizefn().
              */
-            cpu->host_cpu_probe_failed = true;
+            error_setg(&cpu->host_cpu_probe_err,
+                       "failed to retrieve host CPU features");
             return;
         }
     }
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
index b4b20c5dc2..fc9551411e 100644
--- a/target/arm/kvm.c
+++ b/target/arm/kvm.c
@@ -312,7 +312,7 @@ static uint32_t kvm_arm_sve_get_vls(int fd)
     return vls[0] & MAKE_64BIT_MASK(0, ARM_MAX_VQ);
 }
 
-static void kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
+static bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
 {
     /* Identify the feature bits corresponding to the host CPU, and
      * fill out the ARMHostCPUClass fields accordingly. To do this
@@ -330,7 +330,7 @@ static void 
kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
     ahcf->dtb_compatible = "arm,armv8";
 
     if (!kvm_enabled()) {
-        return;
+        return false;
     }
 
     /*
@@ -372,7 +372,7 @@ static void 
kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
     }
 
     if (!kvm_arm_create_scratch_host_vcpu(fdarray, &init)) {
-        return;
+        return false;
     }
 
     int fd = fdarray[2];
@@ -502,7 +502,7 @@ static void 
kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
     kvm_arm_destroy_scratch_host_vcpu(fdarray);
 
     if (err < 0) {
-        return;
+        return false;
     }
 
     /*
@@ -521,27 +521,25 @@ static void 
kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
 
     ahcf->target = init.target;
     ahcf->features = features;
+    return true;
 }
 
 void kvm_arm_set_cpu_features_from_host(ARMCPU *cpu)
 {
     CPUARMState *env = &cpu->env;
+    static bool probe_ok;
 
     if (!arm_host_cpu_features.dtb_compatible) {
-        kvm_arm_get_host_cpu_features(&arm_host_cpu_features);
+        probe_ok = kvm_arm_get_host_cpu_features(&arm_host_cpu_features);
     }
 
-    cpu->kvm_target = arm_host_cpu_features.target;
-
-    if (cpu->kvm_target == QEMU_KVM_ARM_TARGET_NONE) {
-        /*
-         * We can't report this error yet, so flag that we need to
-         * in arm_cpu_realizefn().
-         */
-        cpu->host_cpu_probe_failed = true;
+    if (!probe_ok) {
+        error_setg(&cpu->host_cpu_probe_err,
+                   "failed to retrieve host CPU features");
         return;
     }
 
+    cpu->kvm_target = arm_host_cpu_features.target;
     cpu->dtb_compatible = arm_host_cpu_features.dtb_compatible;
     cpu->isar = arm_host_cpu_features.isar;
     cpu->sve_vq.supported = arm_host_cpu_features.sve_vq_supported;
diff --git a/target/arm/whpx/whpx-all.c b/target/arm/whpx/whpx-all.c
index 024d18df04..ded42c980b 100644
--- a/target/arm/whpx/whpx-all.c
+++ b/target/arm/whpx/whpx-all.c
@@ -767,7 +767,8 @@ void whpx_arm_set_cpu_features_from_host(ARMCPU *cpu)
              * We can't report this error yet, so flag that we need to
              * in arm_cpu_realizefn().
              */
-            cpu->host_cpu_probe_failed = true;
+            error_setg(&cpu->host_cpu_probe_err,
+                      "failed to retrieve host CPU features");
             return;
         }
     }
-- 
2.53.0


Reply via email to