| From | "Hou Wenlong" <> | Subject | [PATCH RFC 40/43] x86/boot: Fill kernel image puds dynamically | Date | Fri, 28 Apr 2023 17:51:20 +0800 |
| |
For PIE kernel, it could be randomized in any address. Later, kernel image would be moved down the top 2G, so fille kernel image puds dynamically.
Signed-off-by: Hou Wenlong <houwenlong.hwl@antgroup.com> Cc: Thomas Garnier <thgarnie@chromium.org>a Cc: Lai Jiangshan <jiangshan.ljs@antgroup.com> Cc: Kees Cook <keescook@chromium.org> --- arch/x86/kernel/head64.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c index 8295b547b64f..c5cd61aab8ae 100644 --- a/arch/x86/kernel/head64.c +++ b/arch/x86/kernel/head64.c @@ -239,8 +239,18 @@ unsigned long __head __startup_64(unsigned long physaddr, } pud = fixup_pointer(&level3_kernel_pgt, physaddr); - pud[510] += load_delta; - pud[511] += load_delta; + if (IS_ENABLED(CONFIG_X86_PIE)) { + pud[510] = 0; + pud[511] = 0; + + i = pud_index(text_base); + pgtable_flags = _KERNPG_TABLE_NOENC - __START_KERNEL_map + load_delta; + pud[i] = pgtable_flags + SYM_ABS_VAL(level2_kernel_pgt); + pud[i + 1] = pgtable_flags + SYM_ABS_VAL(level2_fixmap_pgt); + } else { + pud[510] += load_delta; + pud[511] += load_delta; + } pmd = fixup_pointer(level2_fixmap_pgt, physaddr); for (i = FIXMAP_PMD_TOP; i > FIXMAP_PMD_TOP - FIXMAP_PMD_NUM; i--) -- 2.31.1
|