[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC PATCH 10/13] xen: arm: implement platform hypercall
Signed-off-by: Oleksandr Dmytryshyn <oleksandr.dmytryshyn@xxxxxxxxxxxxxxx> --- xen/arch/arm/Makefile | 1 + xen/arch/arm/platform_hypercall.c | 98 +++++++++++++++++++++++++++++++++++++++ xen/arch/arm/traps.c | 1 + 3 files changed, 100 insertions(+) create mode 100644 xen/arch/arm/platform_hypercall.c diff --git a/xen/arch/arm/Makefile b/xen/arch/arm/Makefile index d70f6d5..332528f 100644 --- a/xen/arch/arm/Makefile +++ b/xen/arch/arm/Makefile @@ -20,6 +20,7 @@ obj-y += percpu.o obj-y += guestcopy.o obj-y += physdev.o obj-y += platform.o +obj-y += platform_hypercall.o obj-y += setup.o obj-y += time.o obj-y += smpboot.o diff --git a/xen/arch/arm/platform_hypercall.c b/xen/arch/arm/platform_hypercall.c new file mode 100644 index 0000000..b4ad039 --- /dev/null +++ b/xen/arch/arm/platform_hypercall.c @@ -0,0 +1,98 @@ +/****************************************************************************** + * platform_hypercall.c + * + * Hardware platform operations. Intended for use by domain-0 kernel. + * + * Copyright (c) 2002-2006, K Fraser + * Copyright (c) 2014, GlobalLogic Inc. + */ + +#include <xen/config.h> +#include <xen/types.h> +#include <xen/sched.h> +#include <xen/domain.h> +#include <xen/event.h> +#include <xen/guest_access.h> +#include <xen/pmstat.h> +#include <xen/irq.h> +#include <public/platform.h> +#include <cpufreq/processor_perf.h> +#include <xsm/xsm.h> + +#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 + +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; + + /* + * 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); + + 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; + + default: + ret = -ENOSYS; + break; + } + + 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: + */ 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); -- 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 |