[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v9 08/11] x86/entry: Clobber the Return Stack Buffer/Return Address Stack on entry to Xen
>>> On 19.01.18 at 15:24, <andrew.cooper3@xxxxxxxxxx> wrote: > On 19/01/18 12:47, Jan Beulich wrote: >>>>> On 18.01.18 at 16:46, <andrew.cooper3@xxxxxxxxxx> wrote: >>> @@ -265,6 +265,10 @@ On hardware supporting IBRS, the `ibrs=` option can be >>> used to force or >>> prevent Xen using the feature itself. If Xen is not using IBRS itself, >>> functionality is still set up so IBRS can be virtualised for guests. >>> >>> +The `rsb_vmexit=` and `rsb_native=` options can be used to fine tune when >>> the >>> +RSB gets overwritten. There are individual controls for an entry from HVM >>> +context, and an entry from a native (PV or Xen) context. >> Would you mind adding a sentence or two to the description making >> clear what use this fine grained control is? I can't really figure why I >> might need to be concerned about one of the two cases, but not the >> other. > > I though I'd covered that in the commit message, but I'm not sure this > is a suitable place to discuss the details. PV and HVM guests have > different reasoning for why we need to overwrite the RSB. > > In the past, there used to be a default interaction of rsb_native and > SMEP, but that proved to be insufficient and rsb_native is now > unconditionally enabled. In principle however, it should fall within > CONFIG_PV. Thanks for the explanation, but I'm afraid I'm none the wiser as to why the two separate options are needed (or even just wanted). >>> --- a/xen/include/asm-x86/spec_ctrl_asm.h >>> +++ b/xen/include/asm-x86/spec_ctrl_asm.h >>> @@ -73,6 +73,40 @@ >>> * - SPEC_CTRL_EXIT_TO_GUEST >>> */ >>> >>> +.macro DO_OVERWRITE_RSB >>> +/* >>> + * Requires nothing >>> + * Clobbers %rax, %rcx >>> + * >>> + * Requires 256 bytes of stack space, but %rsp has no net change. Based on >>> + * Google's performance numbers, the loop is unrolled to 16 iterations and >>> two >>> + * calls per iteration. >>> + * >>> + * The call filling the RSB needs a nonzero displacement, but we use "1: >>> + * pause, jmp 1b" to safely contains any ret-based speculation, even if the >>> + * loop is speculatively executed prematurely. >> I'm struggling to understand why you use "but" here. Maybe just a >> lack of English skills on my part? > > "displacement. A nop would do, but" ? > > It is a justification for why we are putting more than a single byte in > the middle. Oh, I see, but only with the addition you suggest. >>> + * %rsp is preserved by using an extra GPR because a) we've got plenty >>> spare, >>> + * b) the two movs are shorter to encode than `add $32*8, %rsp`, and c) >>> can be >>> + * optimised with mov-elimination in modern cores. >>> + */ >>> + mov $16, %ecx /* 16 iterations, two calls per loop */ >>> + mov %rsp, %rax /* Store the current %rsp */ >>> + >>> +.L\@_fill_rsb_loop: >>> + >>> + .rept 2 /* Unrolled twice. */ >>> + call 2f /* Create an RSB entry. */ >>> +1: pause >>> + jmp 1b /* Capture rogue speculation. */ >>> +2: >> I won't further insist on changing away from numeric labels here, but >> I'd still like to point out an example of a high risk use of such labels in >> mainline code: There's a "jz 1b" soon after >> exception_with_ints_disabled, leading across _two_ other labels and >> quite a few insns and macro invocations. May I at the very least >> suggest that you don't use 1 and 2 here? > > I spent ages trying to get .L labels working here, but they don't > function inside a rept, as you end up with duplicate local symbols. > > Even using irp to inject a unique number into the loop doesn't appear to > work, because the \ escape gets interpreted as a token separator. > AFAICT, \@ is special by virtue of the fact that it doesn't count as a > token separator. > > If you've got a better suggestion then I'm all ears. > > Alternatively, I could manually unroll the loop, or pick some arbitrary > other numbers to use. Since the unroll number is just 2, this is what I would have suggested primarily. .rept of course won't work, as it's not a macro invocation, and hence doesn't increment the internal counter. With .irp I can get things to work: .macro m .irp n, 1, 2 .Lxyz_\@_\n: mov $\@, %eax .endr .endm 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 |