Received: by 2002:a25:31c3:0:0:0:0:0 with SMTP id x186csp2188186ybx; Fri, 8 Nov 2019 01:04:08 -0800 (PST) X-Google-Smtp-Source: APXvYqwFRy2h/Nmk0fBcANrWvBdjhmw0m7HXK+WTwxq44cc/hlYEZ654eKixjbRY9cZzoq01en9D X-Received: by 2002:a50:c20a:: with SMTP id n10mr9103527edf.120.1573203848824; Fri, 08 Nov 2019 01:04:08 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573203848; cv=none; d=google.com; s=arc-20160816; b=Pf9moYTTrzQ0lGFqRa6oKzWrVPlHrlTag4gc36rtQ7qhCGdhbH3HEiwih3DI70A5vp PmQR56slfuLDrZ5gS28lOontyyJphicA5zMUKytUaL8YHwux+M2iV6jAQZqFxI+O/Ibp 3ADAuCcpeu5pUx/dm3n9myOwrGukJuvbEz9igzGmEUtZKg7gZddLV8Uypjy0gApnYrD8 EnLPLvTJB/3rWrS9+xbHsfnH4IB1Mpddu6pLYBqF1HoTxMIsgchpYJM3FBTcqPd4Lj0E bwVeiK1jhw3JwS1Fzd71olv250LGgnpeYjMa3Jo2vHILQdWEoZYm98IiAMboCUvFQQyh /2oQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:references :in-reply-to:message-id:date:subject:cc:to:from:dkim-signature; bh=DQgI6LR9Tf12y8XeIh2jR9nG2D8CgHUS6/V4oUyv4Q4=; b=z/Qkyf1te9tSrO2Ih/yozWaea3s1+upwJmBZpVccTw0HolxMy4DtCHGLPh3t04mEXG WEKCGviXLSxgJKTrRbEhP2foinC3bV0mXo5Wo2I6+oZJPAxKzB4gzagimYId574JJtyy SWWy6nQerCQ56LxzLPHLuSoMidFoc30nRwEGafy4G7UHPjqwJsFcfmyFDhvYBO6tEBbU G4TA36UMjqfE6VC4zIJ5mSxRmw11Owg7TaU1eyjOS3Gq39CxGgUKAMw1jXjCMR1/iIYZ 2cGMgliHLr5H5YThwxmoIBzQj034xUyDcITh9kvs+g0EOW916ArFy+HOv8w1TqPuz413 9MBg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b="Vmo+LDJ/"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g26si3467126edv.109.2019.11.08.01.03.44; Fri, 08 Nov 2019 01:04:08 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b="Vmo+LDJ/"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731278AbfKHJA7 (ORCPT + 99 others); Fri, 8 Nov 2019 04:00:59 -0500 Received: from us-smtp-delivery-1.mimecast.com ([205.139.110.120]:27515 "EHLO us-smtp-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1731264AbfKHJA6 (ORCPT ); Fri, 8 Nov 2019 04:00:58 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1573203656; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=DQgI6LR9Tf12y8XeIh2jR9nG2D8CgHUS6/V4oUyv4Q4=; b=Vmo+LDJ/dnwRULyyLcwKbDNZEDuaeu2cSh1n8YxaQ9K9GoUHelmVpmlCu3OgZN0VDWk12f wEC3toTbRBQwzi3iHKCNQmT4VUFWzLDEHlNPMFODGVuj+APy3cYg+M/oPIbCH2+UlUonlP b1hexFtoOxF+hHaR3PV3jaOCdz3gDXQ= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-304-w-acrUUZPq-jQXuerZDBhg-1; Fri, 08 Nov 2019 04:00:52 -0500 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id BB9E7477; Fri, 8 Nov 2019 09:00:50 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-12-112.pek2.redhat.com [10.72.12.112]) by smtp.corp.redhat.com (Postfix) with ESMTP id 453E15D6A5; Fri, 8 Nov 2019 09:00:43 +0000 (UTC) From: Lianbo Jiang To: linux-kernel@vger.kernel.org Cc: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, x86@kernel.org, bhe@redhat.com, dyoung@redhat.com, jgross@suse.com, dhowells@redhat.com, Thomas.Lendacky@amd.com, ebiederm@xmission.com, vgoyal@redhat.com, d.hatayama@fujitsu.com, horms@verge.net.au, kexec@lists.infradead.org Subject: [PATCH 1/3 v9] x86/kdump: always reserve the low 1M when the crashkernel option is specified Date: Fri, 8 Nov 2019 17:00:25 +0800 Message-Id: <20191108090027.11082-2-lijiang@redhat.com> In-Reply-To: <20191108090027.11082-1-lijiang@redhat.com> References: <20191108090027.11082-1-lijiang@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-MC-Unique: w-acrUUZPq-jQXuerZDBhg-1 X-Mimecast-Spam-Score: 0 Content-Type: text/plain; charset=WINDOWS-1252 Content-Transfer-Encoding: quoted-printable Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Kdump kernel will reuse the first 640k region because the real mode trampoline has to work in this area. When the vmcore is dumped, the old memory in this area may be accessed, therefore, kernel has to copy the contents of the first 640k area to a backup region so that kdump kernel can read the old memory from the backup area of the first 640k area, which is done in the purgatory(). But, the current handling of copying the first 640k area runs into problems when SME is enabled, kernel does not properly copy these old memory to the backup area in the purgatory(), thereby, kdump kernel reads out the encrypted contents, because the kdump kernel must access the first kernel's memory with the encryption bit set when SME is enabled in the first kernel. Please refer to this link: Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=3D204793 Finally, it causes the following errors, and the crash tool gets invalid pointers when parsing the vmcore. crash> kmem -s|grep -i invalid kmem: dma-kmalloc-512: slab:ffffd77680001c00 invalid freepointer:a6086ac099= f0c5a4 kmem: dma-kmalloc-512: slab:ffffd77680001c00 invalid freepointer:a6086ac099= f0c5a4 crash> To avoid the above errors, when the crashkernel option is specified, lets reserve the remaining low 1M memory(after reserving real mode memory) so that the allocated memory does not fall into the low 1M area, which makes us not to copy the first 640k content to a backup region in purgatory(). This indicates that it does not need to be included in crash dumps or used for anything except the processor trampolines that must live in the low 1M. Signed-off-by: Lianbo Jiang --- arch/x86/include/asm/crash.h | 6 ++++++ arch/x86/kernel/crash.c | 15 +++++++++++++++ arch/x86/realmode/init.c | 2 ++ 3 files changed, 23 insertions(+) diff --git a/arch/x86/include/asm/crash.h b/arch/x86/include/asm/crash.h index 0acf5ee45a21..3dff55f4ed9d 100644 --- a/arch/x86/include/asm/crash.h +++ b/arch/x86/include/asm/crash.h @@ -8,4 +8,10 @@ int crash_setup_memmap_entries(struct kimage *image, =09=09struct boot_params *params); void crash_smp_send_stop(void); =20 +#ifdef CONFIG_KEXEC_CORE +void __init crash_reserve_low_1M(void); +#else +static inline void __init crash_reserve_low_1M(void) { } +#endif + #endif /* _ASM_X86_CRASH_H */ diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c index eb651fbde92a..db2301afade5 100644 --- a/arch/x86/kernel/crash.c +++ b/arch/x86/kernel/crash.c @@ -24,6 +24,7 @@ #include #include #include +#include =20 #include #include @@ -39,6 +40,7 @@ #include #include #include +#include =20 /* Used while preparing memory map entries for second kernel */ struct crash_memmap_data { @@ -68,6 +70,19 @@ static inline void cpu_crash_vmclear_loaded_vmcss(void) =09rcu_read_unlock(); } =20 +/* + * When the crashkernel option is specified, only use the low + * 1M for the real mode trampoline. + */ +void __init crash_reserve_low_1M(void) +{ +=09if (cmdline_find_option(boot_command_line, "crashkernel", +=09=09=09=09NULL, 0) > 0) { +=09=09memblock_reserve(0, 1<<20); +=09=09pr_info("Reserving the low 1M of memory for crashkernel\n"); +=09} +} + #if defined(CONFIG_SMP) && defined(CONFIG_X86_LOCAL_APIC) =20 static void kdump_nmi_callback(int cpu, struct pt_regs *regs) diff --git a/arch/x86/realmode/init.c b/arch/x86/realmode/init.c index 7dce39c8c034..262f83cad355 100644 --- a/arch/x86/realmode/init.c +++ b/arch/x86/realmode/init.c @@ -8,6 +8,7 @@ #include #include #include +#include =20 struct real_mode_header *real_mode_header; u32 *trampoline_cr4_features; @@ -34,6 +35,7 @@ void __init reserve_real_mode(void) =20 =09memblock_reserve(mem, size); =09set_real_mode_mem(mem); +=09crash_reserve_low_1M(); } =20 static void __init setup_real_mode(void) --=20 2.17.1