aboutsummaryrefslogtreecommitdiffstats
path: root/extras/mini-os
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-04-16 10:06:19 +0100
committerKeir Fraser <keir.fraser@citrix.com>2008-04-16 10:06:19 +0100
commit796b445b0080452f93f4a98af2d4fe8fea15ebf4 (patch)
treefb5721f7492c545ec056d9a3789769468b1e7999 /extras/mini-os
parent28baa78877ebda840603774d6a1e3e9da9546a6e (diff)
downloadxen-796b445b0080452f93f4a98af2d4fe8fea15ebf4.tar.gz
xen-796b445b0080452f93f4a98af2d4fe8fea15ebf4.tar.bz2
xen-796b445b0080452f93f4a98af2d4fe8fea15ebf4.zip
minios: call do_hypervisor_callback directly from force_evtchn_callback
instead of unnecessarily going through the hypervisor. Signed-off-by: Samuel Thibault <samuel.thibault@eu.citrix.com>
Diffstat (limited to 'extras/mini-os')
-rw-r--r--extras/mini-os/hypervisor.c15
-rw-r--r--extras/mini-os/include/hypervisor.h4
-rw-r--r--extras/mini-os/include/ia64/os.h11
-rw-r--r--extras/mini-os/include/x86/os.h1
4 files changed, 18 insertions, 13 deletions
diff --git a/extras/mini-os/hypervisor.c b/extras/mini-os/hypervisor.c
index e84d34ccaf..2840d789ef 100644
--- a/extras/mini-os/hypervisor.c
+++ b/extras/mini-os/hypervisor.c
@@ -66,6 +66,21 @@ void do_hypervisor_callback(struct pt_regs *regs)
in_callback = 0;
}
+void force_evtchn_callback(void)
+{
+ vcpu_info_t *vcpu;
+ vcpu = &HYPERVISOR_shared_info->vcpu_info[smp_processor_id()];
+ int save = vcpu->evtchn_upcall_mask;
+
+ while (vcpu->evtchn_upcall_pending) {
+ vcpu->evtchn_upcall_mask = 1;
+ barrier();
+ do_hypervisor_callback(NULL);
+ barrier();
+ vcpu->evtchn_upcall_mask = save;
+ barrier();
+ };
+}
inline void mask_evtchn(u32 port)
{
diff --git a/extras/mini-os/include/hypervisor.h b/extras/mini-os/include/hypervisor.h
index e06f54bdef..41ef161db1 100644
--- a/extras/mini-os/include/hypervisor.h
+++ b/extras/mini-os/include/hypervisor.h
@@ -24,6 +24,7 @@
#else
#error "Unsupported architecture"
#endif
+#include <traps.h>
/*
* a placeholder for the start of day information passed up from the hypervisor
@@ -37,7 +38,8 @@ extern union start_info_union start_info_union;
#define start_info (start_info_union.start_info)
/* hypervisor.c */
-//void do_hypervisor_callback(struct pt_regs *regs);
+void force_evtchn_callback(void);
+void do_hypervisor_callback(struct pt_regs *regs);
void mask_evtchn(u32 port);
void unmask_evtchn(u32 port);
void clear_evtchn(u32 port);
diff --git a/extras/mini-os/include/ia64/os.h b/extras/mini-os/include/ia64/os.h
index e6b7884d7a..2ae5331393 100644
--- a/extras/mini-os/include/ia64/os.h
+++ b/extras/mini-os/include/ia64/os.h
@@ -189,17 +189,6 @@ __synch_cmpxchg(volatile void *ptr, uint64_t old, uint64_t new, int size)
return ia64_cmpxchg_acq_64(ptr, old, new);
}
-/*
- * Force a proper event-channel callback from Xen after clearing the
- * callback mask. We do this in a very simple manner, by making a call
- * down into Xen. The pending flag will be checked by Xen on return.
- */
-static inline void
-force_evtchn_callback(void)
-{
- (void)HYPERVISOR_xen_version(0, NULL);
-}
-
extern shared_info_t *HYPERVISOR_shared_info;
static inline int
diff --git a/extras/mini-os/include/x86/os.h b/extras/mini-os/include/x86/os.h
index 7217d0b3ca..1cab0a73db 100644
--- a/extras/mini-os/include/x86/os.h
+++ b/extras/mini-os/include/x86/os.h
@@ -28,7 +28,6 @@ extern void do_exit(void) __attribute__((noreturn));
#include <xen/xen.h>
-#define force_evtchn_callback() ((void)HYPERVISOR_xen_version(0, 0))
#define __KERNEL_CS FLAT_KERNEL_CS
#define __KERNEL_DS FLAT_KERNEL_DS