[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v2 2/2] arm: export platform_op XENPF_settime64



Hi Stefano,

I've made some comment on the v1 after you resend this version. I think
there are still valid with the new version.

Can you give a look there?

Regards,

On 09/11/15 17:32, sstabellini@xxxxxxxxxx wrote:
> From: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> 
> Call update_domain_wallclock_time at domain initialization, specifically
> in arch_set_info_guest for vcpu0, like we do on x86.
> Set time_offset_seconds to the number of seconds between phisical boot
> and domain initialization: it is going to be used to get/set the
> wallclock time.
> Add time_offset_seconds to system_time when before calling do_settime,
> so that system_time actually accounts for all the time in nsec between
> machine boot and when the wallclock was set.
> 
> 
> 
> Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> CC: dgdegra@xxxxxxxxxxxxx
> 
> ---
> 
> Changes in v2:
> - drop XENPF_settime32
> - set time_offset_seconds
> - modify xen/xsm/flask/hooks.c
> ---
>  xen/arch/arm/Makefile             |    1 +
>  xen/arch/arm/domain.c             |    9 ++++++
>  xen/arch/arm/platform_hypercall.c |   62 
> +++++++++++++++++++++++++++++++++++++
>  xen/arch/arm/traps.c              |    1 +
>  xen/arch/arm/vtimer.c             |    1 -
>  xen/include/asm-arm/time.h        |    2 ++
>  xen/include/xsm/dummy.h           |   12 +++----
>  xen/include/xsm/xsm.h             |   13 ++++----
>  xen/xsm/flask/hooks.c             |    2 +-
>  9 files changed, 89 insertions(+), 14 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..1f07a41 100644
> --- a/xen/arch/arm/domain.c
> +++ b/xen/arch/arm/domain.c
> @@ -21,6 +21,7 @@
>  #include <xen/grant_table.h>
>  
>  #include <asm/current.h>
> +#include <asm/div64.h>
>  #include <asm/event.h>
>  #include <asm/guest_access.h>
>  #include <asm/regs.h>
> @@ -742,6 +743,14 @@ int arch_set_info_guest(
>      v->arch.ttbr1 = ctxt->ttbr1;
>      v->arch.ttbcr = ctxt->ttbcr;
>  
> +    if ( v->vcpu_id == 0 )
> +    {
> +        struct domain *d = v->domain;
> +        d->time_offset_seconds = ticks_to_ns(d->arch.virt_timer_base.offset 
> - boot_count);
> +        do_div(d->time_offset_seconds, 1000000000);
> +        update_domain_wallclock_time(d);
> +    }
> +
>      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..cb8e575
> --- /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;
> +    struct domain *d;
> +
> +    if ( copy_from_guest(op, u_xenpf_op, 1) )
> +        return -EFAULT;
> +
> +    if ( op->interface_version != XENPF_INTERFACE_VERSION )
> +        return -EACCES;
> +
> +    d = rcu_lock_current_domain();
> +    if ( d == NULL )
> +        return -ESRCH;
> +
> +    ret = xsm_platform_op(XSM_PRIV, op->cmd);
> +    if ( ret )
> +        return ret;
> +
> +    spin_lock(&xenpf_lock);
> +
> +    switch ( op->cmd )
> +    {
> +    case XENPF_settime64:
> +        if ( likely(!op->u.settime64.mbz) )
> +            do_settime(op->u.settime64.secs,
> +                       op->u.settime64.nsecs,
> +                       op->u.settime64.system_time + 
> SECONDS(d->time_offset_seconds));
> +        else
> +            ret = -EINVAL;
> +        break;
> +
> +    default:
> +        ret = -ENOSYS;
> +        break;
> +    }
> +
> +    spin_unlock(&xenpf_lock);
> +    rcu_unlock_domain(d);
> +    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/arch/arm/vtimer.c b/xen/arch/arm/vtimer.c
> index 1418092..95c2d6c 100644
> --- a/xen/arch/arm/vtimer.c
> +++ b/xen/arch/arm/vtimer.c
> @@ -28,7 +28,6 @@
>  #include <asm/vgic.h>
>  #include <asm/regs.h>
>  
> -extern s_time_t ticks_to_ns(uint64_t ticks);
>  extern uint64_t ns_to_ticks(s_time_t ns);
>  
>  /*
> diff --git a/xen/include/asm-arm/time.h b/xen/include/asm-arm/time.h
> index d755f36..23e5a28 100644
> --- a/xen/include/asm-arm/time.h
> +++ b/xen/include/asm-arm/time.h
> @@ -37,6 +37,8 @@ extern void __cpuinit init_timer_interrupt(void);
>  /* Counter value at boot time */
>  extern uint64_t boot_count;
>  
> +extern s_time_t ticks_to_ns(uint64_t ticks);
> +
>  void preinit_xen_time(void);
>  
>  #endif /* __ARM_TIME_H__ */
> 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();
> diff --git a/xen/xsm/flask/hooks.c b/xen/xsm/flask/hooks.c
> index fafb1a4..680485e 100644
> --- a/xen/xsm/flask/hooks.c
> +++ b/xen/xsm/flask/hooks.c
> @@ -1735,6 +1735,7 @@ static struct xsm_operations flask_ops = {
>      .deassign_dtdevice = flask_deassign_dtdevice,
>  #endif
>  
> +    .platform_op = flask_platform_op,
>  #ifdef CONFIG_X86
>      .do_mca = flask_do_mca,
>      .shadow_control = flask_shadow_control,
> @@ -1745,7 +1746,6 @@ static struct xsm_operations flask_ops = {
>      .hvm_ioreq_server = flask_hvm_ioreq_server,
>      .mem_sharing_op = flask_mem_sharing_op,
>      .apic = flask_apic,
> -    .platform_op = flask_platform_op,
>      .machine_memory_map = flask_machine_memory_map,
>      .domain_memory_map = flask_domain_memory_map,
>      .mmu_update = flask_mmu_update,
> 


-- 
Julien Grall

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.