Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753473AbeAGMDO (ORCPT + 1 other); Sun, 7 Jan 2018 07:03:14 -0500 Received: from mail.skyhub.de ([5.9.137.197]:52890 "EHLO mail.skyhub.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752852AbeAGMDM (ORCPT ); Sun, 7 Jan 2018 07:03:12 -0500 Date: Sun, 7 Jan 2018 13:03:03 +0100 From: Borislav Petkov To: Tim Chen Cc: Thomas Gleixner , Andy Lutomirski , Linus Torvalds , Greg KH , Dave Hansen , Andrea Arcangeli , Andi Kleen , Arjan Van De Ven , David Woodhouse , linux-kernel@vger.kernel.org Subject: Re: [PATCH v2 2/8] x86/enter: MACROS to set/clear IBRS Message-ID: <20180107120303.dbrngl7gjmxns7k6@pd.tnic> References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: User-Agent: NeoMutt/20170609 (1.8.3) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Return-Path: On Fri, Jan 05, 2018 at 06:12:17PM -0800, Tim Chen wrote: > Subject: Re: [PATCH v2 2/8] x86/enter: MACROS to set/clear IBRS Your subject needs to have a verb and not scream: Subject: [PATCH v2 2/8] x86/entry: Add macros to set/clear IBRS > Create macros to control IBRS. Use these macros to enable IBRS on kernel entry > paths and disable IBRS on kernel exit paths. > > The registers rax, rcx and rdx are touched when controlling IBRS > so they need to be saved when they can't be clobbered. > > Signed-off-by: Tim Chen > --- > arch/x86/entry/calling.h | 74 ++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 74 insertions(+) > > diff --git a/arch/x86/entry/calling.h b/arch/x86/entry/calling.h > index 45a63e0..09c870d 100644 > --- a/arch/x86/entry/calling.h > +++ b/arch/x86/entry/calling.h > @@ -6,6 +6,8 @@ > #include > #include > #include > +#include > +#include > > /* > > @@ -347,3 +349,75 @@ For 32-bit we have the following conventions - kernel is built with > .Lafter_call_\@: > #endif > .endm > + > +/* > + * IBRS related macros > + */ > +.macro PUSH_MSR_REGS > + pushq %rax > + pushq %rcx > + pushq %rdx > +.endm > + > +.macro POP_MSR_REGS > + popq %rdx > + popq %rcx > + popq %rax > +.endm > + > +.macro WRMSR_ASM msr_nr:req eax_val:req WRMSR as a name is good enough. Also, you need edx_val:req too in case we decide to reuse that macro for something else later. Which I'm pretty sure we will, once it is out there. > + movl \msr_nr, %ecx > + movl $0, %edx ... and then movl \edx_val, %edx > + movl \eax_val, %eax > +.endm > + > +.macro ENABLE_IBRS > + ALTERNATIVE "jmp .Lskip_\@", "", X86_FEATURE_SPEC_CTRL > + PUSH_MSR_REGS > + WRMSR_ASM $MSR_IA32_SPEC_CTRL, $SPEC_CTRL_FEATURE_ENABLE_IBRS This is overwriting the previous contents of the MSR. You need to read it and OR-in its bits [63:2] with SPEC_CTRL_FEATURE_ENABLE_IBRS and clear bit 0. Unless the rest of this MSR is not going to be used for anything else. Then you're fine. -- Regards/Gruss, Boris. Good mailing practices for 400: avoid top-posting and trim the reply.