|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v10 05/11] x86/entry: Organise the use of MSR_SPEC_CTRL at each entry/exit point
>>> On 24.01.18 at 14:12, <andrew.cooper3@xxxxxxxxxx> wrote:
> We need to be able to either set or clear IBRS in Xen context, as well as
> restore appropriate guest values in guest context. See the documentation in
> asm-x86/spec_ctrl_asm.h for details.
>
> With the contemporary microcode, writes to %cr3 are slower when SPEC_CTRL.IBRS
> is set. Therefore, the positioning of SPEC_CTRL_{ENTRY/EXIT}* is important.
>
> Ideally, the IBRS_SET/IBRS_CLEAR hunks might be positioned either side of the
> %cr3 change, but that is rather more complicated to arrange, and could still
> result in a guest controlled value in SPEC_CTRL during the %cr3 change,
> negating the saving if the guest chose to have IBRS set.
>
> Therefore, we optimise for the pre-Skylake case (being far more common in the
> field than Skylake and later, at the moment), where we have a Xen-preferred
> value of IBRS clear when switching %cr3.
>
> There is a semi-unrelated bugfix, where various asm_defn.h macros have a
> hidden dependency on PAGE_SIZE, which results in an assembler error if used in
> a .macro definition.
>
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
with a spelling observation and a question / perhaps implied
suggestion:
> @@ -99,6 +109,15 @@ UNLIKELY_END(realmode)
> .Lvmx_vmentry_fail:
> sti
> SAVE_ALL
> +
> + /*
> + * PV variant needed here as no guest code has executed (so
> + * MSR_SPEC_CTRL can't have changed value), and NMIs/MCEs are liable
> + * to hit (in which case the HVM varient might corrupt things).
variant
> +.macro DO_SPEC_CTRL_ENTRY maybexen:req ibrs_val:req
> +/*
> + * Requires %rsp=regs (also cpuinfo if !maybexen)
> + * Requires %r14=stack_end (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
> + testb $3, UREGS_cs(%rsp)
> + jz .L\@_entry_from_xen
> + .endif
> +
> + /*
> + * Clear SPEC_CTRL shadowing *before* loading Xen's value. If entering
> + * from a possibly-xen context, %rsp doesn't necessarily alias the
> cpuinfo
> + * block so calculate the position directly.
> + */
> + .if \maybexen
> + movb $0, STACK_CPUINFO_FIELD(use_shadow_spec_ctrl)(%r14)
> + .else
> + movb $0, CPUINFO_use_shadow_spec_ctrl(%rsp)
> + .endif
> +
> +.L\@_entry_from_xen:
> + /* Load Xen's intended value. */
> + mov $\ibrs_val, %eax
> + xor %edx, %edx
> + wrmsr
> +.endm
Did you consider avoiding the conditional branch here altogether,
by doing something like
.if \maybexen
testb $3, UREGS_cs(%rsp)
setz %al
neg %al
and %al, STACK_CPUINFO_FIELD(use_shadow_spec_ctrl)(%r14)
.else
?
It may also be worthwhile again to pull up the zeroing of %edx,
using %dl instead of $0 in the movb (and maybe then also
similarly in DO_SPEC_CTRL_EXIT_TO_XEN, but there I'm less
certain it couldn't have a negative effect).
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |