diff options
author | Joerg Roedel <jroedel@suse.de> | 2020-09-07 16:15:30 +0300 |
---|---|---|
committer | Borislav Petkov <bp@suse.de> | 2020-09-07 22:33:17 +0300 |
commit | 866b556efa1295934ed0bc20c2f208c93a873fb0 (patch) | |
tree | bf24afe78791c6f0f416f2ccdd269efc91a19c6f /arch/x86/kernel/head_64.S | |
parent | 4bed2266cc6f9c3f6cd91378ea4fc76edde674cf (diff) | |
download | linux-866b556efa1295934ed0bc20c2f208c93a873fb0.tar.xz |
x86/head/64: Install startup GDT
Handling exceptions during boot requires a working GDT. The kernel GDT
can't be used on the direct mapping, so load a startup GDT and setup
segments.
Signed-off-by: Joerg Roedel <jroedel@suse.de>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lkml.kernel.org/r/20200907131613.12703-30-joro@8bytes.org
Diffstat (limited to 'arch/x86/kernel/head_64.S')
-rw-r--r-- | arch/x86/kernel/head_64.S | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S index 16da4ac01597..2b2e91627221 100644 --- a/arch/x86/kernel/head_64.S +++ b/arch/x86/kernel/head_64.S @@ -73,6 +73,20 @@ SYM_CODE_START_NOALIGN(startup_64) /* Set up the stack for verify_cpu(), similar to initial_stack below */ leaq (__end_init_task - SIZEOF_PTREGS)(%rip), %rsp + leaq _text(%rip), %rdi + pushq %rsi + call startup_64_setup_env + popq %rsi + + /* Now switch to __KERNEL_CS so IRET works reliably */ + pushq $__KERNEL_CS + leaq .Lon_kernel_cs(%rip), %rax + pushq %rax + lretq + +.Lon_kernel_cs: + UNWIND_HINT_EMPTY + /* Sanitize CPU configuration */ call verify_cpu |