[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCHv3] add "info ioapic" monitor command
From: |
Gleb Natapov |
Subject: |
[Qemu-devel] [PATCHv3] add "info ioapic" monitor command |
Date: |
Wed, 6 Jan 2010 18:35:02 +0200 |
Knowing ioapic configuration is very useful for the poor soles
how need to debug guest occasionally.
Signed-off-by: Gleb Natapov <address@hidden>
diff --git a/hw/ioapic.c b/hw/ioapic.c
index b0ad78f..3afb2c4 100644
--- a/hw/ioapic.c
+++ b/hw/ioapic.c
@@ -24,6 +24,8 @@
#include "pc.h"
#include "qemu-timer.h"
#include "host-utils.h"
+#include "monitor.h"
+#include "qemu-objects.h"
//#define DEBUG_IOAPIC
@@ -50,6 +52,8 @@ struct IOAPICState {
uint64_t ioredtbl[IOAPIC_NUM_PINS];
};
+static struct IOAPICState *ioapic;
+
static void ioapic_service(IOAPICState *s)
{
uint8_t i;
@@ -232,7 +236,7 @@ qemu_irq *ioapic_init(void)
qemu_irq *irq;
int io_memory;
- s = qemu_mallocz(sizeof(IOAPICState));
+ ioapic = s = qemu_mallocz(sizeof(IOAPICState));
ioapic_reset(s);
io_memory = cpu_register_io_memory(ioapic_mem_read,
@@ -245,3 +249,70 @@ qemu_irq *ioapic_init(void)
return irq;
}
+
+static void qemu_ioapic_qlist_iter(QObject *data, void *opaque)
+{
+ QDict *qdict = qobject_to_qdict(data);
+ Monitor *mon = opaque;
+
+ monitor_printf(mon, "%2"PRId64": ", qdict_get_int(qdict, "index"));
+ if (qdict_get_bool(qdict, "masked")) {
+ monitor_printf(mon, "masked\n");
+ } else {
+ monitor_printf(mon, "vec=%3"PRId64" %s %s acive-%s %s
dest=%"PRId64"\n",
+ qdict_get_int(qdict, "vector"),
+ qdict_get_str(qdict, "delivery_mode"),
+ qdict_get_str(qdict, "dest_mode"),
+ qdict_get_str(qdict, "polarity"),
+ qdict_get_str(qdict, "trig_mode"),
+ qdict_get_int(qdict, "destination"));
+ }
+}
+
+void monitor_print_ioapic(Monitor *mon, const QObject *ret_data)
+{
+ qlist_iter(qobject_to_qlist(ret_data), qemu_ioapic_qlist_iter, mon);
+}
+
+static const char *delivery_mode_string[] = {"fixed", "lowprio", "smi", "res",
+ "nmi", "init", "res", "extint"};
+
+void do_info_ioapic(Monitor *mon, QObject **ret_data)
+{
+ int i;
+ QList *list;
+
+ *ret_data = NULL;
+
+ if (!ioapic)
+ return;
+
+ list = qlist_new();
+
+ for (i = 0; i < IOAPIC_NUM_PINS; i++) {
+ QObject *obj;
+ uint64 e = ioapic->ioredtbl[i];
+ if (e & IOAPIC_LVT_MASKED) {
+ obj = qobject_from_jsonf("{'index': %d, 'masked': true}", i);
+ } else {
+ uint8_t vec = e & 0xff;
+ uint8_t trig_mode = ((e >> 15) & 1);
+ uint8_t dest = e >> 56;
+ uint8_t dest_mode = (e >> 11) & 1;
+ uint8_t delivery_mode = (e >> 8) & 7;
+ uint8_t polarity = (e >> 13) & 1;
+ obj = qobject_from_jsonf("{'index': %d, 'masked': false,"
+ "'vector': %d, 'delivery_mode': %s,"
+ "'dest_mode': %s, 'polarity': %s,"
+ "'trig_mode': %s, 'destination': %d}",
+ i, vec,
+ delivery_mode_string[delivery_mode],
+ dest_mode ? "logical":"physical",
+ polarity ? "low" : "high",
+ trig_mode ? "level": "edge",
+ dest);
+ }
+ qlist_append_obj(list, obj);
+ }
+ *ret_data = QOBJECT(list);
+}
diff --git a/hw/pc.h b/hw/pc.h
index 03ffc91..3e39444 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -2,6 +2,7 @@
#define HW_PC_H
#include "qemu-common.h"
+#include "qobject.h"
/* PC-style peripherals (also used by other machines). */
@@ -45,6 +46,8 @@ int apic_accept_pic_intr(CPUState *env);
void apic_deliver_pic_intr(CPUState *env, int level);
int apic_get_interrupt(CPUState *env);
qemu_irq *ioapic_init(void);
+void do_info_ioapic(Monitor *mon, QObject **ret_data);
+void monitor_print_ioapic(Monitor *mon, const QObject *data);
void ioapic_set_irq(void *opaque, int vector, int level);
void apic_reset_irq_delivered(void);
int apic_get_irq_delivered(void);
diff --git a/monitor.c b/monitor.c
index c0dc48e..367e330 100644
--- a/monitor.c
+++ b/monitor.c
@@ -2625,6 +2625,14 @@ static const mon_cmd_t info_cmds[] = {
.mhandler.info = do_info_roms,
},
{
+ .name = "ioapic",
+ .args_type = "",
+ .params = "",
+ .help = "show ioapic config",
+ .user_print = monitor_print_ioapic,
+ .mhandler.info_new = do_info_ioapic,
+ },
+ {
.name = NULL,
},
};
--
Gleb.
- [Qemu-devel] [PATCHv3] add "info ioapic" monitor command,
Gleb Natapov <=