From patchwork Thu Mar 20 01:55:49 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Changyuan Lyu X-Patchwork-Id: 14023314 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id F3374C35FFC for ; Thu, 20 Mar 2025 01:56:46 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C5B7F280010; Wed, 19 Mar 2025 21:56:25 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id BE35C280001; Wed, 19 Mar 2025 21:56:25 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A38C5280010; Wed, 19 Mar 2025 21:56:25 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 82D80280001 for ; Wed, 19 Mar 2025 21:56:25 -0400 (EDT) Received: from smtpin20.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id EE044C08FC for ; Thu, 20 Mar 2025 01:56:25 +0000 (UTC) X-FDA: 83240264730.20.5965A82 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) by imf20.hostedemail.com (Postfix) with ESMTP id E84CB1C0002 for ; Thu, 20 Mar 2025 01:56:23 +0000 (UTC) Authentication-Results: imf20.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=0YFOOCSo; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf20.hostedemail.com: domain of 3xnXbZwoKCGUFKDQJbXDQOJRRJOH.FRPOLQXa-PPNYDFN.RUJ@flex--changyuanl.bounces.google.com designates 209.85.216.74 as permitted sender) smtp.mailfrom=3xnXbZwoKCGUFKDQJbXDQOJRRJOH.FRPOLQXa-PPNYDFN.RUJ@flex--changyuanl.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1742435784; a=rsa-sha256; cv=none; b=bmvgMnnlcBEZcA3DHDe0ervZF1kJzeB4IlbGT1jgN/s0201qKVcJDlfNZJwzgMvHZb7lNs HJtl7SPn2oPUT0B+YCsTpX7HJOP3yw+RVxeU2NNg225K0aOsanNswoXq1U1tWFhOqxO5nW PTtrKY6mcm6gypniJceBG60xExPxqP0= ARC-Authentication-Results: i=1; imf20.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=0YFOOCSo; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf20.hostedemail.com: domain of 3xnXbZwoKCGUFKDQJbXDQOJRRJOH.FRPOLQXa-PPNYDFN.RUJ@flex--changyuanl.bounces.google.com designates 209.85.216.74 as permitted sender) smtp.mailfrom=3xnXbZwoKCGUFKDQJbXDQOJRRJOH.FRPOLQXa-PPNYDFN.RUJ@flex--changyuanl.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1742435784; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=QmV5BWqKnlxPhrRMqlARz/TZT0WTjCpLvcGNlHyxpKs=; b=QRfALLq2NMfg7XCsxX3ix6bi+dW1c7bQnMBx+W1Ks2MmdDJPa8HdVp9tW729qmBElVuWhw OvQRAVNIciN0VNj17Q9BqOpHrL/+EhP6deZNoEr+KJyZLqxHWURa2EPTeIVvxXhkm8VDE7 bqwwHt7uDZlgNcUIw0H8Ks8KhI1oxW4= Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-2ff6167e9ccso701835a91.1 for ; Wed, 19 Mar 2025 18:56:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1742435783; x=1743040583; darn=kvack.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=QmV5BWqKnlxPhrRMqlARz/TZT0WTjCpLvcGNlHyxpKs=; b=0YFOOCSoQzwu8JX5ESUc95n2BSGex+V5TD7apBGv1y/G+TrPQV39h6Qzk4Txtte4CX WpCu78eHZlSe/EM7b1knSA1ZEFwpbWWx8alDmE8+KcIIWhPtfBZmSkwygszupQ9V4niO RUKA9mJ9ZOtprWdLCvDO6FteOR5pBTWTwrKhNjIpyuO92m7W0g5DJBP9r0UN0dSnIu0r 0UcVvuRts7Hbw4jk2LxhBs2ulLePtMVEHwnIrhWmMl6yUVAdp5FJHnH3jG9Mads2bep7 GbEOLGAprf4kHU+juYsA7O/A9Kj1jggbDl+/6HTvP3843Yn90jRTtiH00nXZI5VqOqGW wPRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742435783; x=1743040583; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=QmV5BWqKnlxPhrRMqlARz/TZT0WTjCpLvcGNlHyxpKs=; b=daw9ey1l8JvLEE8gBPSrOwJLVpdsJsegpB4Uz1EBQqmYkP+AadTMlFngT5CyursxMN a5QomkZnlUf6HT5Lamu2uLFZmki1mQ4Kg+vzMgU5sJlQJetygKNqxCG/Bdn82vQXTZoH C3Y2uHCqUzA3/lI+FscGl155z30hl8z1tl8tipppbPagplyAdPfO4WtIcC1CKGYi2jSx TiUTge4eSweRtw8NrcHdQpoxPOtq7iSUM98ED09ISOEF6AFMAmr6wQ8A0TKv6/F9gKKL JYX475n+2ouVIQ/QfIAAe2ZsQ+/GupG8I6AlIrOzpqWtScqYHoG8t2bkrcnFawUkxjLS sCaA== X-Forwarded-Encrypted: i=1; AJvYcCVkid4q1ZWiRdBiVNvfW4gJO2eI4az46yHJhLQZzoS3VKo1pKuRmBm/118G0SGCHToSzBsG5d8D7Q==@kvack.org X-Gm-Message-State: AOJu0Yx9S02jEB+4c4HNHAqdJ0n4nr1NRrWSAHDcKttslL6Rk3BHBEnW ysS9G0XhWBS1TaiwjUFU6Je7yQfmvoGjjvR/i/n/RGo9tKH5jcrlmhofpvqJETjYHHR0L6y04uT EUyfLvuamoBgvJtf4aQ== X-Google-Smtp-Source: AGHT+IFcz6xgCpsdaGMV/lA4NVDUFar/eMRSs8b1l17t60oWu+KTL3OhVFDVjETsYQaFDiZdylma2/Q1A+VwCJiL X-Received: from pjbrr14.prod.google.com ([2002:a17:90b:2b4e:b0:2ef:82c0:cb8d]) (user=changyuanl job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1f86:b0:301:6343:1626 with SMTP id 98e67ed59e1d1-301d507fab7mr2148203a91.1.1742435782874; Wed, 19 Mar 2025 18:56:22 -0700 (PDT) Date: Wed, 19 Mar 2025 18:55:49 -0700 In-Reply-To: <20250320015551.2157511-1-changyuanl@google.com> Mime-Version: 1.0 References: <20250320015551.2157511-1-changyuanl@google.com> X-Mailer: git-send-email 2.49.0.rc1.451.g8f38331e32-goog Message-ID: <20250320015551.2157511-15-changyuanl@google.com> Subject: [PATCH v5 14/16] x86: add KHO support From: Changyuan Lyu To: linux-kernel@vger.kernel.org Cc: graf@amazon.com, akpm@linux-foundation.org, luto@kernel.org, anthony.yznaga@oracle.com, arnd@arndb.de, ashish.kalra@amd.com, benh@kernel.crashing.org, bp@alien8.de, catalin.marinas@arm.com, dave.hansen@linux.intel.com, dwmw2@infradead.org, ebiederm@xmission.com, mingo@redhat.com, jgowans@amazon.com, corbet@lwn.net, krzk@kernel.org, rppt@kernel.org, mark.rutland@arm.com, pbonzini@redhat.com, pasha.tatashin@soleen.com, hpa@zytor.com, peterz@infradead.org, ptyadav@amazon.de, robh+dt@kernel.org, robh@kernel.org, saravanak@google.com, skinsburskii@linux.microsoft.com, rostedt@goodmis.org, tglx@linutronix.de, thomas.lendacky@amd.com, usama.arif@bytedance.com, will@kernel.org, devicetree@vger.kernel.org, kexec@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org, linux-mm@kvack.org, x86@kernel.org, Changyuan Lyu X-Stat-Signature: cmqiumxffbpq84zxsxetkjmpn7hzhytg X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: E84CB1C0002 X-Rspam-User: X-HE-Tag: 1742435783-267189 X-HE-Meta: U2FsdGVkX1/k8OagJV0NL4wY3N516z2p014zydONWQcoDbdrlyMQ4kc/GHX7HjXir8IQb5BqFx0plpSiQRf84MGR8SjR1cevwV4+QQszujnvN50frqHeCx10Iz7mnoPdn3VQejxByVg4p/9liV2TdsYiZvBahN5jfasYFaZb29N+ej8HgcUuz7JKony5T8B7zzEZKqGtUj0wieaTliLs2TrXVGxxL2aDTH1ZgTLxTp0GphqNioUkIr/Aq0w7hSYPBMtfaKSqVpnwQFz4qoYJrSriC/CyWQasJLFzIwgoButtAF4AnW5HqRhsMaIG+DStPKi4nr2cJnqWa2YIWFfiWlFpkO+nGE/PoOz0S1UP/53+9cs1y0YyKj88IfctV02dtWRIlxmLtvbRAlmmD+aOMelCKDIx8YixkQfyYZ1FkFdvz4Kup2pMihdUQm06dMSMcWfGHxcy1ga3vU49AgW9DfhNS9YfkyT9eQftDoXLlsL6Bm5C3DS2kRfuKlJxQzWOt338E9FRw0XX4Ys6/8O0cqXtXnAPelVWiXubI6dOsnO3wcaSgnqyiTWI2bbDBxv2/zHrnGkaiw6Ri6/SB7wH+7kyid1bS3ciVkTk7Kx/fidgSn23C4u2FxhE8mTyLsgaZmTGonY0xLjo7UukNPBxNAzSsfo3zTkIxcLdgeDYTK0njzwMjFwHlhybIyofj97xJepnWI2vtAg8Zoh2Gbf7pr4uEkF0p75MQPT4cEnZ906pz5TNQdPRo1CKjh51mahkENgkEZwvr2y7SOy/M1MyYV+tgFxHG7ZKTAMeIM7QRMBj3KR/H/zbMI+ZgYOzMtP5AaJYHO+I9UMg9tU9JkJJja7oqB3Ey1FLsn4FFNEMShrQQA9XKKI2YRKH+2pv6Und2TsLVyBZWxEUiIp2+02bK9ClK9qBt/7UjwO4xG/SZctQgSoWDmsUeoCByVjj4ea4loXfloCztKhiv8/lYIi rePbJku9 eLpcZ34ZTV2d6RrbECYTFJm5HowIkjdfO8kXAlQfkeEW9VsgDhaqjaFkC9YU8UKZwk9CsvNDg7ZkxzI+Pw2zXFMW/Qv7j25shOFasy/ftX0qQSaISlxAssOu4RB5AUAvfdBAJC4EVUTo4gNUGeni6n9C/V4s1125xarZA26EAhe+J+k2VZdyLLVZBnRZdZAtQEeXakWD+SbeFeOSvDVCXctZHJMPjehAIvSGBIHJRLaSjHXvm7o/FK+WT5sUD9nLX+gHFc/7XlBFDfW4R3DcJecLV9wLPWAB7b7Qm9ExteAlC1eUoNLw0nG4xI06l6ixccyEZC/XlDx45WN5XmK399vNRrcVuZ55pPbFUGMTcpE3QOjkwj7vl+nuODbyB61Pe1ziVMC2wgssnUEAWr0QxROc/a4Gg7EvOIYLZXrVTb1DdQlpf6YAEvWSvwnjbHf6cxR+zO6IqAoSwtkNps5he1olng1NIXPBN6/b8k+lteUn6l83sXSdYS2hoXfHKkojqeDmz+vkeJxSGpjcBs34KVzEZHXH2TFOBdZ6XZ3/soZ406jbuJA3hUtJ4Zuv35hFALSd1AozDYxSpKVby6nss2EUuazvI/wlbsilDbcaaLk1zVyhZ+JYZS65P+GeHjdO9dCSVZvSTLdwh9ipxEDRs5rtyID1oUe6lOuaoAg/4+7JJNYNssZv3MVakm1IDZP6px9Am 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: List-Subscribe: List-Unsubscribe: From: Alexander Graf We now have all bits in place to support KHO kexecs. This patch adds awareness of KHO in the kexec file as well as boot path for x86 and adds the respective kconfig option to the architecture so that it can use KHO successfully. In addition, it enlightens it decompression code with KHO so that its KASLR location finder only considers memory regions that are not already occupied by KHO memory. Signed-off-by: Alexander Graf Co-developed-by: Mike Rapoport (Microsoft) Signed-off-by: Mike Rapoport (Microsoft) Co-developed-by: Changyuan Lyu Signed-off-by: Changyuan Lyu --- arch/x86/Kconfig | 3 ++ arch/x86/boot/compressed/kaslr.c | 52 +++++++++++++++++++++++++- arch/x86/include/asm/setup.h | 4 ++ arch/x86/include/uapi/asm/setup_data.h | 13 ++++++- arch/x86/kernel/e820.c | 18 +++++++++ arch/x86/kernel/kexec-bzimage64.c | 36 ++++++++++++++++++ arch/x86/kernel/setup.c | 25 +++++++++++++ arch/x86/realmode/init.c | 2 + include/linux/kexec_handover.h | 13 +++++-- 9 files changed, 161 insertions(+), 5 deletions(-) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 0e27ebd7e36a..acd180e3002f 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -2091,6 +2091,9 @@ config ARCH_SUPPORTS_KEXEC_BZIMAGE_VERIFY_SIG config ARCH_SUPPORTS_KEXEC_JUMP def_bool y +config ARCH_SUPPORTS_KEXEC_HANDOVER + def_bool y + config ARCH_SUPPORTS_CRASH_DUMP def_bool X86_64 || (X86_32 && HIGHMEM) diff --git a/arch/x86/boot/compressed/kaslr.c b/arch/x86/boot/compressed/kaslr.c index f03d59ea6e40..ff1168881016 100644 --- a/arch/x86/boot/compressed/kaslr.c +++ b/arch/x86/boot/compressed/kaslr.c @@ -760,6 +760,55 @@ static void process_e820_entries(unsigned long minimum, } } +/* + * If KHO is active, only process its scratch areas to ensure we are not + * stepping onto preserved memory. + */ +#ifdef CONFIG_KEXEC_HANDOVER +static bool process_kho_entries(unsigned long minimum, unsigned long image_size) +{ + struct kho_scratch *kho_scratch; + struct setup_data *ptr; + int i, nr_areas = 0; + + ptr = (struct setup_data *)(unsigned long)boot_params_ptr->hdr.setup_data; + while (ptr) { + if (ptr->type == SETUP_KEXEC_KHO) { + struct kho_data *kho = (struct kho_data *)ptr->data; + + kho_scratch = (void *)kho->scratch_addr; + nr_areas = kho->scratch_size / sizeof(*kho_scratch); + + break; + } + + ptr = (struct setup_data *)(unsigned long)ptr->next; + } + + if (!nr_areas) + return false; + + for (i = 0; i < nr_areas; i++) { + struct kho_scratch *area = &kho_scratch[i]; + struct mem_vector region = { + .start = area->addr, + .size = area->size, + }; + + if (process_mem_region(®ion, minimum, image_size)) + break; + } + + return true; +} +#else +static inline bool process_kho_entries(unsigned long minimum, + unsigned long image_size) +{ + return false; +} +#endif + static unsigned long find_random_phys_addr(unsigned long minimum, unsigned long image_size) { @@ -775,7 +824,8 @@ static unsigned long find_random_phys_addr(unsigned long minimum, return 0; } - if (!process_efi_entries(minimum, image_size)) + if (!process_kho_entries(minimum, image_size) && + !process_efi_entries(minimum, image_size)) process_e820_entries(minimum, image_size); phys_addr = slots_fetch_random(); diff --git a/arch/x86/include/asm/setup.h b/arch/x86/include/asm/setup.h index 85f4fde3515c..70e045321d4b 100644 --- a/arch/x86/include/asm/setup.h +++ b/arch/x86/include/asm/setup.h @@ -66,6 +66,10 @@ extern void x86_ce4100_early_setup(void); static inline void x86_ce4100_early_setup(void) { } #endif +#ifdef CONFIG_KEXEC_HANDOVER +#include +#endif + #ifndef _SETUP #include diff --git a/arch/x86/include/uapi/asm/setup_data.h b/arch/x86/include/uapi/asm/setup_data.h index b111b0c18544..c258c37768ee 100644 --- a/arch/x86/include/uapi/asm/setup_data.h +++ b/arch/x86/include/uapi/asm/setup_data.h @@ -13,7 +13,8 @@ #define SETUP_CC_BLOB 7 #define SETUP_IMA 8 #define SETUP_RNG_SEED 9 -#define SETUP_ENUM_MAX SETUP_RNG_SEED +#define SETUP_KEXEC_KHO 10 +#define SETUP_ENUM_MAX SETUP_KEXEC_KHO #define SETUP_INDIRECT (1<<31) #define SETUP_TYPE_MAX (SETUP_ENUM_MAX | SETUP_INDIRECT) @@ -78,6 +79,16 @@ struct ima_setup_data { __u64 size; } __attribute__((packed)); +/* + * Locations of kexec handover metadata + */ +struct kho_data { + __u64 dt_addr; + __u64 dt_size; + __u64 scratch_addr; + __u64 scratch_size; +} __attribute__((packed)); + #endif /* __ASSEMBLY__ */ #endif /* _UAPI_ASM_X86_SETUP_DATA_H */ diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c index 82b96ed9890a..0b81cd70b02a 100644 --- a/arch/x86/kernel/e820.c +++ b/arch/x86/kernel/e820.c @@ -1329,6 +1329,24 @@ void __init e820__memblock_setup(void) memblock_add(entry->addr, entry->size); } + /* + * At this point with KHO we only allocate from scratch memory. + * At the same time, we configure memblock to only allow + * allocations from memory below ISA_END_ADDRESS which is not + * a natural scratch region, because Linux ignores memory below + * ISA_END_ADDRESS at runtime. Beside very few (if any) early + * allocations, we must allocate real-mode trapoline below + * ISA_END_ADDRESS. + * + * To make sure that we can actually perform allocations during + * this phase, let's mark memory below ISA_END_ADDRESS as scratch + * so we can allocate from there in a scratch-only world. + * + * After real mode trampoline is allocated, we clear scratch + * marking from the memory below ISA_END_ADDRESS + */ + memblock_mark_kho_scratch(0, ISA_END_ADDRESS); + /* Throw away partial pages: */ memblock_trim_memory(PAGE_SIZE); diff --git a/arch/x86/kernel/kexec-bzimage64.c b/arch/x86/kernel/kexec-bzimage64.c index 68530fad05f7..09d6a068b14c 100644 --- a/arch/x86/kernel/kexec-bzimage64.c +++ b/arch/x86/kernel/kexec-bzimage64.c @@ -233,6 +233,31 @@ setup_ima_state(const struct kimage *image, struct boot_params *params, #endif /* CONFIG_IMA_KEXEC */ } +static void setup_kho(const struct kimage *image, struct boot_params *params, + unsigned long params_load_addr, + unsigned int setup_data_offset) +{ +#ifdef CONFIG_KEXEC_HANDOVER + struct setup_data *sd = (void *)params + setup_data_offset; + struct kho_data *kho = (void *)sd + sizeof(*sd); + + sd->type = SETUP_KEXEC_KHO; + sd->len = sizeof(struct kho_data); + + /* Only add if we have all KHO images in place */ + if (!image->kho.fdt || !image->kho.scratch) + return; + + /* Add setup data */ + kho->dt_addr = image->kho.fdt->mem; + kho->dt_size = image->kho.fdt->memsz; + kho->scratch_addr = image->kho.scratch->mem; + kho->scratch_size = image->kho.scratch->bufsz; + sd->next = params->hdr.setup_data; + params->hdr.setup_data = params_load_addr + setup_data_offset; +#endif /* CONFIG_KEXEC_HANDOVER */ +} + static int setup_boot_parameters(struct kimage *image, struct boot_params *params, unsigned long params_load_addr, @@ -312,6 +337,13 @@ setup_boot_parameters(struct kimage *image, struct boot_params *params, sizeof(struct ima_setup_data); } + if (IS_ENABLED(CONFIG_KEXEC_HANDOVER)) { + /* Setup space to store preservation metadata */ + setup_kho(image, params, params_load_addr, setup_data_offset); + setup_data_offset += sizeof(struct setup_data) + + sizeof(struct kho_data); + } + /* Setup RNG seed */ setup_rng_seed(params, params_load_addr, setup_data_offset); @@ -479,6 +511,10 @@ static void *bzImage64_load(struct kimage *image, char *kernel, kbuf.bufsz += sizeof(struct setup_data) + sizeof(struct ima_setup_data); + if (IS_ENABLED(CONFIG_KEXEC_HANDOVER)) + kbuf.bufsz += sizeof(struct setup_data) + + sizeof(struct kho_data); + params = kzalloc(kbuf.bufsz, GFP_KERNEL); if (!params) return ERR_PTR(-ENOMEM); diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index ead370570eb2..e2c54181405b 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -385,6 +385,28 @@ int __init ima_get_kexec_buffer(void **addr, size_t *size) } #endif +static void __init add_kho(u64 phys_addr, u32 data_len) +{ +#ifdef CONFIG_KEXEC_HANDOVER + struct kho_data *kho; + u64 addr = phys_addr + sizeof(struct setup_data); + u64 size = data_len - sizeof(struct setup_data); + + kho = early_memremap(addr, size); + if (!kho) { + pr_warn("setup: failed to memremap kho data (0x%llx, 0x%llx)\n", + addr, size); + return; + } + + kho_populate(kho->dt_addr, kho->scratch_addr, kho->scratch_size); + + early_memunmap(kho, size); +#else + pr_warn("Passed KHO data, but CONFIG_KEXEC_HANDOVER not set. Ignoring.\n"); +#endif +} + static void __init parse_setup_data(void) { struct setup_data *data; @@ -413,6 +435,9 @@ static void __init parse_setup_data(void) case SETUP_IMA: add_early_ima_buffer(pa_data); break; + case SETUP_KEXEC_KHO: + add_kho(pa_data, data_len); + break; case SETUP_RNG_SEED: data = early_memremap(pa_data, data_len); add_bootloader_randomness(data->data, data->len); diff --git a/arch/x86/realmode/init.c b/arch/x86/realmode/init.c index f9bc444a3064..9b9f4534086d 100644 --- a/arch/x86/realmode/init.c +++ b/arch/x86/realmode/init.c @@ -65,6 +65,8 @@ void __init reserve_real_mode(void) * setup_arch(). */ memblock_reserve(0, SZ_1M); + + memblock_clear_kho_scratch(0, SZ_1M); } static void __init sme_sev_setup_real_mode(struct trampoline_header *th) diff --git a/include/linux/kexec_handover.h b/include/linux/kexec_handover.h index d52a7b500f4c..2dd51a77d56c 100644 --- a/include/linux/kexec_handover.h +++ b/include/linux/kexec_handover.h @@ -3,9 +3,6 @@ #define LINUX_KEXEC_HANDOVER_H #include -#include -#include -#include struct kho_scratch { phys_addr_t addr; @@ -18,6 +15,15 @@ enum kho_event { KEXEC_KHO_UNFREEZE = 1, }; +#ifdef _SETUP +struct notifier_block; +struct kho_node; +struct folio; +#else +#include +#include +#include + #define KHO_HASHTABLE_BITS 3 #define KHO_NODE_INIT \ { \ @@ -35,6 +41,7 @@ struct kho_node { struct list_head list; bool visited; }; +#endif /* _SETUP */ struct kho_in_node { int offset;