[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 22/01/18 16:49, Jan Beulich wrote: >>>> On 22.01.18 at 16:51, <andrew.cooper3@xxxxxxxxxx> wrote: >> On 19/01/18 15:02, Jan Beulich wrote: >>>>>> 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: >>>>>> + * %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 >> This appears to only work when \n is at the end of the label. None of: >> >> .Lxyz_\@_\n_: mov $\@, %eax >> .Lxyz_\@_\n\()_: mov $\@, %eax >> .Lxyz_\n\@: mov $\@, %eax >> >> work. > .Lxyz_\n\(\)()_\(\)@: mov $\@, %ecx > > (There are two rounds of expansion, so \-s you want expanded > in the second round need escaping for the first one. Eww. That's too much like Perl IMO. I'll see if I can arrange things to work neatly with \n at the end of the label. If not, I'll manually unroll the loop; it is only twice after all. ~Andrew _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |