From: Dave Jiang > Sent: 23 September 2020 16:43 ... > > > > On Thu, Sep 17, 2020 at 02:15:16PM -0700, Dave Jiang wrote: > >> diff --git a/arch/x86/include/asm/special_insns.h b/arch/x86/include/asm/special_insns.h > >> index 59a3e13204c3..7bc8e714f37e 100644 > >> --- a/arch/x86/include/asm/special_insns.h > >> +++ b/arch/x86/include/asm/special_insns.h > >> @@ -234,6 +234,23 @@ static inline void clwb(volatile void *__p) > >> > >> #define nop() asm volatile ("nop") > >> > >> +static inline void movdir64b(void *__dst, const void *src) > > > > Make __dst be the function local variable name and keep "dst", i.e., > > without the underscores, the function parameter name. > > Ok will fix > > > > >> + /* > >> + * Note that this isn't an "on-stack copy", just definition of "dst" > >> + * as a pointer to 64-bytes of stuff that is going to be overwritten. > >> + * In the MOVDIR64B case that may be needed as you can use the > >> + * MOVDIR64B instruction to copy arbitrary memory around. This trick > >> + * lets the compiler know how much gets clobbered. > >> + */ > >> + volatile struct { char _[64]; } *dst = __dst; > >> + > >> + /* MOVDIR64B [rdx], rax */ > >> + asm volatile(".byte 0x66, 0x0f, 0x38, 0xf8, 0x02" > >> + : "=m" (dst) > >> + : "d" (src), "a" (dst)); > >> +} Since 'dst' needs to be 64byte aligned it isn't clear that 'void *' is the right type for 'dst'. At least add a comment. Your asm constraints are also just wrong. There is no real point specifying "=m" (dst) as an output. The write rather bypasses the cache and the caller better know what they are doing. OTOH you'd better add "m" ((struct { char _[64];} *)src) as an input constraint. David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)