Received: by 10.192.165.156 with SMTP id m28csp817535imm; Mon, 16 Apr 2018 09:10:29 -0700 (PDT) X-Google-Smtp-Source: AIpwx48iZoQQnsVjDABq0ACgUgGBZg85rXAZfji7CZEAZxXwY8/YEU1C6Ti3eTNhSgLg1xt72W+I X-Received: by 10.99.95.5 with SMTP id t5mr5220197pgb.165.1523895029051; Mon, 16 Apr 2018 09:10:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523895029; cv=none; d=google.com; s=arc-20160816; b=vVt7VVbr69jATlV7jgDrqnKt0X8+w9spREYcYwiRNzgwY87SlWUZjraJHGH5Y3+Xo2 +QL2oISiiFZe0vSJzqyP898fbgCnLhYgmfqv65auHZaNQcKjoVebp0QWU+3GMKYGE8XE dFZrFYs7KSy5hQOZAYhcQ7QtxbQ7lZjNoQN4viM0uo3RJd/A/x8B9Zz3LyyaGR7Rtu4+ 7cu6ePmiGLCcewnqFxdiNLmcgvY9dDJ6xiOs6HPMj8kmqav+fFRrK69uHEmB00wgYZ1u ofPjTk9vsokS3yxtycmrnr4/YQIraWv+DT/BzOhpXdrGlvgzhojcLiy3p2KNUzPUdMiT DDnA== 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:arc-authentication-results; bh=4jKrcg32lsxIwTAvozXp+/qp4PPFQwzbVy+vJnULHl0=; b=dKJeL5tX69c7TvPXywk0haklmLit8AmKY9HUZy4S3yJlfCMYQWqAOqxMFbv5r6rjob gJlpk70VnVwdGfZUuRee+OTel4vxPeSk+EvxYz1cfuF/x4oWPzz+NI+9MO0l6KDddfBq EF+fzI9YdqrBP75m3S8IuJBvEyvgL/KNqcg6AzRW0S4zYcIcBomwZc2aVY9rIZGuxl9v LAVNNxE+5+kvbu0edC0+NeVzGi2945gA/RmSLFcj8ebouZjux93fKdi5W+8IU74GOKlZ Lx/Nm9NyxRX4O4LcgUhc9qCGpnB8bVD0odvJPhAWZT7T2tbVULsc1wIMguohCV5zQkg/ X9eQ== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 1-v6si12193036plk.308.2018.04.16.09.10.02; Mon, 16 Apr 2018 09:10:29 -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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753168AbeDPQII (ORCPT + 99 others); Mon, 16 Apr 2018 12:08:08 -0400 Received: from avon.wwwdotorg.org ([104.237.132.123]:45346 "EHLO avon.wwwdotorg.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753150AbeDPQIG (ORCPT ); Mon, 16 Apr 2018 12:08:06 -0400 Received: from [10.20.204.51] (unknown [216.228.112.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by avon.wwwdotorg.org (Postfix) with ESMTPSA id 4FB171C06A6; Mon, 16 Apr 2018 10:08:04 -0600 (MDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.99.4 at avon.wwwdotorg.org Subject: Re: [PATCH v2 3/6] ARM: trusted_foundations: do not use naked function To: Stefan Agner , Thierry Reding Cc: Stephen Warren , Robin Murphy , linux@armlinux.org.uk, ard.biesheuvel@linaro.org, arnd@arndb.de, nicolas.pitre@linaro.org, marc.zyngier@arm.com, behanw@converseincode.com, keescook@chromium.org, Bernhard.Rosenkranzer@linaro.org, mka@chromium.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Dmitry Osipenko References: <20180325180959.28008-1-stefan@agner.ch> <20180325180959.28008-4-stefan@agner.ch> <704c863a-0b5a-6396-d7da-f0ed17b7cca2@gmail.com> <263337af-7541-be9e-3db6-6cb987fd08fb@arm.com> From: Stephen Warren Message-ID: <498de826-6e6c-63d8-00d6-f394b2725a34@wwwdotorg.org> Date: Mon, 16 Apr 2018 10:08:02 -0600 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed 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 04/16/2018 09:56 AM, Stefan Agner wrote: > On 27.03.2018 14:16, Dmitry Osipenko wrote: >> On 27.03.2018 14:54, Robin Murphy wrote: >>> On 26/03/18 22:20, Dmitry Osipenko wrote: >>>> On 25.03.2018 21:09, 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. >>>>> >>>>> Cc: Dmitry Osipenko >>>>> Cc: Stephen Warren >>>>> Cc: Thierry Reding >>>>> Signed-off-by: Stefan Agner >>>>> --- >>>>> Changes in v2: >>>>> - Keep stmfd/ldmfd to avoid potential ABI issues >>>>> >>>>>   arch/arm/firmware/trusted_foundations.c | 14 +++++++++----- >>>>>   1 file changed, 9 insertions(+), 5 deletions(-) >>>>> >>>>> diff --git a/arch/arm/firmware/trusted_foundations.c >>>>> b/arch/arm/firmware/trusted_foundations.c >>>>> index 3fb1b5a1dce9..689e6565abfc 100644 >>>>> --- a/arch/arm/firmware/trusted_foundations.c >>>>> +++ b/arch/arm/firmware/trusted_foundations.c >>>>> @@ -31,21 +31,25 @@ >>>>>     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" >>>>> +        "stmfd    sp!, {r4 - r11}\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}" >>>>> +        "ldmfd    sp!, {r4 - r11}\n\t" >>>>>           : >>>>> -        : "r" (type), "r" (arg1), "r" (arg2) >>>>> -        : "memory"); >>>>> +        : "r" (r0), "r" (r1), "r" (r2) >>>>> +        : "memory", "r3", "r12", "lr"); >>>> >>>> Although seems "lr" won't be affected by SMC invocation because it should be >>>> banked and hence could be omitted entirely from the code. Maybe somebody could >>>> confirm this. >>> Strictly per the letter of the architecture, the SMC could be trapped to Hyp >>> mode, and a hypervisor might clobber LR_usr in the process of forwarding the >>> call to the firmware secure monitor (since Hyp doesn't have a banked LR of its >>> own). Admittedly there are probably no real systems with the appropriate >>> hardware/software combination to hit that, but on the other hand if this gets >>> inlined where the compiler has already created a stack frame then an LR clobber >>> is essentially free, so I reckon we're better off keeping it for reassurance. >>> This isn't exactly a critical fast path anyway. >> >> Okay, thank you for the clarification. > > So it seems this change is fine? > > Stephen, you picked up changes for this driver before, is this patch > going through your tree? You had best ask Thierry; he's taken over Tegra maintenance upstream. But that said, don't files in arch/arm go through Russell?