From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48926) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z5ycB-0002ka-F5 for qemu-devel@nongnu.org; Fri, 19 Jun 2015 11:54:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Z5yc7-0001Py-8a for qemu-devel@nongnu.org; Fri, 19 Jun 2015 11:53:59 -0400 Received: from cantor2.suse.de ([195.135.220.15]:54381 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z5yc6-0001Ov-UI for qemu-devel@nongnu.org; Fri, 19 Jun 2015 11:53:55 -0400 Message-ID: <55843B11.3020608@suse.de> Date: Fri, 19 Jun 2015 17:53:53 +0200 From: =?ISO-8859-15?Q?Andreas_F=E4rber?= MIME-Version: 1.0 References: <1434725298-22666-1-git-send-email-den@openvz.org> <1434725298-22666-8-git-send-email-den@openvz.org> In-Reply-To: <1434725298-22666-8-git-send-email-den@openvz.org> Content-Type: text/plain; charset=iso-8859-15 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH 7/8] hmp: added io apic dump state List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "Denis V. Lunev" Cc: Peter Maydell , Paolo Bonzini , Pavel Butsykin , qemu-devel@nongnu.org, Luiz Capitulino Am 19.06.2015 um 16:48 schrieb Denis V. Lunev: > From: Pavel Butsykin >=20 > Added the hmp command to query io apic state, may be usefull after gues= t > crashes to understand IRQ routing in guest. >=20 > Implementation is only for kvm here. The dump will look like > (qemu) info apic-io > ioapic ID=3D00 IRR=3D00000000 SEL=3D18 > ioapic 00 00000000000100ff: int=3Dff delmod=3D0:Fixed P.H.EM dest=3D0 > ioapic 01 0300000000000993: int=3D93 delmod=3D1:LowPri L.H.E. dest=3D3 > ... > ioapic 23 00000000000100ff: int=3Dff delmod=3D0:Fixed P.H.EM dest=3D0 >=20 > Signed-off-by: Pavel Butsykin > Signed-off-by: Denis V. Lunev > CC: Paolo Bonzini > CC: Luiz Capitulino > --- > hmp-commands.hx | 2 ++ > 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 ++++ > monitor.c | 20 ++++++++++++++++++++ > 6 files changed, 69 insertions(+) >=20 > diff --git a/hmp-commands.hx b/hmp-commands.hx > index 95f554e..894ff65 100644 > --- a/hmp-commands.hx > +++ b/hmp-commands.hx > @@ -1726,6 +1726,8 @@ show block device statistics > show the cpu registers > @item info apic-local > show local APIC state > +@item info apic-io > +show io APIC state > @item info cpus > show infos for each CPU > @item info history > 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. > */ > =20 > +#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) > } > } > =20 > +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 =3D 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 . > */ > =20 > +#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; > =20 > +void ioapic_print_redtbl(Monitor *mon, IOAPICCommonState *s) > +{ > + static const char *delm_str[] =3D { > + "Fixed", "LowPri", "SMI", "...", "NMI", "INIT", "...", "ExtINT= "}; > + int i; > + > + monitor_printf(mon, "ioapic ID=3D%02x IRR=3D%08x SEL=3D%02x\n", > + s->id, s->irr, s->ioregsel); > + > + for (i =3D 0; i < IOAPIC_NUM_PINS; i++) { > + uint64_t entry =3D s->ioredtbl[i]; > + uint32_t delm =3D (uint32_t)((entry & IOAPIC_LVT_DELIV_MODE) >= > > + IOAPIC_LVT_DELIV_MODE_SHIFT); > + monitor_printf(mon, "ioapic %02u %016jx: int=3D%02jx " > + "delmod=3D%x:%-6s %c%c%c%c%c%c dest=3D%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 =3D 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 { > =20 > void ioapic_reset_common(DeviceState *dev); > =20 > +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 86c5651..437085f 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); > =20 > +/* ioapic.c */ > + > +void kvm_ioapic_dump_state(Monitor *mon, const QDict *qdict); > + > /* Global System Interrupts */ > =20 > #define GSI_NUM_PINS IOAPIC_NUM_PINS > diff --git a/monitor.c b/monitor.c > index aad2792..5449663 100644 > --- a/monitor.c > +++ b/monitor.c > @@ -957,6 +957,19 @@ int monitor_get_cpu_index(void) > return cpu->cpu_index; > } > =20 > +#if defined(TARGET_I386) > +static void hmp_info_apic_io(Monitor *mon, const QDict *qdict) > +{ > + if (kvm_irqchip_in_kernel()) { > + kvm_ioapic_dump_state(mon, qdict); > + } Why no else clause for TCG? > +} > +#else > +static void hmp_info_apic_io(Monitor *mon, const QDict *qdict) > +{ > +} Rather than having a no-op info apic-io on ARM etc., I would suggest to #ifdef the below array entry too, so that it is for x86 exclusively. Regards, Andreas > +#endif > + > static void hmp_info_apic_local(Monitor *mon, const QDict *qdict) > { > CPUState *cpu; > @@ -2588,6 +2601,13 @@ static mon_cmd_t info_cmds[] =3D { > .mhandler.cmd =3D hmp_info_apic_local, > }, > { > + .name =3D "apic-io", > + .args_type =3D "", > + .params =3D "", > + .help =3D "show io apic state", > + .mhandler.cmd =3D hmp_info_apic_io, > + }, > + { > .name =3D "cpus", > .args_type =3D "", > .params =3D "", --=20 SUSE Linux GmbH, Maxfeldstr. 5, 90409 N=FCrnberg, Germany GF: Felix Imend=F6rffer, Jane Smithard, Dilip Upmanyu, Graham Norton; HRB 21284 (AG N=FCrnberg)