Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp3692787imm; Fri, 25 May 2018 09:55:04 -0700 (PDT) X-Google-Smtp-Source: AB8JxZr2mEqlTvUIudm2N3Er7tjUfpLIyoNNtrl/rgfEIrlIRo9h6xLe2qtguZdsNTs8rm/BBAk4 X-Received: by 2002:a17:902:8b85:: with SMTP id ay5-v6mr3327927plb.30.1527267304326; Fri, 25 May 2018 09:55:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527267304; cv=none; d=google.com; s=arc-20160816; b=T5xZaEQwLiuAMWTbIgYPNIkD2P0/OuyIo6ANbD5a7mtIotuLONEQmSs0foQaF5JYHr YyPZM+F3YRGrL62obOK3JmAPg3t6XJirdM0KPRmYvqCXEr5xIYcWOWot+zYrCxo24ycG CcWBeSS6n7CH1lSCDCkbelD5w8gx6FlTRGzy6XUUqJBd+niKsI+Z2SwshSgPy7h2pq4q 0l7NM2WChm4snnhixePfRecJoLOW9f8TE2NmVD2Fhc6ebXdoCov/FbVj/oFRdja8c/Da pW6DFPUTBVfupcZX+wjlqaXubJobVPPMXVqyOJBRnVEw41e15BOZsAl/ysfg74AdwV3o Eoyg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:from:cc:to:subject :content-transfer-encoding:mime-version:references:in-reply-to :user-agent:date:arc-authentication-results; bh=MFqRHOaPB3RgZ5/+bE5NuxVa1k6Q2iaYuay438E1444=; b=VDsPZ8VpJLIS0rHYjVUy+74eo74Qkxu99Qw/CnA4UKaS5aZTyY0LFeCWbgvN1PQ0Jo TMbTaTeRkLqY4/FTfTuR12EQ8hfK8nEtFV/IhpNwv1EA2fwuoiQCh/Vrkl/NTHym9NG2 jVMGMLvAbH0CFc7jy6vGSSTJ9w2RvtDUZ0Ba54QeHvBk6P9TYtW/JvGCFvttsceDl0W1 o++0ibO2XxKbMvw3yvPo634LixEM3yX4uUwU360H8kKLtXMQy0Mzk1/jBmFZ9gspRHjL GJItsmXAhOgorX30ratKsYmgv9AMA5ihNB0EKgdjf0tf5R6mMDDu220M/SKM8xXhLMP6 MT3Q== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v16-v6si23178824pfm.151.2018.05.25.09.54.49; Fri, 25 May 2018 09:55:04 -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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S967374AbeEYQyA convert rfc822-to-8bit (ORCPT + 99 others); Fri, 25 May 2018 12:54:00 -0400 Received: from terminus.zytor.com ([198.137.202.136]:55885 "EHLO mail.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S967275AbeEYQx7 (ORCPT ); Fri, 25 May 2018 12:53:59 -0400 Received: from wld62.hos.anvin.org (c-24-5-245-234.hsd1.ca.comcast.net [24.5.245.234] (may be forged)) (authenticated bits=0) by mail.zytor.com (8.15.2/8.15.2) with ESMTPSA id w4PGrtxF1127400 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO); Fri, 25 May 2018 09:53:55 -0700 Date: Fri, 25 May 2018 09:53:48 -0700 User-Agent: K-9 Mail for Android In-Reply-To: References: <26B017D5-4063-46CB-8768-B0E5E7CD3838@zytor.com> <319FB971-ABB6-4BE7-969B-D87D84853196@zytor.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8BIT Subject: Re: [clang] stack protector and f1f029c7bf To: Nick Desaulniers CC: Alistair Strachan , Manoj Gupta , Matthias Kaehlcke , Greg Hackmann , sedat.dilek@gmail.com, tstellar@redhat.com, LKML , Kees Cook From: hpa@zytor.com Message-ID: <31A5469A-176F-451F-886A-ECD649DDC78C@zytor.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On May 25, 2018 9:46:42 AM PDT, Nick Desaulniers wrote: >On Fri, May 25, 2018 at 9:33 AM wrote: >> On May 25, 2018 9:27:40 AM PDT, Nick Desaulniers > >wrote: >> >On Thu, May 24, 2018 at 3:43 PM wrote: >> >> On May 24, 2018 3:31:05 PM PDT, Nick Desaulniers >> > >> >wrote: >> >> >On Thu, May 24, 2018 at 3:05 PM H. Peter Anvin >> >wrote: >> >> >> COMPILER AR: "=rm" should NEVER generate worse code than "=r". >> >That >> >> >is >> >> >> unequivocally a compiler bug. >> >> > >> >> >Filed: https://bugs.llvm.org/show_bug.cgi?id=37583 >> >> > >> >> >> >> You are claiming it doesn't buy us anything, but you are >only >> >> >looking >> >> >at >> >> >> > the paravirt case which is kind of "special" (in the short >bus >> >kind >> >> >of >> >> >way), >> >> >> > >> >> >> > That's fair. Is another possible solution to have paravirt >> >maybe >> >> >not >> >> >use >> >> >> > native_save_fl() then, but its own >> >> >non-static-inline-without-m-constraint >> >> >> > implementation? >> >> > >> >> >> KERNEL AR: change native_save_fl() to an extern inline with an >> >> >assembly >> >> >> out-of-line implementation, to satisfy the paravirt requirement >> >that >> >> >no >> >> >> GPRs other than %rax are clobbered. >> >> > >> >> >i'm happy to add that, do you have a recommendation if it should >go >> >in >> >> >an >> >> >existing .S file or a new one (and if so where/what shall I call >> >it?). >> > >> >> How about irqflags.c since that is what the .h file is called. >> > >> >> It should simply be: >> > >> >> push %rdi >> >> popf >> >> ret >> > >> >> pushf >> >> pop %rax >> >> ret >> > >> >> ... but with all the regular assembly decorations, of course. >> > >> >Something like the following? >> > >> > >> >diff --git a/arch/x86/kernel/irqflags.c b/arch/x86/kernel/irqflags.c >> >new file mode 100644 >> >index 000000000000..59dc21bd3327 >> >--- /dev/null >> >+++ b/arch/x86/kernel/irqflags.c >> >@@ -0,0 +1,24 @@ >> >+#include >> >+ >> >+extern unsigned long native_save_fl(void); >> >+extern void native_restore_fl(unsigned long flags); >> >+ >> >+asm( >> >+".pushsection .text;" >> >+".global native_save_fl;" >> >+".type native_save_fl, @function;" >> >+"native_save_fl:" >> >+"pushf;" >> >+"pop %" _ASM_AX ";" >> >+"ret;" >> >+".popsection"); >> >+ >> >+asm( >> >+".pushsection .text;" >> >+".global native_restore_fl;" >> >+".type native_restore_fl, @function;" >> >+"native_restore_fl:" >> >+"push %" _ASM_DI ";" >> >+"popf;" >> >+"ret;" >> >+".popsection"); >> > >> >And change the declaration in arch/x86/include/asm/irqflags.h to: >> >+extern inline unsigned long native_save_fl(void); >> >+extern inline void native_restore_fl(unsigned long flags); >> > >> >This seems to work, but >> >1. arch/x86/boot/compressed/misc.o warns that native_save_fl() is >never >> >defined (arch_local_save_flags() uses it). Does that mean >> >arch_local_save_flags(), and friends would also have to move to the >> >newly >> >created .c file as well? >> >2. `extern inline` doesn't inline any instances (from what I can >tell >> >from >> >disassembling vmlinux). I think this is strictly worse. Don't we >only >> >want >> >pv_irq_ops.save_fl to be non-inlined in a way that no stack >protector >> >can >> >be added? If that's the case, should my assembly based >implementation >> >have >> >a different identifier (`native_save_fl_paravirt` or something). >That >> >would >> >also fix point #1 above. But now the paravirt code has its own copy >of >> >the >> >function. > >> Sorry, I meant irqflags.S. > >> It still should be available as as inline, however, but now "extern >inline". > >Heh, ok I was confused. But in testing, I had also created: > >arch/x86/lib/irqflags.S >/* SPDX-License-Identifier: GPL-2.0 */ > >#include >#include >#include > >/* > * unsigned long native_save_fl(void) > */ >ENTRY(native_save_fl) >pushf >pop %_ASM_AX >ret >ENDPROC(native_save_fl) >EXPORT_SYMBOL(native_save_fl) > >/* > * void native_restore_fl(unsigned long flags) > * %rdi: flags > */ >ENTRY(native_restore_fl) >push %_ASM_DI >popf >ret >ENDPROC(native_restore_fl) >EXPORT_SYMBOL(native_restore_fl) > >The issue is that this still has issues 1 & 2 listed earlier (and the >disassembly has a lot more trailing nops added). > >When you say > >> It still should be available as as inline, however, but now "extern >inline". > >Am I understanding correctly that native_save_fl should be inlined into >all >call sites (modulo the problematic pv_irq_ops.save_fl case)? Because >for >these two assembly implementations, it's not, but maybe there's >something >missing in my implementation? Yes, that's what "extern inline" means. Maybe it needs a must inline annotation, but that's really messed up. -- Sent from my Android device with K-9 Mail. Please excuse my brevity.