On Fri, Jan 05, 2018 at 06:12:19PM -0800, Tim Chen wrote:
> From: Tim Chen <tim.c.c...@linux.intel.com>
> From: Andrea Arcangeli <aarca...@redhat.com>
> 
> There are 2 ways to control IBRS
> 
> 1. At boot time
>     noibrs kernel boot parameter will disable IBRS usage
> 
> Otherwise if the above parameters are not specified, the system
> will enable ibrs and ibpb usage if the cpu supports it.
> 
> 2. At run time
>     echo 0 > /sys/kernel/debug/x86/ibrs_enabled will turn off IBRS
>     echo 1 > /sys/kernel/debug/x86/ibrs_enabled will turn on IBRS in kernel
>     echo 2 > /sys/kernel/debug/x86/ibrs_enabled will turn on IBRS in both 
> userspace and kernel
> 
> The implementation was updated with input and suggestions from Andrea 
> Arcangeli.
> 
> Signed-off-by: Tim Chen <tim.c.c...@linux.intel.com>
> ---
>  arch/x86/entry/calling.h         |  42 ++++++++--
>  arch/x86/include/asm/spec_ctrl.h |  15 ++++
>  arch/x86/kernel/cpu/Makefile     |   1 +
>  arch/x86/kernel/cpu/scattered.c  |   2 +
>  arch/x86/kernel/cpu/spec_ctrl.c  | 160 
> +++++++++++++++++++++++++++++++++++++++
>  5 files changed, 214 insertions(+), 6 deletions(-)
>  create mode 100644 arch/x86/include/asm/spec_ctrl.h
>  create mode 100644 arch/x86/kernel/cpu/spec_ctrl.c
> 
> diff --git a/arch/x86/entry/calling.h b/arch/x86/entry/calling.h
> index 09c870d..6b65d47 100644
> --- a/arch/x86/entry/calling.h
> +++ b/arch/x86/entry/calling.h
> @@ -373,35 +373,55 @@ For 32-bit we have the following conventions - kernel 
> is built with
>  .endm
>  
>  .macro ENABLE_IBRS
> -     ALTERNATIVE "jmp .Lskip_\@", "", X86_FEATURE_SPEC_CTRL
> +     testl   $1, dynamic_ibrs
> +     jz      .Lskip_\@
> +
>       PUSH_MSR_REGS
>       WRMSR_ASM $MSR_IA32_SPEC_CTRL, $SPEC_CTRL_FEATURE_ENABLE_IBRS
>       POP_MSR_REGS
> +     jmp     .Ldone_\@
> +
>  .Lskip_\@:
> +     lfence
> +.Ldone_\@:
>  .endm
>  
>  .macro DISABLE_IBRS
> -     ALTERNATIVE "jmp .Lskip_\@", "", X86_FEATURE_SPEC_CTRL
> +     testl   $1, dynamic_ibrs

On every system call we end up hammering on this 'dynamic_ibrs'
variable. And it looks like it can be flipped via the IPI mechanism.

Would it make sense for this to be per-cpu?

Reply via email to