From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1033372AbbKFN0L (ORCPT ); Fri, 6 Nov 2015 08:26:11 -0500 Received: from shrek-s3.podlesie.net ([85.14.110.209]:38391 "EHLO shrek.podlesie.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1033190AbbKFN0J (ORCPT ); Fri, 6 Nov 2015 08:26:09 -0500 X-Greylist: delayed 448 seconds by postgrey-1.27 at vger.kernel.org; Fri, 06 Nov 2015 08:26:09 EST From: Krzysztof Mazur To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, Andrew Morton , Andy Lutomirski , Borislav Petkov , "H. Peter Anvin" , Ingo Molnar , Laszlo Ersek , Matt Fleming , Paolo Bonzini , Thomas Gleixner , Krzysztof Mazur Subject: [PATCH] x86/setup: fix low identity map for >= 2GB kernel range Date: Fri, 6 Nov 2015 14:18:36 +0100 Message-Id: <1446815916-22105-1-git-send-email-krzysiek@podlesie.net> X-Mailer: git-send-email 2.6.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The commit f5f3497cad8c8416a74b9aaceb127908755d020a (x86/setup: Extend low identity map to cover whole kernel range) extended the low identity mapping. However, if the kernel uses more than 2 GB (VMSPLIT_2G_OPT or VMSPLIT_1G memory split), the normal memory mapping is overwritten by the low identity mapping causing crash. To avoid overwritting, limit the low identity map to cover only memory before kernel range (PAGE_OFFSET). Signed-off-by: Krzysztof Mazur --- The bug can be also fixed by copying identity mapping before copying kernel address range, but this fix is smaller. It might be also helpful to add a warning, if the low identity mapping is truncated due to kernel mapping (KERNEL_PGD_BOUNDARY < KERNEL_PGD_PTRS). arch/x86/kernel/setup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index a3cccbf..37c8ea8 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -1180,7 +1180,7 @@ void __init setup_arch(char **cmdline_p) */ clone_pgd_range(initial_page_table, swapper_pg_dir + KERNEL_PGD_BOUNDARY, - KERNEL_PGD_PTRS); + min(KERNEL_PGD_PTRS, KERNEL_PGD_BOUNDARY)); #endif tboot_probe(); -- 2.6.0