[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
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@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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |