aboutsummaryrefslogtreecommitdiffstats
path: root/extras/mini-os/events.c
diff options
context:
space:
mode:
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>2006-11-30 17:17:28 +0000
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>2006-11-30 17:17:28 +0000
commit89f64447946ccfaa906987c3ce72ab3788c5705d (patch)
tree55a66e274d0f303a448427df745bc3e278763dbb /extras/mini-os/events.c
parentf446b44935ec9e42dba073dccffec738a5feaa37 (diff)
downloadxen-89f64447946ccfaa906987c3ce72ab3788c5705d.tar.gz
xen-89f64447946ccfaa906987c3ce72ab3788c5705d.tar.bz2
xen-89f64447946ccfaa906987c3ce72ab3788c5705d.zip
[MINIOS] Improved unbind_all_ports().
Signed-off-by: Jacob Gorm Hansen <jacobg@diku.dk>
Diffstat (limited to 'extras/mini-os/events.c')
-rw-r--r--extras/mini-os/events.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/extras/mini-os/events.c b/extras/mini-os/events.c
index 5d60ab70fc..dad8e42377 100644
--- a/extras/mini-os/events.c
+++ b/extras/mini-os/events.c
@@ -31,26 +31,27 @@ typedef struct _ev_action_t {
u32 count;
} ev_action_t;
-
static ev_action_t ev_actions[NR_EVS];
void default_handler(evtchn_port_t port, struct pt_regs *regs, void *data);
+static unsigned long bound_ports[NR_EVS/(8*sizeof(unsigned long))];
+
void unbind_all_ports(void)
{
int i;
- for(i=0;i<NR_EVS;i++)
- {
- if(ev_actions[i].handler != default_handler)
- {
- struct evtchn_close close;
- mask_evtchn(i);
- close.port = i;
- HYPERVISOR_event_channel_op(EVTCHNOP_close, &close);
- }
- }
+ for (i = 0; i < NR_EVS; i++)
+ {
+ if (test_and_clear_bit(i, bound_ports))
+ {
+ struct evtchn_close close;
+ mask_evtchn(i);
+ close.port = i;
+ HYPERVISOR_event_channel_op(EVTCHNOP_close, &close);
+ }
+ }
}
-
+
/*
* Demux events to different handlers.
*/
@@ -114,6 +115,7 @@ int bind_virq(uint32_t virq, evtchn_handler_t handler, void *data)
printk("Failed to bind virtual IRQ %d\n", virq);
return 1;
}
+ set_bit(op.port,bound_ports);
bind_evtchn(op.port, handler, data);
return 0;
}
@@ -188,6 +190,7 @@ int evtchn_bind_interdomain(domid_t pal, evtchn_port_t remote_port,
int err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain, &op);
if (err)
return err;
+ set_bit(op.local_port,bound_ports);
evtchn_port_t port = op.local_port;
clear_evtchn(port); /* Without, handler gets invoked now! */
*local_port = bind_evtchn(port, handler, data);