lkml.org 
[lkml]   [2019]   [Jun]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v7 20/27] x86/cet/shstk: Introduce WRUSS instruction
    Date
    WRUSS is a new kernel-mode instruction but writes directly to user
    shadow stack memory. This is used to construct a return address on
    the shadow stack for the signal handler.

    This instruction can fault if the user shadow stack is invalid shadow
    stack memory. In that case, the kernel does a fixup.

    Signed-off-by: Yu-cheng Yu <yu-cheng.yu@intel.com>
    ---
    arch/x86/include/asm/special_insns.h | 32 ++++++++++++++++++++++++++++
    1 file changed, 32 insertions(+)

    diff --git a/arch/x86/include/asm/special_insns.h b/arch/x86/include/asm/special_insns.h
    index 0a3c4cab39db..99530ab0a077 100644
    --- a/arch/x86/include/asm/special_insns.h
    +++ b/arch/x86/include/asm/special_insns.h
    @@ -250,6 +250,38 @@ static inline void clwb(volatile void *__p)
    : [pax] "a" (p));
    }

    +#ifdef CONFIG_X86_INTEL_CET
    +#if defined(CONFIG_IA32_EMULATION) || defined(CONFIG_X86_X32)
    +static inline int write_user_shstk_32(unsigned long addr, unsigned int val)
    +{
    + asm_volatile_goto("1: wrussd %1, (%0)\n"
    + _ASM_EXTABLE(1b, %l[fail])
    + :: "r" (addr), "r" (val)
    + :: fail);
    + return 0;
    +fail:
    + return -EPERM;
    +}
    +#else
    +static inline int write_user_shstk_32(unsigned long addr, unsigned int val)
    +{
    + WARN_ONCE(1, "%s used but not supported.\n", __func__);
    + return -EFAULT;
    +}
    +#endif
    +
    +static inline int write_user_shstk_64(unsigned long addr, unsigned long val)
    +{
    + asm_volatile_goto("1: wrussq %1, (%0)\n"
    + _ASM_EXTABLE(1b, %l[fail])
    + :: "r" (addr), "r" (val)
    + :: fail);
    + return 0;
    +fail:
    + return -EPERM;
    +}
    +#endif /* CONFIG_X86_INTEL_CET */
    +
    #define nop() asm volatile ("nop")


    --
    2.17.1
    \
     
     \ /
      Last update: 2019-06-06 22:16    [W:5.015 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site