[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <c7fa2998-0532-b46c-7bfb-ed41620f10b8@citrix.com>
Date: Fri, 18 Feb 2022 21:24:10 +0000
From: Andrew Cooper <Andrew.Cooper3@...rix.com>
To: David Laight <David.Laight@...LAB.COM>,
Peter Zijlstra <peterz@...radead.org>,
"x86@...nel.org" <x86@...nel.org>,
"joao@...rdrivepizza.com" <joao@...rdrivepizza.com>,
"hjl.tools@...il.com" <hjl.tools@...il.com>,
"jpoimboe@...hat.com" <jpoimboe@...hat.com>
CC: "linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
"ndesaulniers@...gle.com" <ndesaulniers@...gle.com>,
"keescook@...omium.org" <keescook@...omium.org>,
"samitolvanen@...gle.com" <samitolvanen@...gle.com>,
"mark.rutland@....com" <mark.rutland@....com>,
"alyssa.milburn@...el.com" <alyssa.milburn@...el.com>,
Andrew Cooper <Andrew.Cooper3@...rix.com>
Subject: Re: [PATCH 05/29] x86: Base IBT bits
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
Powered by blists - more mailing lists