mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* Re: [PATCH v2 2/8] x86/enter: MACROS to set/clear IBRS
       [not found]               ` <CAD4b4WKsb3R_TieHrcY9RB6jLLAREJgq5ua4xqvTPRV6MNi4Kg@mail.gmail.com>
@ 2018-01-17 21:40                 ` Tim Chen
  0 siblings, 0 replies; 6+ messages in thread
From: Tim Chen @ 2018-01-17 21:40 UTC (permalink / raw)
  To: Mark Marshall, linux-kernel

On 01/06/2018 03:05 PM, Mark Marshall wrote:
> Hi.
> 
> (I've only just subscribed and can't work out how to reply to a message from before I subscribed (on my phone), sorry)
> 
> In the macro WRMSR_ASM you seem to have lost the wrmsr?
> 
>

Yes.  That's a bug noticed by Thomas and I'll fix for update to IBRS patches.

Tim

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 2/8] x86/enter: MACROS to set/clear IBRS
  2018-01-07 12:03   ` Borislav Petkov
  2018-01-07 17:12     ` Tim Chen
@ 2018-01-08 22:24     ` Tim Chen
  1 sibling, 0 replies; 6+ messages in thread
From: Tim Chen @ 2018-01-08 22:24 UTC (permalink / raw)
  To: Borislav Petkov
  Cc: Thomas Gleixner, Andy Lutomirski, Linus Torvalds, Greg KH,
	Dave Hansen, Andrea Arcangeli, Andi Kleen, Arjan Van De Ven,
	David Woodhouse, linux-kernel

On 01/07/2018 04:03 AM, Borislav Petkov wrote:

> 
> WRMSR as a name is good enough.
> 

It alias with wrmsr instruction and didn't
build correctly. So I'll keep it as WRMSR_ASM.

Tim

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 2/8] x86/enter: MACROS to set/clear IBRS
  2018-01-07 17:12     ` Tim Chen
@ 2018-01-07 18:44       ` Borislav Petkov
  0 siblings, 0 replies; 6+ messages in thread
From: Borislav Petkov @ 2018-01-07 18:44 UTC (permalink / raw)
  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

On Sun, Jan 07, 2018 at 09:12:21AM -0800, Tim Chen wrote:
> Currently we are not using other bits.
> When the time comes that we have other bits in this MSR used, we will
> change this.

Then please write in a short comment above it that it is ok that the
previous MSR contents get overwritten.

-- 
Regards/Gruss,
    Boris.

Good mailing practices for 400: avoid top-posting and trim the reply.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 2/8] x86/enter: MACROS to set/clear IBRS
  2018-01-07 12:03   ` Borislav Petkov
@ 2018-01-07 17:12     ` Tim Chen
  2018-01-07 18:44       ` Borislav Petkov
  2018-01-08 22:24     ` Tim Chen
  1 sibling, 1 reply; 6+ messages in thread
From: Tim Chen @ 2018-01-07 17:12 UTC (permalink / raw)
  To: Borislav Petkov
  Cc: Thomas Gleixner, Andy Lutomirski, Linus Torvalds, Greg KH,
	Dave Hansen, Andrea Arcangeli, Andi Kleen, Arjan Van De Ven,
	David Woodhouse, linux-kernel



On 01/07/2018 04:03 AM, Borislav Petkov wrote:
> 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 <tim.c.chen@linux.intel.com>
>> ---
>>  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 <asm/percpu.h>
>>  #include <asm/asm-offsets.h>
>>  #include <asm/processor-flags.h>
>> +#include <asm/msr-index.h>
>> +#include <asm/cpufeatures.h>
>>  
>>  /*
>>  
>> @@ -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.
> 

Currently we are not using other bits.
When the time comes that we have other bits in this MSR used, we will
change this.

Tim

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 2/8] x86/enter: MACROS to set/clear IBRS
  2018-01-06  2:12 ` [PATCH v2 2/8] x86/enter: MACROS to set/clear IBRS Tim Chen
@ 2018-01-07 12:03   ` Borislav Petkov
  2018-01-07 17:12     ` Tim Chen
  2018-01-08 22:24     ` Tim Chen
  0 siblings, 2 replies; 6+ messages in thread
From: Borislav Petkov @ 2018-01-07 12:03 UTC (permalink / raw)
  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

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 <tim.c.chen@linux.intel.com>
> ---
>  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 <asm/percpu.h>
>  #include <asm/asm-offsets.h>
>  #include <asm/processor-flags.h>
> +#include <asm/msr-index.h>
> +#include <asm/cpufeatures.h>
>  
>  /*
>  
> @@ -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.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v2 2/8] x86/enter: MACROS to set/clear IBRS
  2018-01-06  2:12 [PATCH v2 0/8] IBRS patch series Tim Chen
@ 2018-01-06  2:12 ` Tim Chen
  2018-01-07 12:03   ` Borislav Petkov
  0 siblings, 1 reply; 6+ messages in thread
From: Tim Chen @ 2018-01-06  2:12 UTC (permalink / raw)
  To: Thomas Gleixner, Andy Lutomirski, Linus Torvalds, Greg KH
  Cc: Tim Chen, Dave Hansen, Andrea Arcangeli, Andi Kleen,
	Arjan Van De Ven, David Woodhouse, linux-kernel

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 <tim.c.chen@linux.intel.com>
---
 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 <asm/percpu.h>
 #include <asm/asm-offsets.h>
 #include <asm/processor-flags.h>
+#include <asm/msr-index.h>
+#include <asm/cpufeatures.h>
 
 /*
 
@@ -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
+	movl	\msr_nr, %ecx
+	movl	$0, %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
+	POP_MSR_REGS
+.Lskip_\@:
+.endm
+
+.macro DISABLE_IBRS
+	ALTERNATIVE "jmp .Lskip_\@", "", X86_FEATURE_SPEC_CTRL
+	PUSH_MSR_REGS
+	WRMSR_ASM $MSR_IA32_SPEC_CTRL, $SPEC_CTRL_FEATURE_DISABLE_IBRS
+	POP_MSR_REGS
+.Lskip_\@:
+.endm
+
+.macro ENABLE_IBRS_CLOBBER
+	ALTERNATIVE "jmp .Lskip_\@", "", X86_FEATURE_SPEC_CTRL
+	WRMSR_ASM $MSR_IA32_SPEC_CTRL, $SPEC_CTRL_FEATURE_ENABLE_IBRS
+.Lskip_\@:
+.endm
+
+.macro DISABLE_IBRS_CLOBBER
+	ALTERNATIVE "jmp .Lskip_\@", "", X86_FEATURE_SPEC_CTRL
+	WRMSR_ASM $MSR_IA32_SPEC_CTRL, $SPEC_CTRL_FEATURE_DISABLE_IBRS
+.Lskip_\@:
+.endm
+
+.macro ENABLE_IBRS_SAVE_AND_CLOBBER save_reg:req
+	ALTERNATIVE "jmp .Lskip_\@", "", X86_FEATURE_SPEC_CTRL
+	movl	$MSR_IA32_SPEC_CTRL, %ecx
+	rdmsr
+	movl	%eax, \save_reg
+
+	movl	$0, %edx
+	movl	$SPEC_CTRL_FEATURE_ENABLE_IBRS, %eax
+	wrmsr
+.Lskip_\@:
+.endm
+
+.macro RESTORE_IBRS_CLOBBER save_reg:req
+	ALTERNATIVE "jmp .Lskip_\@", "", X86_FEATURE_SPEC_CTRL
+	/* Set IBRS to the value saved in the save_reg */
+	movl    $MSR_IA32_SPEC_CTRL, %ecx
+	movl    $0, %edx
+	movl    \save_reg, %eax
+	wrmsr
+.Lskip_\@:
+.endm
-- 
2.9.4

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2018-01-17 21:41 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <CAD4b4WJYMM1_r1MtEsj5zKbMT5hbVGA-vYAHyvQG0ww-9i1GKw@mail.gmail.com>
     [not found] ` <CAD4b4WL2eoiDF1BpoUaL8EwKNWLGcX7_4embJu-qmOB_BDVk-A@mail.gmail.com>
     [not found]   ` <CAD4b4WKoytFLp+d0tgRHuN-O9Or8_C6VR9zg70-PF2=dd4T-8g@mail.gmail.com>
     [not found]     ` <CAD4b4W+Hqkc7Hx977sb6wVAK9oZMh_PdkP_r-MGhKvZ3BYeKJA@mail.gmail.com>
     [not found]       ` <CAD4b4WKNnjww_cayBDgE5XPSF=arC8+BC_i6Py=Ac4_90mO7qQ@mail.gmail.com>
     [not found]         ` <CAD4b4WJp18P261mq8MGMus8=bWgut3TT-iGqO2f+F-cVK+c5LA@mail.gmail.com>
     [not found]           ` <CAD4b4WJX=s+XTrkXp0_JxLgK79PnFmCiWV4ifKFevoW8JoLP2g@mail.gmail.com>
     [not found]             ` <CAD4b4WKbzFLE4K1u3OTyW=us1PRHoDxfiF1yAbPaZmWauCB5_A@mail.gmail.com>
     [not found]               ` <CAD4b4WKsb3R_TieHrcY9RB6jLLAREJgq5ua4xqvTPRV6MNi4Kg@mail.gmail.com>
2018-01-17 21:40                 ` [PATCH v2 2/8] x86/enter: MACROS to set/clear IBRS Tim Chen
2018-01-06  2:12 [PATCH v2 0/8] IBRS patch series Tim Chen
2018-01-06  2:12 ` [PATCH v2 2/8] x86/enter: MACROS to set/clear IBRS Tim Chen
2018-01-07 12:03   ` Borislav Petkov
2018-01-07 17:12     ` Tim Chen
2018-01-07 18:44       ` Borislav Petkov
2018-01-08 22:24     ` Tim Chen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®