Messages in this thread Patch in this message | | | From | Jim Kukunas <> | Subject | [PATCH 06/11] x86/xip: after paging trampoline, discard PMDs above _brk | Date | Mon, 23 Mar 2015 00:46:35 -0700 |
| |
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 <james.t.kukunas@linux.intel.com> --- 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
| |