Ian Campbell
2013-Nov-22 16:24 UTC
[PATCH v2 13/15] xen: arm: Add debug keyhandler to dump the physical GIC state.
Rename the existing gic_dump_info to gic_dump_info_guest reduce confusion. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> --- v2: s/gic_dump_info/gic_dump_info_guest/ --- xen/arch/arm/domain.c | 2 +- xen/arch/arm/gic.c | 77 ++++++++++++++++++++++++++++++++++++++++++++- xen/include/asm-arm/gic.h | 2 +- 3 files changed, 78 insertions(+), 3 deletions(-) diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index 52d2403..59eea75 100644 --- a/xen/arch/arm/domain.c +++ b/xen/arch/arm/domain.c @@ -713,7 +713,7 @@ void arch_dump_domain_info(struct domain *d) for_each_vcpu ( d, v ) { - gic_dump_info(v); + gic_dump_info_guest(v); } } diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c index 9711f5d..1f32e99 100644 --- a/xen/arch/arm/gic.c +++ b/xen/arch/arm/gic.c @@ -28,6 +28,7 @@ #include <xen/softirq.h> #include <xen/list.h> #include <xen/device_tree.h> +#include <xen/keyhandler.h> #include <asm/p2m.h> #include <asm/domain.h> #include <asm/platform.h> @@ -386,6 +387,77 @@ int gic_irq_xlate(const u32 *intspec, unsigned int intsize, return 0; } + +static void do_dump_gic(unsigned char key) +{ + int irq; + printk("''%c'' pressed -> dumping GIC state\n", key); + + for ( irq = 0; irq < gic.lines; irq++ ) + { + const char *type; + int type_nr, enable, pend, active, priority, target; + struct irq_desc *desc = irq_to_desc(irq); + uint8_t *bytereg; + uint32_t wordreg; + + bytereg = (uint8_t *) (GICD + GICD_ITARGETSR); + target = bytereg[irq]; + + bytereg = (uint8_t *) (GICD + GICD_IPRIORITYR); + priority = bytereg[irq]; + + switch ( irq ) + { + case 0 ... 15: + type = "SGI"; + type_nr = irq; + target = 0x00; /* these are per-CPU */ + break; + case 16 ... 31: + type = "PPI"; + type_nr = irq - 16; + break; + default: + type = "SPI"; + type_nr = irq - 32; + break; + } + + wordreg = GICD[GICD_ISENABLER + irq / 32]; + enable = !!(wordreg & (1u << (irq % 32))); + wordreg = GICD[GICD_ISPENDR + irq / 32]; + pend = !!(wordreg & (1u << (irq % 32))); + wordreg = GICD[GICD_ISACTIVER + irq / 32]; + active = !!(wordreg & (1u << (irq % 32))); + + printk("IRQ%d %s%d: %c%c%c pri:%02x tgt:%02x ", + irq, type, type_nr, + enable ? ''e'' : ''-'', + pend ? ''p'' : ''-'', + active ? ''a'' : ''-'', + priority, target); + + if ( desc->status & IRQ_GUEST ) + { + struct domain *d = desc->action->dev_id; + printk("dom%d %s", d->domain_id, desc->action->name); + } + else + { + printk("Xen"); + } + printk("\n"); + } + +} + +static struct keyhandler dump_gic_keyhandler = { + .irq_callback = 0, + .u.fn = do_dump_gic, + .desc = "dump GIC state" +}; + /* Set up the GIC */ void __init gic_init(void) { @@ -460,6 +532,9 @@ void __init gic_init(void) gic_hyp_init(); spin_unlock(&gic.lock); + + register_keyhandler(''G'', &dump_gic_keyhandler); + } void send_SGI_mask(const cpumask_t *cpumask, enum gic_sgi sgi) @@ -913,7 +988,7 @@ static void maintenance_interrupt(int irq, void *dev_id, struct cpu_user_regs *r } } -void gic_dump_info(struct vcpu *v) +void gic_dump_info_guest(struct vcpu *v) { int i; struct pending_irq *p; diff --git a/xen/include/asm-arm/gic.h b/xen/include/asm-arm/gic.h index 41f0b3b..e6369fa 100644 --- a/xen/include/asm-arm/gic.h +++ b/xen/include/asm-arm/gic.h @@ -189,7 +189,7 @@ extern void send_SGI_self(enum gic_sgi sgi); extern void send_SGI_allbutself(enum gic_sgi sgi); /* print useful debug info */ -extern void gic_dump_info(struct vcpu *v); +extern void gic_dump_info_guest(struct vcpu *v); /* Number of interrupt lines */ extern unsigned int gic_number_lines(void); -- 1.7.10.4
Ian Campbell
2013-Nov-22 16:37 UTC
Re: [PATCH v2 13/15] xen: arm: Add debug keyhandler to dump the physical GIC state.
On Fri, 2013-11-22 at 16:24 +0000, Ian Campbell wrote:> Rename the existing gic_dump_info to gic_dump_info_guest reduce confusion. > > Signed-off-by: Ian Campbell <ian.campbell@citrix.com>I had intended to drop this one from the series based on Julien''s comments on v1 but I forgot.
Reasonably Related Threads
- [PATCH v2 2/2] xen/arm: initialize the GIC irq properties of interrupts routed to guests
- [PATCH+RFC+HACK 00/16] xen: arm initial support for xgene arm64 platform
- [PATCH 3/4] xen/arm: dump gic debug info from arch_dump_domain_info
- [PATCH v5 0/7] Dissociate logical and gic/hardware CPU ID
- [PATCH] xen/arm: Missing +1 when then number of interrupt lines for the GIC is computed