From: Gleb Natapov <gleb@redhat.com>
To: qemu-devel@nongnu.org
Cc: lcapitulino@redhat.com
Subject: [Qemu-devel] [PATCHv3] add "info ioapic" monitor command
Date: Wed, 6 Jan 2010 18:35:02 +0200 [thread overview]
Message-ID: <20100106163502.GQ4905@redhat.com> (raw)
Knowing ioapic configuration is very useful for the poor soles
how need to debug guest occasionally.
Signed-off-by: Gleb Natapov <gleb@redhat.com>
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.
next reply other threads:[~2010-01-06 17:03 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-01-06 16:35 Gleb Natapov [this message]
2010-01-06 19:50 ` [Qemu-devel] [PATCHv3] add "info ioapic" monitor command Anthony Liguori
2010-01-06 21:12 ` Gleb Natapov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100106163502.GQ4905@redhat.com \
--to=gleb@redhat.com \
--cc=lcapitulino@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.