diff options
Diffstat (limited to 'drivers/xen')
-rw-r--r-- | drivers/xen/events.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/xen/events.c b/drivers/xen/events.c index a0837036d898..b6c2b8f16bee 100644 --- a/drivers/xen/events.c +++ b/drivers/xen/events.c | |||
@@ -164,6 +164,12 @@ static inline void set_evtchn(int port) | |||
164 | sync_set_bit(port, &s->evtchn_pending[0]); | 164 | sync_set_bit(port, &s->evtchn_pending[0]); |
165 | } | 165 | } |
166 | 166 | ||
167 | static inline int test_evtchn(int port) | ||
168 | { | ||
169 | struct shared_info *s = HYPERVISOR_shared_info; | ||
170 | return sync_test_bit(port, &s->evtchn_pending[0]); | ||
171 | } | ||
172 | |||
167 | 173 | ||
168 | /** | 174 | /** |
169 | * notify_remote_via_irq - send event to remote end of event channel via irq | 175 | * notify_remote_via_irq - send event to remote end of event channel via irq |
@@ -732,6 +738,25 @@ void xen_clear_irq_pending(int irq) | |||
732 | clear_evtchn(evtchn); | 738 | clear_evtchn(evtchn); |
733 | } | 739 | } |
734 | 740 | ||
741 | void xen_set_irq_pending(int irq) | ||
742 | { | ||
743 | int evtchn = evtchn_from_irq(irq); | ||
744 | |||
745 | if (VALID_EVTCHN(evtchn)) | ||
746 | set_evtchn(evtchn); | ||
747 | } | ||
748 | |||
749 | bool xen_test_irq_pending(int irq) | ||
750 | { | ||
751 | int evtchn = evtchn_from_irq(irq); | ||
752 | bool ret = false; | ||
753 | |||
754 | if (VALID_EVTCHN(evtchn)) | ||
755 | ret = test_evtchn(evtchn); | ||
756 | |||
757 | return ret; | ||
758 | } | ||
759 | |||
735 | /* Poll waiting for an irq to become pending. In the usual case, the | 760 | /* Poll waiting for an irq to become pending. In the usual case, the |
736 | irq will be disabled so it won't deliver an interrupt. */ | 761 | irq will be disabled so it won't deliver an interrupt. */ |
737 | void xen_poll_irq(int irq) | 762 | void xen_poll_irq(int irq) |