From: Julien Grall <julien.grall@citrix.com>
To: sstabellini@kernel.org, xen-devel@lists.xensource.com
Cc: dgdegra@tycho.nsa.gov, Ian.Campbell@citrix.com,
Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [PATCH v2 2/2] arm: export platform_op XENPF_settime64
Date: Tue, 10 Nov 2015 14:21:56 +0000 [thread overview]
Message-ID: <5641FD84.2000109@citrix.com> (raw)
In-Reply-To: <1447090362-28317-2-git-send-email-sstabellini@kernel.org>
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
next prev parent reply other threads:[~2015-11-10 14:21 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-09 17:31 [PATCH v2 0/2] wallclock time on arm Stefano Stabellini
2015-11-09 17:32 ` [PATCH v2 1/2] xen: move wallclock functions from x86 to common sstabellini
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 [this message]
2015-11-10 14:28 ` Stefano Stabellini
2015-11-10 14:33 ` Julien Grall
2015-11-10 19:35 ` Daniel De Graaf
2015-11-10 8:11 ` [PATCH v2 1/2] xen: move wallclock functions from x86 to common Shannon Zhao
2015-11-10 10:36 ` Jan Beulich
2015-11-10 11:19 ` Stefano Stabellini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5641FD84.2000109@citrix.com \
--to=julien.grall@citrix.com \
--cc=Ian.Campbell@citrix.com \
--cc=dgdegra@tycho.nsa.gov \
--cc=sstabellini@kernel.org \
--cc=stefano.stabellini@eu.citrix.com \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.