Re: [PATCH v9 11/26] x86/fpu/xstate: Update the XSTATE context copy function to support dynamic states

From: Bae, Chang Seok
Date: Wed Aug 18 2021 - 15:47:21 EST


On Aug 18, 2021, at 05:03, Borislav Petkov <bp@xxxxxxxxx> wrote:
> On Fri, Jul 30, 2021 at 07:59:42AM -0700, Chang S. Bae wrote:
>>
>> - copy_feature(header.xfeatures & BIT_ULL(i), &to,
>> - __raw_xsave_addr(&tsk->thread.fpu, i),
>> - __raw_xsave_addr(NULL, i),
>> - xstate_sizes[i]);
>> + unsigned int size = xstate_sizes[i];
>> + void *from = NULL;
>> +
>> + /*
>> + * Copy the xstate if available. Otherwise, copy the
>> + * non-zero init states for legacy states (FP and
>> + * SSE) or fill zeros.
>> + */
>> +
>> + if (header.xfeatures & mask)
>> + from = __raw_xsave_addr(&tsk->thread.fpu, i);
>> + else if (XFEATURE_MASK_FPSSE & mask)
>
> The i loop variable above starts from FIRST_EXTENDED_XFEATURE - why is
> this XFEATURE_MASK_FPSSE check even here?

!(header.xfeatures & mask) means init-state should be copied. Except for
these, the init value is zero (as also noted here [1]). So, check this to copy
correct init data if the current iteration is for the legacy states.

At least, I may need to improve the readability here.

[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/x86/kernel/fpu/xstate.c#n416

Thanks,
Chang