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

Re: [Xen-devel] [PATCH 6 of 6] arm: Enable VFP at boot



On Thu, 2012-05-31 at 17:40 +0100, Tim Deegan wrote:
> # HG changeset patch
> # User Tim Deegan <tim@xxxxxxx>
> # Date 1338482127 -3600
> # Node ID d12d5fcf152bffda41de51f9919b3211d69f955b
> # Parent  9570c43c07f397d8d4a8e725698c17c10c034d80
> arm: Enable VFP at boot.

Thanks, this should mean I can remove
"cluster.cpu0.vfp-enable_at_reset=1" from my fast model cfg file!

... tries it... yes it works, sweeet!

> 
> Signed-off-by: Tim Deegan <tim@xxxxxxx>
> 
> diff -r 9570c43c07f3 -r d12d5fcf152b xen/arch/arm/Rules.mk
> --- a/xen/arch/arm/Rules.mk   Thu May 31 17:35:27 2012 +0100
> +++ b/xen/arch/arm/Rules.mk   Thu May 31 17:35:27 2012 +0100
> @@ -24,7 +24,7 @@ ifneq ($(call cc-option,$(CC),-fvisibili
>  CFLAGS += -DGCC_HAS_VISIBILITY_ATTRIBUTE
>  endif
>  
> -CFLAGS += -march=armv7-a -mcpu=cortex-a15
> +CFLAGS += -march=armv7-a -mcpu=cortex-a15 -mfpu=vfpv3 -mfloat-abi=softfp

This might have been worthy of a comment...

http://wiki.debian.org/ArmHardFloatPort has some discussion, including:
        * soft: Full software floating point. 
        * softfp: Use the FPU, but remain compatible with soft-float
        code. 
        * hard: Full hardware floating point. 

and "The combination of -mfpu=vfp and -mfloat-abi=hard is not available
in FSF GCC 4.4". (there's a reference to a TODO section which seems to
not exist anymore...). I think Debian's armhf does actually use hard
(the page seems to imply it)

Anyway softfp does seem like the right option, at least until
-mfloat-abi=hard. Since this is all internal to the hypervisor (guests
can do whatever they want, I'm happily running armhf binaries) I don't
think this is a big deal to change as and when the compiler will let us.

>  
>  # Require GCC v3.4+ (to avoid issues with alignment constraints in Xen 
> headers)
>  check-$(gcc) = $(call cc-ver-check,CC,0x030400,"Xen requires at least 
> gcc-3.4")
> diff -r 9570c43c07f3 -r d12d5fcf152b xen/arch/arm/setup.c
> --- a/xen/arch/arm/setup.c    Thu May 31 17:35:27 2012 +0100
> +++ b/xen/arch/arm/setup.c    Thu May 31 17:35:27 2012 +0100
> @@ -36,6 +36,7 @@
>  #include <asm/page.h>
>  #include <asm/current.h>
>  #include <asm/setup.h>
> +#include <asm/vfp.h>
>  #include "gic.h"
>  
>  static __attribute_used__ void init_done(void)
> @@ -192,6 +193,8 @@ void __init start_xen(unsigned long boot
>  
>      processor_id();
>  
> +    enable_vfp();
> +
>      softirq_init();
>  
>      tasklet_subsys_init();
> diff -r 9570c43c07f3 -r d12d5fcf152b xen/arch/arm/smpboot.c
> --- a/xen/arch/arm/smpboot.c  Thu May 31 17:35:27 2012 +0100
> +++ b/xen/arch/arm/smpboot.c  Thu May 31 17:35:27 2012 +0100
> @@ -26,6 +26,7 @@
>  #include <xen/sched.h>
>  #include <xen/smp.h>
>  #include <xen/softirq.h>
> +#include <asm/vfp.h>
>  #include "gic.h"
>  
>  cpumask_t cpu_online_map;
> @@ -106,6 +107,8 @@ void __cpuinit start_secondary(unsigned 
>      WRITE_CP32((uint32_t) hyp_traps_vector, HVBAR);
>  
>      mmu_init_secondary_cpu();
> +    enable_vfp();
> +
>      gic_init_secondary_cpu();
>      init_timer_interrupt();
>      gic_route_irqs();
> diff -r 9570c43c07f3 -r d12d5fcf152b xen/include/asm-arm/vfp.h
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/xen/include/asm-arm/vfp.h       Thu May 31 17:35:27 2012 +0100
> @@ -0,0 +1,35 @@
> +#ifndef __ARM_VFP_H_
> +#define __ARM_VFP_H_
> +
> +#include <xen/types.h>
> +
> +#define FPEXC_EN (1u << 30)
> +
> +/* Save and restore FP state.
> + * Ought to be using the new vmrs/vmsr names, but older binutils has a
> + * bug where it only allows them to target fpscr (and not, say, fpexc). */
> +#define READ_FP(reg) ({                                 \
> +    uint32_t val;                                       \
> +    asm volatile ("fmrx %0, fp" #reg : "=r" (val));     \
> +    val; })
> +
> +#define WRITE_FP(reg, val) do {                         \
> +    asm volatile ("fmxr fp" #reg ", %0" : : "r" (val)); \
> +} while (0)
> +
> +
> +/* Start-of-day: Turn on VFP */
> +static inline void enable_vfp(void)
> +{
> +    WRITE_FP(exc, READ_FP(exc) | FPEXC_EN);
> +}
> +
> +#endif
> +/*
> + * Local variables:
> + * mode: C
> + * c-set-style: "BSD"
> + * c-basic-offset: 4
> + * indent-tabs-mode: nil
> + * End:
> + */



_______________________________________________
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®.