Replace monitor_printf() error reporting with the standard **errp
pattern. Drop the Monitor *mon parameter and return bool to indicate
success, improving the function usage from non-HMP contexts. Update the
KVM MCE injection path and hmp_mce() accordingly.
Notes:
- we may want to print the error in KVM path too
- multiple error prints are now accumulated with error hints
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
target/i386/cpu.h | 4 ++--
target/i386/helper.c | 49 ++++++++++++++++++++++++++++---------------------
target/i386/kvm/kvm.c | 4 ++--
target/i386/monitor.c | 6 ++++--
4 files changed, 36 insertions(+), 27 deletions(-)
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
index bdd4fff89d6..da9f51b85b7 100644
--- a/target/i386/cpu.h
+++ b/target/i386/cpu.h
@@ -2842,9 +2842,9 @@ void do_cpu_init(X86CPU *cpu);
#define MCE_INJECT_BROADCAST 1
#define MCE_INJECT_UNCOND_AO 2
-void cpu_x86_inject_mce(Monitor *mon, X86CPU *cpu, int bank,
+bool cpu_x86_inject_mce(X86CPU *cpu, int bank,
uint64_t status, uint64_t mcg_status, uint64_t addr,
- uint64_t misc, int flags);
+ uint64_t misc, int flags, Error **errp);
uint32_t cpu_cc_compute_all(CPUX86State *env1);
diff --git a/target/i386/helper.c b/target/i386/helper.c
index 8cc73f619a9..03265c80b0a 100644
--- a/target/i386/helper.c
+++ b/target/i386/helper.c
@@ -18,6 +18,7 @@
*/
#include "qemu/osdep.h"
+#include "qapi/error.h"
#include "qapi/qapi-events-run-state.h"
#include "cpu.h"
#include "exec/cputlb.h"
@@ -27,7 +28,6 @@
#ifndef CONFIG_USER_ONLY
#include "system/hw_accel.h"
#include "system/memory.h"
-#include "monitor/monitor.h"
#include "kvm/kvm_i386.h"
#endif
#include "qemu/log.h"
@@ -377,7 +377,7 @@ out:
}
typedef struct MCEInjectionParams {
- Monitor *mon;
+ GString *err;
int bank;
uint64_t status;
uint64_t mcg_status;
@@ -424,9 +424,9 @@ static void do_inject_x86_mce(CPUState *cs, run_on_cpu_data data)
* reporting is disabled
*/
if ((cenv->mcg_cap & MCG_CTL_P) && cenv->mcg_ctl != ~(uint64_t)0) {
- monitor_printf(params->mon,
- "CPU %d: Uncorrected error reporting disabled\n",
- cs->cpu_index);
+ g_string_append_printf(params->err,
+ "CPU %d: Uncorrected error reporting disabled\n",
+ cs->cpu_index);
return;
}
@@ -435,10 +435,9 @@ static void do_inject_x86_mce(CPUState *cs, run_on_cpu_data data)
* reporting is disabled for the bank
*/
if (banks[0] != ~(uint64_t)0) {
- monitor_printf(params->mon,
- "CPU %d: Uncorrected error reporting disabled for"
- " bank %d\n",
- cs->cpu_index, params->bank);
+ g_string_append_printf(params->err,
+ "CPU %d: Uncorrected error reporting disabled for bank %d\n",
+ cs->cpu_index, params->bank);
return;
}
@@ -455,7 +454,7 @@ static void do_inject_x86_mce(CPUState *cs, run_on_cpu_data data)
if (need_reset) {
emit_guest_memory_failure(MEMORY_FAILURE_ACTION_RESET, ar,
recursive);
- monitor_printf(params->mon, "%s", msg);
+ g_string_append_printf(params->err, "%s\n", msg);
qemu_log_mask(CPU_LOG_RESET, "%s\n", msg);
qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
return;
@@ -484,14 +483,16 @@ static void do_inject_x86_mce(CPUState *cs, run_on_cpu_data data)
emit_guest_memory_failure(MEMORY_FAILURE_ACTION_INJECT, ar, recursive);
}
-void cpu_x86_inject_mce(Monitor *mon, X86CPU *cpu, int bank,
+bool cpu_x86_inject_mce(X86CPU *cpu, int bank,
uint64_t status, uint64_t mcg_status, uint64_t addr,
- uint64_t misc, int flags)
+ uint64_t misc, int flags, Error **errp)
{
+ ERRP_GUARD();
CPUState *cs = CPU(cpu);
CPUX86State *cenv = &cpu->env;
+ g_autoptr(GString) err = g_string_new(NULL);
MCEInjectionParams params = {
- .mon = mon,
+ .err = err,
.bank = bank,
.status = status,
.mcg_status = mcg_status,
@@ -502,21 +503,21 @@ void cpu_x86_inject_mce(Monitor *mon, X86CPU *cpu, int bank,
unsigned bank_num = cenv->mcg_cap & 0xff;
if (!cenv->mcg_cap) {
- monitor_printf(mon, "MCE injection not supported\n");
- return;
+ error_setg(errp, "MCE injection not supported");
+ return false;
}
if (bank >= bank_num) {
- monitor_printf(mon, "Invalid MCE bank number\n");
- return;
+ error_setg(errp, "Invalid MCE bank number");
+ return false;
}
if (!(status & MCI_STATUS_VAL)) {
- monitor_printf(mon, "Invalid MCE status code\n");
- return;
+ error_setg(errp, "Invalid MCE status code");
+ return false;
}
if ((flags & MCE_INJECT_BROADCAST)
&& !cpu_x86_support_mca_broadcast(cenv)) {
- monitor_printf(mon, "Guest CPU does not support MCA broadcast\n");
- return;
+ error_setg(errp, "Guest CPU does not support MCA broadcast");
+ return false;
}
run_on_cpu(cs, do_inject_x86_mce, RUN_ON_CPU_HOST_PTR(¶ms));
@@ -535,6 +536,12 @@ void cpu_x86_inject_mce(Monitor *mon, X86CPU *cpu, int bank,
run_on_cpu(other_cs, do_inject_x86_mce, RUN_ON_CPU_HOST_PTR(¶ms));
}
}
+ if (params.err->len) {
+ error_setg(errp, "Failed to inject MCE");
+ error_append_hint(errp, "%s", params.err->str);
+ return false;
+ }
+ return true;
}
static inline target_ulong get_memio_eip(CPUX86State *env)
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
index 9e352882c8c..d01519ef2f3 100644
--- a/target/i386/kvm/kvm.c
+++ b/target/i386/kvm/kvm.c
@@ -747,8 +747,8 @@ static void kvm_mce_inject(X86CPU *cpu, hwaddr paddr, int code)
flags = 0;
}
- cpu_x86_inject_mce(NULL, cpu, 9, status, mcg_status, paddr,
- (MCM_ADDR_PHYS << 6) | 0xc, flags);
+ cpu_x86_inject_mce(cpu, 9, status, mcg_status, paddr,
+ (MCM_ADDR_PHYS << 6) | 0xc, flags, NULL);
}
static void emit_hypervisor_memory_failure(MemoryFailureAction action, bool ar)
diff --git a/target/i386/monitor.c b/target/i386/monitor.c
index a536712c755..785a13dd710 100644
--- a/target/i386/monitor.c
+++ b/target/i386/monitor.c
@@ -580,6 +580,7 @@ void hmp_mce(Monitor *mon, const QDict *qdict)
uint64_t addr = qdict_get_int(qdict, "addr");
uint64_t misc = qdict_get_int(qdict, "misc");
int flags = MCE_INJECT_UNCOND_AO;
+ Error *err = NULL;
if (qdict_get_try_bool(qdict, "broadcast", false)) {
flags |= MCE_INJECT_BROADCAST;
@@ -587,7 +588,8 @@ void hmp_mce(Monitor *mon, const QDict *qdict)
cs = qemu_get_cpu(cpu_index);
if (cs != NULL) {
cpu = X86_CPU(cs);
- cpu_x86_inject_mce(mon, cpu, bank, status, mcg_status, addr, misc,
- flags);
+ cpu_x86_inject_mce(cpu, bank, status, mcg_status, addr, misc,
+ flags, &err);
+ hmp_handle_error(mon, err);
}
}
--
2.54.0