Index: 2006-10-04/xen/arch/x86/domain.c ==================================================================--- 2006-10-04.orig/xen/arch/x86/domain.c 2006-10-04 15:18:51.000000000 +0200 +++ 2006-10-04/xen/arch/x86/domain.c 2006-10-04 15:20:09.000000000 +0200 @@ -40,6 +40,9 @@ #include <asm/hvm/hvm.h> #include <asm/hvm/support.h> #include <asm/msr.h> +#ifdef CONFIG_COMPAT +#include <compat/vcpu.h> +#endif DEFINE_PER_CPU(struct vcpu *, curr_vcpu); @@ -532,7 +535,7 @@ arch_do_vcpu_op( break; rc = 0; - v->runstate_guest = area.addr.h; + runstate_guest(v) = area.addr.h; if ( v == current ) __copy_to_guest(area.addr.h, &v->runstate, 1); @@ -958,8 +961,20 @@ void context_switch(struct vcpu *prev, s context_saved(prev); /* Update per-VCPU guest runstate shared memory area (if registered). */ - if ( !guest_handle_is_null(next->runstate_guest) ) - __copy_to_guest(next->runstate_guest, &next->runstate, 1); + if ( !guest_handle_is_null(runstate_guest(next)) ) + { + if ( !IS_COMPAT(next->domain) ) + __copy_to_guest(runstate_guest(next), &next->runstate, 1); +#ifdef CONFIG_COMPAT + else + { + struct compat_vcpu_runstate_info info; + + XLAT_vcpu_runstate_info(&info, &next->runstate); + __copy_to_guest(next->runstate_guest.compat, &info, 1); + } +#endif + } schedule_tail(next); BUG(); Index: 2006-10-04/xen/arch/x86/x86_64/Makefile ==================================================================--- 2006-10-04.orig/xen/arch/x86/x86_64/Makefile 2006-10-04 15:20:03.000000000 +0200 +++ 2006-10-04/xen/arch/x86/x86_64/Makefile 2006-10-04 15:20:09.000000000 +0200 @@ -4,6 +4,7 @@ obj-y += mm.o obj-y += traps.o obj-$(CONFIG_COMPAT) += compat.o +obj-$(CONFIG_COMPAT) += domain.o obj-$(CONFIG_COMPAT) += physdev.o ifeq ($(CONFIG_COMPAT),y) Index: 2006-10-04/xen/arch/x86/x86_64/compat/entry.S ==================================================================--- 2006-10-04.orig/xen/arch/x86/x86_64/compat/entry.S 2006-10-04 15:20:03.000000000 +0200 +++ 2006-10-04/xen/arch/x86/x86_64/compat/entry.S 2006-10-04 15:20:09.000000000 +0200 @@ -284,7 +284,6 @@ CFIX14: #define compat_multicall domain_crash_synchronous #define compat_set_timer_op domain_crash_synchronous #define compat_grant_table_op domain_crash_synchronous -#define compat_vcpu_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 Index: 2006-10-04/xen/arch/x86/x86_64/domain.c ==================================================================--- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ 2006-10-04/xen/arch/x86/x86_64/domain.c 2006-10-04 15:20:09.000000000 +0200 @@ -0,0 +1,62 @@ +/****************************************************************************** + * arch/x86/x86_64/domain.c + * + */ + +#include <xen/config.h> +#include <xen/types.h> +#include <xen/guest_access.h> +#include <asm/hypercall.h> +#include <compat/vcpu.h> + +int +arch_compat_vcpu_op( + int cmd, struct vcpu *v, XEN_GUEST_HANDLE(void) arg) +{ + long rc = 0; + + switch ( cmd ) + { + case VCPUOP_register_runstate_memory_area: + { + struct compat_vcpu_register_runstate_memory_area area; + + rc = -EFAULT; + if ( copy_from_guest(&area, arg, 1) ) + break; + + if ( area.addr.h.c != area.addr.p || + !compat_handle_okay(area.addr.h, 1) ) + break; + + rc = 0; + guest_from_compat_handle(v->runstate_guest.compat, area.addr.h); + + if ( v == current ) + { + struct compat_vcpu_runstate_info info; + + XLAT_vcpu_runstate_info(&info, &v->runstate); + __copy_to_compat(area.addr.h, &info, 1); + } + + break; + } + + default: + rc = -ENOSYS; + break; + } + + return rc; +} + +/* + * Local variables: + * mode: C + * c-set-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ Index: 2006-10-04/xen/common/compat/Makefile ==================================================================--- 2006-10-04.orig/xen/common/compat/Makefile 2006-10-04 15:18:51.000000000 +0200 +++ 2006-10-04/xen/common/compat/Makefile 2006-10-04 15:20:09.000000000 +0200 @@ -1,3 +1,4 @@ +obj-y += domain.o obj-y += kernel.o obj-y += memory.o obj-y += xlat.o Index: 2006-10-04/xen/common/compat/domain.c ==================================================================--- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ 2006-10-04/xen/common/compat/domain.c 2006-10-04 15:20:09.000000000 +0200 @@ -0,0 +1,102 @@ +/****************************************************************************** + * domain.c + * + */ + +#include <xen/config.h> +#include <xen/lib.h> +#include <xen/sched.h> +#include <xen/domain.h> +#include <xen/guest_access.h> +#include <xen/hypercall.h> +#include <compat/vcpu.h> + +int compat_vcpu_op(int cmd, int vcpuid, XEN_GUEST_HANDLE(void) arg) +{ + struct domain *d = current->domain; + struct vcpu *v; + long rc = 0; + + if ( (vcpuid < 0) || (vcpuid >= MAX_VIRT_CPUS) ) + return -EINVAL; + + if ( (v = d->vcpu[vcpuid]) == NULL ) + return -ENOENT; + + switch ( cmd ) + { + case VCPUOP_initialise: + { + struct compat_vcpu_guest_context *cmp_ctxt; + struct vcpu_guest_context *nat_ctxt; + + if ( (cmp_ctxt = xmalloc(struct compat_vcpu_guest_context)) == NULL ) + { + rc = -ENOMEM; + break; + } + + if ( copy_from_guest(cmp_ctxt, arg, 1) ) + { + xfree(cmp_ctxt); + rc = -EFAULT; + break; + } + + if ( (nat_ctxt = xmalloc(struct vcpu_guest_context)) == NULL ) + { + rc = -ENOMEM; + break; + } + + memset(nat_ctxt, 0, sizeof(*nat_ctxt)); + XLAT_vcpu_guest_context(nat_ctxt, cmp_ctxt); + xfree(cmp_ctxt); + + LOCK_BIGLOCK(d); + rc = -EEXIST; + if ( !test_bit(_VCPUF_initialised, &v->vcpu_flags) ) + rc = boot_vcpu(d, vcpuid, nat_ctxt); + UNLOCK_BIGLOCK(d); + + xfree(nat_ctxt); + break; + } + + case VCPUOP_up: + case VCPUOP_down: + case VCPUOP_is_up: + rc = do_vcpu_op(cmd, vcpuid, arg); + break; + + case VCPUOP_get_runstate_info: + { + union { + struct vcpu_runstate_info nat; + struct compat_vcpu_runstate_info cmp; + } runstate; + + vcpu_runstate_get(v, &runstate.nat); + xlat_vcpu_runstate_info(&runstate.nat); + if ( copy_to_guest(arg, &runstate.cmp, 1) ) + rc = -EFAULT; + break; + } + + default: + rc = arch_compat_vcpu_op(cmd, v, arg); + break; + } + + return rc; +} + +/* + * Local variables: + * mode: C + * c-set-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ Index: 2006-10-04/xen/common/compat/xlat.c ==================================================================--- 2006-10-04.orig/xen/common/compat/xlat.c 2006-10-04 15:20:03.000000000 +0200 +++ 2006-10-04/xen/common/compat/xlat.c 2006-10-04 15:20:09.000000000 +0200 @@ -6,6 +6,7 @@ #include <xen/lib.h> #include <compat/xen.h> #include <compat/event_channel.h> +#include <compat/vcpu.h> /* In-place translation functons: */ void xlat_start_info(struct start_info *native, @@ -17,6 +18,14 @@ void xlat_start_info(struct start_info * XLAT_start_info(compat, native); } +void xlat_vcpu_runstate_info(struct vcpu_runstate_info *native) +{ + struct compat_vcpu_runstate_info *compat = (void *)native; + + BUILD_BUG_ON(sizeof(*native) < sizeof(*compat)); + XLAT_vcpu_runstate_info(compat, native); +} + #define xen_dom0_vga_console_info dom0_vga_console_info CHECK_dom0_vga_console_info #undef dom0_vga_console_info Index: 2006-10-04/xen/include/asm-x86/hypercall.h ==================================================================--- 2006-10-04.orig/xen/include/asm-x86/hypercall.h 2006-10-04 15:20:03.000000000 +0200 +++ 2006-10-04/xen/include/asm-x86/hypercall.h 2006-10-04 15:20:09.000000000 +0200 @@ -125,6 +125,10 @@ compat_physdev_op( int cmd, XEN_GUEST_HANDLE(void) arg); +extern int +arch_compat_vcpu_op( + int cmd, struct vcpu *v, XEN_GUEST_HANDLE(void) arg); + #endif #endif /* __ASM_X86_HYPERCALL_H__ */ Index: 2006-10-04/xen/include/xen/compat.h ==================================================================--- 2006-10-04.orig/xen/include/xen/compat.h 2006-10-04 15:18:51.000000000 +0200 +++ 2006-10-04/xen/include/xen/compat.h 2006-10-04 15:20:09.000000000 +0200 @@ -148,6 +148,8 @@ int hypercall_xlat_continuation(unsigned /* In-place translation functons: */ struct start_info; void xlat_start_info(struct start_info *, enum XLAT_start_info_console); +struct vcpu_runstate_info; +void xlat_vcpu_runstate_info(struct vcpu_runstate_info *); #define BITS_PER_GUEST_LONG(d) (!IS_COMPAT(d) ? BITS_PER_LONG : COMPAT_BITS_PER_LONG) Index: 2006-10-04/xen/include/xen/sched.h ==================================================================--- 2006-10-04.orig/xen/include/xen/sched.h 2006-10-04 15:11:04.000000000 +0200 +++ 2006-10-04/xen/include/xen/sched.h 2006-10-04 15:20:09.000000000 +0200 @@ -18,6 +18,11 @@ #include <xen/xenoprof.h> #include <xen/irq.h> +#ifdef CONFIG_COMPAT +#include <compat/vcpu.h> +DEFINE_XEN_GUEST_HANDLE(vcpu_runstate_info_compat_t); +#endif + extern unsigned long volatile jiffies; extern rwlock_t domlist_lock; @@ -82,7 +87,16 @@ struct vcpu void *sched_priv; /* scheduler-specific data */ struct vcpu_runstate_info runstate; +#ifndef CONFIG_COMPAT +# define runstate_guest(v) ((v)->runstate_guest) XEN_GUEST_HANDLE(vcpu_runstate_info_t) runstate_guest; /* guest address */ +#else +# define runstate_guest(v) ((v)->runstate_guest.native) + union { + XEN_GUEST_HANDLE(vcpu_runstate_info_t) native; + XEN_GUEST_HANDLE(vcpu_runstate_info_compat_t) compat; + } runstate_guest; /* guest address */ +#endif unsigned long vcpu_flags; Index: 2006-10-04/xen/include/xlat.lst ==================================================================--- 2006-10-04.orig/xen/include/xlat.lst 2006-10-04 15:20:03.000000000 +0200 +++ 2006-10-04/xen/include/xlat.lst 2006-10-04 15:20:09.000000000 +0200 @@ -6,6 +6,9 @@ ! mmuext_op xen.h ! start_info xen.h ? vcpu_time_info xen.h +! cpu_user_regs arch-@arch@.h +! trap_info arch-@arch@.h +! vcpu_guest_context arch-@arch@.h ? evtchn_alloc_unbound event_channel.h ? evtchn_bind_interdomain event_channel.h ? evtchn_bind_ipi event_channel.h @@ -22,3 +25,4 @@ ! memory_map memory.h ! memory_reservation memory.h ! translate_gpfn_list memory.h +! vcpu_runstate_info vcpu.h _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel