Received: by 2002:ac0:a582:0:0:0:0:0 with SMTP id m2-v6csp2102764imm; Tue, 2 Oct 2018 21:16:11 -0700 (PDT) X-Google-Smtp-Source: ACcGV611PrqoSKcEmNb9ATc5tduZGOSy5TblLeKK2v2HgUw9cP1vZzT8ddAorIhKq8Q9R0wfn61L X-Received: by 2002:a63:334c:: with SMTP id z73-v6mr4312455pgz.220.1538540171749; Tue, 02 Oct 2018 21:16:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538540171; cv=none; d=google.com; s=arc-20160816; b=rXqbmWLr7K3wNYQzokts+z/Jhdp1vHlEMENh6mrRc3BlFwoJyd6M3UWI0oOsnyZeD4 rLhi3eWXOhWe7XRj8qwaeKqThZ/c6bfx8VIzBX/lpmgKTrMVClL6ipQ69PWUo49cHfbv qJUsDuggg9oTAtLVqEgdO1BWudO5lYa9hLYXg/iZdfzO4jt9KNQZAJZN9yEpleALO51Y IPlZ3Mn1lFzHk4JXd76eowJTzzmi3sQbqKe9uMoMHeaTADvPljZxBEdyBDMFjzGhHhqZ euoy1VuMReWjHq0zuA1UAaF4OVvBTuWn0TnlHLl9lwk8Ihz+3VqGuKJsclM/raYv7U7I 0dyQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=b8hMQk3fFEqMP1bAZ3CMvGA+6ynknamCpebgkffm2vs=; b=aHp1cnRcXlNZFXLpn/X60ZtlhqQZIPArcs7Sf10aOB9GMAQNXHjwzjnIw76IIu/wl+ W168rbAMG3Ghlu6LA0lqgMQwGXbgW3Yf9GfklcS3IQFMLojYDx3Qxq/BwEwiC2WHdF30 VZapL39M3Jl9G2dlSgoinnF9sWZES/9VKhEBcsv6zeA3/SntTXJqQfm/OA1aXn/WIumD 5nXabtlAePwU8TPAK9poNeJTy2W7lSLjyRmlqidjsPC64BK/ILRAkWD/MRmOz6PAA209 +6N/swDKYs8wXoK6cVFzb7gTrCXeOBnh5mt2taeEJmaj264M8PbWembjosHDSr5yaR8+ RjsA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d34-v6si144303pgm.550.2018.10.02.21.15.44; Tue, 02 Oct 2018 21:16:11 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726552AbeJCLCR (ORCPT + 99 others); Wed, 3 Oct 2018 07:02:17 -0400 Received: from mx1.redhat.com ([209.132.183.28]:57102 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726394AbeJCLCR (ORCPT ); Wed, 3 Oct 2018 07:02:17 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A81CDAC2D5; Wed, 3 Oct 2018 04:15:39 +0000 (UTC) Received: from asgard.redhat.com (ovpn-200-17.brq.redhat.com [10.40.200.17]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 1772D662D0; Wed, 3 Oct 2018 04:15:27 +0000 (UTC) Date: Wed, 3 Oct 2018 06:15:57 +0200 From: Eugene Syromiatnikov To: Yu-cheng Yu Cc: x86@kernel.org, "H. Peter Anvin" , Thomas Gleixner , Ingo Molnar , linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-mm@kvack.org, linux-arch@vger.kernel.org, linux-api@vger.kernel.org, Arnd Bergmann , Andy Lutomirski , Balbir Singh , Cyrill Gorcunov , Dave Hansen , Florian Weimer , "H.J. Lu" , Jann Horn , Jonathan Corbet , Kees Cook , Mike Kravetz , Nadav Amit , Oleg Nesterov , Pavel Machek , Peter Zijlstra , Randy Dunlap , "Ravi V. Shankar" , Vedvyas Shanbhogue Subject: Re: [RFC PATCH v4 19/27] x86/cet/shstk: Introduce WRUSS instruction Message-ID: <20181003041557.GA22724@asgard.redhat.com> References: <20180921150351.20898-1-yu-cheng.yu@intel.com> <20180921150351.20898-20-yu-cheng.yu@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180921150351.20898-20-yu-cheng.yu@intel.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 03 Oct 2018 04:15:40 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Sep 21, 2018 at 08:03:43AM -0700, Yu-cheng Yu wrote: > 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 > fixup. "a fixup" > > Signed-off-by: Yu-cheng Yu > --- > arch/x86/include/asm/special_insns.h | 32 ++++++++++++++++++++++++++++ > arch/x86/mm/fault.c | 9 ++++++++ > 2 files changed, 41 insertions(+) > > diff --git a/arch/x86/include/asm/special_insns.h b/arch/x86/include/asm/special_insns.h > index 317fc59b512c..c04e68ef47da 100644 > --- a/arch/x86/include/asm/special_insns.h > +++ b/arch/x86/include/asm/special_insns.h > @@ -237,6 +237,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 -1; Should it... > +} > +#else > +static inline int write_user_shstk_32(unsigned long addr, unsigned int val) > +{ > + WARN_ONCE(1, "write_user_shstk_32 used but not supported.\n"); "is/was used" > + 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 -1; ...and it be -EPERM, if -EFAULT was returned earlier for write_user_shstk_32? > +} > +#endif /* CONFIG_X86_INTEL_CET */ > + > #define nop() asm volatile ("nop") > > > diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c > index 7c3877a982f4..4d4ac57a4ba2 100644 > --- a/arch/x86/mm/fault.c > +++ b/arch/x86/mm/fault.c > @@ -1305,6 +1305,15 @@ __do_page_fault(struct pt_regs *regs, unsigned long error_code, > error_code |= X86_PF_USER; > flags |= FAULT_FLAG_USER; > } else { > + /* > + * WRUSS is a kernel instrcution and but writes "WRUSS is a kernel instruction but writes" > + * to user shadow stack. When a fault occurs, > + * both X86_PF_USER and X86_PF_SHSTK are set. > + * Clear X86_PF_USER here. > + */ > + if ((error_code & (X86_PF_USER | X86_PF_SHSTK)) == > + (X86_PF_USER | X86_PF_SHSTK)) > + error_code &= ~X86_PF_USER; > if (regs->flags & X86_EFLAGS_IF) > local_irq_enable(); > } > -- > 2.17.1 >