mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 00:33:55 -06:00
QEMU: MCE: Add MCE simulation to qemu/tcg
- MCE features are initialized when VCPU is intialized according to CPUID. - A monitor command "mce" is added to inject a MCE. - A new interrupt mask: CPU_INTERRUPT_MCE is added to inject the MCE. aliguori: fix build for linux-user Signed-off-by: Huang Ying <ying.huang@intel.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
2152390dca
commit
79c4f6b080
8 changed files with 217 additions and 2 deletions
46
monitor.c
46
monitor.c
|
@ -1677,6 +1677,28 @@ static void do_acl_remove(Monitor *mon, const char *aclname, const char *match)
|
|||
}
|
||||
}
|
||||
|
||||
#if defined(TARGET_I386)
|
||||
static void do_inject_mce(Monitor *mon,
|
||||
int cpu_index, int bank,
|
||||
unsigned status_hi, unsigned status_lo,
|
||||
unsigned mcg_status_hi, unsigned mcg_status_lo,
|
||||
unsigned addr_hi, unsigned addr_lo,
|
||||
unsigned misc_hi, unsigned misc_lo)
|
||||
{
|
||||
CPUState *cenv;
|
||||
uint64_t status = ((uint64_t)status_hi << 32) | status_lo;
|
||||
uint64_t mcg_status = ((uint64_t)mcg_status_hi << 32) | mcg_status_lo;
|
||||
uint64_t addr = ((uint64_t)addr_hi << 32) | addr_lo;
|
||||
uint64_t misc = ((uint64_t)misc_hi << 32) | misc_lo;
|
||||
|
||||
for (cenv = first_cpu; cenv != NULL; cenv = cenv->next_cpu)
|
||||
if (cenv->cpu_index == cpu_index && cenv->mcg_cap) {
|
||||
cpu_inject_x86_mce(cenv, bank, status, mcg_status, addr, misc);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static const mon_cmd_t mon_cmds[] = {
|
||||
#include "qemu-monitor.h"
|
||||
{ NULL, NULL, },
|
||||
|
@ -2451,6 +2473,15 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline)
|
|||
void *arg3, void *arg4, void *arg5);
|
||||
void (*handler_7)(Monitor *mon, void *arg0, void *arg1, void *arg2,
|
||||
void *arg3, void *arg4, void *arg5, void *arg6);
|
||||
void (*handler_8)(Monitor *mon, void *arg0, void *arg1, void *arg2,
|
||||
void *arg3, void *arg4, void *arg5, void *arg6,
|
||||
void *arg7);
|
||||
void (*handler_9)(Monitor *mon, void *arg0, void *arg1, void *arg2,
|
||||
void *arg3, void *arg4, void *arg5, void *arg6,
|
||||
void *arg7, void *arg8);
|
||||
void (*handler_10)(Monitor *mon, void *arg0, void *arg1, void *arg2,
|
||||
void *arg3, void *arg4, void *arg5, void *arg6,
|
||||
void *arg7, void *arg8, void *arg9);
|
||||
|
||||
#ifdef DEBUG
|
||||
monitor_printf(mon, "command='%s'\n", cmdline);
|
||||
|
@ -2739,6 +2770,21 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline)
|
|||
handler_7(mon, args[0], args[1], args[2], args[3], args[4], args[5],
|
||||
args[6]);
|
||||
break;
|
||||
case 8:
|
||||
handler_8 = cmd->handler;
|
||||
handler_8(mon, args[0], args[1], args[2], args[3], args[4], args[5],
|
||||
args[6], args[7]);
|
||||
break;
|
||||
case 9:
|
||||
handler_9 = cmd->handler;
|
||||
handler_9(mon, args[0], args[1], args[2], args[3], args[4], args[5],
|
||||
args[6], args[7], args[8]);
|
||||
break;
|
||||
case 10:
|
||||
handler_10 = cmd->handler;
|
||||
handler_10(mon, args[0], args[1], args[2], args[3], args[4], args[5],
|
||||
args[6], args[7], args[8], args[9]);
|
||||
break;
|
||||
default:
|
||||
monitor_printf(mon, "unsupported number of arguments: %d\n", nb_args);
|
||||
goto fail;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue