[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 for 4.5] arm32: fix build after 063188f4b3
I sent again the wrong version :/. Sorry for the noise. On 10/15/2014 03:08 PM, Julien Grall wrote: > "xen: arm: Add support for the Exynos secure firmware" introduced code > assuming that exynos_smc() would get called with arguments in certain > registers. While the "noinline" attribute guarantees the function to > not get inlined, it does not guarantee that all arguments arrive in the > assumed registers: gcc's interprocedural analysis can result in clone > functions to be created where some of the incoming arguments (commonly > when they have constant values) get replaced by putting in place the > respective values inside the clone. > > Xen contains in multiple place of this SMC function: consolidate the function > in a single place and write it in assembly. > > Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx> > Reported-by: Jan Beulich <jbeulich@xxxxxxxx> > > --- > This is a fix for Xen 4.5 to compile the hypervisor with GCC 4.9.1, used by > Fedora & co. > > Changes in v3: > - Introduce macros assembly helper > - Consolidate the SMC code in a single assembly file > - Rename do_scm into call_smc and create helper for different number > of argument > - Rebase on top of PSCI v0.2 host support > > Changes in v2: > - Write the SMC call in assembly > - Consolidate the code in a single place > --- > xen/arch/arm/Makefile | 1 + > xen/arch/arm/platforms/exynos5.c | 15 +-------------- > xen/arch/arm/platforms/seattle.c | 12 ++---------- > xen/arch/arm/psci.c | 34 ++++------------------------------ > xen/arch/arm/smc.S | 21 +++++++++++++++++++++ > xen/include/asm-arm/arm32/macros.h | 8 ++++++++ > xen/include/asm-arm/macros.h | 16 ++++++++++++++++ > xen/include/asm-arm/processor.h | 9 +++++++++ > 8 files changed, 62 insertions(+), 54 deletions(-) > create mode 100644 xen/arch/arm/smc.S > create mode 100644 xen/include/asm-arm/arm32/macros.h > create mode 100644 xen/include/asm-arm/macros.h > > diff --git a/xen/arch/arm/Makefile b/xen/arch/arm/Makefile > index 9a25290..41aba2e 100644 > --- a/xen/arch/arm/Makefile > +++ b/xen/arch/arm/Makefile > @@ -37,6 +37,7 @@ obj-y += hvm.o > obj-y += device.o > obj-y += decode.o > obj-y += processor.o > +obj-y += smc.o > > #obj-bin-y += ....o > > diff --git a/xen/arch/arm/platforms/exynos5.c > b/xen/arch/arm/platforms/exynos5.c > index ac556cb..cfb293d 100644 > --- a/xen/arch/arm/platforms/exynos5.c > +++ b/xen/arch/arm/platforms/exynos5.c > @@ -37,19 +37,6 @@ static bool_t secure_firmware; > > #define SMC_CMD_CPU1BOOT (-4) > > -static noinline void exynos_smc(register_t function_id, register_t arg0, > - register_t arg1, register_t arg2) > -{ > - asm volatile( > - __asmeq("%0", "r0") > - __asmeq("%1", "r1") > - __asmeq("%2", "r2") > - __asmeq("%3", "r3") > - "smc #0" > - : > - : "r" (function_id), "r" (arg0), "r" (arg1), "r" (arg2)); > -} > - > static int exynos5_init_time(void) > { > uint32_t reg; > @@ -263,7 +250,7 @@ static int exynos5_cpu_up(int cpu) > iounmap(power); > > if ( secure_firmware ) > - exynos_smc(SMC_CMD_CPU1BOOT, cpu, 0, 0); > + call_smc1(SMC_CMD_CPU1BOOT, cpu); > > return cpu_up_send_sgi(cpu); > } > diff --git a/xen/arch/arm/platforms/seattle.c > b/xen/arch/arm/platforms/seattle.c > index edfc391..f717039 100644 > --- a/xen/arch/arm/platforms/seattle.c > +++ b/xen/arch/arm/platforms/seattle.c > @@ -31,22 +31,14 @@ static const char * const seattle_dt_compat[] __initconst > = > * This is temporary until full PSCI-0.2 is supported. > * Then, these function will be removed. > */ > -static noinline void seattle_smc_psci(register_t func_id) > -{ > - asm volatile( > - "smc #0" > - : "+r" (func_id) > - :); > -} > - > static void seattle_system_reset(void) > { > - seattle_smc_psci(PSCI_0_2_FN_SYSTEM_RESET); > + call_smc0(PSCI_0_2_FN_SYSTEM_RESET); > } > > static void seattle_system_off(void) > { > - seattle_smc_psci(PSCI_0_2_FN_SYSTEM_OFF); > + call_smc0(PSCI_0_2_FN_SYSTEM_OFF); > } > > PLATFORM_START(seattle, "SEATTLE") > diff --git a/xen/arch/arm/psci.c b/xen/arch/arm/psci.c > index 604ff4c..c186c13 100644 > --- a/xen/arch/arm/psci.c > +++ b/xen/arch/arm/psci.c > @@ -25,49 +25,23 @@ > > uint32_t psci_ver; > > -#ifdef CONFIG_ARM_32 > -#define REG_PREFIX "r" > -#else > -#define REG_PREFIX "x" > -#endif > - > -static noinline int __invoke_psci_fn_smc(register_t function_id, > - register_t arg0, > - register_t arg1, > - register_t arg2) > -{ > - asm volatile( > - __asmeq("%0", REG_PREFIX"0") > - __asmeq("%1", REG_PREFIX"1") > - __asmeq("%2", REG_PREFIX"2") > - __asmeq("%3", REG_PREFIX"3") > - "smc #0" > - : "+r" (function_id) > - : "r" (arg0), "r" (arg1), "r" (arg2)); > - > - return function_id; > -} > - > -#undef REG_PREFIX > - > static uint32_t psci_cpu_on_nr; > > int call_psci_cpu_on(int cpu) > { > - return __invoke_psci_fn_smc(psci_cpu_on_nr, > - cpu_logical_map(cpu), __pa(init_secondary), > 0); > + return call_smc2(psci_cpu_on_nr, cpu_logical_map(cpu), > __pa(init_secondary)); > } > > void call_psci_system_off(void) > { > if ( psci_ver > XEN_PSCI_V_0_1 ) > - __invoke_psci_fn_smc(PSCI_0_2_FN_SYSTEM_OFF, 0, 0, 0); > + call_smc0(PSCI_0_2_FN_SYSTEM_OFF); > } > > void call_psci_system_reset(void) > { > if ( psci_ver > XEN_PSCI_V_0_1 ) > - __invoke_psci_fn_smc(PSCI_0_2_FN_SYSTEM_RESET, 0, 0, 0); > + call_smc0(PSCI_0_2_FN_SYSTEM_RESET); > } > > int __init psci_is_smc_method(const struct dt_device_node *psci) > @@ -134,7 +108,7 @@ int __init psci_init_0_2(void) > if ( ret ) > return -EINVAL; > > - psci_ver = __invoke_psci_fn_smc(PSCI_0_2_FN_PSCI_VERSION, 0, 0, 0); > + psci_ver = call_smc0(PSCI_0_2_FN_PSCI_VERSION); > > if ( psci_ver != XEN_PSCI_V_0_2 ) > { > diff --git a/xen/arch/arm/smc.S b/xen/arch/arm/smc.S > new file mode 100644 > index 0000000..b8f1822 > --- /dev/null > +++ b/xen/arch/arm/smc.S > @@ -0,0 +1,21 @@ > +/* > + * xen/arch/arm/smc.S > + * > + * Wrapper for Secure Monitors Calls > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + */ > + > +#include <asm/macros.h> > + > +ENTRY(call_smc) > + smc #0 > + ret > diff --git a/xen/include/asm-arm/arm32/macros.h > b/xen/include/asm-arm/arm32/macros.h > new file mode 100644 > index 0000000..a4e20aa > --- /dev/null > +++ b/xen/include/asm-arm/arm32/macros.h > @@ -0,0 +1,8 @@ > +#ifndef __ASM_ARM_ARM32_MACROS_H > +#define __ASM_ARM_ARM32_MACROS_H > + > + .macro ret > + mov pc, lr > + .endm > + > +#endif /* __ASM_ARM_ARM32_MACROS_H */ > diff --git a/xen/include/asm-arm/macros.h b/xen/include/asm-arm/macros.h > new file mode 100644 > index 0000000..f92f905 > --- /dev/null > +++ b/xen/include/asm-arm/macros.h > @@ -0,0 +1,16 @@ > +#ifndef __ASM_MACROS_H > +#define __ASM_MACROS_H > + > +#ifndef __ASSEMBLY__ > +# error "This file should only be included in assembly file" > +#endif > + > +#if defined (CONFIG_ARM_32) > +# include <asm/arm32/macros.h> > +#elif defined(CONFIG_ARM_64) > +/* Not specific ARM64 macros for now */ > +#else > +# error "unknown ARM variant" > +#endif > + > +#endif /* __ASM_ARM_MACROS_H */ > diff --git a/xen/include/asm-arm/processor.h b/xen/include/asm-arm/processor.h > index e719c26..90c2647 100644 > --- a/xen/include/asm-arm/processor.h > +++ b/xen/include/asm-arm/processor.h > @@ -614,6 +614,15 @@ void vcpu_regs_hyp_to_user(const struct vcpu *vcpu, > void vcpu_regs_user_to_hyp(struct vcpu *vcpu, > const struct vcpu_guest_core_regs *regs); > > +int call_smc(register_t function_id, register_t arg0, register_t arg1, > + register_t arg2); > + > +#define call_smc0(func) call_smc((func), 0, 0, 0) > +#define call_smc1(func, a0) call_smc((func), (a0), 0, 0) > +#define call_smc2(func, a0, a1) call_smc((func), (a0), (a1), 0) > + > +int do_smc(register_t function_id, ...); > + > #endif /* __ASSEMBLY__ */ > #endif /* __ASM_ARM_PROCESSOR_H */ > /* > -- Julien Grall _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |