Messages in this thread | | | From | David Laight <> | Subject | RE: [PATCH 05/29] x86: Base IBT bits | Date | Fri, 18 Feb 2022 21:11:25 +0000 |
| |
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. (I think that is right for asm with input and output in the same register.) There might be a HIDE_FOR_OPTIMISER() define that does that.
David
- Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)
| |