* Re: [PATCH v2 2/2] arm: export platform_op XENPF_settime64
2015-11-09 17:32 ` [PATCH v2 2/2] arm: export platform_op XENPF_settime64 sstabellini
@ 2015-11-10 8:13 ` Shannon Zhao
2015-11-10 11:25 ` Stefano Stabellini
2015-11-10 14:21 ` Julien Grall
2015-11-10 19:35 ` Daniel De Graaf
2 siblings, 1 reply; 12+ messages in thread
From: Shannon Zhao @ 2015-11-10 8:13 UTC (permalink / raw)
To: sstabellini, xen-devel; +Cc: dgdegra, Ian.Campbell, Stefano Stabellini
Hi Stefano,
When I apply this patch, there are some warnings too.
Applying: arm: export platform_op XENPF_settime64
/home/open-source/xen/.git/rebase-apply/patch:67: trailing whitespace.
*
/home/open-source/xen/.git/rebase-apply/patch:69: trailing whitespace.
*
/home/open-source/xen/.git/rebase-apply/patch:172: trailing whitespace.
warning: 3 lines add whitespace errors.
On 2015/11/10 1:32, sstabellini@kernel.org wrote:
> From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
>
> 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@eu.citrix.com>
> CC: dgdegra@tycho.nsa.gov
>
> ---
>
> 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,
>
--
Shannon
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH v2 2/2] arm: export platform_op XENPF_settime64
2015-11-10 8:13 ` Shannon Zhao
@ 2015-11-10 11:25 ` Stefano Stabellini
0 siblings, 0 replies; 12+ messages in thread
From: Stefano Stabellini @ 2015-11-10 11:25 UTC (permalink / raw)
To: Shannon Zhao
Cc: dgdegra, sstabellini, xen-devel, Stefano Stabellini, Ian.Campbell
On Tue, 10 Nov 2015, Shannon Zhao wrote:
> Hi Stefano,
>
> When I apply this patch, there are some warnings too.
>
> Applying: arm: export platform_op XENPF_settime64
> /home/open-source/xen/.git/rebase-apply/patch:67: trailing whitespace.
> *
> /home/open-source/xen/.git/rebase-apply/patch:69: trailing whitespace.
> *
> /home/open-source/xen/.git/rebase-apply/patch:172: trailing whitespace.
>
> warning: 3 lines add whitespace errors.
Thanks, I'll fix.
> On 2015/11/10 1:32, sstabellini@kernel.org wrote:
> > From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> >
> > 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@eu.citrix.com>
> > CC: dgdegra@tycho.nsa.gov
> >
> > ---
> >
> > 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,
> >
>
> --
> Shannon
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 2/2] arm: export platform_op XENPF_settime64
2015-11-09 17:32 ` [PATCH v2 2/2] arm: export platform_op XENPF_settime64 sstabellini
2015-11-10 8:13 ` Shannon Zhao
@ 2015-11-10 14:21 ` Julien Grall
2015-11-10 14:28 ` Stefano Stabellini
2015-11-10 19:35 ` Daniel De Graaf
2 siblings, 1 reply; 12+ messages in thread
From: Julien Grall @ 2015-11-10 14:21 UTC (permalink / raw)
To: sstabellini, xen-devel; +Cc: dgdegra, Ian.Campbell, Stefano Stabellini
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@kernel.org wrote:
> From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
>
> 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@eu.citrix.com>
> CC: dgdegra@tycho.nsa.gov
>
> ---
>
> 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
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH v2 2/2] arm: export platform_op XENPF_settime64
2015-11-10 14:21 ` Julien Grall
@ 2015-11-10 14:28 ` Stefano Stabellini
2015-11-10 14:33 ` Julien Grall
0 siblings, 1 reply; 12+ messages in thread
From: Stefano Stabellini @ 2015-11-10 14:28 UTC (permalink / raw)
To: Julien Grall
Cc: dgdegra, sstabellini, xen-devel, Stefano Stabellini, Ian.Campbell
Actually I addressed all the ones I thought needed to be addressed and
replied to the others. Is there anything that I missed?
On Tue, 10 Nov 2015, Julien Grall wrote:
> 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@kernel.org wrote:
> > From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> >
> > 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@eu.citrix.com>
> > CC: dgdegra@tycho.nsa.gov
> >
> > ---
> >
> > 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
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 2/2] arm: export platform_op XENPF_settime64
2015-11-09 17:32 ` [PATCH v2 2/2] arm: export platform_op XENPF_settime64 sstabellini
2015-11-10 8:13 ` Shannon Zhao
2015-11-10 14:21 ` Julien Grall
@ 2015-11-10 19:35 ` Daniel De Graaf
2 siblings, 0 replies; 12+ messages in thread
From: Daniel De Graaf @ 2015-11-10 19:35 UTC (permalink / raw)
To: sstabellini, xen-devel; +Cc: Ian.Campbell, Stefano.Stabellini
On 09/11/15 12:32, sstabellini@kernel.org wrote:
> From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
>
> 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@eu.citrix.com>
Acked-by: dgdegra@tycho.nsa.gov
^ permalink raw reply [flat|nested] 12+ messages in thread