From mboxrd@z Thu Jan 1 00:00:00 1970 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.5 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham 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 7A080C433E6 for ; Wed, 3 Mar 2021 00:22:57 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 13D6164E58 for ; Wed, 3 Mar 2021 00:22:57 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 13D6164E58 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=soleen.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 3DB698D010B; Tue, 2 Mar 2021 19:22:49 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 258808D0101; Tue, 2 Mar 2021 19:22:49 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D12FE8D010B; Tue, 2 Mar 2021 19:22:48 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0022.hostedemail.com [216.40.44.22]) by kanga.kvack.org (Postfix) with ESMTP id A034F8D0101 for ; Tue, 2 Mar 2021 19:22:48 -0500 (EST) Received: from smtpin28.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id 5B43B612F for ; Wed, 3 Mar 2021 00:22:48 +0000 (UTC) X-FDA: 77876662416.28.F63D467 Received: from mail-qt1-f169.google.com (mail-qt1-f169.google.com [209.85.160.169]) by imf04.hostedemail.com (Postfix) with ESMTP id 6E1F8132 for ; Wed, 3 Mar 2021 00:22:47 +0000 (UTC) Received: by mail-qt1-f169.google.com with SMTP id d11so15555669qtx.9 for ; Tue, 02 Mar 2021 16:22:47 -0800 (PST) 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=CkOHd4Ubs6QxUZPpaIRvKfllHz4QaZDE7Cb9NwMEurE=; b=kv+djcD5Dn8tl5qEcKKg9wUfgrKRtIeHMDiyEGXGQs7F/ZmuhWe//JnMzxmKu3F7AH 88SbhKfkE78CfHCAU44Ln2BV0iQYNwXNNODQZqJTwJvNp3lruyG1V2IxzYqcxJbNeIZ6 girfcwSI1nPDGrreCNMXLSEJQko02mF+3Yihp7JjLbeVQdjBz1rF1xU7FCCpI1MADl1I pOeZtuW+wh2ejaP/7dgGE0DRh69BVBAUaJ+0RDEenZ88YSFdaBOLm7hTX3jYfk39tjpV 9gPTcFqCKqbCgpdfet/cTN4tW9o3BcjhJkKgOcD4wkV5+2WV0S3t0adzPBj5dTCa3CUU saSw== 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=CkOHd4Ubs6QxUZPpaIRvKfllHz4QaZDE7Cb9NwMEurE=; b=eu6OTIXMQtJZRt6QVZPkV73Jx0qKdDvtP4n8lLqf4WsLBd4rkKvdHUxZyNqgp7pCsh 1IozZCGsyrahLCeI+LphgS3PtGD1y1aR2FlPRhycqllI/csGE0qziTMfbaMAt+ZlEySJ jgc/tobw8r1zxbKrnNwNhz/7bLmB49hw30v/8WdGkt9/EKF8DfASAytZeWu2R56TAOA3 vPR7pxtM2Vw/zGcJGU7J0itzS1F5ctZwr0RXupvkJTJ4yUkOY1pWNbEzdi9MrvRn5f9e 3yr8NZ8Ab+zU5m6XNxicmdZuPHnktOCUCnrO4+Y3xEJ59KZuwfVPAFvw37eJLLHMjAsc K8cw== X-Gm-Message-State: AOAM531FLJ4fuRMevubL5iulKfpauovfpy8dBED5yKISdDjf4pEsJEPg jn9fgFzHGVTjFiM7IsIyjD4gEA== X-Google-Smtp-Source: ABdhPJzh2Sttz/3luOleODmtp3yKBF23rhlq0H6VUfZnw3KEBQCZesiL+EeFQlA4puGBiExt3HvrBQ== X-Received: by 2002:ac8:5947:: with SMTP id 7mr8369297qtz.60.1614730967312; Tue, 02 Mar 2021 16:22:47 -0800 (PST) Received: from localhost.localdomain (c-73-69-118-222.hsd1.nh.comcast.net. [73.69.118.222]) by smtp.gmail.com with ESMTPSA id r3sm16690512qkm.129.2021.03.02.16.22.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 02 Mar 2021 16:22:46 -0800 (PST) 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 Subject: [PATCH v12 11/17] arm64: kexec: kexec may require EL2 vectors Date: Tue, 2 Mar 2021 19:22:24 -0500 Message-Id: <20210303002230.1083176-12-pasha.tatashin@soleen.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210303002230.1083176-1-pasha.tatashin@soleen.com> References: <20210303002230.1083176-1-pasha.tatashin@soleen.com> MIME-Version: 1.0 X-Rspamd-Server: rspam03 X-Rspamd-Queue-Id: 6E1F8132 X-Stat-Signature: 8f7wm4mkct7yz4mwhs5pawxahq8iodw6 Received-SPF: none (soleen.com>: No applicable sender policy available) receiver=imf04; identity=mailfrom; envelope-from=""; helo=mail-qt1-f169.google.com; client-ip=209.85.160.169 X-HE-DKIM-Result: pass/pass X-HE-Tag: 1614730967-816585 Content-Transfer-Encoding: quoted-printable X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: If we have a EL2 mode without VHE, the EL2 vectors are needed in order to switch to EL2 and jump to new world with hypervisor privileges. In preporation to MMU enabled relocation, configure our EL2 table now. Suggested-by: James Morse Signed-off-by: Pavel Tatashin --- arch/arm64/Kconfig | 2 +- arch/arm64/include/asm/kexec.h | 1 + arch/arm64/kernel/asm-offsets.c | 1 + arch/arm64/kernel/machine_kexec.c | 31 +++++++++++++++++++++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 1f212b47a48a..825fe88b7c08 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -1141,7 +1141,7 @@ config CRASH_DUMP =20 config TRANS_TABLE def_bool y - depends on HIBERNATION + depends on HIBERNATION || KEXEC_CORE =20 config XEN_DOM0 def_bool y diff --git a/arch/arm64/include/asm/kexec.h b/arch/arm64/include/asm/kexe= c.h index 9befcd87e9a8..305cf0840ed3 100644 --- a/arch/arm64/include/asm/kexec.h +++ b/arch/arm64/include/asm/kexec.h @@ -96,6 +96,7 @@ struct kimage_arch { void *dtb; phys_addr_t dtb_mem; phys_addr_t kern_reloc; + phys_addr_t el2_vectors; /* Core ELF header buffer */ void *elf_headers; unsigned long elf_headers_mem; diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offs= ets.c index 0c92e193f866..2e3278df1fc3 100644 --- a/arch/arm64/kernel/asm-offsets.c +++ b/arch/arm64/kernel/asm-offsets.c @@ -157,6 +157,7 @@ int main(void) #endif #ifdef CONFIG_KEXEC_CORE DEFINE(KIMAGE_ARCH_DTB_MEM, offsetof(struct kimage, arch.dtb_mem)); + DEFINE(KIMAGE_ARCH_EL2_VECTORS, offsetof(struct kimage, arch.el2_vecto= rs)); DEFINE(KIMAGE_HEAD, offsetof(struct kimage, head)); DEFINE(KIMAGE_START, offsetof(struct kimage, start)); BLANK(); diff --git a/arch/arm64/kernel/machine_kexec.c b/arch/arm64/kernel/machin= e_kexec.c index 2e734e4ae12e..fb03b6676fb9 100644 --- a/arch/arm64/kernel/machine_kexec.c +++ b/arch/arm64/kernel/machine_kexec.c @@ -20,6 +20,7 @@ #include #include #include +#include =20 #include "cpu-reset.h" =20 @@ -42,7 +43,9 @@ static void _kexec_image_info(const char *func, int lin= e, pr_debug(" start: %lx\n", kimage->start); pr_debug(" head: %lx\n", kimage->head); pr_debug(" nr_segments: %lu\n", kimage->nr_segments); + pr_debug(" dtb_mem: %pa\n", &kimage->arch.dtb_mem); pr_debug(" kern_reloc: %pa\n", &kimage->arch.kern_reloc); + pr_debug(" el2_vectors: %pa\n", &kimage->arch.el2_vectors); =20 for (i =3D 0; i < kimage->nr_segments; i++) { pr_debug(" segment[%lu]: %016lx - %016lx, 0x%lx bytes, %lu pages\= n", @@ -137,9 +140,27 @@ static void kexec_segment_flush(const struct kimage = *kimage) } } =20 +/* Allocates pages for kexec page table */ +static void *kexec_page_alloc(void *arg) +{ + struct kimage *kimage =3D (struct kimage *)arg; + struct page *page =3D kimage_alloc_control_pages(kimage, 0); + + if (!page) + return NULL; + + memset(page_address(page), 0, PAGE_SIZE); + + return page_address(page); +} + int machine_kexec_post_load(struct kimage *kimage) { void *reloc_code =3D page_to_virt(kimage->control_code_page); + struct trans_pgd_info info =3D { + .trans_alloc_page =3D kexec_page_alloc, + .trans_alloc_arg =3D kimage, + }; =20 /* If in place, relocation is not used, only flush next kernel */ if (kimage->head & IND_DONE) { @@ -148,6 +169,14 @@ int machine_kexec_post_load(struct kimage *kimage) return 0; } =20 + kimage->arch.el2_vectors =3D 0; + if (is_hyp_callable()) { + int rc =3D trans_pgd_copy_el2_vectors(&info, + &kimage->arch.el2_vectors); + if (rc) + return rc; + } + memcpy(reloc_code, arm64_relocate_new_kernel, arm64_relocate_new_kernel_size); kimage->arch.kern_reloc =3D __pa(reloc_code); @@ -200,6 +229,8 @@ void machine_kexec(struct kimage *kimage) restart(is_hyp_callable(), kimage->start, kimage->arch.dtb_mem, 0, 0); } else { + if (is_hyp_callable()) + __hyp_set_vectors(kimage->arch.el2_vectors); cpu_soft_restart(kimage->arch.kern_reloc, virt_to_phys(kimage), 0, 0); } --=20 2.25.1