lkml.org 
[lkml]   [2023]   [Apr]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH RFC 40/43] x86/boot: Fill kernel image puds dynamically
Date
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
\
 
 \ /
  Last update: 2023-04-28 12:02    [W:0.311 / U:0.080 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site