Received: by 10.213.65.68 with SMTP id h4csp1346241imn; Wed, 21 Mar 2018 08:29:31 -0700 (PDT) X-Google-Smtp-Source: AG47ELv9j4ftco8oKYfgXW86OFu4yab1AxJ8JFzE0RD/vKYjy2n63VIY3rY93D1vuNLKSK/HOIju X-Received: by 10.98.101.69 with SMTP id z66mr16738756pfb.25.1521646171177; Wed, 21 Mar 2018 08:29:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521646171; cv=none; d=google.com; s=arc-20160816; b=fRZw+8kN9MRXpWTCJzZoT+Bi2y65mWwNXNyjywBPAC/vd1/Gf8Bi5iCU7Jl4q6LWyk +XJNOeoUcH11eQ7LVwWR0ERi6ygDvo5RlYZrk3f2AUnk5vc8xMjkb4PUw8ScPPb7otn+ 9IN5epVPDd9OAiYYvokO+DyqicrfsYbTL755uZ/HM3FynIrnMXzprcMzJXBirnj8Ls0k /Q6lPBXhFtSSEmIM5t+vmgF6Pvoi265ouio/WdiXl5DytngcwqVNGBqrYWvoZKirBLT0 nMki2rX5pJn/rHGMsYMuabJgzATWrqc8TgRCTh1pjl3gNkZJhudGaXPnjMeDjQiaRIc7 7rfQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dkim-signature :arc-authentication-results; bh=Nu6arM5G8n49XZmylTY0/0o3fmII4OoDxstDOtWOVfc=; b=hJ3TI+j5mACkAxd/AySr7MoDEUpS79FkScpemXfFjuvJqUZgEoid6lhAqBFmW+adk4 /yde1Qj8EsUeWnFDI0OpTFhNaUTLqLH5S0P2wg/NK2/z6WyiUQX9/2w10mI8CtGOxh0r M0CMDX9kEwf1JLn7pLl3ldA6sed14Be3hZgfUIKfrAWdzBnYTSquUigBPuQ2lkpAP9z3 QME3by7BVfgSbk7s+kFvT4UAkH6R9ikb9yMk6acCm9rCkkSIOdmsOpVkZ+lS9UwwFRAe qYfV9h9FFzHPSa0zaVnR8gTPWrPXspxzl5LIyH2/lsADUvvo0jnlLv5RLpAprv9C0ex0 LlYg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Sa1T7VRr; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id n34-v6si4046990pld.603.2018.03.21.08.29.16; Wed, 21 Mar 2018 08:29:31 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Sa1T7VRr; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752726AbeCUP1N (ORCPT + 99 others); Wed, 21 Mar 2018 11:27:13 -0400 Received: from mail-pl0-f66.google.com ([209.85.160.66]:36117 "EHLO mail-pl0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752717AbeCUP1M (ORCPT ); Wed, 21 Mar 2018 11:27:12 -0400 Received: by mail-pl0-f66.google.com with SMTP id 61-v6so3328167plf.3 for ; Wed, 21 Mar 2018 08:27:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=Nu6arM5G8n49XZmylTY0/0o3fmII4OoDxstDOtWOVfc=; b=Sa1T7VRrsiooIEy7O+3SPjdBuBY8SWjo/BTIxyqqQDoGAyqA+2sCNjkMu0/1CHb4Of Nk3nYX9oulSJrnX7ztuvCNn1Dz48+N17JfXTSy+DFsly4utvxGMWF8kXvOKL9AF6gevD SyQCsyCUOTWv6bAvQYV3lM8phJTIcSbZDlz/hazM7LNe1AKqB69xyjslcd6PZkH8sAEz 8iHfg1Pns6aRT4tXGD5rFrjoa+Cl7UK1c14a1KCdCreRFshS6v6vZWjCJiXzxfLeR+3O lFQ9I4h5U+8++espvGdZDYgvUAOp2hKvoGMrnQdx1qV1yjNE8symkRFb9vgOjzKos7S0 PhkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=Nu6arM5G8n49XZmylTY0/0o3fmII4OoDxstDOtWOVfc=; b=lHlI0EXhO54oDeF9IQG7Clp+keJ3qj4H/swPY4ELXQ3/UNbilT3anr35kIfBp+bScA 8R6PahmMUcMHvWcDc+B6xIz8WhIujAfG8UHmvexxVPz+rE9yc4XKqqny9OA/7iFFf8HL Zu05KjzNhqt8t77yn1lS6hWlTBDFs9r7tBCOOySiavCa5iI26l4yNgSmfBDbzXu2xzMy YCeLt82cCMsOrTFFD07VC73gWTY1V9llbyXSWjMFtewJO/oSlnDlCixb+qR09bZkF8Uy hcX+BqMLJG3DIEMA0Wl+biN+fFLuDIMJ+yB2wgcrK0WPF1ybRbHcb+lkKhNM8dkfmchC pJLQ== X-Gm-Message-State: AElRT7FIULr65foY/sKEH//IL32lILhuHIUKIA1RqGs/su/+tPHjTc7S RpeDOGh1u+J3FWsZ/16cWx8= X-Received: by 2002:a17:902:a607:: with SMTP id u7-v6mr20993417plq.367.1521646031607; Wed, 21 Mar 2018 08:27:11 -0700 (PDT) Received: from [192.168.1.145] (ppp109-252-55-234.pppoe.spdop.ru. [109.252.55.234]) by smtp.googlemail.com with ESMTPSA id t25sm8361290pge.88.2018.03.21.08.27.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 21 Mar 2018 08:27:10 -0700 (PDT) Subject: Re: [PATCH 3/5] ARM: trusted_foundations: do not use naked function To: Stefan Agner , Robin Murphy , swarren@nvidia.com, thierry.reding@gmail.com, Alexandre Courbot Cc: linux@armlinux.org.uk, ard.biesheuvel@linaro.org, arnd@arndb.de, nicolas.pitre@linaro.org, keescook@chromium.org, marc.zyngier@arm.com, linux-kernel@vger.kernel.org, mka@chromium.org, linux-arm-kernel@lists.infradead.org, Bernhard.Rosenkranzer@linaro.org References: <20180320230206.25289-1-stefan@agner.ch> <20180320230206.25289-4-stefan@agner.ch> <124e16c9-b8ca-9c7e-ade5-b033eed76e14@arm.com> <302cfd1a4324e064cd4f189e4e0ffc21@agner.ch> From: Dmitry Osipenko Message-ID: <03de5241-fb69-9097-5020-f9843482318d@gmail.com> Date: Wed, 21 Mar 2018 18:26:58 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 In-Reply-To: <302cfd1a4324e064cd4f189e4e0ffc21@agner.ch> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 21.03.2018 17:09, Stefan Agner wrote: > On 21.03.2018 13:13, Robin Murphy wrote: >> On 20/03/18 23:02, Stefan Agner wrote: >>> As documented in GCC naked functions should only use Basic asm >>> syntax. The Extended asm or mixture of Basic asm and "C" code is >>> not guaranteed. Currently this works because it was hard coded >>> to follow and check GCC behavior for arguments and register >>> placement. >>> >>> Furthermore with clang using parameters in Extended asm in a >>> naked function is not supported: >>> arch/arm/firmware/trusted_foundations.c:47:10: error: parameter >>> references not allowed in naked functions >>> : "r" (type), "r" (arg1), "r" (arg2) >>> ^ >>> >>> Use a regular function to be more portable. This aligns also with >>> the other smc call implementations e.g. in qcom_scm-32.c and >>> bcm_kona_smc.c. >>> >>> Additionally also make sure all callee-saved registers get saved >>> as it has been done before. >>> >>> Signed-off-by: Stefan Agner >>> --- >>> arch/arm/firmware/trusted_foundations.c | 12 +++++++----- >>> 1 file changed, 7 insertions(+), 5 deletions(-) >>> >>> diff --git a/arch/arm/firmware/trusted_foundations.c b/arch/arm/firmware/trusted_foundations.c >>> index 3fb1b5a1dce9..426d732e6591 100644 >>> --- a/arch/arm/firmware/trusted_foundations.c >>> +++ b/arch/arm/firmware/trusted_foundations.c >>> @@ -31,21 +31,23 @@ >>> static unsigned long cpu_boot_addr; >>> -static void __naked tf_generic_smc(u32 type, u32 arg1, u32 arg2) >>> +static void tf_generic_smc(u32 type, u32 arg1, u32 arg2) >>> { >>> + register u32 r0 asm("r0") = type; >>> + register u32 r1 asm("r1") = arg1; >>> + register u32 r2 asm("r2") = arg2; >>> + >>> asm volatile( >>> ".arch_extension sec\n\t" >>> - "stmfd sp!, {r4 - r11, lr}\n\t" >>> __asmeq("%0", "r0") >>> __asmeq("%1", "r1") >>> __asmeq("%2", "r2") >>> "mov r3, #0\n\t" >>> "mov r4, #0\n\t" >>> "smc #0\n\t" >>> - "ldmfd sp!, {r4 - r11, pc}" >>> : >>> - : "r" (type), "r" (arg1), "r" (arg2) >>> - : "memory"); >>> + : "r" (r0), "r" (r1), "r" (r2) >>> + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"); >> >> I may be missing a subtlety, but it looks like we no longer have a >> guarantee that r11 will be caller-saved as it was previously. I don't >> know the Trusted Foundations ABI to say whether that matters or not, >> but if it is the case that it never needed preserving anyway, that >> might be worth calling out in the commit message. > > Adding r11 (fp) to the clobber list causes an error when using gcc and > CONFIG_FRAME_POINTER=y: > arch/arm/firmware/trusted_foundations.c: In function ‘tf_generic_smc’: > arch/arm/firmware/trusted_foundations.c:51:1: error: fp cannot be used > in asm here > > Not sure what ABI Trusted Foundations follow. > > [adding Stephen, Thierry and Dmitry] > Maybe someone more familiar with NVIDIA Tegra SoCs can help? > > When CONFIG_FRAME_POINTER=y fp gets saved anyway. So we could add r11 to > clobber list ifndef CONFIG_FRAME_POINTER... I have no idea about TF ABI either. Looking at the downstream kernel code, r4 - r12 should be saved. I've CC'd Alexandre as he is the author of the original patch and may still remember the details. I'm also wondering why original code doesn't have r3 in the clobber list and why r3 is set to '0', downstream sets it to the address of SP and on return from SMC r3 contains the address of SP which should be restored. I'm now wondering how SMC calling worked for me at all on T30, maybe it didn't..