From e4130630e189f44c1371dc8c78b66b8bcf6df732 Mon Sep 17 00:00:00 2001 From: "iap10@labyrinth.cl.cam.ac.uk" Date: Mon, 6 Oct 2003 17:18:26 +0000 Subject: bitkeeper revision 1.483 (3f81a3e2iM-0WXaGxUS3ywM3_KZqLw) move mini-os to extras directory --- extras/mini-os/hypervisor.c | 83 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 extras/mini-os/hypervisor.c (limited to 'extras/mini-os/hypervisor.c') diff --git a/extras/mini-os/hypervisor.c b/extras/mini-os/hypervisor.c new file mode 100644 index 0000000000..cf3349426e --- /dev/null +++ b/extras/mini-os/hypervisor.c @@ -0,0 +1,83 @@ +/****************************************************************************** + * hypervisor.c + * + * Communication to/from hypervisor. + * + * Copied from XenoLinux and adjusted by Rolf.Neugebauer@intel.com + * + * Copyright (c) 2002, K A Fraser + */ + +#include +#include + +static unsigned long event_mask = 0; +static unsigned long ev_err_count; + +void do_hypervisor_callback(struct pt_regs *regs) +{ + unsigned long events, flags; + shared_info_t *shared = HYPERVISOR_shared_info; + + do { + /* Specialised local_irq_save(). */ + flags = test_and_clear_bit(EVENTS_MASTER_ENABLE_BIT, + &shared->events_mask); + barrier(); + + events = xchg(&shared->events, 0); + events &= event_mask; + + /* 'events' now contains some pending events to handle. */ + __asm__ __volatile__ ( + " push %1 ;" + " sub $4,%%esp ;" + " jmp 2f ;" + "1: btrl %%eax,%0 ;" /* clear bit */ + " mov %%eax,(%%esp) ;" + " call do_event ;" /* do_event(event) */ + "2: bsfl %0,%%eax ;" /* %eax == bit # */ + " jnz 1b ;" + " add $8,%%esp ;" + /* we use %ebx because it is callee-saved */ + : : "b" (events), "r" (regs) + /* clobbered by callback function calls */ + : "eax", "ecx", "edx", "memory" ); + + /* Specialised local_irq_restore(). */ + if ( flags ) set_bit(EVENTS_MASTER_ENABLE_BIT, &shared->events_mask); + barrier(); + } + while ( shared->events ); +} + + + +/* + * Define interface to generic handling in irq.c + */ + +void enable_hypervisor_event(unsigned int ev) +{ + set_bit(ev, &event_mask); + set_bit(ev, &HYPERVISOR_shared_info->events_mask); + if ( test_bit(EVENTS_MASTER_ENABLE_BIT, + &HYPERVISOR_shared_info->events_mask) ) + do_hypervisor_callback(NULL); +} + +void disable_hypervisor_event(unsigned int ev) +{ + clear_bit(ev, &event_mask); + clear_bit(ev, &HYPERVISOR_shared_info->events_mask); +} + +void ack_hypervisor_event(unsigned int ev) +{ + if ( !(event_mask & (1<events_mask); +} -- cgit v1.2.3