diff options
author | rneugeba@wyvis.research <rneugeba@wyvis.research> | 2003-10-06 11:26:01 +0000 |
---|---|---|
committer | rneugeba@wyvis.research <rneugeba@wyvis.research> | 2003-10-06 11:26:01 +0000 |
commit | f2c4c1d4e811964ff9fc87101f0804cf10f9789e (patch) | |
tree | 09a4ea50df6f7813a76d3e9f97b374b47f1ee64b /mini-os/events.c | |
parent | 922fddb0355189b9e0b4a85bca04d03569b7ad56 (diff) | |
download | xen-f2c4c1d4e811964ff9fc87101f0804cf10f9789e.tar.gz xen-f2c4c1d4e811964ff9fc87101f0804cf10f9789e.tar.bz2 xen-f2c4c1d4e811964ff9fc87101f0804cf10f9789e.zip |
bitkeeper revision 1.478.1.1 (3f815149k7sE-z_IK6MG5eHi34m-Qg)
Minimal guest OS (based on some old code from Keir)
Diffstat (limited to 'mini-os/events.c')
-rw-r--r-- | mini-os/events.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/mini-os/events.c b/mini-os/events.c new file mode 100644 index 0000000000..a2083afa37 --- /dev/null +++ b/mini-os/events.c @@ -0,0 +1,106 @@ +/* -*- Mode:C; c-basic-offset:4; tab-width:4 -*- + **************************************************************************** + * (C) 2003 - Rolf Neugebauer - Intel Research Cambridge + **************************************************************************** + * + * File: events.c + * Author: Rolf Neugebauer (neugebar@dcs.gla.ac.uk) + * Changes: + * + * Date: Jul 2003 + * + * Environment: Xen Minimal OS + * Description: Deal with events + * + **************************************************************************** + * $Id: c-insert.c,v 1.7 2002/11/08 16:04:34 rn Exp $ + **************************************************************************** + */ + +#include <os.h> +#include <hypervisor.h> +#include <events.h> +#include <lib.h> + +static ev_action_t ev_actions[NR_EVS]; +void default_handler(int ev, struct pt_regs *regs); + + +/* + * demux events to different handlers + */ +asmlinkage unsigned int do_event(int ev, struct pt_regs *regs) +{ + ev_action_t *action; + + if (ev >= NR_EVS) { + printk("Large event number %d\n", ev); + return 0; + } + + action = &ev_actions[ev]; + action->count++; + ack_hypervisor_event(ev); + + if (!action->handler) + goto out; + + if (action->status & EVS_DISABLED) + goto out; + + /* call the handler */ + action->handler(ev, regs); + + out: + return 1; + +} + +/* + * add a handler + */ +unsigned int add_ev_action( int ev, void (*handler)(int, struct pt_regs *) ) +{ + if (ev_actions[ev].handler) { + printk ("event[%d] already handled by %p", ev, ev_actions[ev].handler); + return 0; + } + + ev_actions[ev].handler = handler; + return 1; +} + +unsigned int enable_ev_action( int ev ) +{ + if (!ev_actions[ev].handler) { + printk ("enable event[%d], no handler installed", ev); + return 0; + } + ev_actions[ev].status &= ~EVS_DISABLED; + return 1; +} + +unsigned int disable_ev_action( int ev ) +{ + ev_actions[ev].status |= EVS_DISABLED; + return 1; +} + +/* + * initially all events are without a handler and disabled + */ +void init_events(void) +{ + int i; + + /* inintialise event handler */ + for ( i = 0; i < NR_EVS; i++ ) + { + ev_actions[i].status = EVS_DISABLED; + ev_actions[i].handler = NULL; + } +} + +void default_handler(int ev, struct pt_regs *regs) { + printk("X[%d] ", ev); +} |