On Mon, 14 Oct 2024 at 05:30, Kirill A. Shutemov <kir...@shutemov.name> wrote: > > Given that LAM enforces bit 47/56 to be equal to bit 63 I think we can do > this unconditionally instead of masking: > > diff --git a/arch/x86/lib/getuser.S b/arch/x86/lib/getuser.S > index d066aecf8aeb..86d4511520b1 100644 > --- a/arch/x86/lib/getuser.S > +++ b/arch/x86/lib/getuser.S > @@ -37,9 +37,14 @@ > > #define ASM_BARRIER_NOSPEC ALTERNATIVE "", "lfence", X86_FEATURE_LFENCE_RDTSC > > +#define SHIFT_LEFT_TO_MSB ALTERNATIVE \ > + "shl $(64 - 48), %rdx", \ > + "shl $(64 - 57), %rdx", X86_FEATURE_LA57
That's certainly a lot smaller than the big constant, which is good. But I would want some AMD architect to actually tell us *which* cores this affects, and just what the cycle latency of the canonicality check really is. For example, the whole point of the address masking is that the access itself isn't actually conditional, and we want (and expect) the exception in the invalid address case (which very much includes the non-canonicality). So either the attacker has to find an unrelated conditional that precedes the whole user access sequence (ie not just the CLAC afterwards, but the STAC and the address masking that precedes the access), *or* the attacker has to be able to deal with whatever signal noise that comes from taking the GP exception and signal handling and return to user space. The exception handling will almost certainly have destroyed any signal in L1 cache, so some flush+reload attack is going to be very very inconvenient. And we could easily make it much worse by just adding extra work to the GP exception handling. And that is all in *addition* to having the sequence of the non-canonical access followed by the "clac" and then you have to find a dependent load to leak the data you loaded through the non-canonical address. And all *that* needs to happen before the non-canonical address actually being checked. End result: I don't think this is actually a real scenario in the first place. I would want some AMD person to really check. Linus