aboutsummaryrefslogtreecommitdiffstats
path: root/extras/mini-os/hypervisor.c
diff options
context:
space:
mode:
authoriap10@labyrinth.cl.cam.ac.uk <iap10@labyrinth.cl.cam.ac.uk>2003-10-06 17:18:26 +0000
committeriap10@labyrinth.cl.cam.ac.uk <iap10@labyrinth.cl.cam.ac.uk>2003-10-06 17:18:26 +0000
commite4130630e189f44c1371dc8c78b66b8bcf6df732 (patch)
tree8502aa47aab90a0e59e3db0da53ada16f48a4213 /extras/mini-os/hypervisor.c
parentcc2ec41082ca2cc7c641794b3f52c4ee8233dc5f (diff)
downloadxen-e4130630e189f44c1371dc8c78b66b8bcf6df732.tar.gz
xen-e4130630e189f44c1371dc8c78b66b8bcf6df732.tar.bz2
xen-e4130630e189f44c1371dc8c78b66b8bcf6df732.zip
bitkeeper revision 1.483 (3f81a3e2iM-0WXaGxUS3ywM3_KZqLw)
move mini-os to extras directory
Diffstat (limited to 'extras/mini-os/hypervisor.c')
-rw-r--r--extras/mini-os/hypervisor.c83
1 files changed, 83 insertions, 0 deletions
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 <os.h>
+#include <hypervisor.h>
+
+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<<ev)) )
+ {
+ //printk("Unexpected hypervisor event %d\n", ev);
+ atomic_inc((atomic_t *)&ev_err_count);
+ }
+ set_bit(ev, &HYPERVISOR_shared_info->events_mask);
+}