Re: [PATCH] x86/fpu: Warn only when CPU-provided sizes less than struct declaration

From: Suravee Suthikulpanit
Date: Thu Dec 12 2019 - 01:53:09 EST


Dave,

On 12/11/2019 9:13 PM, Dave Hansen wrote:
On 12/10/19 9:24 PM, Suravee Suthikulpanit wrote:
The value returned by ECX[1] indicates the alignment of state
component i when the compacted format of the extended region of an
XSAVE area is used (see Section 13.4.3). If ECX[1] returns 0, state
component i is located immediately following the preceding state
component; if ECX[1] returns 1, state component i is located on the
next 64-byte boundary following the preceding state component.

Essentially, if an implementation needs state alignment or (up to) 64
bytes of padding, it could use this existing architecture for it.

Let me check with the HW folks and get back to you on this.

Please correct me if I am wrong, but I believe this is similar to the
case mentioned in the commit ef78f2a4bf84 ('x86/fpu: Check
CPU-provided sizes against struct declarations'), where it mentions
inconsistency b/w the MPX 'bndcsr' state and the C structures.

Yep, but I fixed that by padding the C structure, not silencing the
warning. Also *ALL* MPX implementations have had the same size for that
state.

Ah I see. But that solution works because the MPX feature is only on Intel.
In case of PKRU, it seems that two hardware implementations have different
padding size for PKRU state. IIUC, Intel has padding of 4 bytes based on
the following struct.

/*
* State component 9: 32-bit PKRU register. The state is
* 8 bytes long but only 4 bytes is used currently.
*/
struct pkru_state {
u32 pkru;
u32 pad;
} __packed;

Therefore, I agree with you that we might need to use the ECX[1].
Let me confirm this and get back to you.

Thanks,
Suravee