[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 at 11:41, <andrew.cooper3@xxxxxxxxxx> wrote:
> 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.

Considering that the alternatives are (from what I can tell) more
expensive, I can't see why a compiler would do that. Or maybe
I'm still not getting the exact scenario you're thinking about ...

>> (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.

Thanks. And yes, we likely will want to make our stack handling
ABI compliant, at which point this patch could be reverted.

Jan

_______________________________________________
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®.