[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC PATCH v2 09/12] xen: arm: implement platform hypercall
Signed-off-by: Oleksandr Dmytryshyn <oleksandr.dmytryshyn@xxxxxxxxxxxxxxx> --- xen/arch/arm/Makefile | 1 + xen/arch/arm/platform_hypercall.c | 57 ++++++++++++++++++++++++++ xen/arch/arm/traps.c | 1 + xen/arch/x86/platform_hypercall.c | 29 ++----------- xen/arch/x86/x86_64/platform_hypercall.c | 2 + xen/common/Makefile | 1 + xen/common/platform_hypercall.c | 70 ++++++++++++++++++++++++++++++++ 7 files changed, 135 insertions(+), 26 deletions(-) create mode 100644 xen/arch/arm/platform_hypercall.c create mode 100644 xen/common/platform_hypercall.c diff --git a/xen/arch/arm/Makefile b/xen/arch/arm/Makefile index d70f6d5..54d8258 100644 --- a/xen/arch/arm/Makefile +++ b/xen/arch/arm/Makefile @@ -32,6 +32,7 @@ obj-y += vuart.o obj-y += hvm.o obj-y += device.o obj-y += decode.o +obj-y += platform_hypercall.o #obj-bin-y += ....o diff --git a/xen/arch/arm/platform_hypercall.c b/xen/arch/arm/platform_hypercall.c new file mode 100644 index 0000000..aa870b4 --- /dev/null +++ b/xen/arch/arm/platform_hypercall.c @@ -0,0 +1,57 @@ +/****************************************************************************** + * platform_hypercall.c + * + * Hardware platform operations. Intended for use by domain-0 kernel. + * + * Copyright (c) 2014 GlobalLogic Inc. + */ + +#include <xen/config.h> +#include <xen/types.h> +#include <xen/sched.h> +#include <xen/pmstat.h> +#include <public/platform.h> + +long arch_do_platform_op(struct xen_platform_op *platform_op, + XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op) +{ + long ret = 0; + struct xen_platform_op *op = platform_op; + + switch ( op->cmd ) + { + case XENPF_set_processor_pminfo: + switch ( op->u.set_pminfo.type ) + { + case XEN_PM_PX: + if ( !(xen_processor_pmbits & XEN_PROCESSOR_PM_PX) ) + { + ret = -ENOSYS; + break; + } +#ifdef HAS_CPUFREQ + ret = set_px_pminfo(op->u.set_pminfo.id, &op->u.set_pminfo.u.perf); +#else + ret = -EINVAL; +#endif + break; + + default: + ret = -EINVAL; + break; + } + break; + } + + return ret; +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c index 21c7b26..d1b0014 100644 --- a/xen/arch/arm/traps.c +++ b/xen/arch/arm/traps.c @@ -1012,6 +1012,7 @@ static arm_hypercall_t arm_hypercall_table[] = { HYPERCALL(hvm_op, 2), HYPERCALL(grant_table_op, 3), HYPERCALL_ARM(vcpu_op, 3), + HYPERCALL(platform_op, 1), }; typedef int (*arm_psci_fn_t)(uint32_t, register_t); diff --git a/xen/arch/x86/platform_hypercall.c b/xen/arch/x86/platform_hypercall.c index 7ce8592..98956ff 100644 --- a/xen/arch/x86/platform_hypercall.c +++ b/xen/arch/x86/platform_hypercall.c @@ -35,15 +35,12 @@ #ifndef COMPAT typedef long ret_t; -DEFINE_SPINLOCK(xenpf_lock); # undef copy_from_compat # define copy_from_compat copy_from_guest # undef copy_to_compat # define copy_to_compat copy_to_guest # undef guest_from_compat_handle # define guest_from_compat_handle(x,y) ((x)=(y)) -#else -extern spinlock_t xenpf_lock; #endif static DEFINE_PER_CPU(uint64_t, freq); @@ -61,30 +58,11 @@ long cpu_down_helper(void *data); long core_parking_helper(void *data); uint32_t get_cur_idle_nums(void); -ret_t do_platform_op(XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op) +ret_t arch_do_platform_op(struct xen_platform_op *platform_op, + XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op) { ret_t ret = 0; - struct xen_platform_op curop, *op = &curop; - - if ( copy_from_guest(op, u_xenpf_op, 1) ) - return -EFAULT; - - if ( op->interface_version != XENPF_INTERFACE_VERSION ) - return -EACCES; - - ret = xsm_platform_op(XSM_PRIV, op->cmd); - if ( ret ) - return ret; - - /* - * Trylock here avoids deadlock with an existing platform critical section - * which might (for some current or future reason) want to synchronise - * with this vcpu. - */ - while ( !spin_trylock(&xenpf_lock) ) - if ( hypercall_preempt_check() ) - return hypercall_create_continuation( - __HYPERVISOR_platform_op, "h", u_xenpf_op); + struct xen_platform_op *op = platform_op; switch ( op->cmd ) { @@ -607,7 +585,6 @@ ret_t do_platform_op(XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op) } out: - spin_unlock(&xenpf_lock); return ret; } diff --git a/xen/arch/x86/x86_64/platform_hypercall.c b/xen/arch/x86/x86_64/platform_hypercall.c index b6f380e..655fbb2 100644 --- a/xen/arch/x86/x86_64/platform_hypercall.c +++ b/xen/arch/x86/x86_64/platform_hypercall.c @@ -10,6 +10,7 @@ DEFINE_XEN_GUEST_HANDLE(compat_platform_op_t); #define xen_platform_op compat_platform_op #define xen_platform_op_t compat_platform_op_t #define do_platform_op(x) compat_platform_op(_##x) +#define arch_do_platform_op(x, y) arch_compat_platform_op(x, y) #define efi_get_info efi_compat_get_info #define efi_runtime_call(x) efi_compat_runtime_call(x) @@ -37,6 +38,7 @@ CHECK_pf_enter_acpi_sleep; #define _XEN_GUEST_HANDLE_PARAM(t) XEN_GUEST_HANDLE_PARAM(t) typedef int ret_t; +#include "../../../common/platform_hypercall.c" #include "../platform_hypercall.c" /* diff --git a/xen/common/Makefile b/xen/common/Makefile index 3683ae3..455bda6 100644 --- a/xen/common/Makefile +++ b/xen/common/Makefile @@ -51,6 +51,7 @@ obj-y += tmem_xen.o obj-y += radix-tree.o obj-y += rbtree.o obj-y += lzo.o +obj-y += platform_hypercall.o obj-bin-$(CONFIG_X86) += $(foreach n,decompress bunzip2 unxz unlzma unlzo unlz4 earlycpio,$(n).init.o) diff --git a/xen/common/platform_hypercall.c b/xen/common/platform_hypercall.c new file mode 100644 index 0000000..e562660 --- /dev/null +++ b/xen/common/platform_hypercall.c @@ -0,0 +1,70 @@ +/****************************************************************************** + * platform_hypercall.c + * + * Hardware platform operations. Intended for use by domain-0 kernel. + * + * Copyright (c) 2002-2006, K Fraser + */ + +#include <xen/config.h> +#include <xen/types.h> +#include <xen/lib.h> +#include <xen/event.h> +#include <xen/iocap.h> +#include <xen/guest_access.h> +#include <public/platform.h> +#include <xsm/xsm.h> + +#ifndef COMPAT +typedef long ret_t; +DEFINE_SPINLOCK(xenpf_lock); +#else +extern spinlock_t xenpf_lock; +#endif + +extern ret_t +arch_do_platform_op( + struct xen_platform_op *platform_op, + XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op); + +ret_t do_platform_op(XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op) +{ + ret_t ret = 0; + struct xen_platform_op curop, *op = &curop; + + if ( copy_from_guest(op, u_xenpf_op, 1) ) + return -EFAULT; + + if ( op->interface_version != XENPF_INTERFACE_VERSION ) + return -EACCES; + + ret = xsm_platform_op(XSM_PRIV, op->cmd); + if ( ret ) + return ret; + + /* + * Trylock here avoids deadlock with an existing platform critical section + * which might (for some current or future reason) want to synchronise + * with this vcpu. + */ + while ( !spin_trylock(&xenpf_lock) ) + if ( hypercall_preempt_check() ) + return hypercall_create_continuation( + __HYPERVISOR_platform_op, "h", u_xenpf_op); + + ret = arch_do_platform_op(op, u_xenpf_op); + + spin_unlock(&xenpf_lock); + + return ret; +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |