From 354ecd6e5017ded134b69779ef0d3e54a1d7c8c6 Mon Sep 17 00:00:00 2001
From: Roger Pau Monne <roger.pau@citrix.com>
Date: Thu, 19 Jun 2014 13:05:53 +0200
Subject: [PATCH v5 03/29] 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 |   79 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 79 insertions(+), 0 deletions(-)

diff --git a/sys/x86/xen/xen_intr.c b/sys/x86/xen/xen_intr.c
index d148798..ebaded1 100644
--- a/sys/x86/xen/xen_intr.c
+++ b/sys/x86/xen/xen_intr.c
@@ -1427,3 +1427,82 @@ 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,
+		    !!test_bit(isrc->xi_pirq, xen_intr_pirq_eoi_map),
+		    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)

