From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E477FC433E1 for ; Thu, 21 May 2020 22:47:20 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 96BDA207D8 for ; Thu, 21 May 2020 22:47:20 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="F5pZZOod" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 96BDA207D8 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=chromium.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id D8D5D80008; Thu, 21 May 2020 18:47:19 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id D3DD780007; Thu, 21 May 2020 18:47:19 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id C2BD980008; Thu, 21 May 2020 18:47:19 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0201.hostedemail.com [216.40.44.201]) by kanga.kvack.org (Postfix) with ESMTP id ABF1C80007 for ; Thu, 21 May 2020 18:47:19 -0400 (EDT) Received: from smtpin30.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay04.hostedemail.com (Postfix) with ESMTP id 5D2C552C9 for ; Thu, 21 May 2020 22:47:19 +0000 (UTC) X-FDA: 76842213798.30.magic44_22c4495480139 X-HE-Tag: magic44_22c4495480139 X-Filterd-Recvd-Size: 5657 Received: from mail-pj1-f68.google.com (mail-pj1-f68.google.com [209.85.216.68]) by imf21.hostedemail.com (Postfix) with ESMTP for ; Thu, 21 May 2020 22:47:18 +0000 (UTC) Received: by mail-pj1-f68.google.com with SMTP id q24so4080200pjd.1 for ; Thu, 21 May 2020 15:47:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to; bh=rM+9EQuq5q2z+8Rnep+GSyMO4ogI1cr2dU/BPSckSc0=; b=F5pZZOodmnglpG9At4hjeCVVXyzpzR4//cFTakNlKlvYwN0D+RuXv3b3KfBXiqoIPd /NyMZuiJBlrSFqpYzdTFBIiE/Ajl6B2wuAI+W1w9YFfa7uRzrvVkreh5wHd+nlLnew6l kqRmg/Q/gn8MWqph8HYDUDERDWiswmiGynNGs= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=rM+9EQuq5q2z+8Rnep+GSyMO4ogI1cr2dU/BPSckSc0=; b=pxigaqa84+OLZjDl5owyEYB7l7YXf0DJNK2CcMvadjGwbfOyOI186emXqiudI0EdgZ EjiE8TYDUIfK5m7nL8PsJur7dJCooLR1/cOz3WVKwvWIjM3h6b/H2h7jjJWzia4SzMbT MZ1wqklR33Z01II4HPHKfIfN3Ykb6rRb/ZgFRYs9lRKxrJwhLC2jyd/9g9qmgVjj6tAK U1Z55lTkCLEgxL+BsJePRRXCCSPO8q0T7hXitQvTxhzWD8Y2woEPFRbbUSVrDlw/nOK4 W5poSUtaCcn5f2HvmIeNL1zdHscd4xT+gxzszt6ye0kPIo0igmQm0DZIXg/s/WY2QSd3 +3wQ== X-Gm-Message-State: AOAM532z3/1vJX0NaQMqJv0rmWFykSl8hplSC3j5dM+QeRCuxJNaGUkH oHn0aBAC+CazgdhRbxx90urCjg== X-Google-Smtp-Source: ABdhPJwybfeAkdZSGfnmkfJKXBXqvxYAb7XHY72AtmJcsitduYysU62VqrkmK64cVlAk1k1RabLKSA== X-Received: by 2002:a17:902:7b86:: with SMTP id w6mr11680926pll.292.1590101237858; Thu, 21 May 2020 15:47:17 -0700 (PDT) Received: from www.outflux.net (smtp.outflux.net. [198.145.64.163]) by smtp.gmail.com with ESMTPSA id o11sm5192507pfd.195.2020.05.21.15.47.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 May 2020 15:47:16 -0700 (PDT) Date: Thu, 21 May 2020 15:47:15 -0700 From: Kees Cook 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 , Borislav Petkov , Cyrill Gorcunov , Dave Hansen , Eugene Syromiatnikov , Florian Weimer , "H.J. Lu" , Jann Horn , Jonathan Corbet , Mike Kravetz , Nadav Amit , Oleg Nesterov , Pavel Machek , Peter Zijlstra , Randy Dunlap , "Ravi V. Shankar" , Vedvyas Shanbhogue , Dave Martin , Weijiang Yang Subject: Re: [RFC PATCH 3/5] selftest/x86: Fix sigreturn_64 test. Message-ID: <202005211545.30156BFC4@keescook> References: <20200521211720.20236-1-yu-cheng.yu@intel.com> <20200521211720.20236-4-yu-cheng.yu@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200521211720.20236-4-yu-cheng.yu@intel.com> X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On Thu, May 21, 2020 at 02:17:18PM -0700, Yu-cheng Yu wrote: > When shadow stack is enabled, selftests/x86/sigreturn_64 triggers a fault > when doing sigreturn to 32-bit context but the task's shadow stack pointer > is above 32-bit address range. Fix it by: > > - Allocate a small shadow stack below 32-bit address, > - Switch to the new shadow stack, > - Run tests, > - Switch back to the original 64-bit shadow stack. > > Signed-off-by: Yu-cheng Yu > --- > tools/testing/selftests/x86/sigreturn.c | 28 +++++++++++++++++++++++++ > 1 file changed, 28 insertions(+) > > diff --git a/tools/testing/selftests/x86/sigreturn.c b/tools/testing/selftests/x86/sigreturn.c > index 57c4f67f16ef..5bcd74d416ff 100644 > --- a/tools/testing/selftests/x86/sigreturn.c > +++ b/tools/testing/selftests/x86/sigreturn.c > @@ -45,6 +45,14 @@ > #include > #include > #include > +#include > +#include > +#include > + > +#ifdef __x86_64__ > +int arch_prctl(int code, unsigned long *addr); > +#define ARCH_CET_ALLOC_SHSTK 0x3004 > +#endif > > /* Pull in AR_xyz defines. */ > typedef unsigned int u32; > @@ -766,6 +774,20 @@ int main() > int total_nerrs = 0; > unsigned short my_cs, my_ss; > > +#ifdef __x86_64__ I think this should also be gated by whether the compiler will know what to do with the shadow stack instructions. (Perhaps the earlier Makefile define can be exported and tested here.) > + /* Alloc a shadow stack within 32-bit address range */ > + unsigned long arg, ssp_64, ssp_32; > + ssp_64 = _get_ssp(); > + > + if (ssp_64 != 0) { > + arg = 0x1001; > + arch_prctl(ARCH_CET_ALLOC_SHSTK, &arg); > + ssp_32 = arg + 0x1000 - 8; > + asm volatile("RSTORSSP (%0)\n":: "r" (ssp_32)); > + asm volatile("SAVEPREVSSP"); > + } > +#endif -- Kees Cook