arm32: fix build after 063188f4b3 "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. The alternative of adding __attribute__((optimize("-fno-ipa-cp"))) to the function definition would likely not work with all supported compiler versions. Signed-off-by: Jan Beulich --- a/xen/arch/arm/platforms/exynos5.c +++ b/xen/arch/arm/platforms/exynos5.c @@ -40,6 +40,11 @@ static bool_t secure_firmware; static noinline void exynos_smc(register_t function_id, register_t arg0, register_t arg1, register_t arg2) { + register register_t fn_id asm("r0") = function_id; + register register_t a0 asm("r1") = arg0; + register register_t a1 asm("r2") = arg1; + register register_t a2 asm("r3") = arg2; + asm volatile( __asmeq("%0", "r0") __asmeq("%1", "r1") @@ -47,7 +52,7 @@ static noinline void exynos_smc(register __asmeq("%3", "r3") "smc #0" : - : "r" (function_id), "r" (arg0), "r" (arg1), "r" (arg2)); + : "r" (fn_id), "r" (a0), "r" (a1), "r" (a2)); } static int exynos5_init_time(void)