aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Vrabel <david.vrabel@citrix.com>2013-10-14 10:17:14 +0200
committerJan Beulich <jbeulich@suse.com>2013-10-14 10:17:14 +0200
commit611d0ecc81bf948f6f9c592afdd6c2aebcfaaadb (patch)
treea3a741503fc9917448c46450b621f2f081d379f5
parentfbbd5009e6ed1201731b1727762070c1a988e67d (diff)
downloadxen-611d0ecc81bf948f6f9c592afdd6c2aebcfaaadb.tar.gz
xen-611d0ecc81bf948f6f9c592afdd6c2aebcfaaadb.tar.bz2
xen-611d0ecc81bf948f6f9c592afdd6c2aebcfaaadb.zip
evtchn: print ABI specific state with the 'e' debug key
In the output of the 'e' debug key, print some ABI specific state in addition to the (p)ending and (m)asked bits. For the 2-level ABI, print the state of that event's selector bit. e.g., (XEN) port [p/m/s] (XEN) 1 [0/0/1]: s=3 n=0 x=0 d=0 p=74 (XEN) 2 [0/0/1]: s=3 n=0 x=0 d=0 p=75 Signed-off-by: David Vrabel <david.vrabel@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com> Acked-by: Keir Fraser <keir@xen.org>
-rw-r--r--xen/common/event_2l.c10
-rw-r--r--xen/common/event_channel.c8
-rw-r--r--xen/include/xen/event.h7
3 files changed, 22 insertions, 3 deletions
diff --git a/xen/common/event_2l.c b/xen/common/event_2l.c
index 7b28942933..a9d99d3e92 100644
--- a/xen/common/event_2l.c
+++ b/xen/common/event_2l.c
@@ -74,6 +74,15 @@ static bool_t evtchn_2l_is_masked(struct domain *d,
return test_bit(evtchn->port, &shared_info(d, evtchn_mask));
}
+static void evtchn_2l_print_state(struct domain *d,
+ const struct evtchn *evtchn)
+{
+ struct vcpu *v = d->vcpu[evtchn->notify_vcpu_id];
+
+ printk("%d", !!test_bit(evtchn->port / BITS_PER_EVTCHN_WORD(d),
+ &vcpu_info(v, evtchn_pending_sel)));
+}
+
static const struct evtchn_port_ops evtchn_port_ops_2l =
{
.set_pending = evtchn_2l_set_pending,
@@ -81,6 +90,7 @@ static const struct evtchn_port_ops evtchn_port_ops_2l =
.unmask = evtchn_2l_unmask,
.is_pending = evtchn_2l_is_pending,
.is_masked = evtchn_2l_is_masked,
+ .print_state = evtchn_2l_print_state,
};
void evtchn_2l_init(struct domain *d)
diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c
index 7290a21dc0..f73c7a9afd 100644
--- a/xen/common/event_channel.c
+++ b/xen/common/event_channel.c
@@ -1232,7 +1232,7 @@ static void domain_dump_evtchn_info(struct domain *d)
d->poll_mask, d->max_vcpus);
printk("Event channel information for domain %d:\n"
"Polling vCPUs: {%s}\n"
- " port [p/m]\n", d->domain_id, keyhandler_scratch);
+ " port [p/m/s]\n", d->domain_id, keyhandler_scratch);
spin_lock(&d->event_lock);
@@ -1247,10 +1247,12 @@ static void domain_dump_evtchn_info(struct domain *d)
if ( chn->state == ECS_FREE )
continue;
- printk(" %4u [%d/%d]: s=%d n=%d x=%d",
+ printk(" %4u [%d/%d/",
port,
!!evtchn_port_is_pending(d, chn),
- !!evtchn_port_is_masked(d, chn),
+ !!evtchn_port_is_masked(d, chn));
+ evtchn_port_print_state(d, chn);
+ printk("]: s=%d n=%d x=%d",
chn->state, chn->notify_vcpu_id, chn->xen_consumer);
switch ( chn->state )
diff --git a/xen/include/xen/event.h b/xen/include/xen/event.h
index 30c59c9979..2445562ecd 100644
--- a/xen/include/xen/event.h
+++ b/xen/include/xen/event.h
@@ -115,6 +115,7 @@ struct evtchn_port_ops {
void (*unmask)(struct domain *d, struct evtchn *evtchn);
bool_t (*is_pending)(struct domain *d, const struct evtchn *evtchn);
bool_t (*is_masked)(struct domain *d, const struct evtchn *evtchn);
+ void (*print_state)(struct domain *d, const struct evtchn *evtchn);
};
static inline void evtchn_port_set_pending(struct vcpu *v,
@@ -147,4 +148,10 @@ static inline bool_t evtchn_port_is_masked(struct domain *d,
return d->evtchn_port_ops->is_masked(d, evtchn);
}
+static inline void evtchn_port_print_state(struct domain *d,
+ const struct evtchn *evtchn)
+{
+ d->evtchn_port_ops->print_state(d, evtchn);
+}
+
#endif /* __XEN_EVENT_H__ */