tech-kern archive

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

Re: [PATCH v2 1/2] Fetch XSAVE area component offsets and sizes when initializing x86 CPU



On 05.06.2019 17:59, Paul Goyette wrote:
> An easier question:
> 
> Does an old HAXM module still work correctly with a new kernel?  AND
> Does a new HAXM module still work correctly with an old kernel?
> 

Actually HAXM does not use these structs but I propose to bump minor
number nonetheless as we want to keep kernel and modules (ptrace is a
module) synced.

> 
> 
> On Wed, 5 Jun 2019, Paul Goyette wrote:
> 
>> On Wed, 5 Jun 2019, Kamil Rytarowski wrote:
>>
>>> On 05.06.2019 17:32, Paul Goyette wrote:
>>>> Are there any userland programs that use cpu.h?  Or any kernel modules?
>>>
>>> We use cpu.h, e.g. when prompting for CPU_MACHDEP values with sysctl(3).
>>>
>>> HAXM as a kernel module uses cpu.h.
>>
>> Well, just #include doesn't mean we need a bump.  Do either of these
>> result in a change to the data being shared with the kernel?
>>
>> For example, does HAXM actually share any 'struct x86_fpu_save' (or
>> any larger struct that contains a x86_fpu_save) with the kernel?  Or
>> do the sysctl variables include a struct x86_fpu_save?
>>
>>
>>
>>>> If so, these changes would create a change in the kernel API and would
>>>> therefore require a kernel version bump.
>>>>
>>>>
>>>>
>>>>
>>>>> Introduce two new arrays, x86_xsave_offsets and x86_xsave_sizes,
>>>>> and initialize them with XSAVE area component offsets and sizes
>>>>> queried
>>>>> via CPUID.  This will be needed to implement getters and setters for
>>>>> additional register types.
>>>>>
>>>>> While at it, add XSAVE_* constants corresponding to specific XSAVE
>>>>> components.
>>>>> ---
>>>>> sys/arch/x86/include/cpu.h        |  2 ++
>>>>> sys/arch/x86/include/specialreg.h | 20 ++++++++++++++++++++
>>>>> sys/arch/x86/x86/identcpu.c       | 12 ++++++++++++
>>>>> 3 files changed, 34 insertions(+)
>>>>>
>>>>> diff --git a/sys/arch/x86/include/cpu.h b/sys/arch/x86/include/cpu.h
>>>>> index 143ae3c5c5ec..589f179ce758 100644
>>>>> --- a/sys/arch/x86/include/cpu.h
>>>>> +++ b/sys/arch/x86/include/cpu.h
>>>>> @@ -459,6 +459,8 @@ extern int x86_fpu_save;
>>>>> #define    FPU_SAVE_XSAVEOPT    3
>>>>> extern unsigned int x86_fpu_save_size;
>>>>> extern uint64_t x86_xsave_features;
>>>>> +extern size_t x86_xsave_offsets[];
>>>>> +extern size_t x86_xsave_sizes[];
>>>>> extern uint32_t x86_fpu_mxcsr_mask;
>>>>> extern bool x86_fpu_eager;
>>>>>
>>>>> diff --git a/sys/arch/x86/include/specialreg.h
>>>>> b/sys/arch/x86/include/specialreg.h
>>>>> index 4f8c4cca6db7..1c0e8c972b07 100644
>>>>> --- a/sys/arch/x86/include/specialreg.h
>>>>> +++ b/sys/arch/x86/include/specialreg.h
>>>>> @@ -146,6 +146,26 @@
>>>>> #define XCR0_FPU    (XCR0_X87 | XCR0_SSE | XCR0_YMM_Hi128 | \
>>>>>              XCR0_Opmask | XCR0_ZMM_Hi256 | XCR0_Hi16_ZMM)
>>>>>
>>>>> +/*
>>>>> + * XSAVE component indices.
>>>>> + */
>>>>> +#define XSAVE_X87    0
>>>>> +#define XSAVE_SSE    1
>>>>> +#define XSAVE_YMM_Hi128    2
>>>>> +#define XSAVE_BNDREGS    3
>>>>> +#define XSAVE_BNDCSR    4
>>>>> +#define XSAVE_Opmask    5
>>>>> +#define XSAVE_ZMM_Hi256    6
>>>>> +#define XSAVE_Hi16_ZMM    7
>>>>> +#define XSAVE_PT    8
>>>>> +#define XSAVE_PKRU    9
>>>>> +#define XSAVE_HDC    10
>>>>> +
>>>>> +/*
>>>>> + * Highest XSAVE component enabled by XCR0_FPU.
>>>>> + */
>>>>> +#define XSAVE_MAX_COMPONENT XSAVE_Hi16_ZMM
>>>>> +
>>>>> /*
>>>>>  * CPUID "features" bits
>>>>>  */
>>>>> diff --git a/sys/arch/x86/x86/identcpu.c b/sys/arch/x86/x86/identcpu.c
>>>>> index 9037fb2673fd..9714865bfb43 100644
>>>>> --- a/sys/arch/x86/x86/identcpu.c
>>>>> +++ b/sys/arch/x86/x86/identcpu.c
>>>>> @@ -74,6 +74,8 @@ char cpu_brand_string[49];
>>>>> int x86_fpu_save __read_mostly;
>>>>> unsigned int x86_fpu_save_size __read_mostly = sizeof(struct save87);
>>>>> uint64_t x86_xsave_features __read_mostly = 0;
>>>>> +size_t x86_xsave_offsets[XSAVE_MAX_COMPONENT] __read_mostly;
>>>>> +size_t x86_xsave_sizes[XSAVE_MAX_COMPONENT] __read_mostly;
>>>>>
>>>>> /*
>>>>>  * Note: these are just the ones that may not have a cpuid
>>>>> instruction.
>>>>> @@ -755,6 +757,7 @@ static void
>>>>> cpu_probe_fpu(struct cpu_info *ci)
>>>>> {
>>>>>     u_int descs[4];
>>>>> +    int i;
>>>>>
>>>>>     x86_fpu_eager = true;
>>>>>     x86_fpu_save = FPU_SAVE_FSAVE;
>>>>> @@ -816,6 +819,15 @@ cpu_probe_fpu(struct cpu_info *ci)
>>>>>         x86_fpu_save_size = descs[2];
>>>>>
>>>>>     x86_xsave_features = (uint64_t)descs[3] << 32 | descs[0];
>>>>> +
>>>>> +    /* Get component offsets and sizes for the save area */
>>>>> +    for (i = XSAVE_YMM_Hi128; i < __arraycount(x86_xsave_offsets);
>>>>> i++) {
>>>>> +        if (x86_xsave_features & ((uint64_t)1 << i)) {
>>>>> +            x86_cpuid2(0xd, i, descs);
>>>>> +            x86_xsave_offsets[i] = descs[1];
>>>>> +            x86_xsave_sizes[i] = descs[0];
>>>>> +        }
>>>>> +    }
>>>>> }
>>>>>
>>>>> void
>>>>> -- 
>>>>> 2.22.0.rc3
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>> +--------------------+--------------------------+-----------------------+
>>>>
>>>> | Paul Goyette       | PGP Key fingerprint:     | E-mail
>>>> addresses:     |
>>>> | (Retired)          | FA29 0E3B 35AF E8AE 6651 |
>>>> paul%whooppee.com@localhost     |
>>>> | Software Developer | 0786 F758 55DE 53BA 7731 |
>>>> pgoyette%netbsd.org@localhost   |
>>>> +--------------------+--------------------------+-----------------------+
>>>>
>>>
>>>
>>>
>>
>> +--------------------+--------------------------+-----------------------+
>> | Paul Goyette       | PGP Key fingerprint:     | E-mail addresses:     |
>> | (Retired)          | FA29 0E3B 35AF E8AE 6651 | paul%whooppee.com@localhost     |
>> | Software Developer | 0786 F758 55DE 53BA 7731 | pgoyette%netbsd.org@localhost   |
>> +--------------------+--------------------------+-----------------------+
>>
>> !DSPAM:5cf7e5e166371668321042!
>>
> 
> +--------------------+--------------------------+-----------------------+
> | Paul Goyette       | PGP Key fingerprint:     | E-mail addresses:     |
> | (Retired)          | FA29 0E3B 35AF E8AE 6651 | paul%whooppee.com@localhost     |
> | Software Developer | 0786 F758 55DE 53BA 7731 | pgoyette%netbsd.org@localhost   |
> +--------------------+--------------------------+-----------------------+


Attachment: signature.asc
Description: OpenPGP digital signature



Home | Main Index | Thread Index | Old Index