提交 04e00c92 编写于 作者: M Markus Armbruster

monitor: Use trad. command interface for HMP pcie_aer_inject_error

All QMP commands use the "new" handler interface (mhandler.cmd_new).
Most HMP commands still use the traditional interface (mhandler.cmd),
but a few use the "new" one.  Complicates handle_user_command() for no
gain, so I'm converting these to the traditional interface.

pcie_aer_inject_error's implementation is split into the
hmp_pcie_aer_inject_error() and pcie_aer_inject_error_print().  The
former is a peculiar crossbreed between HMP and QMP handler.  On
success, it works like a QMP handler: store QDict through ret_data
parameter, return 0.  Printing the QDict is left to
pcie_aer_inject_error_print().  On failure, it works more like an HMP
handler: print error to monitor, return negative number.

To convert to the traditional interface, turn
pcie_aer_inject_error_print() into a command handler wrapping around
hmp_pcie_aer_inject_error().  By convention, this command handler
should be called hmp_pcie_aer_inject_error(), so rename the existing
hmp_pcie_aer_inject_error() to do_pcie_aer_inject_error().
Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
Reviewed-by: NEric Blake <eblake@redhat.com>
Reviewed-by: NLuiz Capitulino <lcapitulino@redhat.com>
上级 318660f8
...@@ -1183,8 +1183,7 @@ ETEXI ...@@ -1183,8 +1183,7 @@ ETEXI
"<error_status> = error string or 32bit\n\t\t\t" "<error_status> = error string or 32bit\n\t\t\t"
"<tlb header> = 32bit x 4\n\t\t\t" "<tlb header> = 32bit x 4\n\t\t\t"
"<tlb header prefix> = 32bit x 4", "<tlb header prefix> = 32bit x 4",
.user_print = pcie_aer_inject_error_print, .mhandler.cmd = hmp_pcie_aer_inject_error,
.mhandler.cmd_new = hmp_pcie_aer_inject_error,
}, },
STEXI STEXI
......
...@@ -29,19 +29,7 @@ PciInfoList *qmp_query_pci(Error **errp) ...@@ -29,19 +29,7 @@ PciInfoList *qmp_query_pci(Error **errp)
return NULL; return NULL;
} }
static void pci_error_message(Monitor *mon) void hmp_pcie_aer_inject_error(Monitor *mon, const QDict *qdict)
{ {
monitor_printf(mon, "PCI devices not supported\n"); monitor_printf(mon, "PCI devices not supported\n");
} }
int hmp_pcie_aer_inject_error(Monitor *mon,
const QDict *qdict, QObject **ret_data)
{
pci_error_message(mon);
return -ENOSYS;
}
void pcie_aer_inject_error_print(Monitor *mon, const QObject *data)
{
pci_error_message(mon);
}
...@@ -815,21 +815,6 @@ const VMStateDescription vmstate_pcie_aer_log = { ...@@ -815,21 +815,6 @@ const VMStateDescription vmstate_pcie_aer_log = {
} }
}; };
void pcie_aer_inject_error_print(Monitor *mon, const QObject *data)
{
QDict *qdict;
int devfn;
assert(qobject_type(data) == QTYPE_QDICT);
qdict = qobject_to_qdict(data);
devfn = (int)qdict_get_int(qdict, "devfn");
monitor_printf(mon, "OK id: %s root bus: %s, bus: %x devfn: %x.%x\n",
qdict_get_str(qdict, "id"),
qdict_get_str(qdict, "root_bus"),
(int) qdict_get_int(qdict, "bus"),
PCI_SLOT(devfn), PCI_FUNC(devfn));
}
typedef struct PCIEAERErrorName { typedef struct PCIEAERErrorName {
const char *name; const char *name;
uint32_t val; uint32_t val;
...@@ -962,8 +947,8 @@ static int pcie_aer_parse_error_string(const char *error_name, ...@@ -962,8 +947,8 @@ static int pcie_aer_parse_error_string(const char *error_name,
return -EINVAL; return -EINVAL;
} }
int hmp_pcie_aer_inject_error(Monitor *mon, static int do_pcie_aer_inject_error(Monitor *mon,
const QDict *qdict, QObject **ret_data) const QDict *qdict, QObject **ret_data)
{ {
const char *id = qdict_get_str(qdict, "id"); const char *id = qdict_get_str(qdict, "id");
const char *error_name; const char *error_name;
...@@ -1035,3 +1020,23 @@ int hmp_pcie_aer_inject_error(Monitor *mon, ...@@ -1035,3 +1020,23 @@ int hmp_pcie_aer_inject_error(Monitor *mon,
return 0; return 0;
} }
void hmp_pcie_aer_inject_error(Monitor *mon, const QDict *qdict)
{
QObject *data;
int devfn;
if (do_pcie_aer_inject_error(mon, qdict, &data) < 0) {
return;
}
assert(qobject_type(data) == QTYPE_QDICT);
qdict = qobject_to_qdict(data);
devfn = (int)qdict_get_int(qdict, "devfn");
monitor_printf(mon, "OK id: %s root bus: %s, bus: %x devfn: %x.%x\n",
qdict_get_str(qdict, "id"),
qdict_get_str(qdict, "root_bus"),
(int) qdict_get_int(qdict, "bus"),
PCI_SLOT(devfn), PCI_FUNC(devfn));
}
...@@ -161,9 +161,7 @@ extern unsigned int nb_prom_envs; ...@@ -161,9 +161,7 @@ extern unsigned int nb_prom_envs;
void hmp_drive_add(Monitor *mon, const QDict *qdict); void hmp_drive_add(Monitor *mon, const QDict *qdict);
/* pcie aer error injection */ /* pcie aer error injection */
void pcie_aer_inject_error_print(Monitor *mon, const QObject *data); void hmp_pcie_aer_inject_error(Monitor *mon, const QDict *qdict);
int hmp_pcie_aer_inject_error(Monitor *mon,
const QDict *qdict, QObject **ret_data);
/* serial ports */ /* serial ports */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册