Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932410AbbD0Ix0 (ORCPT ); Mon, 27 Apr 2015 04:53:26 -0400 Received: from mail.skyhub.de ([78.46.96.112]:44478 "EHLO mail.skyhub.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932122AbbD0IxW (ORCPT ); Mon, 27 Apr 2015 04:53:22 -0400 Date: Mon, 27 Apr 2015 10:53:05 +0200 From: Borislav Petkov To: Andy Lutomirski Cc: Andy Lutomirski , X86 ML , "H. Peter Anvin" , Denys Vlasenko , Linus Torvalds , Brian Gerst , Denys Vlasenko , Ingo Molnar , Steven Rostedt , Oleg Nesterov , Frederic Weisbecker , Alexei Starovoitov , Will Drewry , Kees Cook , Linux Kernel Mailing List Subject: Re: [PATCH] x86_64, asm: Work around AMD SYSRET SS descriptor attribute issue Message-ID: <20150427085305.GB6774@pd.tnic> References: <5d120f358612d73fc909f5bfa47e7bd082db0af0.1429841474.git.luto@kernel.org> <20150425211206.GE32099@pd.tnic> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1913 Lines: 59 On Sun, Apr 26, 2015 at 04:39:38PM -0700, Andy Lutomirski wrote: > > +#define X86_BUG_CANONICAL_RCX X86_BUG(8) /* SYSRET #GPs when %RCX non-canonical */ > > I think that "sysret" should appear in the name. Yeah, I thought about it too, will fix. > Oh no! My laptop is currently bug-free, and you're breaking it! :) Muahahahhahaha... > > + > > + /* > > + * On Intel CPUs, SYSRET with non-canonical RCX/RIP will #GP > > + * in kernel space. This essentially lets the user take over > > + * the kernel, since userspace controls RSP. > > + */ > > + ALTERNATIVE "jmp 1f", "", X86_BUG_CANONICAL_RCX > > + > > I know it would be ugly, but would it be worth saving two bytes by > using ALTERNATIVE "jmp 1f", "shl ...", ...? > > > /* Change top 16 bits to be the sign-extension of 47th bit */ > > shl $(64 - (__VIRTUAL_MASK_SHIFT+1)), %rcx > > sar $(64 - (__VIRTUAL_MASK_SHIFT+1)), %rcx > > @@ -432,6 +436,7 @@ syscall_return: > > cmpq %rcx, %r11 > > jne opportunistic_sysret_failed You want to stick all 4 insns in the alternative? Yeah, it should work but it might even more unreadable than it is now. Btw, we can do this too: ALTERNATIVE "", "shl $(64 - (__VIRTUAL_MASK_SHIFT+1)), %rcx \ sar $(64 - (__VIRTUAL_MASK_SHIFT+1)), %rcx \ cmpq %rcx, %r11 \ jne opportunistic_sysret_failed" X86_BUG_SYSRET_CANONICAL_RCX which will replace the 2-byte JMP with a lot of NOPs on AMD. I'll trace it again to see which one is worse :-) Thanks. -- Regards/Gruss, Boris. ECO tip #101: Trim your mails when you reply. -- -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/