From patchwork Mon Oct 13 15:29:01 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Grall X-Patchwork-Id: 38676 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-lb0-f197.google.com (mail-lb0-f197.google.com [209.85.217.197]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id BF21C20973 for ; Mon, 13 Oct 2014 15:31:16 +0000 (UTC) Received: by mail-lb0-f197.google.com with SMTP id p9sf4333572lbv.4 for ; Mon, 13 Oct 2014 08:31:15 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:from:to:date:message-id:cc:subject :precedence:list-id:list-unsubscribe:list-post:list-help :list-subscribe:mime-version:sender:errors-to:x-original-sender :x-original-authentication-results:mailing-list:list-archive :content-type:content-transfer-encoding; bh=GU1G50SshcKgoyJXG/zx+xs2xWih95U5gCpEvgGD/6w=; b=SmGFrYXC3urwIutMeegFRHaX7rZUitPpVb6WGkXHzzkSkB4sHav6n1q8GnhxN0SBwU nuMmuaLe4xI9hFgPlxr304qrn/zhmvZ+iPBnh0p6JagfV8EZr6062V/G/rzRblsexwAT JTnmLhSauKgLijYQpG2D+8kPB3lc2uohJshMocIxkYPyWp786yHX9l4ydklnCsKqvRJX 1UcVPuwKJBOBsTrR4fHEemz4KXtTOGGRvz5ugs25J7syx6kA1f3n1h/PgcpLBCMZfgAH mSwqteBdtdGKlrpM5p1Hb3z444pRNRYqr2JUizuEWB5di6dbK7ShpcDstvqJySZOaBKl jwbw== X-Gm-Message-State: ALoCoQnRWCaO7SHwiIGVIzfs3Hsq8HqHHRujSacf6aLrggT2IwLFzbEEVvI+WwkXED3gttnSSidr X-Received: by 10.112.151.3 with SMTP id um3mr120812lbb.15.1413214275560; Mon, 13 Oct 2014 08:31:15 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.87.100 with SMTP id w4ls465574laz.16.gmail; Mon, 13 Oct 2014 08:31:15 -0700 (PDT) X-Received: by 10.112.26.103 with SMTP id k7mr3905087lbg.86.1413214275314; Mon, 13 Oct 2014 08:31:15 -0700 (PDT) Received: from mail-la0-f43.google.com (mail-la0-f43.google.com [209.85.215.43]) by mx.google.com with ESMTPS id m4si22624410lbd.106.2014.10.13.08.31.14 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 13 Oct 2014 08:31:14 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.43 as permitted sender) client-ip=209.85.215.43; Received: by mail-la0-f43.google.com with SMTP id mc6so6870060lab.2 for ; Mon, 13 Oct 2014 08:31:14 -0700 (PDT) X-Received: by 10.113.10.9 with SMTP id dw9mr24931347lbd.46.1413214274880; Mon, 13 Oct 2014 08:31:14 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.84.229 with SMTP id c5csp235425lbz; Mon, 13 Oct 2014 08:31:14 -0700 (PDT) X-Received: by 10.52.187.197 with SMTP id fu5mr1416224vdc.89.1413214273494; Mon, 13 Oct 2014 08:31:13 -0700 (PDT) Received: from lists.xen.org (lists.xen.org. [50.57.142.19]) by mx.google.com with ESMTPS id ka13si11811940vdb.22.2014.10.13.08.31.12 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Mon, 13 Oct 2014 08:31:13 -0700 (PDT) Received-SPF: none (google.com: xen-devel-bounces@lists.xen.org does not designate permitted sender hosts) client-ip=50.57.142.19; Received: from localhost ([127.0.0.1] helo=lists.xen.org) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1XdhZ0-0006eq-3n; Mon, 13 Oct 2014 15:29:34 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1XdhYz-0006eZ-0L for xen-devel@lists.xenproject.org; Mon, 13 Oct 2014 15:29:33 +0000 Received: from [85.158.139.211:59165] by server-13.bemta-5.messagelabs.com id 23/3F-20082-CDFEB345; Mon, 13 Oct 2014 15:29:32 +0000 X-Env-Sender: julien.grall@linaro.org X-Msg-Ref: server-14.tower-206.messagelabs.com!1413214170!5510602!1 X-Originating-IP: [209.85.212.181] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 6.12.3; banners=-,-,- X-VirusChecked: Checked Received: (qmail 32538 invoked from network); 13 Oct 2014 15:29:31 -0000 Received: from mail-wi0-f181.google.com (HELO mail-wi0-f181.google.com) (209.85.212.181) by server-14.tower-206.messagelabs.com with RC4-SHA encrypted SMTP; 13 Oct 2014 15:29:31 -0000 Received: by mail-wi0-f181.google.com with SMTP id hi2so7768852wib.8 for ; Mon, 13 Oct 2014 08:29:30 -0700 (PDT) X-Received: by 10.180.100.106 with SMTP id ex10mr1421515wib.63.1413214170365; Mon, 13 Oct 2014 08:29:30 -0700 (PDT) Received: from belegaer.uk.xensource.com ([185.25.64.249]) by mx.google.com with ESMTPSA id ny6sm12528132wic.22.2014.10.13.08.29.29 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 13 Oct 2014 08:29:29 -0700 (PDT) From: Julien Grall To: xen-devel@lists.xenproject.org Date: Mon, 13 Oct 2014 16:29:01 +0100 Message-Id: <1413214141-370-1-git-send-email-julien.grall@linaro.org> X-Mailer: git-send-email 1.7.10.4 Cc: ian.campbell@citrix.com, Julien Grall , tim@xen.org, stefano.stabellini@citrix.com, Jan Beulich Subject: [Xen-devel] [PATCH v2 for 4.5] arm32: fix build after 063188f4b3 X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Post: , List-Help: , List-Subscribe: , MIME-Version: 1.0 Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: julien.grall@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.43 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Archive: "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 Signed-off-by: Jan Beulich --- This is a fix for Xen 4.5 to compile the hypervisor with GCC 4.9.1, used by Fedora & co. Jan: I kept your Signed-off-by for the commit message. Changes in v2: - Write the SMC call in assembly - Consolidate the code in a single place --- xen/arch/arm/arm32/Makefile | 1 + xen/arch/arm/arm32/smc.S | 19 +++++++++++++++++++ xen/arch/arm/arm64/Makefile | 1 + xen/arch/arm/arm64/smc.S | 19 +++++++++++++++++++ xen/arch/arm/platforms/exynos5.c | 15 +-------------- xen/arch/arm/platforms/seattle.c | 12 ++---------- xen/arch/arm/psci.c | 29 ++--------------------------- xen/include/asm-arm/processor.h | 2 ++ 8 files changed, 47 insertions(+), 51 deletions(-) create mode 100644 xen/arch/arm/arm32/smc.S create mode 100644 xen/arch/arm/arm64/smc.S diff --git a/xen/arch/arm/arm32/Makefile b/xen/arch/arm/arm32/Makefile index df0e7de..51b64f9 100644 --- a/xen/arch/arm/arm32/Makefile +++ b/xen/arch/arm/arm32/Makefile @@ -8,5 +8,6 @@ obj-y += domain.o obj-y += vfp.o obj-y += smpboot.o obj-y += domctl.o +obj-y += smc.o obj-$(EARLY_PRINTK) += debug.o diff --git a/xen/arch/arm/arm32/smc.S b/xen/arch/arm/arm32/smc.S new file mode 100644 index 0000000..ea1dba5 --- /dev/null +++ b/xen/arch/arm/arm32/smc.S @@ -0,0 +1,19 @@ +/* + * xen/arch/arm/arm32/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. + */ + +GLOBAL(do_smc) + smc #0 + mov pc, lr diff --git a/xen/arch/arm/arm64/Makefile b/xen/arch/arm/arm64/Makefile index c7243f5..4debaf4 100644 --- a/xen/arch/arm/arm64/Makefile +++ b/xen/arch/arm/arm64/Makefile @@ -1,6 +1,7 @@ subdir-y += lib obj-y += entry.o +obj-y += smc.o obj-y += traps.o obj-y += domain.o diff --git a/xen/arch/arm/arm64/smc.S b/xen/arch/arm/arm64/smc.S new file mode 100644 index 0000000..dfe3f02 --- /dev/null +++ b/xen/arch/arm/arm64/smc.S @@ -0,0 +1,19 @@ +/* + * xen/arch/arm/arm64/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. + */ + +GLOBAL(do_smc) + smc #0 + ret diff --git a/xen/arch/arm/platforms/exynos5.c b/xen/arch/arm/platforms/exynos5.c index ac556cb..0b6e884 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); + do_smc(SMC_CMD_CPU1BOOT, cpu, 0, 0); return cpu_up_send_sgi(cpu); } diff --git a/xen/arch/arm/platforms/seattle.c b/xen/arch/arm/platforms/seattle.c index edfc391..91b3c47 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); + do_smc(PSCI_0_2_FN_SYSTEM_RESET); } static void seattle_system_off(void) { - seattle_smc_psci(PSCI_0_2_FN_SYSTEM_OFF); + do_smc(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 b6360d5..7f1f628 100644 --- a/xen/arch/arm/psci.c +++ b/xen/arch/arm/psci.c @@ -25,37 +25,12 @@ bool_t psci_available; -#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 do_smc(psci_cpu_on_nr, cpu_logical_map(cpu), + __pa(init_secondary), 0); } int __init psci_init(void) diff --git a/xen/include/asm-arm/processor.h b/xen/include/asm-arm/processor.h index e719c26..5b7385c 100644 --- a/xen/include/asm-arm/processor.h +++ b/xen/include/asm-arm/processor.h @@ -614,6 +614,8 @@ 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 do_smc(register_t function_id, ...); + #endif /* __ASSEMBLY__ */ #endif /* __ASM_ARM_PROCESSOR_H */ /*