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