From 47b8db8f8b806420e5b7abf6f19385f37a04dcfc Mon Sep 17 00:00:00 2001
From: Roger Pau Monne <roger.pau@citrix.com>
Date: Fri, 28 Mar 2014 17:31:13 +0100
Subject: [PATCH 12/31] xen: add a DDB command to print event channel
 information

Add a new DDB command to dump all registered event channels.

Approved by: xxx
Sponsored by: Citrix Systems R&D

x86/xen/xen_intr.c:
 - Add a new xen_evtchn command to DDB in order to dump all
   information related to event channels.
---
 sys/x86/xen/xen_intr.c |   78 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 78 insertions(+), 0 deletions(-)

diff --git a/sys/x86/xen/xen_intr.c b/sys/x86/xen/xen_intr.c
index 7d97fa2..1f08615 100644
--- a/sys/x86/xen/xen_intr.c
+++ b/sys/x86/xen/xen_intr.c
@@ -1401,3 +1401,81 @@ xen_intr_port(xen_intr_handle_t handle)
 	
 	return (isrc->xi_port);
 }
+
+#include "opt_ddb.h"
+
+#ifdef DDB
+#include <ddb/ddb.h>
+
+static const char *
+xen_intr_print_type(enum evtchn_type type)
+{
+	switch (type) {
+		case EVTCHN_TYPE_UNBOUND:
+			return "UNBOUND";
+		case EVTCHN_TYPE_PIRQ:
+			return "PIRQ";
+		case EVTCHN_TYPE_VIRQ:
+			return "VIRQ";
+		case EVTCHN_TYPE_IPI:
+			return "IPI";
+		case EVTCHN_TYPE_PORT:
+			return "PORT";
+		default:
+			break;
+	}
+
+	return "UNKNOWN";
+}
+
+static void
+xen_intr_dump_port(struct xenisrc *isrc)
+{
+	struct xen_intr_pcpu_data *pcpu;
+	shared_info_t *s = HYPERVISOR_shared_info;
+	int i;
+
+	db_printf("Port %d Type: %s\n",
+	    isrc->xi_port, xen_intr_print_type(isrc->xi_type));
+	if (isrc->xi_type == EVTCHN_TYPE_PIRQ) {
+		db_printf("\tPirq: %d ActiveHi: %d EdgeTrigger: %d NeedsEOI: %d Shared: %d\n",
+		    isrc->xi_pirq, isrc->xi_activehi, isrc->xi_edgetrigger,
+		    isrc->xi_needs_eoi, isrc->xi_shared);
+	}
+	if (isrc->xi_type == EVTCHN_TYPE_VIRQ) {
+		db_printf("\tVirq: %d\n", isrc->xi_virq);
+	}
+
+	db_printf("\tMasked: %d Pending: %d\n",
+	    test_bit(isrc->xi_port, &s->evtchn_mask[0]),
+	    test_bit(isrc->xi_port, &s->evtchn_pending[0]));
+
+	db_printf("\tPer-CPU Masks: ");
+	CPU_FOREACH(i) {
+		pcpu = DPCPU_ID_PTR(i, xen_intr_pcpu);
+		db_printf("cpu#%d: %d ", i,
+		    test_bit(isrc->xi_port, pcpu->evtchn_enabled));
+	}
+	db_printf("\n");
+}
+
+DB_SHOW_COMMAND(xen_evtchn, db_show_xen_evtchn)
+{
+	int i;
+
+	if (!xen_domain()) {
+		db_printf("Only available on Xen guests\n");
+		return;
+	}
+
+	for (i = 0; i < NR_EVENT_CHANNELS; i++) {
+		struct xenisrc *isrc;
+
+		isrc = xen_intr_port_to_isrc[i];
+		if (isrc == NULL)
+			continue;
+
+		xen_intr_dump_port(isrc);
+	}
+}
+#endif /* DDB */
-- 
1.7.7.5 (Apple Git-26)

