diff options
author | Jeremy Fitzhardinge <jeremy@goop.org> | 2008-03-17 19:37:18 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-04-24 17:57:32 -0400 |
commit | ee523ca1e456d754d66be6deab910131e4e1dbf8 (patch) | |
tree | 346c3bf4f701a07b124af72a3da4577b2e5dcb3b /arch/x86/xen/events.c | |
parent | e2a81baf6604a2e08e10c7405b0349106f77c8af (diff) |
xen: implement a debug-interrupt handler
Xen supports the notion of a debug interrupt which can be triggered
from the console. For now this is implemented to show pending events,
masks and each CPU's pending event set.
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86/xen/events.c')
-rw-r--r-- | arch/x86/xen/events.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/arch/x86/xen/events.c b/arch/x86/xen/events.c index dcf613e17581..0140981e93c4 100644 --- a/arch/x86/xen/events.c +++ b/arch/x86/xen/events.c | |||
@@ -455,6 +455,53 @@ void xen_send_IPI_one(unsigned int cpu, enum ipi_vector vector) | |||
455 | notify_remote_via_irq(irq); | 455 | notify_remote_via_irq(irq); |
456 | } | 456 | } |
457 | 457 | ||
458 | irqreturn_t xen_debug_interrupt(int irq, void *dev_id) | ||
459 | { | ||
460 | struct shared_info *sh = HYPERVISOR_shared_info; | ||
461 | int cpu = smp_processor_id(); | ||
462 | int i; | ||
463 | unsigned long flags; | ||
464 | static DEFINE_SPINLOCK(debug_lock); | ||
465 | |||
466 | spin_lock_irqsave(&debug_lock, flags); | ||
467 | |||
468 | printk("vcpu %d\n ", cpu); | ||
469 | |||
470 | for_each_online_cpu(i) { | ||
471 | struct vcpu_info *v = per_cpu(xen_vcpu, i); | ||
472 | printk("%d: masked=%d pending=%d event_sel %08lx\n ", i, | ||
473 | (get_irq_regs() && i == cpu) ? !(get_irq_regs()->flags & X86_EFLAGS_IF) : v->evtchn_upcall_mask, | ||
474 | v->evtchn_upcall_pending, | ||
475 | v->evtchn_pending_sel); | ||
476 | } | ||
477 | printk("pending:\n "); | ||
478 | for(i = ARRAY_SIZE(sh->evtchn_pending)-1; i >= 0; i--) | ||
479 | printk("%08lx%s", sh->evtchn_pending[i], | ||
480 | i % 8 == 0 ? "\n " : " "); | ||
481 | printk("\nmasks:\n "); | ||
482 | for(i = ARRAY_SIZE(sh->evtchn_mask)-1; i >= 0; i--) | ||
483 | printk("%08lx%s", sh->evtchn_mask[i], | ||
484 | i % 8 == 0 ? "\n " : " "); | ||
485 | |||
486 | printk("\nunmasked:\n "); | ||
487 | for(i = ARRAY_SIZE(sh->evtchn_mask)-1; i >= 0; i--) | ||
488 | printk("%08lx%s", sh->evtchn_pending[i] & ~sh->evtchn_mask[i], | ||
489 | i % 8 == 0 ? "\n " : " "); | ||
490 | |||
491 | printk("\npending list:\n"); | ||
492 | for(i = 0; i < NR_EVENT_CHANNELS; i++) { | ||
493 | if (sync_test_bit(i, sh->evtchn_pending)) { | ||
494 | printk(" %d: event %d -> irq %d\n", | ||
495 | cpu_evtchn[i], i, | ||
496 | evtchn_to_irq[i]); | ||
497 | } | ||
498 | } | ||
499 | |||
500 | spin_unlock_irqrestore(&debug_lock, flags); | ||
501 | |||
502 | return IRQ_HANDLED; | ||
503 | } | ||
504 | |||
458 | 505 | ||
459 | /* | 506 | /* |
460 | * Search the CPUs pending events bitmasks. For each one found, map | 507 | * Search the CPUs pending events bitmasks. For each one found, map |