diff options
author | David Vrabel <david.vrabel@citrix.com> | 2013-10-14 10:17:14 +0200 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2013-10-14 10:17:14 +0200 |
commit | 611d0ecc81bf948f6f9c592afdd6c2aebcfaaadb (patch) | |
tree | a3a741503fc9917448c46450b621f2f081d379f5 | |
parent | fbbd5009e6ed1201731b1727762070c1a988e67d (diff) | |
download | xen-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.c | 10 | ||||
-rw-r--r-- | xen/common/event_channel.c | 8 | ||||
-rw-r--r-- | xen/include/xen/event.h | 7 |
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__ */ |