[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2/2] arm: export platform_op XENPF_settime
Call update_domain_wallclock_time at domain initialization. Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- xen/arch/arm/Makefile | 1 + xen/arch/arm/domain.c | 3 ++ xen/arch/arm/platform_hypercall.c | 62 +++++++++++++++++++++++++++++++++++++ xen/arch/arm/traps.c | 1 + xen/include/xsm/dummy.h | 12 +++---- xen/include/xsm/xsm.h | 13 ++++---- 6 files changed, 80 insertions(+), 12 deletions(-) create mode 100644 xen/arch/arm/platform_hypercall.c diff --git a/xen/arch/arm/Makefile b/xen/arch/arm/Makefile index 1ef39f7..240aa29 100644 --- a/xen/arch/arm/Makefile +++ b/xen/arch/arm/Makefile @@ -23,6 +23,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 += bootfdt.o obj-y += time.o diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index b2bfc7d..ac9b1b3 100644 --- a/xen/arch/arm/domain.c +++ b/xen/arch/arm/domain.c @@ -742,6 +742,9 @@ int arch_set_info_guest( v->arch.ttbr1 = ctxt->ttbr1; v->arch.ttbcr = ctxt->ttbcr; + if ( v->vcpu_id == 0 ) + update_domain_wallclock_time(v->domain); + v->is_initialised = 1; if ( ctxt->flags & VGCF_online ) diff --git a/xen/arch/arm/platform_hypercall.c b/xen/arch/arm/platform_hypercall.c new file mode 100644 index 0000000..f60d7b3 --- /dev/null +++ b/xen/arch/arm/platform_hypercall.c @@ -0,0 +1,62 @@ +/****************************************************************************** + * platform_hypercall.c + * + * Hardware platform operations. Intended for use by domain-0 kernel. + * + * Copyright (c) 2015, Citrix + */ + +#include <xen/config.h> +#include <xen/types.h> +#include <xen/sched.h> +#include <xen/guest_access.h> +#include <xen/spinlock.h> +#include <public/platform.h> +#include <xsm/xsm.h> +#include <asm/current.h> +#include <asm/event.h> + +DEFINE_SPINLOCK(xenpf_lock); + +long do_platform_op(XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op) +{ + long ret; + 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; + + spin_lock(&xenpf_lock); + + switch ( op->cmd ) + { + case XENPF_settime32: + do_settime(op->u.settime32.secs, + op->u.settime32.nsecs, + op->u.settime32.system_time); + break; + + case XENPF_settime64: + if ( likely(!op->u.settime64.mbz) ) + do_settime(op->u.settime64.secs, + op->u.settime64.nsecs, + op->u.settime64.system_time); + else + ret = -EINVAL; + break; + + default: + ret = -ENOSYS; + break; + } + + spin_unlock(&xenpf_lock); + return ret; +} diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c index 9d2bd6a..c49bd3f 100644 --- a/xen/arch/arm/traps.c +++ b/xen/arch/arm/traps.c @@ -1233,6 +1233,7 @@ static arm_hypercall_t arm_hypercall_table[] = { HYPERCALL(hvm_op, 2), HYPERCALL(grant_table_op, 3), HYPERCALL(multicall, 2), + HYPERCALL(platform_op, 1), HYPERCALL_ARM(vcpu_op, 3), }; diff --git a/xen/include/xsm/dummy.h b/xen/include/xsm/dummy.h index 9fe372c..aec5a9b 100644 --- a/xen/include/xsm/dummy.h +++ b/xen/include/xsm/dummy.h @@ -583,6 +583,12 @@ static XSM_INLINE int xsm_mem_sharing(XSM_DEFAULT_ARG struct domain *d) return xsm_default_action(action, current->domain, d); } #endif + +static XSM_INLINE int xsm_platform_op(XSM_DEFAULT_ARG uint32_t op) +{ + XSM_ASSERT_ACTION(XSM_PRIV); + return xsm_default_action(action, current->domain, NULL); +} #ifdef CONFIG_X86 static XSM_INLINE int xsm_do_mca(XSM_DEFAULT_VOID) @@ -639,12 +645,6 @@ static XSM_INLINE int xsm_apic(XSM_DEFAULT_ARG struct domain *d, int cmd) return xsm_default_action(action, d, NULL); } -static XSM_INLINE int xsm_platform_op(XSM_DEFAULT_ARG uint32_t op) -{ - XSM_ASSERT_ACTION(XSM_PRIV); - return xsm_default_action(action, current->domain, NULL); -} - static XSM_INLINE int xsm_machine_memory_map(XSM_DEFAULT_VOID) { XSM_ASSERT_ACTION(XSM_PRIV); diff --git a/xen/include/xsm/xsm.h b/xen/include/xsm/xsm.h index ba3caed..f48cf60 100644 --- a/xen/include/xsm/xsm.h +++ b/xen/include/xsm/xsm.h @@ -164,6 +164,8 @@ struct xsm_operations { int (*mem_sharing) (struct domain *d); #endif + int (*platform_op) (uint32_t cmd); + #ifdef CONFIG_X86 int (*do_mca) (void); int (*shadow_control) (struct domain *d, uint32_t op); @@ -175,7 +177,6 @@ struct xsm_operations { int (*mem_sharing_op) (struct domain *d, struct domain *cd, int op); int (*apic) (struct domain *d, int cmd); int (*memtype) (uint32_t access); - int (*platform_op) (uint32_t cmd); int (*machine_memory_map) (void); int (*domain_memory_map) (struct domain *d); #define XSM_MMU_UPDATE_READ 1 @@ -624,6 +625,11 @@ static inline int xsm_mem_sharing (xsm_default_t def, struct domain *d) } #endif +static inline int xsm_platform_op (xsm_default_t def, uint32_t op) +{ + return xsm_ops->platform_op(op); +} + #ifdef CONFIG_X86 static inline int xsm_do_mca(xsm_default_t def) { @@ -675,11 +681,6 @@ static inline int xsm_memtype (xsm_default_t def, uint32_t access) return xsm_ops->memtype(access); } -static inline int xsm_platform_op (xsm_default_t def, uint32_t op) -{ - return xsm_ops->platform_op(op); -} - static inline int xsm_machine_memory_map(xsm_default_t def) { return xsm_ops->machine_memory_map(); -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |