diff options
Diffstat (limited to 'arch/x86/include/asm/efi.h')
-rw-r--r-- | arch/x86/include/asm/efi.h | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h index 85f6ccb80b91..a399c1ebf6f0 100644 --- a/arch/x86/include/asm/efi.h +++ b/arch/x86/include/asm/efi.h | |||
@@ -6,6 +6,7 @@ | |||
6 | #include <asm/pgtable.h> | 6 | #include <asm/pgtable.h> |
7 | #include <asm/processor-flags.h> | 7 | #include <asm/processor-flags.h> |
8 | #include <asm/tlb.h> | 8 | #include <asm/tlb.h> |
9 | #include <asm/nospec-branch.h> | ||
9 | 10 | ||
10 | /* | 11 | /* |
11 | * We map the EFI regions needed for runtime services non-contiguously, | 12 | * We map the EFI regions needed for runtime services non-contiguously, |
@@ -36,8 +37,18 @@ | |||
36 | 37 | ||
37 | extern asmlinkage unsigned long efi_call_phys(void *, ...); | 38 | extern asmlinkage unsigned long efi_call_phys(void *, ...); |
38 | 39 | ||
39 | #define arch_efi_call_virt_setup() kernel_fpu_begin() | 40 | #define arch_efi_call_virt_setup() \ |
40 | #define arch_efi_call_virt_teardown() kernel_fpu_end() | 41 | ({ \ |
42 | kernel_fpu_begin(); \ | ||
43 | firmware_restrict_branch_speculation_start(); \ | ||
44 | }) | ||
45 | |||
46 | #define arch_efi_call_virt_teardown() \ | ||
47 | ({ \ | ||
48 | firmware_restrict_branch_speculation_end(); \ | ||
49 | kernel_fpu_end(); \ | ||
50 | }) | ||
51 | |||
41 | 52 | ||
42 | /* | 53 | /* |
43 | * Wrap all the virtual calls in a way that forces the parameters on the stack. | 54 | * Wrap all the virtual calls in a way that forces the parameters on the stack. |
@@ -73,6 +84,7 @@ struct efi_scratch { | |||
73 | efi_sync_low_kernel_mappings(); \ | 84 | efi_sync_low_kernel_mappings(); \ |
74 | preempt_disable(); \ | 85 | preempt_disable(); \ |
75 | __kernel_fpu_begin(); \ | 86 | __kernel_fpu_begin(); \ |
87 | firmware_restrict_branch_speculation_start(); \ | ||
76 | \ | 88 | \ |
77 | if (efi_scratch.use_pgd) { \ | 89 | if (efi_scratch.use_pgd) { \ |
78 | efi_scratch.prev_cr3 = __read_cr3(); \ | 90 | efi_scratch.prev_cr3 = __read_cr3(); \ |
@@ -91,6 +103,7 @@ struct efi_scratch { | |||
91 | __flush_tlb_all(); \ | 103 | __flush_tlb_all(); \ |
92 | } \ | 104 | } \ |
93 | \ | 105 | \ |
106 | firmware_restrict_branch_speculation_end(); \ | ||
94 | __kernel_fpu_end(); \ | 107 | __kernel_fpu_end(); \ |
95 | preempt_enable(); \ | 108 | preempt_enable(); \ |
96 | }) | 109 | }) |