aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmmanuel Ackaouy <ack@xensource.com>2007-01-05 17:34:35 +0000
committerEmmanuel Ackaouy <ack@xensource.com>2007-01-05 17:34:35 +0000
commit2942f45e09fb239f07af6d980f6a60e5d92ae04e (patch)
tree7a7dee5b9952fd58b2252d00b730fdb044e28123
parent75a2a59383d0e0bb7c89917a3fdad683bad4996c (diff)
downloadxen-2942f45e09fb239f07af6d980f6a60e5d92ae04e.tar.gz
xen-2942f45e09fb239f07af6d980f6a60e5d92ae04e.tar.bz2
xen-2942f45e09fb239f07af6d980f6a60e5d92ae04e.zip
Enable compatibility mode operation for HYPERVISOR_sched_op and
HYPERVISOR_set_timer_op. Signed-off-by: Jan Beulich <jbeulich@novell.com>
-rw-r--r--xen/arch/x86/x86_64/compat/entry.S6
-rw-r--r--xen/common/Makefile5
-rw-r--r--xen/common/compat/schedule.c51
-rw-r--r--xen/common/schedule.c17
-rw-r--r--xen/include/xlat.lst3
5 files changed, 76 insertions, 6 deletions
diff --git a/xen/arch/x86/x86_64/compat/entry.S b/xen/arch/x86/x86_64/compat/entry.S
index fa62fe4160..a7decff144 100644
--- a/xen/arch/x86/x86_64/compat/entry.S
+++ b/xen/arch/x86/x86_64/compat/entry.S
@@ -279,10 +279,8 @@ CFIX14:
.section .rodata, "a", @progbits
#define compat_platform_op domain_crash_synchronous
-#define compat_set_timer_op domain_crash_synchronous
#define compat_grant_table_op domain_crash_synchronous
#define compat_acm_op domain_crash_synchronous
-#define compat_arch_sched_op domain_crash_synchronous
#define compat_xenoprof_op domain_crash_synchronous
#define compat_sysctl domain_crash_synchronous
#define compat_domctl domain_crash_synchronous
@@ -317,7 +315,7 @@ ENTRY(compat_hypercall_table)
.quad compat_mmuext_op
.quad compat_acm_op
.quad compat_nmi_op
- .quad compat_arch_sched_op
+ .quad compat_sched_op
.quad compat_callback_op /* 30 */
.quad compat_xenoprof_op
.quad do_event_channel_op
@@ -359,7 +357,7 @@ ENTRY(compat_hypercall_args_table)
.byte 4 /* compat_mmuext_op */
.byte 1 /* compat_acm_op */
.byte 2 /* compat_nmi_op */
- .byte 2 /* compat_arch_sched_op */
+ .byte 2 /* compat_sched_op */
.byte 2 /* compat_callback_op */ /* 30 */
.byte 2 /* compat_xenoprof_op */
.byte 2 /* compat_event_channel_op */
diff --git a/xen/common/Makefile b/xen/common/Makefile
index 680fd60b8c..2beaa128c0 100644
--- a/xen/common/Makefile
+++ b/xen/common/Makefile
@@ -39,3 +39,8 @@ subdir-$(CONFIG_COMPAT) += compat
# Object file contains changeset and compiler information.
version.o: $(BASEDIR)/include/xen/compile.h
+
+ifeq ($(CONFIG_COMPAT),y)
+# extra dependencies
+schedule.o: compat/schedule.c
+endif
diff --git a/xen/common/compat/schedule.c b/xen/common/compat/schedule.c
new file mode 100644
index 0000000000..5795279978
--- /dev/null
+++ b/xen/common/compat/schedule.c
@@ -0,0 +1,51 @@
+/****************************************************************************
+ * schedule.c
+ *
+ */
+
+#include <compat/sched.h>
+
+#define COMPAT
+#define ret_t int
+
+#define do_sched_op compat_sched_op
+
+#define xen_sched_shutdown sched_shutdown
+CHECK_sched_shutdown;
+#undef xen_sched_shutdown
+
+#define xen_sched_remote_shutdown sched_remote_shutdown
+CHECK_sched_remote_shutdown;
+#undef xen_sched_remote_shutdown
+
+static int compat_poll(struct compat_sched_poll *compat)
+{
+ struct sched_poll native;
+
+#define XLAT_sched_poll_HNDL_ports(_d_, _s_) \
+ guest_from_compat_handle((_d_)->ports, (_s_)->ports)
+ XLAT_sched_poll(&native, compat);
+#undef XLAT_sched_poll_HNDL_ports
+
+ return do_poll(&native);
+}
+
+#define do_poll compat_poll
+#define sched_poll compat_sched_poll
+
+#include "../schedule.c"
+
+int compat_set_timer_op(u32 lo, s32 hi)
+{
+ return do_set_timer_op(((s64)hi << 32) | lo);
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/common/schedule.c b/xen/common/schedule.c
index 4083426cb0..69fbb02634 100644
--- a/xen/common/schedule.c
+++ b/xen/common/schedule.c
@@ -13,6 +13,7 @@
*
*/
+#ifndef COMPAT
#include <xen/config.h>
#include <xen/init.h>
#include <xen/lib.h>
@@ -366,9 +367,13 @@ long do_sched_op_compat(int cmd, unsigned long arg)
return ret;
}
-long do_sched_op(int cmd, XEN_GUEST_HANDLE(void) arg)
+typedef long ret_t;
+
+#endif /* !COMPAT */
+
+ret_t do_sched_op(int cmd, XEN_GUEST_HANDLE(void) arg)
{
- long ret = 0;
+ ret_t ret = 0;
switch ( cmd )
{
@@ -445,6 +450,8 @@ long do_sched_op(int cmd, XEN_GUEST_HANDLE(void) arg)
return ret;
}
+#ifndef COMPAT
+
/* Per-domain one-shot-timer hypercall. */
long do_set_timer_op(s_time_t timeout)
{
@@ -736,6 +743,12 @@ void dump_runq(unsigned char key)
local_irq_restore(flags);
}
+#ifdef CONFIG_COMPAT
+#include "compat/schedule.c"
+#endif
+
+#endif /* !COMPAT */
+
/*
* Local variables:
* mode: C
diff --git a/xen/include/xlat.lst b/xen/include/xlat.lst
index df786c0d53..5ac6430a91 100644
--- a/xen/include/xlat.lst
+++ b/xen/include/xlat.lst
@@ -26,4 +26,7 @@
! memory_map memory.h
! memory_reservation memory.h
! translate_gpfn_list memory.h
+! sched_poll sched.h
+? sched_remote_shutdown sched.h
+? sched_shutdown sched.h
! vcpu_runstate_info vcpu.h