From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752457AbbCWH53 (ORCPT ); Mon, 23 Mar 2015 03:57:29 -0400 Received: from mga11.intel.com ([192.55.52.93]:24173 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752099AbbCWHzJ (ORCPT ); Mon, 23 Mar 2015 03:55:09 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.11,450,1422950400"; d="scan'208";a="544809140" From: Jim Kukunas To: Linux Kernel , tom.zanussi@linux.intel.com Cc: Arjan van de Ven , "H. Peter Anvin" , tglx@linutronix.de, mingo@redhat.com, x86@kernel.org Subject: [PATCH 06/11] x86/xip: after paging trampoline, discard PMDs above _brk Date: Mon, 23 Mar 2015 00:46:35 -0700 Message-Id: <1427096800-30452-7-git-send-email-james.t.kukunas@linux.intel.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1427096800-30452-1-git-send-email-james.t.kukunas@linux.intel.com> References: <1427096800-30452-1-git-send-email-james.t.kukunas@linux.intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In the likely case that XIP_BASE is above PAGE_OFFSET, we want to discard any early identity mappings. So rather than keeping every PMD above PAGE_OFFSET, only copy the ones from PAGE_OFFSET to the last PMD of _end. At this point, the linear address space should look normal. Signed-off-by: Jim Kukunas --- arch/x86/include/asm/pgtable.h | 7 +++++++ arch/x86/kernel/setup.c | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h index a0c35bf..5eaba7d 100644 --- a/arch/x86/include/asm/pgtable.h +++ b/arch/x86/include/asm/pgtable.h @@ -660,6 +660,13 @@ static inline int pgd_none(pgd_t pgd) #define KERNEL_PGD_BOUNDARY pgd_index(PAGE_OFFSET) #define KERNEL_PGD_PTRS (PTRS_PER_PGD - KERNEL_PGD_BOUNDARY) +#ifdef CONFIG_XIP_KERNEL +#define BOOT_PGD_COPY_PTRS \ + ((pgd_index((unsigned long)_end) - pgd_index(PAGE_OFFSET)) + 4) +#else +#define BOOT_PGD_COPY_PTRS KERNEL_PGD_PTRS +#endif + #ifndef __ASSEMBLY__ extern int direct_gbpages; diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index e2d85c4..d276ebf 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -894,7 +894,7 @@ void __init setup_arch(char **cmdline_p) */ clone_pgd_range(swapper_pg_dir + KERNEL_PGD_BOUNDARY, initial_page_table + KERNEL_PGD_BOUNDARY, - KERNEL_PGD_PTRS); + BOOT_PGD_COPY_PTRS); load_cr3(swapper_pg_dir); /* -- 2.1.0