lkml.org 
[lkml]   [2020]   [May]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH v2 2/9] x86/asm: move the raw asm in iosubmit_cmds512() to special_insns.h
    From
    Date
    The MOVDIR64B instruction can be used by other wrapper instructions. Move
    the core asm code to special_insns.h and have iosubmit_cmds512() call the
    core asm function.

    Signed-off-by: Dave Jiang <dave.jiang@intel.com>
    Reviewed-by: Tony Luck <tony.luck@intel.com>
    ---
    arch/x86/include/asm/io.h | 15 ++-------------
    arch/x86/include/asm/special_insns.h | 17 +++++++++++++++++
    2 files changed, 19 insertions(+), 13 deletions(-)

    diff --git a/arch/x86/include/asm/io.h b/arch/x86/include/asm/io.h
    index e1aa17a468a8..56421666115e 100644
    --- a/arch/x86/include/asm/io.h
    +++ b/arch/x86/include/asm/io.h
    @@ -412,25 +412,14 @@ extern bool phys_mem_access_encrypted(unsigned long phys_addr,
    * Warning: Do not use this helper unless your driver has checked that the CPU
    * instruction is supported on the platform.
    */
    -static inline void iosubmit_cmds512(void __iomem *__dst, const void *src,
    +static inline void iosubmit_cmds512(void __iomem *dst, const void *src,
    size_t count)
    {
    - /*
    - * 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;
    const u8 *from = src;
    const u8 *end = from + count * 64;

    while (from < end) {
    - /* MOVDIR64B [rdx], rax */
    - asm volatile(".byte 0x66, 0x0f, 0x38, 0xf8, 0x02"
    - : "=m" (dst)
    - : "d" (from), "a" (dst));
    + movdir64b(dst, from);
    from += 64;
    }
    }
    diff --git a/arch/x86/include/asm/special_insns.h b/arch/x86/include/asm/special_insns.h
    index 1b9b2e79c353..9ad28d82de70 100644
    --- a/arch/x86/include/asm/special_insns.h
    +++ b/arch/x86/include/asm/special_insns.h
    @@ -256,6 +256,23 @@ static inline int write_user_shstk_64(unsigned long addr, unsigned long val)

    #define nop() asm volatile ("nop")

    +static inline void movdir64b(void *__dst, const void *src)
    +{
    + /*
    + * 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));
    +}
    +

    #endif /* __KERNEL__ */

    \
     
     \ /
      Last update: 2020-05-18 20:54    [W:3.457 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site