Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp594386pxb; Wed, 27 Jan 2021 16:09:52 -0800 (PST) X-Google-Smtp-Source: ABdhPJxvbTuksRlodBSIQBpyR4Z8CJttN10+nNlY/0WbJX5jmD65rDzNb4teO4ULfZBP5HineeYP X-Received: by 2002:a17:906:4a13:: with SMTP id w19mr8511948eju.33.1611792592077; Wed, 27 Jan 2021 16:09:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1611792592; cv=none; d=google.com; s=arc-20160816; b=huBn0O1jc9xm14hyeXk2l7RwgAPvIvNhtsD4luhQvIJDQ9r00+wNgoQOHLoWP4YTlA 6G1i1kz5i4/bKxFe2lX4UAaPTO7VobHJZwxKv2J2/m4L8XZ+U35Ce+Wi8TJdGumJCyZz rS5gX54y4gvQTPufuVSumUJQYA7/37N/+hRAEySOZPhw+fyFp4I/5wS5MSbYjaF1CfjB AyyAi0xNzHkv53/mR4d2EY30ouDh51rtUHp34bjW9x6pV6pZUVT4Km3kXJUUp7T79p+5 DoZh0DBng+pe0LxgXTnpgq7kpFDPeQ8VE5VUPXcLiVOEAgO7+Qx1E1dAAE/1GjzfpPcA 4s5A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=iM7vyMjvp8HFtXYgFN4DAarGfV3AZjiwX6w+vbwvdyg=; b=XsiABpbGZ7c3d60ma/FMrUnc0fxcb/P2BsXnn1UAU+3nyMMSbkPyGRsQw4BkXiysbz l6R/eYAi0CPbbViIVKeBVvLB5HB+K3gykKmjPeqRD4kc7nDR7yLIw4NTDbvnOxzYbRpZ hP5h6QvLZR9wpg8d+uNlaGBKldyoI8Gi2Wj0nWvS0M9PzjLB6ZCiGhqM1z7mt7sOPyF+ kYug1a8xkj+4MgX83aKrgMTuZdlL2McIDFCQkM+6hg0g4sPAUYsX7yMzXa2eGMR2dF+h DkXcVi5MbAH+wi72d2cqCkHU/Oy4uLUgNOUI7jQ5TjRIX5SP/RQYKPDVPvezRMpZsF1Y 7Okw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@soleen.com header.s=google header.b=QMOtRows; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id cy15si1754668edb.10.2021.01.27.16.09.28; Wed, 27 Jan 2021 16:09:52 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@soleen.com header.s=google header.b=QMOtRows; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344164AbhA0RtH (ORCPT + 99 others); Wed, 27 Jan 2021 12:49:07 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54858 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235239AbhA0R1w (ORCPT ); Wed, 27 Jan 2021 12:27:52 -0500 Received: from mail-qt1-x82f.google.com (mail-qt1-x82f.google.com [IPv6:2607:f8b0:4864:20::82f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 69DDAC061756 for ; Wed, 27 Jan 2021 09:27:12 -0800 (PST) Received: by mail-qt1-x82f.google.com with SMTP id h16so871746qth.11 for ; Wed, 27 Jan 2021 09:27:12 -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=iM7vyMjvp8HFtXYgFN4DAarGfV3AZjiwX6w+vbwvdyg=; b=QMOtRowsZT/Ru/xiPTLv/7JFh1hwOeF1FlFu0MyMoJe50YZ0ukuVerCY5joYBmYk/j dENZG3TuOn7AB27MiwjTj0TrcFWdGNygOEnZ4oGtC8PD8Du3kTYT6MOH+q217OZij3VA xMIee8OoRMSkHIpRftlWwViPysU80FoFq3KYkOC9aLDwgio7a8z5Ksf6AILaSVU0Gxha mSMwr5P5KU4POmhpF7+VQycvc+a+IS3S+icaRsghxQ5TaGvRsRibJJlSlzRdHCgkriq2 mJAX/hxhmlpNg6OOMCgLkRiiCUisawlzo9BxNh/nMUteSZE2Uaa4Vf0zsuQq+CBuEALt cl1g== 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=iM7vyMjvp8HFtXYgFN4DAarGfV3AZjiwX6w+vbwvdyg=; b=h6Hlu2zjgTdlazirFiN80ANyDXx0q8lmZkUxeVcOVJN5BCLy9uscUOJ3cUNVKySw8H lpS3O903X9NilYyhJT7F/ZOsi1n1gG7RYBOHUCMG/hq3mbrlh6OEWtgRp0IgxZmVFrKC PloW03zn00OGXBpGmHBQh0x+bgJznpcfZoV4t/bKg1aP7p2IlRXOOCdIH4Ws30QpjjFM ZIkZF5EfidxcUlFbLRrEeEurOhn+rV1VSywsRUxsbZcpQ8/MO09EJrHrVkPvnQ9UNVwF wOZcmEXcc8a08Nfhe3S/48z9Bog3miwW5t8uZvttZKfZn8CdkVWEYwkHdBl61RIGQXLR QDng== X-Gm-Message-State: AOAM532ctS6PqOgbqApE+LqzWbc+MQ+hLq1vedfuvy0P7iaCKp9cN54v QEz8KVs+Ag31mO/X4J/wKZPoGw== X-Received: by 2002:ac8:118c:: with SMTP id d12mr10787471qtj.262.1611768431629; Wed, 27 Jan 2021 09:27:11 -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 z2sm1728019qtz.71.2021.01.27.09.27.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Jan 2021 09:27:11 -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 v11 2/6] arm64: kexec: use ld script for relocation function Date: Wed, 27 Jan 2021 12:27:02 -0500 Message-Id: <20210127172706.617195-3-pasha.tatashin@soleen.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210127172706.617195-1-pasha.tatashin@soleen.com> References: <20210127172706.617195-1-pasha.tatashin@soleen.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently, relocation code declares start and end variables which are used to compute it size. The better way to do this is to use ld script incited, and put relocation function in its own section. Soon, relocation function will share the same page with EL2 vectors. So, proper marking is needed. Signed-off-by: Pavel Tatashin --- arch/arm64/include/asm/kexec.h | 4 ++++ arch/arm64/include/asm/sections.h | 1 + arch/arm64/kernel/machine_kexec.c | 17 ++++++++--------- arch/arm64/kernel/relocate_kernel.S | 15 ++------------- arch/arm64/kernel/vmlinux.lds.S | 19 +++++++++++++++++++ 5 files changed, 34 insertions(+), 22 deletions(-) diff --git a/arch/arm64/include/asm/kexec.h b/arch/arm64/include/asm/kexec.h index 990185744148..7f4f9abdf049 100644 --- a/arch/arm64/include/asm/kexec.h +++ b/arch/arm64/include/asm/kexec.h @@ -90,6 +90,10 @@ static inline void crash_prepare_suspend(void) {} static inline void crash_post_resume(void) {} #endif +#if defined(CONFIG_KEXEC_CORE) +extern const char arm64_relocate_new_kernel[]; +#endif + /* * kern_reloc_arg is passed to kernel relocation function as an argument. * head kimage->head, allows to traverse through relocation segments. diff --git a/arch/arm64/include/asm/sections.h b/arch/arm64/include/asm/sections.h index 8ff579361731..ae873eb22205 100644 --- a/arch/arm64/include/asm/sections.h +++ b/arch/arm64/include/asm/sections.h @@ -19,5 +19,6 @@ extern char __exittext_begin[], __exittext_end[]; extern char __irqentry_text_start[], __irqentry_text_end[]; extern char __mmuoff_data_start[], __mmuoff_data_end[]; extern char __entry_tramp_text_start[], __entry_tramp_text_end[]; +extern char __relocate_new_kernel_start[], __relocate_new_kernel_end[]; #endif /* __ASM_SECTIONS_H */ diff --git a/arch/arm64/kernel/machine_kexec.c b/arch/arm64/kernel/machine_kexec.c index 679db3f1e0c5..361a4d082093 100644 --- a/arch/arm64/kernel/machine_kexec.c +++ b/arch/arm64/kernel/machine_kexec.c @@ -20,13 +20,10 @@ #include #include #include +#include #include "cpu-reset.h" -/* Global variables for the arm64_relocate_new_kernel routine. */ -extern const unsigned char arm64_relocate_new_kernel[]; -extern const unsigned long arm64_relocate_new_kernel_size; - /** * kexec_image_info - For debugging output. */ @@ -78,13 +75,15 @@ int machine_kexec_post_load(struct kimage *kimage) { void *reloc_code = page_to_virt(kimage->control_code_page); struct kern_reloc_arg *kern_reloc_arg = kexec_page_alloc(kimage); + long func_offset, reloc_size; if (!kern_reloc_arg) return -ENOMEM; - memcpy(reloc_code, arm64_relocate_new_kernel, - arm64_relocate_new_kernel_size); - kimage->arch.kern_reloc = __pa(reloc_code); + func_offset = arm64_relocate_new_kernel - __relocate_new_kernel_start; + reloc_size = __relocate_new_kernel_end - __relocate_new_kernel_start; + memcpy(reloc_code, __relocate_new_kernel_start, reloc_size); + kimage->arch.kern_reloc = __pa(reloc_code) + func_offset; kimage->arch.kern_reloc_arg = __pa(kern_reloc_arg); kern_reloc_arg->head = kimage->head; kern_reloc_arg->entry_addr = kimage->start; @@ -92,9 +91,9 @@ int machine_kexec_post_load(struct kimage *kimage) kexec_image_info(kimage); /* Flush the reloc_code in preparation for its execution. */ - __flush_dcache_area(reloc_code, arm64_relocate_new_kernel_size); + __flush_dcache_area(reloc_code, reloc_size); flush_icache_range((uintptr_t)reloc_code, (uintptr_t)reloc_code + - arm64_relocate_new_kernel_size); + reloc_size); __flush_dcache_area(kern_reloc_arg, sizeof(struct kern_reloc_arg)); return 0; diff --git a/arch/arm64/kernel/relocate_kernel.S b/arch/arm64/kernel/relocate_kernel.S index c92228aeddca..d2a4a0b0d76b 100644 --- a/arch/arm64/kernel/relocate_kernel.S +++ b/arch/arm64/kernel/relocate_kernel.S @@ -14,6 +14,7 @@ #include #include +.pushsection ".kexec_relocate.text", "ax" /* * arm64_relocate_new_kernel - Put a 2nd stage image in place and boot it. * @@ -75,16 +76,4 @@ SYM_CODE_START(arm64_relocate_new_kernel) ldr x0, [x0, #KEXEC_KRELOC_KERN_ARG0] /* x0 = dtb address */ br x4 SYM_CODE_END(arm64_relocate_new_kernel) - -.align 3 /* To keep the 64-bit values below naturally aligned. */ - -.Lcopy_end: -.org KEXEC_CONTROL_PAGE_SIZE - -/* - * arm64_relocate_new_kernel_size - Number of bytes to copy to the - * control_code_page. - */ -.globl arm64_relocate_new_kernel_size -arm64_relocate_new_kernel_size: - .quad .Lcopy_end - arm64_relocate_new_kernel +.popsection diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S index 4c0b0c89ad59..33b0d3c9fd3b 100644 --- a/arch/arm64/kernel/vmlinux.lds.S +++ b/arch/arm64/kernel/vmlinux.lds.S @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -82,6 +83,16 @@ jiffies = jiffies_64; #define HIBERNATE_TEXT #endif +#ifdef CONFIG_KEXEC_CORE +#define KEXEC_TEXT \ + . = ALIGN(SZ_4K); \ + __relocate_new_kernel_start = .; \ + *(.kexec_relocate.text) \ + __relocate_new_kernel_end = .; +#else +#define KEXEC_TEXT +#endif + #ifdef CONFIG_UNMAP_KERNEL_AT_EL0 #define TRAMP_TEXT \ . = ALIGN(PAGE_SIZE); \ @@ -142,6 +153,7 @@ SECTIONS HYPERVISOR_TEXT IDMAP_TEXT HIBERNATE_TEXT + KEXEC_TEXT TRAMP_TEXT *(.fixup) *(.gnu.warning) @@ -316,3 +328,10 @@ ASSERT((__entry_tramp_text_end - __entry_tramp_text_start) == PAGE_SIZE, * If padding is applied before .head.text, virt<->phys conversions will fail. */ ASSERT(_text == KIMAGE_VADDR, "HEAD is misaligned") + +#ifdef CONFIG_KEXEC_CORE +/* kexec relocation code should fit into one KEXEC_CONTROL_PAGE_SIZE */ +ASSERT(__relocate_new_kernel_end - (__relocate_new_kernel_start & ~(SZ_4K - 1)) + <= SZ_4K, "kexec relocation code is too big or misaligned") +ASSERT(KEXEC_CONTROL_PAGE_SIZE >= SZ_4K, "KEXEC_CONTROL_PAGE_SIZE is brokern") +#endif -- 2.25.1