diff options
author | Joerg Roedel <jroedel@suse.de> | 2020-09-07 15:15:31 +0200 |
---|---|---|
committer | Borislav Petkov <bp@suse.de> | 2020-09-07 21:35:54 +0200 |
commit | e04b88336360e101329add0c05e5cb1cebae64fd (patch) | |
tree | 8000b4ce48f2493cf0ef43f862b7bd8bfdb71bfd /arch/x86/kernel/head_64.S | |
parent | 866b556efa1295934ed0bc20c2f208c93a873fb0 (diff) | |
download | linux-stable-e04b88336360e101329add0c05e5cb1cebae64fd.tar.gz linux-stable-e04b88336360e101329add0c05e5cb1cebae64fd.tar.bz2 linux-stable-e04b88336360e101329add0c05e5cb1cebae64fd.zip |
x86/head/64: Load GDT after switch to virtual addresses
Load the GDT right after switching to virtual addresses to make sure
there is a defined GDT for exception handling.
Signed-off-by: Joerg Roedel <jroedel@suse.de>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Kees Cook <keescook@chromium.org>
Link: https://lkml.kernel.org/r/20200907131613.12703-31-joro@8bytes.org
Diffstat (limited to 'arch/x86/kernel/head_64.S')
-rw-r--r-- | arch/x86/kernel/head_64.S | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S index 2b2e91627221..03b03f266dc1 100644 --- a/arch/x86/kernel/head_64.S +++ b/arch/x86/kernel/head_64.S @@ -158,6 +158,14 @@ SYM_CODE_START(secondary_startup_64) 1: UNWIND_HINT_EMPTY + /* + * We must switch to a new descriptor in kernel space for the GDT + * because soon the kernel won't have access anymore to the userspace + * addresses where we're currently running on. We have to do that here + * because in 32bit we couldn't load a 64bit linear address. + */ + lgdt early_gdt_descr(%rip) + /* Check if nx is implemented */ movl $0x80000001, %eax cpuid @@ -185,14 +193,6 @@ SYM_CODE_START(secondary_startup_64) pushq $0 popfq - /* - * We must switch to a new descriptor in kernel space for the GDT - * because soon the kernel won't have access anymore to the userspace - * addresses where we're currently running on. We have to do that here - * because in 32bit we couldn't load a 64bit linear address. - */ - lgdt early_gdt_descr(%rip) - /* set up data segments */ xorl %eax,%eax movl %eax,%ds |