From patchwork Mon Apr 25 20:07:03 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matt Fleming X-Patchwork-Id: 66623 Delivered-To: patch@linaro.org Received: by 10.140.93.198 with SMTP id d64csp1234732qge; Mon, 25 Apr 2016 13:11:31 -0700 (PDT) X-Received: by 10.66.164.165 with SMTP id yr5mr51333300pab.133.1461615090944; Mon, 25 Apr 2016 13:11:30 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id dz3si4631779pad.113.2016.04.25.13.11.30; Mon, 25 Apr 2016 13:11:30 -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=@codeblueprint-co-uk.20150623.gappssmtp.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 S965126AbcDYUL1 (ORCPT + 29 others); Mon, 25 Apr 2016 16:11:27 -0400 Received: from mail-wm0-f52.google.com ([74.125.82.52]:37281 "EHLO mail-wm0-f52.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933528AbcDYUIS (ORCPT ); Mon, 25 Apr 2016 16:08:18 -0400 Received: by mail-wm0-f52.google.com with SMTP id n3so145610628wmn.0 for ; Mon, 25 Apr 2016 13:08:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=codeblueprint-co-uk.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=HoEuiLvTvjulTz5Gs08cAhFnQlO1iWlhPhlWaXIJFXQ=; b=Ziwmq9AyRE0wEy6JAuTsokiMfYcRkgT+y2dfptdEUZ8y6ai/LLIy4GYsOVP6YE9Qtj LCIcJ5ua80As7JFzYs4p+gP2xbDffw4qkr0boLDOg/FdaLVhs3/GxSOJt6zasssk1Sm7 OiFS7XBLj9qBWm0e6H4AOkFohSWpGoBG7QZG7pTZfLAJn6+77VUDGmAQhWfniOnoe5RV Y2IMvZcnuFcB7AxJ5ZRorqc7XvjA/aBdE4O4Ctcc/JyNgzq75rP3CGOseQlIxzBRGWZX xhTfEzkDQlVKZCG5jEQwHJjK6DBxiuw63ipcAk8UzYLpV2vPLXL7b6MK5oFEwquk01Gv JD5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=HoEuiLvTvjulTz5Gs08cAhFnQlO1iWlhPhlWaXIJFXQ=; b=ay0YdRgVEOkY/gLIx5GTnayaxUFdcMqBvtvozM4UL6k+DWBXu4+b5m60EViDx/bfx5 0Xa7Hk5areUfAE8nn4KIvY0k0u0UyCafTkvy9cJ7H7+Pm7X/pXxVau9IC2IJZm3FyEIH c//CnP777Goa5jjOgYeXJm1j1bPX+Or6FOWP5B3eBNYHTbyFc+RVTHMikLdjJPXZWPKb pBoHIPpRzIjJUyaRmt7wCXL1SAF1I8jP4/xfe5+Bw+2xKNntHiI4Tjyj5x5U5smk2941 aJUN7zb4e5YRG+BhwR2x3RYJRDZtAcGYpLQtxckuprQZm6siw/BZg8bjGZ8NjB5jrx9C 1T4g== X-Gm-Message-State: AOPr4FVW1sOWnKp1wibfR5C0QjH5Ncc3Zue1n9NPJWwh6/EMJImehFl0m6hcSUDM+/yiDQ== X-Received: by 10.195.3.1 with SMTP id bs1mr39237041wjd.160.1461614896668; Mon, 25 Apr 2016 13:08:16 -0700 (PDT) Received: from localhost (bcdc58e5.skybroadband.com. [188.220.88.229]) by smtp.gmail.com with ESMTPSA id o73sm20368582wme.16.2016.04.25.13.08.15 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 25 Apr 2016 13:08:16 -0700 (PDT) From: Matt Fleming To: Ingo Molnar , Thomas Gleixner , "H . Peter Anvin" Cc: Mark Rutland , Ard Biesheuvel , linux-kernel@vger.kernel.org, linux-efi@vger.kernel.org, Matt Fleming , Catalin Marinas , Leif Lindholm , Russell King , Will Deacon Subject: [PATCH 31/40] efi/runtime-wrappers: Add {__, }efi_call_virt templates Date: Mon, 25 Apr 2016 21:07:03 +0100 Message-Id: <1461614832-17633-32-git-send-email-matt@codeblueprint.co.uk> X-Mailer: git-send-email 2.7.3 In-Reply-To: <1461614832-17633-1-git-send-email-matt@codeblueprint.co.uk> References: <1461614832-17633-1-git-send-email-matt@codeblueprint.co.uk> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Mark Rutland Currently each architecture must implement two macros, efi_call_virt and __efi_call_virt, which only differ by the presence or absence of a return type. Otherwise, the logic surrounding the call is identical. As each architecture must define the entire body of each, we can't place any generic manipulation (e.g. irq flag validation) in the middle. This patch adds template implementations of these macros. With these, arch code can implement three template macros, avoiding reptition for the void/non-void return cases: * arch_efi_call_virt_setup Sets up the environment for the call (e.g. switching page tables, allowing kernel-mode use of floating point, if required). * arch_efi_call_virt Performs the call. The last expression in the macro must be the call itself, allowing the logic to be shared by the void and non-void cases. * arch_efi_call_virt_teardown Restores the usual kernel environment once the call has returned. While the savings from repition are minimal, we additionally gain the ability to add common code around the call with the call environment set up. This can be used to detect common firmware issues (e.g. bad irq mask management). Signed-off-by: Mark Rutland Reviewed-by: Ard Biesheuvel Cc: linux-efi@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: Catalin Marinas Cc: "H. Peter Anvin" Cc: Leif Lindholm Cc: Russell King Cc: Thomas Gleixner Cc: Will Deacon Signed-off-by: Matt Fleming --- drivers/firmware/efi/runtime-wrappers.c | 40 +++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) -- 2.7.3 diff --git a/drivers/firmware/efi/runtime-wrappers.c b/drivers/firmware/efi/runtime-wrappers.c index de6953039af6..0677577bdaa1 100644 --- a/drivers/firmware/efi/runtime-wrappers.c +++ b/drivers/firmware/efi/runtime-wrappers.c @@ -21,6 +21,46 @@ #include /* + * Arch code can implement the following three template macros, avoiding + * reptition for the void/non-void return cases of {__,}efi_call_virt: + * + * * arch_efi_call_virt_setup + * + * Sets up the environment for the call (e.g. switching page tables, + * allowing kernel-mode use of floating point, if required). + * + * * arch_efi_call_virt + * + * Performs the call. The last expression in the macro must be the call + * itself, allowing the logic to be shared by the void and non-void + * cases. + * + * * arch_efi_call_virt_teardown + * + * Restores the usual kernel environment once the call has returned. + */ + +#ifndef efi_call_virt +#define efi_call_virt(f, args...) \ +({ \ + efi_status_t __s; \ + arch_efi_call_virt_setup(); \ + __s = arch_efi_call_virt(f, args); \ + arch_efi_call_virt_teardown(); \ + __s; \ +}) +#endif + +#ifndef __efi_call_virt +#define __efi_call_virt(f, args...) \ +({ \ + arch_efi_call_virt_setup(); \ + arch_efi_call_virt(f, args); \ + arch_efi_call_virt_teardown(); \ +}) +#endif + +/* * According to section 7.1 of the UEFI spec, Runtime Services are not fully * reentrant, and there are particular combinations of calls that need to be * serialized. (source: UEFI Specification v2.4A)