From: "Denis V. Lunev" <den@openvz.org>
Cc: "Denis V. Lunev" <den@openvz.org>,
"Andreas Färber" <andreas.faerber@web.de>,
"Paolo Bonzini" <pbonzini@redhat.com>,
qemu-devel@nongnu.org, "Pavel Butsykin" <pbutsykin@virtuozzo.com>
Subject: [Qemu-devel] [PATCH 8/9] hmp: added io apic dump state
Date: Tue, 15 Sep 2015 12:23:07 +0300 [thread overview]
Message-ID: <1442308988-653-9-git-send-email-den@openvz.org> (raw)
In-Reply-To: <1442308988-653-1-git-send-email-den@openvz.org>
From: Pavel Butsykin <pbutsykin@virtuozzo.com>
Added the hmp command to query io apic state, may be usefull after guest
crashes to understand IRQ routing in guest.
Implementation is only for kvm here. The dump will look like
(qemu) info apic-io
ioapic ID=00 IRR=00000000 SEL=18
ioapic 00 00000000000100ff: int=ff delmod=0:Fixed P.H.EM dest=0
ioapic 01 0300000000000993: int=93 delmod=1:LowPri L.H.E. dest=3
...
ioapic 23 00000000000100ff: int=ff delmod=0:Fixed P.H.EM dest=0
Signed-off-by: Pavel Butsykin <pbutsykin@virtuozzo.com>
Signed-off-by: Denis V. Lunev <den@openvz.org>
CC: Andreas Färber <andreas.faerber@web.de>
CC: Paolo Bonzini <pbonzini@redhat.com>
---
hmp-commands-info.hx | 16 ++++++++++++++++
hw/i386/kvm/ioapic.c | 10 ++++++++++
hw/intc/ioapic_common.c | 31 +++++++++++++++++++++++++++++++
include/hw/i386/ioapic_internal.h | 2 ++
include/hw/i386/pc.h | 4 ++++
include/monitor/monitor-common.h | 1 +
target-i386/monitor.c | 9 +++++++++
7 files changed, 73 insertions(+)
diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx
index 5ffc181..c65b7d2 100644
--- a/hmp-commands-info.hx
+++ b/hmp-commands-info.hx
@@ -128,6 +128,22 @@ STEXI
Show local APIC state
ETEXI
+#if defined(TARGET_I386)
+ {
+ .name = "apic-io",
+ .args_type = "",
+ .params = "",
+ .help = "show io apic state",
+ .mhandler.cmd = hmp_info_apic_io,
+ },
+#endif
+
+STEXI
+@item info apic-io
+@findex apic-io
+Show io APIC state
+ETEXI
+
{
.name = "cpus",
.args_type = "",
diff --git a/hw/i386/kvm/ioapic.c b/hw/i386/kvm/ioapic.c
index d2a6c4c..b7390ca 100644
--- a/hw/i386/kvm/ioapic.c
+++ b/hw/i386/kvm/ioapic.c
@@ -10,6 +10,7 @@
* See the COPYING file in the top-level directory.
*/
+#include "monitor/monitor.h"
#include "hw/i386/pc.h"
#include "hw/i386/ioapic_internal.h"
#include "hw/i386/apic_internal.h"
@@ -110,6 +111,15 @@ static void kvm_ioapic_put(IOAPICCommonState *s)
}
}
+void kvm_ioapic_dump_state(Monitor *mon, const QDict *qdict)
+{
+ IOAPICCommonState s;
+
+ kvm_ioapic_get(&s);
+
+ ioapic_print_redtbl(mon, &s);
+}
+
static void kvm_ioapic_reset(DeviceState *dev)
{
IOAPICCommonState *s = IOAPIC_COMMON(dev);
diff --git a/hw/intc/ioapic_common.c b/hw/intc/ioapic_common.c
index 8b7d118..83edf69 100644
--- a/hw/intc/ioapic_common.c
+++ b/hw/intc/ioapic_common.c
@@ -19,6 +19,7 @@
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
+#include "monitor/monitor.h"
#include "hw/i386/ioapic.h"
#include "hw/i386/ioapic_internal.h"
#include "hw/sysbus.h"
@@ -31,6 +32,36 @@
*/
int ioapic_no;
+void ioapic_print_redtbl(Monitor *mon, IOAPICCommonState *s)
+{
+ static const char *delm_str[] = {
+ "Fixed", "LowPri", "SMI", "...", "NMI", "INIT", "...", "ExtINT"};
+ int i;
+
+ monitor_printf(mon, "ioapic ID=%02x IRR=%08x SEL=%02x\n",
+ s->id, s->irr, s->ioregsel);
+
+ for (i = 0; i < IOAPIC_NUM_PINS; i++) {
+ uint64_t entry = s->ioredtbl[i];
+ uint32_t delm = (uint32_t)((entry & IOAPIC_LVT_DELIV_MODE) >>
+ IOAPIC_LVT_DELIV_MODE_SHIFT);
+ monitor_printf(mon, "ioapic %02u %016jx: int=%02jx "
+ "delmod=%x:%-6s %c%c%c%c%c%c dest=%jx\n",
+ i, entry,
+ entry & IOAPIC_VECTOR_MASK,
+ delm,
+ delm_str[delm],
+ entry & IOAPIC_LVT_DEST_MODE ? 'L' : 'P',
+ entry & IOAPIC_LVT_DELIV_STATUS ? 'P' : '.',
+ entry & IOAPIC_LVT_POLARITY ? 'L' : 'H',
+ entry & IOAPIC_LVT_REMOTE_IRR ? 'R' : '.',
+ entry & IOAPIC_LVT_TRIGGER_MODE ? 'L' : 'E',
+ entry & IOAPIC_LVT_MASKED ? 'M' : '.',
+ (entry >> IOAPIC_LVT_DEST_SHIFT) &
+ (entry & IOAPIC_LVT_DEST_MODE ? 0xff : 0xf));
+ }
+}
+
void ioapic_reset_common(DeviceState *dev)
{
IOAPICCommonState *s = IOAPIC_COMMON(dev);
diff --git a/include/hw/i386/ioapic_internal.h b/include/hw/i386/ioapic_internal.h
index 4f7764e..797ed47 100644
--- a/include/hw/i386/ioapic_internal.h
+++ b/include/hw/i386/ioapic_internal.h
@@ -105,4 +105,6 @@ struct IOAPICCommonState {
void ioapic_reset_common(DeviceState *dev);
+void ioapic_print_redtbl(Monitor *mon, IOAPICCommonState *s);
+
#endif /* !QEMU_IOAPIC_INTERNAL_H */
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 3e002c9..539cf64 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -123,6 +123,10 @@ int pic_get_output(DeviceState *d);
void hmp_info_pic(Monitor *mon, const QDict *qdict);
void hmp_info_irq(Monitor *mon, const QDict *qdict);
+/* ioapic.c */
+
+void kvm_ioapic_dump_state(Monitor *mon, const QDict *qdict);
+
/* Global System Interrupts */
#define GSI_NUM_PINS IOAPIC_NUM_PINS
diff --git a/include/monitor/monitor-common.h b/include/monitor/monitor-common.h
index 462c35e..71f224b 100644
--- a/include/monitor/monitor-common.h
+++ b/include/monitor/monitor-common.h
@@ -43,5 +43,6 @@ void hmp_info_mem(Monitor *mon, const QDict *qdict);
void hmp_info_tlb(Monitor *mon, const QDict *qdict);
void hmp_mce(Monitor *mon, const QDict *qdict);
void hmp_info_apic_local(Monitor *mon, const QDict *qdict);
+void hmp_info_apic_io(Monitor *mon, const QDict *qdict);
#endif /* MONITOR_COMMON */
diff --git a/target-i386/monitor.c b/target-i386/monitor.c
index fbc9fcd..797ea2d 100644
--- a/target-i386/monitor.c
+++ b/target-i386/monitor.c
@@ -24,6 +24,8 @@
#include "cpu.h"
#include "monitor/monitor.h"
#include "monitor/monitor-common.h"
+#include "hw/i386/pc.h"
+#include "sysemu/kvm.h"
#include "hmp.h"
@@ -498,3 +500,10 @@ void hmp_info_apic_local(Monitor *mon, const QDict *qdict)
x86_cpu_dump_apic_local_state(mon_get_cpu(), (FILE *)mon, monitor_fprintf,
CPU_DUMP_FPU);
}
+
+void hmp_info_apic_io(Monitor *mon, const QDict *qdict)
+{
+ if (kvm_irqchip_in_kernel()) {
+ kvm_ioapic_dump_state(mon, qdict);
+ }
+}
--
2.1.4
next prev parent reply other threads:[~2015-09-15 9:23 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-15 9:22 [Qemu-devel] [PATCH v2 0/9] hmp command IO- and Local APIC dump state Denis V. Lunev
2015-09-15 9:23 ` [Qemu-devel] [PATCH 1/9] apic_internal.h: move apic_get_bit(), apic_set_bit() to apic_internal.h Denis V. Lunev
2015-09-15 9:23 ` [Qemu-devel] [PATCH 2/9] apic_internal.h: rename ESR_ILLEGAL_ADDRESS to APIC_ESR_ILLEGAL_ADDRESS Denis V. Lunev
2015-09-15 9:23 ` [Qemu-devel] [PATCH 3/9] apic_internal.h: added more constants Denis V. Lunev
2015-09-15 9:23 ` [Qemu-devel] [PATCH 4/9] apic_internal.h: fix formatting and drop unused consts Denis V. Lunev
2015-09-15 9:23 ` [Qemu-devel] [PATCH 5/9] monitor: make monitor_fprintf and mon_get_cpu externally visible Denis V. Lunev
2015-09-15 9:23 ` [Qemu-devel] [PATCH 6/9] hmp: added local apic dump state Denis V. Lunev
2015-09-15 10:20 ` Paolo Bonzini
2015-09-15 9:23 ` [Qemu-devel] [PATCH 7/9] ioapic_internal.h: added more constants Denis V. Lunev
2015-09-15 9:23 ` Denis V. Lunev [this message]
2015-09-15 10:32 ` [Qemu-devel] [PATCH 8/9] hmp: added io apic dump state Paolo Bonzini
2015-09-15 9:23 ` [Qemu-devel] [PATCH 9/9] hmp: implemented io apic dump state for TCG Denis V. Lunev
-- strict thread matches above, loose matches on Subject: below --
2015-09-21 10:57 [Qemu-devel] [PATCH v3 0/9] hmp command IO- and Local APIC dump state Denis V. Lunev
2015-09-21 10:57 ` [Qemu-devel] [PATCH 8/9] hmp: added io apic " Denis V. Lunev
2015-09-22 13:18 [Qemu-devel] [PATCH v4 0/9] hmp command IO- and Local APIC " Denis V. Lunev
2015-09-22 13:18 ` [Qemu-devel] [PATCH 8/9] hmp: added io apic " Denis V. Lunev
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=1442308988-653-9-git-send-email-den@openvz.org \
--to=den@openvz.org \
--cc=andreas.faerber@web.de \
--cc=pbonzini@redhat.com \
--cc=pbutsykin@virtuozzo.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).