[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 11/16] xen: arm: Add debug keyhandler to dump the physical GIC state.
Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- xen/arch/arm/gic.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c index ab49106..185a6b8 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> @@ -385,6 +386,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) { @@ -456,6 +528,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) -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |