From patchwork Wed Jun 9 00:44:13 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pasha Tatashin X-Patchwork-Id: 12308525 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AFF00C4743D for ; Wed, 9 Jun 2021 01:01:43 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 7BED7608FE for ; Wed, 9 Jun 2021 01:01:43 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7BED7608FE Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=soleen.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Cc:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=aHHdcyh3NLwkr8tBPLLH6npc8Fq/lshntEf9CzF7U8Q=; b=jnToGLEJUcpSbT OYhHPBAazDyxNr5fWPT2IVJqoPkn1NjpxOhiDARSV2kr4Ci434IoyALuCG/vgJHWbGrdZ6M5T66Ic 30bS+twIClovRcdnTpzaAZazmKtEgzZK6wSl7u5Tzm5/JHbd/vXgijlRiCvFrA3u8O8wRK8Hqx3ch 1AvTeF4d4SyiOFUjcMv4tmr5SCKJzoCl5j3YVrGQdrWfmeRKUzdWLi+Ip8jibO7NqUyQOQvkxwlSR 6bXRoEc/mQFr1I4jHjQiR0HGPHZ1p6cF+FVT+1oNsTXAuaTx3sbyGEZek8edjV0T2BlJev0PVMJUO ZPnLUm1f3LJJl6BVfUZQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1lqmWO-00B1D8-4j; Wed, 09 Jun 2021 00:56:41 +0000 Received: from mail-qv1-f46.google.com ([209.85.219.46]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1lqmLf-00Avao-Bh for linux-arm-kernel@lists.infradead.org; Wed, 09 Jun 2021 00:45:37 +0000 Received: by mail-qv1-f46.google.com with SMTP id w4so4483530qvr.11 for ; Tue, 08 Jun 2021 17:45:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=soleen.com; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=ZPSVbTnhn1kzrM4k6yG1hZdalcOX13NxNhzKc5GCg3M=; b=LGgj1DSeN2dBtzalXLyd/X7N/RCTiZa3EUru9uNeWdpVQJnvQ9bVsOe+hpBq10aBS+ aY1IEnfFr3j+uNpDjtIRX15IWRmDkCAmORZVFue5KNHoK9ciqWHqDq8PCBfaG/bKQ9PX H4wnXAYOwb47RzvJL85RhAzTQ4swYnk5uLiqv1RevSgZBxDenYt+PNKEP6Xg8h9NdGQ/ 3DLpUIt2K7tm2CzWfhFt6+tTbTdPRHX38gq3dsPGJUfHALsxCr1UcjF9n5kDaIFRgbym rbYrqPpH4MczVux3IZZxQkckEORpurxOSkjx4dSeN6myWV528RbdrQVhFzdB/rchvYEp Mpzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ZPSVbTnhn1kzrM4k6yG1hZdalcOX13NxNhzKc5GCg3M=; b=aipLYIxPJwbp2NOFE9eOflrODdVd1DWYqjwKqEftmVE/Y21ZhpSkFS/l9JLCGKulIh VPsBxNopfpux6MFOY+zRU6FwA+yeX+/UiJwYp0bHr8bfr8imkihj0pnpXckUoPHCE+Wu 7QAlZmbN0xypmNl6rK6os8EENQhxkjAK+AIIyboXIXhDS5+tACrBYHiPUxM29LDWa0mY hWiATbhEdlyRkO8Hzowd/3sC7lDo/YSqkril2wqXPGLw7Ut9zNPQVp9YppIdGl/x3WK5 tRp1eNU0SflVta9EI1PORP19r8gYg0eNmlOVCdR0CjQzjSzeIA42RzHpDX/TdpN2Nx+Q uktg== X-Gm-Message-State: AOAM5312PUehojzjWqDfkge1wEBpZ/SsT5j5n50fRlLhFwfHSz4Brp11 go2Y6Oa4X1HNgExG+zFT+sy52A== X-Google-Smtp-Source: ABdhPJx9mZ6UlFMdNKDraoLwthZ4OWu6MUyQRTHx+1rf8HWW0BNaBOPk307SDiklwhYTyx05MvoNSA== X-Received: by 2002:ad4:4713:: with SMTP id k19mr3379354qvz.26.1623199474423; Tue, 08 Jun 2021 17:44:34 -0700 (PDT) Received: from localhost.localdomain (c-73-69-118-222.hsd1.nh.comcast.net. [73.69.118.222]) by smtp.gmail.com with ESMTPSA id n194sm12869011qka.66.2021.06.08.17.44.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Jun 2021 17:44:34 -0700 (PDT) From: Pavel Tatashin To: pasha.tatashin@soleen.com, jmorris@namei.org, sashal@kernel.org, ebiederm@xmission.com, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, corbet@lwn.net, catalin.marinas@arm.com, will@kernel.org, linux-arm-kernel@lists.infradead.org, maz@kernel.org, james.morse@arm.com, vladimir.murzin@arm.com, matthias.bgg@gmail.com, linux-mm@kvack.org, mark.rutland@arm.com, steve.capper@arm.com, rfontana@redhat.com, tglx@linutronix.de, selindag@gmail.com, tyhicks@linux.microsoft.com, kernelfans@gmail.com, akpm@linux-foundation.org, madvenka@linux.microsoft.com Subject: [PATCH v15 09/15] arm64: kexec: relocate in EL1 mode Date: Tue, 8 Jun 2021 20:44:13 -0400 Message-Id: <20210609004419.936873-10-pasha.tatashin@soleen.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210609004419.936873-1-pasha.tatashin@soleen.com> References: <20210609004419.936873-1-pasha.tatashin@soleen.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210608_174535_434325_678EC706 X-CRM114-Status: GOOD ( 13.26 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Since we are going to keep MMU enabled during relocation, we need to keep EL1 mode throughout the relocation. Keep EL1 enabled, and switch EL2 only before entering the new world. Suggested-by: James Morse Signed-off-by: Pavel Tatashin --- arch/arm64/kernel/cpu-reset.h | 3 +-- arch/arm64/kernel/machine_kexec.c | 4 ++-- arch/arm64/kernel/relocate_kernel.S | 13 +++++++++++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/arch/arm64/kernel/cpu-reset.h b/arch/arm64/kernel/cpu-reset.h index 81b3d0fe7a63..296abbac7192 100644 --- a/arch/arm64/kernel/cpu-reset.h +++ b/arch/arm64/kernel/cpu-reset.h @@ -20,11 +20,10 @@ static inline void __noreturn __nocfi cpu_soft_restart(unsigned long entry, { typeof(__cpu_soft_restart) *restart; - unsigned long el2_switch = is_hyp_nvhe(); restart = (void *)__pa_symbol(function_nocfi(__cpu_soft_restart)); cpu_install_idmap(); - restart(el2_switch, entry, arg0, arg1, arg2); + restart(0, entry, arg0, arg1, arg2); unreachable(); } diff --git a/arch/arm64/kernel/machine_kexec.c b/arch/arm64/kernel/machine_kexec.c index e0ef88cc57d2..152fb00bcccc 100644 --- a/arch/arm64/kernel/machine_kexec.c +++ b/arch/arm64/kernel/machine_kexec.c @@ -231,8 +231,8 @@ void machine_kexec(struct kimage *kimage) } else { if (is_hyp_nvhe()) __hyp_set_vectors(kimage->arch.el2_vectors); - cpu_soft_restart(kimage->arch.kern_reloc, virt_to_phys(kimage), - 0, 0); + cpu_soft_restart(kimage->arch.kern_reloc, + virt_to_phys(kimage), 0, 0); } BUG(); /* Should never get here. */ diff --git a/arch/arm64/kernel/relocate_kernel.S b/arch/arm64/kernel/relocate_kernel.S index 36b4496524c3..df023b82544b 100644 --- a/arch/arm64/kernel/relocate_kernel.S +++ b/arch/arm64/kernel/relocate_kernel.S @@ -13,6 +13,7 @@ #include #include #include +#include /* * arm64_relocate_new_kernel - Put a 2nd stage image in place and boot it. @@ -61,12 +62,20 @@ SYM_CODE_START(arm64_relocate_new_kernel) isb /* Start new image. */ + ldr x1, [x0, #KIMAGE_ARCH_EL2_VECTORS] /* relocation start */ + cbz x1, .Lel1 + ldr x1, [x0, #KIMAGE_START] /* relocation start */ + ldr x2, [x0, #KIMAGE_ARCH_DTB_MEM] /* dtb address */ + mov x3, xzr + mov x4, xzr + mov x0, #HVC_SOFT_RESTART + hvc #0 /* Jumps from el2 */ +.Lel1: ldr x4, [x0, #KIMAGE_START] /* relocation start */ ldr x0, [x0, #KIMAGE_ARCH_DTB_MEM] /* dtb address */ - mov x1, xzr mov x2, xzr mov x3, xzr - br x4 + br x4 /* Jumps from el1 */ SYM_CODE_END(arm64_relocate_new_kernel) .align 3 /* To keep the 64-bit values below naturally aligned. */