[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20210115190729.GE9138@zn.tnic>
Date: Fri, 15 Jan 2021 20:07:29 +0100
From: Borislav Petkov <bp@...en8.de>
To: Nathan Chancellor <natechancellor@...il.com>
Cc: Arnd Bergmann <arnd@...nel.org>, Ard Biesheuvel <ardb@...nel.org>,
Thomas Gleixner <tglx@...utronix.de>,
Ingo Molnar <mingo@...hat.com>, x86@...nel.org,
Nick Desaulniers <ndesaulniers@...gle.com>,
Arnd Bergmann <arnd@...db.de>,
Darren Hart <dvhart@...radead.org>,
Andy Shevchenko <andy@...radead.org>,
"H. Peter Anvin" <hpa@...or.com>, linux-efi@...r.kernel.org,
platform-driver-x86@...r.kernel.org, linux-kernel@...r.kernel.org,
clang-built-linux@...glegroups.com
Subject: Re: [PATCH] x86: efi: avoid BUILD_BUG_ON() for non-constant p4d_index
On Fri, Jan 15, 2021 at 11:32:03AM -0700, Nathan Chancellor wrote:
> I triggered it with CONFIG_UBSAN=y + CONFIG_UBSAN_UNSIGNED_OVERFLOW=y
> (it can be exposed with an allyesconfig/allmodconfig on mainline
> currently).
Yah, I can trigger with that, thanks.
But I'll be damned, check this out:
clang preprocesses to this:
do { extern void __compiletime_assert_332(void) ; if (!(!(p4d_index((-68 * ((1UL) << 30))) != p4d_index((0xffffffffff000000UL))))) __compiletime_assert_332(); } while (0);
The resulting asm is:
.LBB1_32:
movabsq $-73014444032, %r13 # imm = 0xFFFFFFEF00000000
testb $1, %al
jne .LBB1_33
.LBB1_34:
xorl %r14d, %ebx
testl $33554431, %ebx # imm = 0x1FFFFFF
je .LBB1_36
# %bb.35:
callq __compiletime_assert_332
so the undefined symbol is there, leading to:
ld: arch/x86/platform/efi/efi_64.o: in function `efi_sync_low_kernel_mappings':
/home/boris/kernel/linux/arch/x86/platform/efi/efi_64.c:140: undefined reference to `__compiletime_assert_332'
Now look at gcc:
It preprocesses to:
do { extern void __compiletime_assert_332(void) __attribute__((__error__("BUILD_BUG_ON failed: " "p4d_index(EFI_VA_END) != p4d_index(MODULES_END)"))); if (!(!(p4d_index((-68 * ((1UL) << 30))) != p4d_index((0xffffffffff000000UL))))) __compiletime_assert_332(); } while (0);
Resulting asm:
$ grep __compiletime_assert_332 arch/x86/platform/efi/efi_64.s
$
That thing has been optimized away!
Which means, those build assertions are gone on gcc and they don't catch
diddly squat. I sure hope I'm missing something here...
--
Regards/Gruss,
Boris.
https://people.kernel.org/tglx/notes-about-netiquette
Powered by blists - more mailing lists