From patchwork Tue Apr 18 19:47:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: D Scott Phillips X-Patchwork-Id: 85062 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp3089967vqo; Tue, 18 Apr 2023 12:52:54 -0700 (PDT) X-Google-Smtp-Source: AKy350brIwVRFuzjMo273VQzVrM5P97jBfAYZCR7TOgOPgN/spVsQDmZpRCsMJ+Dnz4P/Rsi2alV X-Received: by 2002:a05:6a00:2d89:b0:63b:88f6:3817 with SMTP id fb9-20020a056a002d8900b0063b88f63817mr948907pfb.19.1681847574293; Tue, 18 Apr 2023 12:52:54 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1681847574; cv=pass; d=google.com; s=arc-20160816; b=YjuBgZGDFMtzu0bBYEQeI7GgYfxUwb/4yUhZi9tLCAIsf/wukjCy8DIGon/9lRER+M lm4kcVDGd0gQLqz6FfwXDbMiZ5u6QrzBCjCrb2b6Bzgq1pKoaXu1eQKEKNnZWGokFV1l 10NHCGCQS4qqmsm1+iru++vatWFKdmvHh4t8jsUgBEGONv62lUDF4A49slI9khgywJBY fxsBOw7bv/XgC8FL4pQAzG4Glf7bFe4lmsUAMm1+Kg89ARdJf1AjYegRdVKPyNZhP+68 0bysY1NwH7f7GHES4+HtVuw4OswCUicUknxdtjOOmivzxvqpAIiy9FYbM+NglZibvW18 Hm5Q== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:content-transfer-encoding :message-id:date:subject:cc:to:from:dkim-signature; bh=x1QKyM0ujN8MIg70hN50CWZYNE2zTZ84Lbe11dCVmwU=; b=CS7wBMM64jCZhuK+22oE5Tv6nDioRy4VjBMkKIWiQwN2CLpUfkMshGGye5iy9ljHuU SIsoFAk79iQ+1ripiovflPMKVt+u1q+BfXCrlWYWjRi+AHh8+8q0kP3zH4T24PXQLj1U GXWXXC+IklTTy2gbnTrldGKYsYWwL9eWStlRmnQ7xKk1axFzcaaxFvGFii8H+bBr/ego pDE1FU8tjC7/EozpSDn6xOagc1+2QevOgTzZ6UaN11FU3ubHqIzW/HiTnP1PeXWEsbsk Fv5nHsg40AIdhNzXLu/jpD/KlTQrWAOiI+bI4YyHoDKKOgklLQXkefVvcOIO1XgJqLyj QkAA== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@os.amperecomputing.com header.s=selector2 header.b=gnrXnIuP; arc=pass (i=1 spf=pass spfdomain=os.amperecomputing.com dkim=pass dkdomain=os.amperecomputing.com dmarc=pass fromdomain=os.amperecomputing.com); spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=amperecomputing.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id f1-20020a63de01000000b0051372ec9316si14244181pgg.166.2023.04.18.12.52.27; Tue, 18 Apr 2023 12:52:54 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@os.amperecomputing.com header.s=selector2 header.b=gnrXnIuP; arc=pass (i=1 spf=pass spfdomain=os.amperecomputing.com dkim=pass dkdomain=os.amperecomputing.com dmarc=pass fromdomain=os.amperecomputing.com); spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=amperecomputing.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231872AbjDRTsJ (ORCPT + 99 others); Tue, 18 Apr 2023 15:48:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50070 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230035AbjDRTsH (ORCPT ); Tue, 18 Apr 2023 15:48:07 -0400 Received: from NAM12-BN8-obe.outbound.protection.outlook.com (mail-bn8nam12on2115.outbound.protection.outlook.com [40.107.237.115]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0310C26AC for ; Tue, 18 Apr 2023 12:48:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=O1qC9LtVsi+nY1WI7QhT3StX/GqrzL1auLJk3eV3f8uJTq7fTnYsU+Hoapt/2rd1j7IYfuqAlcuo4qgZV1ySpK++Yp5pIa5E4eUO4leebYhxLE+LIRR6yCcs2uPu1sQEoM4C3E1acM6+MLN1xqUYNalDnIahi8QqBKx8Mz6A+s4nkXL0u5wS4X+aUbdhm29QiE4Arwenwceam3HdE82rg2cgWhDh5r/tybsBbOgbdKdcabMXt2TIaZsuW/o7ILnpHdRh6e3bt+vxqugbwqlqvXtHw7Uw+X7WL9gSeXss5Ja3Pjmu8ZvPjPHxjPCPjJxKg3erCf8ZhHnrnu9CGBUR6A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=x1QKyM0ujN8MIg70hN50CWZYNE2zTZ84Lbe11dCVmwU=; b=KFS0FX5Qr4UnRWtryCMntRoN8+2TDNenZZlY0+Yz/36PYZHHblyVkcrRia9lD5r1yVr/KwW2t0bc9VgZ5KHYGvf/tShZJlIp48doKkymd0eDmqoQYuCsx96TcJu/9HbjVXRpUnIoVsP9p5jYsyTZq6xkDJ3+DLm5Myxj5AsXVT66Rq0Xnx9tAYdzLQQtUTnALD92t+kh9AIvhMkbZM8dByVo10uzjKpf3tyFcuuI0rjFcmqto3SW5QCuXelW90e9HYo/8Lx3N7LM0sopepJspmzY5wY+R2ZvcdYZ+F7P8E8eq52X5JhYtQAIXrFVsbcoKyudYK3Z0htumnFWqBoW/w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=os.amperecomputing.com; dmarc=pass action=none header.from=os.amperecomputing.com; dkim=pass header.d=os.amperecomputing.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=os.amperecomputing.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=x1QKyM0ujN8MIg70hN50CWZYNE2zTZ84Lbe11dCVmwU=; b=gnrXnIuPY2Qd4FVMbdKOeqtslgPu9Qr54V7LKvT9Ff7DlTgvXvOQKaIl3pY0WQYNXYT44L6zr6nHTf41Yc9qy36+t4Cu8NWQILW3/qYV/fqFd5Sb/AHbdpWst3Rnq49/e8xkE0GUOskioX+rRxy8dRdaXYNhONecONdCw+Q3fXg= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=os.amperecomputing.com; Received: from MWHPR0101MB2893.prod.exchangelabs.com (2603:10b6:301:33::25) by BL3PR01MB7196.prod.exchangelabs.com (2603:10b6:208:347::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6319.20; Tue, 18 Apr 2023 19:48:02 +0000 Received: from MWHPR0101MB2893.prod.exchangelabs.com ([fe80::1cda:7642:ae1d:599c]) by MWHPR0101MB2893.prod.exchangelabs.com ([fe80::1cda:7642:ae1d:599c%3]) with mapi id 15.20.6319.019; Tue, 18 Apr 2023 19:48:02 +0000 From: D Scott Phillips To: linux-arm-kernel@lists.infradead.org, James Morse Cc: Catalin Marinas , Will Deacon , linux-kernel@vger.kernel.org Subject: [PATCH v2 RESEND 1/2] arm64: sdei: Use alternative patching to select the conduit in sdei exit Date: Tue, 18 Apr 2023 12:47:45 -0700 Message-Id: <20230418194746.620266-1-scott@os.amperecomputing.com> X-Mailer: git-send-email 2.39.2 X-ClientProxiedBy: CH0PR03CA0418.namprd03.prod.outlook.com (2603:10b6:610:11b::19) To MWHPR0101MB2893.prod.exchangelabs.com (2603:10b6:301:33::25) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MWHPR0101MB2893:EE_|BL3PR01MB7196:EE_ X-MS-Office365-Filtering-Correlation-Id: 0a09d52c-3169-4653-ec20-08db4045d194 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: /+/7Hq/tBfy9MNp/2lCX19KiMntq9BIV/hSbeyYDTQSq1/EFk7V2JgT/35D7BupWxTSZZZfSfWhiqOKcT9FxgbSlYwlO4nwF1Fzq0Y7Q1Q8dT9u2e13jFOwheqyY72ad5d1VZWRA94nEGkrTJucfPXeRZgXEmzSFwZbrPJamxR0jGE/WwH47uGUjanpgyb/zGbtiloJ1iMQHuN5aomfh5Z5Dbc1UCwyEq/KBMkLq3Tmibk9V2N1PRN88R1FDRnthrsss3TwpcUw1Dsm3T5XQe/7s+lNYTO2CE7OQAJStVFlElEPR1SAMYl7MhRnSuPYgpeKosp/23EuqmJC4K5ulRgi/fb0Kc1G87OMFjELLyrnL5Dn33Qbx/ZellJ/97yg2aw3bW236DpWms7hLKNJqzSa/WL5FPl6fRYXBvLWmOOTLPdfb2QsSV2PCba8KDw+VtM+cvj8gg2vkoeaQOxi7F3KniCBvO7k5y4mOkgg8Gk9dFFpzllOJVoixuER5z4Bpd7jP7jPjFh/xkONXhQWiCWxX9B4wBMMm20+GulfzeY04jr4t+jhxsHfOJcR7AmJAW0AXzZoZDrb9bEziSoZsBvUleqpOkQOHlyfZG1uWLMh4AdHkrv1lTNGErz9kcUVT X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MWHPR0101MB2893.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230028)(4636009)(136003)(39850400004)(396003)(376002)(366004)(346002)(451199021)(5660300002)(2616005)(26005)(86362001)(83380400001)(6512007)(186003)(1076003)(6506007)(38350700002)(38100700002)(8676002)(8936002)(54906003)(6666004)(6486002)(52116002)(478600001)(41300700001)(316002)(66556008)(66946007)(6916009)(66476007)(4326008)(2906002);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: w2BifIuL0fRuESN4Jf1F1lg2TE0XhEwpJbdH8VXjGKGXxg5EOnfdF89MjZTgzAm0booBx7Xd0TXzbMSoLVKtguOVe7ob7osfZCPJaFkyEASoYVP6lBw7b3LTkDEodWFKS6MLiEd5EvI4rX/LzY6X6xwwemLSPCz1iBi868N1mFVNEQ/2Wmo342oqBg/VR0x8MZ77Wb+DmZ89uLsnI9ztE4jdfl321aSZN/FOCVOW9sxYneRMa1LvMajCGFOjFnHuUeYvh+2GC0V2vPL4Q7oi3E26fbApea8Dr0n6S7DIApIuBNRhDoiE3vkF+B7ULHPAqHQK/vb7Ovtru05UnfgNoLlUvQU0qnZJ014NftH4GNXAGxlmT43+/nHjOq3VFs3APWcf3o9A0HP6EM3sXCJXiBtrDK1SoXJ099ZTQVhp2+NUWOujqlLd9ZlDIVgPw5qU211/SNZKMQrHNOFs8Phims4sQJX9CZVQISjwcXCBjBc7w4JE3SqLw1fIPQOS1efUIMdQbdYskSo4DGaVKO6PRB2J4/Etn1p3Ai7MumLvO1A4OjUM1Fow9c3Xqc6L3vaPwr+0hC+1mBs9Rg5/MUl02X/PhEwfwLZe2qqPTGgo4sfW4DLa+Bclng0DvwwDBSSZMHiTd1FMJoUw6SHlfg5zPSZTVmBevnob/30aIfEDQH3BB82nbph9AVh+ALiZK0VtGm74QxJrjtdwloij4eMaF9cIoI2nsZVRyWUYx70KIgeAerLw2mj+fo32jrtEJeA9XsCVMXmJoO+UJNNWIhU1o9aA0fjwHHG4Nwnow/8HGc+S5WhzQVQ3qafuxGIf6ccWHUuCnpoDZV0CsIWpV4Fg02Lc0lpAP7B4MeFWMidGBVTaGLmY16JOk1D4MPGUndFqM4Ds2vHThDeC+J3LNMlh1wZ907otqwm9P7kGkrp9I5nq9eHGd5BMLKHO6++gtxvGLMx70t7A29L1zPDi3me9PcDGl9E1vACiqK28X1P+bxyFxc9NQ8C+0vunRfm2hNaFxkQOMSgWC7eGO/X2bhmRbKOWHqBiSbprxgP+k3tNGub+qX5o8p7sHpVUzZkc3Jl3H5eU+S/M628TOfkeqbzh6YeZYpBs/8f2DC1nWjYkRgqWM3KdFWhiInwWhavmoB8RftZTEYmrmTOfTPffkiFiHwgc+mT2HB/1Z4zeNI287ZSpqleBNUtJNDcGeaih9c/nKKUha6pSqrPOPtZnhAqFda3ZNiwVNNxVwuDYoZx8a8Kojvm4RYisn1+1MrqA3mIAkSzqSMrsdksEUKlsk5zS0GpvbKIaeOgP156CSXk+ADeeJBKZ7HuqGEoID5dIKv0R70qn4dEcbJ168lbgo0T0viz/6ScLFiSwCGVIl7t6GvukA1uKtEa5c5B2vuoiFbAhfoISWJ0D3Ol95IwlmzIz8dLw1GTVnYgavIM94ypHwexYy+CYz4S9CgB7wcyfHPKRJ4uK4okuB1wuiR9oFDfedqONgcZeIpOSs/pFiXSdlnO3Lw1FHs0TetcHtvMmDpofxcSecieSqe84/qYk0aN3bZ4y/7pDvDhqUOfF0R4zXsGaUwGl4jbUGZPVtI/SaRRR9JbzsV2RlVPP1MtSh/fjaQ== X-OriginatorOrg: os.amperecomputing.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0a09d52c-3169-4653-ec20-08db4045d194 X-MS-Exchange-CrossTenant-AuthSource: MWHPR0101MB2893.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Apr 2023 19:48:01.9338 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3bc2b170-fd94-476d-b0ce-4229bdc904a7 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: +CduQbcu/VGECtB2wdi2Cw1DtJI01SF9OUAyD03NNgIkxWKmM+oIsyDuuVXEhhGqHah1z3yfOFu+EsgVc/37sflzJATgtor/ITduxKGbfQcSxd2PIL5ZBBUh+b9JgeEe X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL3PR01MB7196 X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2, SPF_HELO_PASS,SPF_PASS,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1763545002249336715?= X-GMAIL-MSGID: =?utf-8?q?1763545002249336715?= Patch in the conduit instruction for SDEI instead of branching between the possible conduits. The sdei driver's conduit initialization is moved earlier in the initialization flow, into setup_arch(), so that it is ready in time for alternative patching. Suggested-by: James Morse Signed-off-by: D Scott Phillips --- arch/arm64/include/asm/sdei.h | 13 +++---- arch/arm64/kernel/entry.S | 26 ++++++------- arch/arm64/kernel/sdei.c | 30 ++++++++++++--- arch/arm64/kernel/setup.c | 3 ++ drivers/firmware/arm_sdei.c | 71 +++++++++++++++++++---------------- include/linux/arm_sdei.h | 6 ++- 6 files changed, 88 insertions(+), 61 deletions(-) diff --git a/arch/arm64/include/asm/sdei.h b/arch/arm64/include/asm/sdei.h index 4292d9bafb9d..badb39510515 100644 --- a/arch/arm64/include/asm/sdei.h +++ b/arch/arm64/include/asm/sdei.h @@ -3,10 +3,6 @@ #ifndef __ASM_SDEI_H #define __ASM_SDEI_H -/* Values for sdei_exit_mode */ -#define SDEI_EXIT_HVC 0 -#define SDEI_EXIT_SMC 1 - #define SDEI_STACK_SIZE IRQ_STACK_SIZE #ifndef __ASSEMBLY__ @@ -17,8 +13,6 @@ #include -extern unsigned long sdei_exit_mode; - /* Software Delegated Exception entry point from firmware*/ asmlinkage void __sdei_asm_handler(unsigned long event_num, unsigned long arg, unsigned long pc, unsigned long pstate); @@ -40,8 +34,11 @@ asmlinkage unsigned long __sdei_handler(struct pt_regs *regs, unsigned long do_sdei_event(struct pt_regs *regs, struct sdei_registered_event *arg); -unsigned long sdei_arch_get_entry_point(int conduit); -#define sdei_arch_get_entry_point(x) sdei_arch_get_entry_point(x) +unsigned long sdei_arch_get_entry_point(void); +#define sdei_arch_get_entry_point sdei_arch_get_entry_point + +void __init sdei_patch_conduit(struct alt_instr *alt, __le32 *origptr, + __le32 *updptr, int nr_inst); #endif /* __ASSEMBLY__ */ #endif /* __ASM_SDEI_H */ diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index ab2a6e33c052..ae7aa02f0df5 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -914,13 +914,10 @@ NOKPROBE(call_on_irq_stack) #include #include -.macro sdei_handler_exit exit_mode - /* On success, this call never returns... */ - cmp \exit_mode, #SDEI_EXIT_SMC - b.ne 99f - smc #0 - b . -99: hvc #0 +.macro sdei_handler_exit +alternative_cb ARM64_ALWAYS_SYSTEM, sdei_patch_conduit + nop // Patched to SMC/HVC #0 +alternative_cb_end b . .endm @@ -955,7 +952,6 @@ NOKPROBE(__sdei_asm_entry_trampoline) * Make the exit call and restore the original ttbr1_el1 * * x0 & x1: setup for the exit API call - * x2: exit_mode * x4: struct sdei_registered_event argument from registration time. */ SYM_CODE_START(__sdei_asm_exit_trampoline) @@ -964,7 +960,7 @@ SYM_CODE_START(__sdei_asm_exit_trampoline) tramp_unmap_kernel tmp=x4 -1: sdei_handler_exit exit_mode=x2 +1: sdei_handler_exit SYM_CODE_END(__sdei_asm_exit_trampoline) NOKPROBE(__sdei_asm_exit_trampoline) .popsection // .entry.tramp.text @@ -1070,14 +1066,16 @@ SYM_CODE_START(__sdei_asm_handler) mov_q x3, SDEI_1_0_FN_SDEI_EVENT_COMPLETE_AND_RESUME csel x0, x2, x3, ls - ldr_l x2, sdei_exit_mode - -alternative_if_not ARM64_UNMAP_KERNEL_AT_EL0 - sdei_handler_exit exit_mode=x2 +#ifdef CONFIG_UNMAP_KERNEL_AT_EL0 +alternative_if ARM64_UNMAP_KERNEL_AT_EL0 + b 1f alternative_else_nop_endif +#endif + + sdei_handler_exit #ifdef CONFIG_UNMAP_KERNEL_AT_EL0 - tramp_alias dst=x5, sym=__sdei_asm_exit_trampoline, tmp=x3 +1: tramp_alias dst=x5, sym=__sdei_asm_exit_trampoline, tmp=x3 br x5 #endif SYM_CODE_END(__sdei_asm_handler) diff --git a/arch/arm64/kernel/sdei.c b/arch/arm64/kernel/sdei.c index 830be01af32d..be7f6ea49956 100644 --- a/arch/arm64/kernel/sdei.c +++ b/arch/arm64/kernel/sdei.c @@ -20,8 +20,6 @@ #include #include -unsigned long sdei_exit_mode; - /* * VMAP'd stacks checking for stack overflow on exception using sp as a scratch * register, meaning SDEI has to switch to its own stack. We need two stacks as @@ -162,7 +160,7 @@ static int init_sdei_scs(void) return err; } -unsigned long sdei_arch_get_entry_point(int conduit) +unsigned long sdei_arch_get_entry_point(void) { /* * SDEI works between adjacent exception levels. If we booted at EL1 we @@ -181,8 +179,6 @@ unsigned long sdei_arch_get_entry_point(int conduit) if (init_sdei_scs()) goto out_err_free_stacks; - sdei_exit_mode = (conduit == SMCCC_CONDUIT_HVC) ? SDEI_EXIT_HVC : SDEI_EXIT_SMC; - #ifdef CONFIG_UNMAP_KERNEL_AT_EL0 if (arm64_kernel_unmapped_at_el0()) { unsigned long offset; @@ -262,3 +258,27 @@ unsigned long __kprobes do_sdei_event(struct pt_regs *regs, return vbar + 0x480; } + +/* + * Patch in the sdei conduit instruction. + */ +void __init sdei_patch_conduit(struct alt_instr *alt, __le32 *origptr, + __le32 *updptr, int nr_inst) +{ + u32 insn; + + BUG_ON(nr_inst != 1); /* NOP -> HVC/SMC */ + + switch (sdei_get_conduit()) { + case SMCCC_CONDUIT_HVC: + insn = aarch64_insn_get_hvc_value(); + break; + case SMCCC_CONDUIT_SMC: + insn = aarch64_insn_get_smc_value(); + break; + default: + return; + } + + *updptr = cpu_to_le32(insn); +} diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c index b8ec7b3ac9cb..6286c4c59074 100644 --- a/arch/arm64/kernel/setup.c +++ b/arch/arm64/kernel/setup.c @@ -7,6 +7,7 @@ */ #include +#include #include #include #include @@ -365,6 +366,8 @@ void __init __no_sanitize_address setup_arch(char **cmdline_p) else psci_acpi_init(); + sdei_conduit_init(); + init_bootcpu_ops(); smp_init_cpus(); smp_build_mpidr_hash(); diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c index 1e1a51510e83..0dbb88bcc9a2 100644 --- a/drivers/firmware/arm_sdei.c +++ b/drivers/firmware/arm_sdei.c @@ -919,37 +919,12 @@ int sdei_unregister_ghes(struct ghes *ghes) return err; } -static int sdei_get_conduit(struct platform_device *pdev) +enum arm_smccc_conduit sdei_get_conduit(void) { - const char *method; - struct device_node *np = pdev->dev.of_node; - - sdei_firmware_call = NULL; - if (np) { - if (of_property_read_string(np, "method", &method)) { - pr_warn("missing \"method\" property\n"); - return SMCCC_CONDUIT_NONE; - } - - if (!strcmp("hvc", method)) { - sdei_firmware_call = &sdei_smccc_hvc; - return SMCCC_CONDUIT_HVC; - } else if (!strcmp("smc", method)) { - sdei_firmware_call = &sdei_smccc_smc; - return SMCCC_CONDUIT_SMC; - } - - pr_warn("invalid \"method\" property: %s\n", method); - } else if (!acpi_disabled) { - if (acpi_psci_use_hvc()) { - sdei_firmware_call = &sdei_smccc_hvc; - return SMCCC_CONDUIT_HVC; - } else { - sdei_firmware_call = &sdei_smccc_smc; - return SMCCC_CONDUIT_SMC; - } - } - + if (sdei_firmware_call == sdei_smccc_hvc) + return SMCCC_CONDUIT_HVC; + if (sdei_firmware_call == sdei_smccc_smc) + return SMCCC_CONDUIT_SMC; return SMCCC_CONDUIT_NONE; } @@ -957,9 +932,7 @@ static int sdei_probe(struct platform_device *pdev) { int err; u64 ver = 0; - int conduit; - conduit = sdei_get_conduit(pdev); if (!sdei_firmware_call) return 0; @@ -984,7 +957,7 @@ static int sdei_probe(struct platform_device *pdev) if (err) return err; - sdei_entry_point = sdei_arch_get_entry_point(conduit); + sdei_entry_point = sdei_arch_get_entry_point(); if (!sdei_entry_point) { /* Not supported due to hardware or boot configuration */ sdei_mark_interface_broken(); @@ -1059,6 +1032,38 @@ static bool __init sdei_present_acpi(void) return true; } +void __init sdei_conduit_init(void) +{ + const char *method; + struct device_node *np; + + if (acpi_disabled) { + np = of_find_matching_node_and_match(NULL, sdei_of_match, NULL); + if (!np || !of_device_is_available(np)) + return; + + if (of_property_read_string(np, "method", &method)) { + pr_warn("missing \"method\" property\n"); + return; + } + + if (!strcmp("hvc", method)) + sdei_firmware_call = &sdei_smccc_hvc; + else if (!strcmp("smc", method)) + sdei_firmware_call = &sdei_smccc_smc; + else + pr_warn("invalid \"method\" property: %s\n", method); + } else { + if (!sdei_present_acpi()) + return; + + if (acpi_psci_use_hvc()) + sdei_firmware_call = &sdei_smccc_hvc; + else + sdei_firmware_call = &sdei_smccc_smc; + } +} + void __init sdei_init(void) { struct platform_device *pdev; diff --git a/include/linux/arm_sdei.h b/include/linux/arm_sdei.h index 14dc461b0e82..de9aafd87c48 100644 --- a/include/linux/arm_sdei.h +++ b/include/linux/arm_sdei.h @@ -13,7 +13,7 @@ /* Arch code should override this to set the entry point from firmware... */ #ifndef sdei_arch_get_entry_point -#define sdei_arch_get_entry_point(conduit) (0) +#define sdei_arch_get_entry_point() (0) #endif /* @@ -22,6 +22,8 @@ */ typedef int (sdei_event_callback)(u32 event, struct pt_regs *regs, void *arg); +enum arm_smccc_conduit sdei_get_conduit(void); + /* * Register your callback to claim an event. The event must be described * by firmware. @@ -47,10 +49,12 @@ int sdei_unregister_ghes(struct ghes *ghes); int sdei_mask_local_cpu(void); int sdei_unmask_local_cpu(void); void __init sdei_init(void); +void __init sdei_conduit_init(void); #else static inline int sdei_mask_local_cpu(void) { return 0; } static inline int sdei_unmask_local_cpu(void) { return 0; } static inline void sdei_init(void) { } +static inline void sdei_conduit_init(void) { } #endif /* CONFIG_ARM_SDE_INTERFACE */