Skip to content

Commit c51ae12

Browse files
committed
Merge tag 'x86_seves_fixes_for_v5.10_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 SEV-ES fixes from Borislav Petkov: "Three fixes to SEV-ES to correct setting up the new early pagetable on 5-level paging machines, to always map boot_params and the kernel cmdline, and disable stack protector for ../compressed/head{32,64}.c. (Arvind Sankar)" * tag 'x86_seves_fixes_for_v5.10_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/boot/64: Explicitly map boot_params and command line x86/head/64: Disable stack protection for head$(BITS).o x86/boot/64: Initialize 5-level paging variables earlier
2 parents b6f96e7 + b17a45b commit c51ae12

5 files changed

Lines changed: 40 additions & 16 deletions

File tree

arch/x86/boot/compressed/head_64.S

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,9 @@ SYM_FUNC_START_LOCAL_NOALIGN(.Lrelocated)
544544
pushq %rsi
545545
call set_sev_encryption_mask
546546
call load_stage2_idt
547+
548+
/* Pass boot_params to initialize_identity_maps() */
549+
movq (%rsp), %rdi
547550
call initialize_identity_maps
548551
popq %rsi
549552

arch/x86/boot/compressed/ident_map_64.c

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@
3333
#define __PAGE_OFFSET __PAGE_OFFSET_BASE
3434
#include "../../mm/ident_map.c"
3535

36-
#ifdef CONFIG_X86_5LEVEL
37-
unsigned int __pgtable_l5_enabled;
38-
unsigned int pgdir_shift = 39;
39-
unsigned int ptrs_per_p4d = 1;
40-
#endif
36+
#define _SETUP
37+
#include <asm/setup.h> /* For COMMAND_LINE_SIZE */
38+
#undef _SETUP
39+
40+
extern unsigned long get_cmd_line_ptr(void);
4141

4242
/* Used by PAGE_KERN* macros: */
4343
pteval_t __default_kernel_pte_mask __read_mostly = ~0;
@@ -107,8 +107,10 @@ static void add_identity_map(unsigned long start, unsigned long end)
107107
}
108108

109109
/* Locates and clears a region for a new top level page table. */
110-
void initialize_identity_maps(void)
110+
void initialize_identity_maps(void *rmode)
111111
{
112+
unsigned long cmdline;
113+
112114
/* Exclude the encryption mask from __PHYSICAL_MASK */
113115
physical_mask &= ~sme_me_mask;
114116

@@ -149,10 +151,19 @@ void initialize_identity_maps(void)
149151
}
150152

151153
/*
152-
* New page-table is set up - map the kernel image and load it
153-
* into cr3.
154+
* New page-table is set up - map the kernel image, boot_params and the
155+
* command line. The uncompressed kernel requires boot_params and the
156+
* command line to be mapped in the identity mapping. Map them
157+
* explicitly here in case the compressed kernel does not touch them,
158+
* or does not touch all the pages covering them.
154159
*/
155160
add_identity_map((unsigned long)_head, (unsigned long)_end);
161+
boot_params = rmode;
162+
add_identity_map((unsigned long)boot_params, (unsigned long)(boot_params + 1));
163+
cmdline = get_cmd_line_ptr();
164+
add_identity_map(cmdline, cmdline + COMMAND_LINE_SIZE);
165+
166+
/* Load the new page-table. */
156167
write_cr3(top_level_pgt);
157168
}
158169

arch/x86/boot/compressed/kaslr.c

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -840,14 +840,6 @@ void choose_random_location(unsigned long input,
840840
return;
841841
}
842842

843-
#ifdef CONFIG_X86_5LEVEL
844-
if (__read_cr4() & X86_CR4_LA57) {
845-
__pgtable_l5_enabled = 1;
846-
pgdir_shift = 48;
847-
ptrs_per_p4d = 512;
848-
}
849-
#endif
850-
851843
boot_params->hdr.loadflags |= KASLR_FLAG;
852844

853845
if (IS_ENABLED(CONFIG_X86_32))

arch/x86/boot/compressed/pgtable_64.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@
88
#define BIOS_START_MIN 0x20000U /* 128K, less than this is insane */
99
#define BIOS_START_MAX 0x9f000U /* 640K, absolute maximum */
1010

11+
#ifdef CONFIG_X86_5LEVEL
12+
/* __pgtable_l5_enabled needs to be in .data to avoid being cleared along with .bss */
13+
unsigned int __section(.data) __pgtable_l5_enabled;
14+
unsigned int __section(.data) pgdir_shift = 39;
15+
unsigned int __section(.data) ptrs_per_p4d = 1;
16+
#endif
17+
1118
struct paging_config {
1219
unsigned long trampoline_start;
1320
unsigned long l5_required;
@@ -198,4 +205,13 @@ void cleanup_trampoline(void *pgtable)
198205

199206
/* Restore trampoline memory */
200207
memcpy(trampoline_32bit, trampoline_save, TRAMPOLINE_32BIT_SIZE);
208+
209+
/* Initialize variables for 5-level paging */
210+
#ifdef CONFIG_X86_5LEVEL
211+
if (__read_cr4() & X86_CR4_LA57) {
212+
__pgtable_l5_enabled = 1;
213+
pgdir_shift = 48;
214+
ptrs_per_p4d = 512;
215+
}
216+
#endif
201217
}

arch/x86/kernel/Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ endif
4747
# non-deterministic coverage.
4848
KCOV_INSTRUMENT := n
4949

50+
CFLAGS_head$(BITS).o += -fno-stack-protector
51+
5052
CFLAGS_irq.o := -I $(srctree)/$(src)/../include/asm/trace
5153

5254
obj-y := process_$(BITS).o signal.o

0 commit comments

Comments
 (0)