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

Re: [Xen-devel] Ping: [PATCH v2] x86/EFI: meet further spec requirements for runtime calls



On 22/11/16 10:09, Jan Beulich wrote:
>>>> On 15.11.16 at 17:06, <JBeulich@xxxxxxxx> wrote:
>>>>> On 15.11.16 at 16:47, <andrew.cooper3@xxxxxxxxxx> wrote:
>>> On 14/11/16 10:32, Jan Beulich wrote:
>>>> So far we didn't guarantee 16-byte alignment of the stack: While (so
>>>> far) we don't tell the compiler to use smaller alignment, we also don't
>>>> guarantee 16-byte alignment when establishing stack pointers for new
>>>> vCPU-s. Runtime service functions using SSE instructions may end with
>>>> #GP(0) without that.
>>>>
>>>> Note that making use of -mpreferred-stack-boundary=3, as mentioned in
>>>> the comment, wouldn't help to reduce the needed alignment: The compiler
>>>> would then be free to align the stack of the function with the aligned
>>>> object, but would be permitted to place an odd number of 8-byte objects
>>>> there, resulting in the callee to still run on an unaligned stack.
>>>>
>>>> (The only working alternative to the approach chosen here would be to
>>>> use -mincoming-stack-boundary=3, but that would affect all functions in
>>>> runtime.c, not just the ones actually making runtime services calls.
>>>> And it would still require the manual alignment logic here to be used
>>>> with gcc 5.2 and earlier - not permitting that command line option -,
>>>> just that then the alignment amount would become conditional.)
>>>>
>>>> Hence enforce the needed alignment by making efi_rs_enter() return a
>>>> suitably aligned structure, which the caller then necessarily has to
>>>> store in a suitably aligned local variable, the address of which then
>>>> gets passed to efi_rs_leave(). Also (to limit exposure) move the
>>>> function declarations to where they belong: They're local to runtime.c,
>>>> and shared only with compat.c (by the latter including the former).
>>> Why does this guarantee alignment?  What prevents the compiler from
>>> reordering the items in its stack layout?
>> The compiler will always allocate stack variables such that called
>> functions will see an ABI-compliant stack. Without variables of
>> bigger alignment, it does this by implying that the current function
>> also has an aligned stack. Since we start out with a stack frame on
>> an 8 mod 16 boundary, said compiler behavior propagates
>> this through all call hierarchies. With variables of bigger alignment
>> the compiler arranges for the current frame to be suitably
>> expanded, and it will of course continue to guarantee that all
>> callees get to see a 16-byte aligned stack. IOW all we need to do
>> is break this 8 mod 16 thing once.
> Ping? We have a problem to solve here, so I think I can expect that
> either the proposed solution (even if not covering all theoretical
> cases of possibly compiler behavior) is accepted, or an alternative
> proposal is put up.

Right, so the proposed patch is half a solution, in that it will resolve
the issue when a compiler make one of two choices.  From this point of
view, it is an improvement.

> I'd really like to avoid seeing 4.8 go out with the
> problem un-addressed.

However, calling the issue addressed after this patch is false.  A
compiler which chooses to reorder stack objects differently will still
fail to maintain the alignment you are trying to impose.

> (From a strictly formal perspective, me being
> the only maintainer of EFI code, I could put the patch in without any
> ack [other than Wei's release one], but I'd like to avoid that if at all
> possible.)

If you want an ack, then fine.  Acked-by: Andrew Cooper
<andrew.cooper3@xxxxxxxxxx> but I don't expect this fully resolve the issue.

~Andrew

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

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