Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
fork

Configure Feed

Select the types of activity you want to include in your feed.

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 https://github.com/ClangBuiltLinux/linux/issues/256 for more info.

Reported-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Nathan Chancellor <nathan@kernel.org>
Acked-by: Ard Biesheuvel <ardb@kernel.org>
Tested-by: Nick Desaulniers <ndesaulniers@google.com>
Tested-by: Nathan Chancellor <nathan@kernel.org>
Link: http://lkml.kernel.org/r/20210107223424.4135538-1-arnd@kernel.org

-19
-19
arch/x86/platform/efi/efi_64.c
··· 115 115 pud_t *pud_k, *pud_efi; 116 116 pgd_t *efi_pgd = efi_mm.pgd; 117 117 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 - 130 118 pgd_efi = efi_pgd + pgd_index(PAGE_OFFSET); 131 119 pgd_k = pgd_offset_k(PAGE_OFFSET); 132 120 133 121 num_entries = pgd_index(EFI_VA_END) - pgd_index(PAGE_OFFSET); 134 122 memcpy(pgd_efi, pgd_k, sizeof(pgd_t) * num_entries); 135 - 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 123 143 124 pgd_efi = efi_pgd + pgd_index(EFI_VA_END); 144 125 pgd_k = pgd_offset_k(EFI_VA_END);