Re: [PATCH 05/29] x86: Base IBT bits

From: Andrew Cooper
Date: Fri Feb 18 2022 - 16:24:23 EST


On 18/02/2022 21:11, David Laight wrote:
> From: Andrew Cooper
>> Sent: 18 February 2022 20:50
>>
>> On 18/02/2022 16:49, Peter Zijlstra wrote:
>>> +/*
>>> + * A bit convoluted, but matches both endbr32 and endbr64 without
>>> + * having either as literal in the text.
>>> + */
>>> +static inline bool is_endbr(const void *addr)
>>> +{
>>> + unsigned int val = ~*(unsigned int *)addr;
>>> + val |= 0x01000000U;
>>> + return val == ~0xfa1e0ff3;
>>> +}
>> At this point, I feel I've earned an "I told you so". :)
>>
>> Clang 13 sees straight through the trickery and generates:
>>
>> is_endbr:                               # @is_endbr
>>         movl    $-16777217, %eax                # imm = 0xFEFFFFFF
>>         andl    (%rdi), %eax
>>         cmpl    $-98693133, %eax                # imm = 0xFA1E0FF3
>>         sete    %al
>>         retq
> I think it is enough to add:
> asm("", "=r" (val));
> somewhere in the middle.

(First, you mean "+r" not "=r"), but no - the problem isn't val.  It's
`~0xfa1e0ff3` which the compiler is free to transform in several unsafe way.

~Andrew