Skip to content

Commit 816ef8d

Browse files
committed
x86/efi: Remove EFI PGD build time checks
With CONFIG_X86_5LEVEL, CONFIG_UBSAN and CONFIG_UBSAN_UNSIGNED_OVERFLOW enabled, clang fails the build with x86_64-linux-ld: arch/x86/platform/efi/efi_64.o: in function `efi_sync_low_kernel_mappings': efi_64.c:(.text+0x22c): undefined reference to `__compiletime_assert_354' which happens due to -fsanitize=unsigned-integer-overflow being enabled: -fsanitize=unsigned-integer-overflow: Unsigned integer overflow, where the result of an unsigned integer computation cannot be represented in its type. Unlike signed integer overflow, this is not undefined behavior, but it is often unintentional. This sanitizer does not check for lossy implicit conversions performed before such a computation (see -fsanitize=implicit-conversion). and that fires when the (intentional) EFI_VA_START/END defines overflow an unsigned long, leading to the assertion expressions not getting optimized away (on GCC they do)... However, those checks are superfluous: the runtime services mapping code already makes sure the ranges don't overshoot EFI_VA_END as the EFI mapping range is hardcoded. On each runtime services call, it is switched to the EFI-specific PGD and even if mappings manage to escape that last PGD, this won't remain unnoticed for long. So rip them out. See ClangBuiltLinux#256 for more info. Reported-by: Arnd Bergmann <[email protected]> Signed-off-by: Borislav Petkov <[email protected]> Reviewed-by: Nathan Chancellor <[email protected]> Acked-by: Ard Biesheuvel <[email protected]> Tested-by: Nick Desaulniers <[email protected]> Tested-by: Nathan Chancellor <[email protected]> Link: http://lkml.kernel.org/r/[email protected]
1 parent 3943abf commit 816ef8d

File tree

1 file changed

+0
-19
lines changed

1 file changed

+0
-19
lines changed

arch/x86/platform/efi/efi_64.c

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -115,31 +115,12 @@ void efi_sync_low_kernel_mappings(void)
115115
pud_t *pud_k, *pud_efi;
116116
pgd_t *efi_pgd = efi_mm.pgd;
117117

118-
/*
119-
* We can share all PGD entries apart from the one entry that
120-
* covers the EFI runtime mapping space.
121-
*
122-
* Make sure the EFI runtime region mappings are guaranteed to
123-
* only span a single PGD entry and that the entry also maps
124-
* other important kernel regions.
125-
*/
126-
MAYBE_BUILD_BUG_ON(pgd_index(EFI_VA_END) != pgd_index(MODULES_END));
127-
MAYBE_BUILD_BUG_ON((EFI_VA_START & PGDIR_MASK) !=
128-
(EFI_VA_END & PGDIR_MASK));
129-
130118
pgd_efi = efi_pgd + pgd_index(PAGE_OFFSET);
131119
pgd_k = pgd_offset_k(PAGE_OFFSET);
132120

133121
num_entries = pgd_index(EFI_VA_END) - pgd_index(PAGE_OFFSET);
134122
memcpy(pgd_efi, pgd_k, sizeof(pgd_t) * num_entries);
135123

136-
/*
137-
* As with PGDs, we share all P4D entries apart from the one entry
138-
* that covers the EFI runtime mapping space.
139-
*/
140-
BUILD_BUG_ON(p4d_index(EFI_VA_END) != p4d_index(MODULES_END));
141-
BUILD_BUG_ON((EFI_VA_START & P4D_MASK) != (EFI_VA_END & P4D_MASK));
142-
143124
pgd_efi = efi_pgd + pgd_index(EFI_VA_END);
144125
pgd_k = pgd_offset_k(EFI_VA_END);
145126
p4d_efi = p4d_offset(pgd_efi, 0);

0 commit comments

Comments
 (0)