[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v6.5 21/26] x86/entry: Use MSR_SPEC_CTRL at each entry/exit point



>>> On 04.01.18 at 01:15, <andrew.cooper3@xxxxxxxxxx> wrote:
> Set or clear IBRS in Xen context, and appropriate guest values in guest
> context.  See the documentation in asm-x86/spec_ctrl_asm.h for details.

I think this is misleading - there is no setting or clearing in Xen context
here, as the controlling features (X86_FEATURE_XEN_IBRS_{SET,CLEAR})
get set only in the next patch.

> --- a/xen/include/asm-x86/asm_defns.h
> +++ b/xen/include/asm-x86/asm_defns.h
> @@ -7,6 +7,7 @@
>  #include <asm/asm-offsets.h>
>  #endif
>  #include <asm/bug.h>
> +#include <asm/page.h>
>  #include <asm/processor.h>
>  #include <asm/percpu.h>
>  #include <xen/stringify.h>
> @@ -344,4 +345,6 @@ static always_inline void stac(void)
>  #define REX64_PREFIX "rex64/"
>  #endif
>  
> +#include <asm/spec_ctrl_asm.h>

Why do all consumers of asm_defns.h need to also see the
definitions that other header holds? If there are include ordering
issues, can't interested .c and/or .S files include that other
header first? In fact I have a patch pending (in a yet to be
finished series) which does that for processor.h: It shouldn't
really be included by this header, as nothing in here needs
anything out of there (the things needed live in x86-defns.h).

> --- a/xen/include/asm-x86/nops.h
> +++ b/xen/include/asm-x86/nops.h
> @@ -50,7 +50,7 @@
>  #define P6_NOP9 0x66,0x0f,0x1f,0x84,0x00,0,0,0,0
>  
>  #ifdef __ASSEMBLY__
> -#define _ASM_MK_NOP(x) .byte x
> +#define _ASM_MK_NOP(x) .byte x;

Imo the semicolon doesn't belong here, but ...

> @@ -65,6 +65,12 @@
>  #define ASM_NOP8 _ASM_MK_NOP(P6_NOP8)
>  #define ASM_NOP9 _ASM_MK_NOP(P6_NOP9)
>  
> +#define ASM_NOP22 ASM_NOP8 ASM_NOP8 ASM_NOP6
> +#define ASM_NOP26 ASM_NOP8 ASM_NOP8 ASM_NOP8 ASM_NOP2
> +#define ASM_NOP32 ASM_NOP8 ASM_NOP8 ASM_NOP8 ASM_NOP8
> +#define ASM_NOP33 ASM_NOP8 ASM_NOP8 ASM_NOP8 ASM_NOP7 ASM_NOP2
> +#define ASM_NOP39 ASM_NOP8 ASM_NOP8 ASM_NOP8 ASM_NOP8 ASM_NOP7

... here (between the elements, matching e.g. ASM_AC() and
CR4_PV32_RESTORE).

If you really want to keep introducing these (instead of the - imo -
much more clean use of suitable .skip in the macros, as is being
done in the 32-bit PV SMEP/SMAP handling), please at least use
ASM_NOP9 here as far as possible.

> +.macro DO_SPEC_CTRL_ENTRY_FROM_VMEXIT ibrs_val:req
> +/*
> + * Requires %rbx=current, %rsp=regs/cpuinfo
> + * Clobbers %rax, %rcx, %rdx
> + *
> + * The common case is that a guest has direct access to MSR_SPEC_CTRL, at
> + * which point we need to save the guest value before setting IBRS for Xen.
> + * Unilaterally saving the guest value is shorter and faster than checking.
> + */
> +    mov $MSR_SPEC_CTRL, %ecx
> +    rdmsr
> +
> +    /* Stash the value from hardware. */
> +    mov VCPU_arch_msr(%rbx), %rdx
> +    mov %al, VCPUMSR_spec_ctrl_host(%rdx)
> +    xor %edx, %edx
> +
> +    /* Clear SPEC_CTRL shadowing *before* loading Xen's value. */
> +    movb %dl, CPUINFO_use_shadow_spec_ctrl(%rsp)
> +
> +    /* Load Xen's indented value. */

"intended" (also another time below)?

> +.macro DO_SPEC_CTRL_ENTRY maybexen:req ibrs_val:req
> +/*
> + * Requires %rsp=regs (also cpuinfo if !maybexen)
> + * Clobbers %rax, %rcx, %rdx
> + *
> + * PV guests can't update MSR_SPEC_CTRL behind Xen's back, so no need to read
> + * it back.  Entries from guest context need to clear SPEC_CTRL shadowing,
> + * while entries from Xen must leave shadowing in its current state.
> + */
> +    mov $MSR_SPEC_CTRL, %ecx
> +
> +    .if \maybexen
> +        cmpl $__HYPERVISOR_CS, UREGS_cs(%rsp)

Perhaps better "cmpw", and if you're afraid of the length changing
prefix decode stall, then use an intermediate register.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.