Print this page
15254 %ymm registers not restored after signal handler
15367 x86 getfpregs() summons corrupting %xmm ghosts
15333 want x86 /proc xregs support (libc_db, libproc, mdb, etc.)
15336 want libc functions for extended ucontext_t
15334 want ps_lwphandle-specific reg routines
15328 FPU_CW_INIT mistreats reserved bit
15335 i86pc fpu_subr.c isn't really platform-specific
15332 setcontext(2) isn't actually noreturn
15331 need <sys/stdalign.h>
Change-Id: I7060aa86042dfb989f77fc3323c065ea2eafa9ad
Conflicts:
    usr/src/uts/common/fs/proc/prcontrol.c
    usr/src/uts/intel/os/archdep.c
    usr/src/uts/intel/sys/ucontext.h
    usr/src/uts/intel/syscall/getcontext.c

*** 6093,6117 **** if (vabits) *vabits = cpi->cpi_vabits; } size_t ! cpuid_get_xsave_size() { return (MAX(cpuid_info0.cpi_xsave.xsav_max_size, sizeof (struct xsave_state))); } /* * Return true if the CPUs on this system require 'pointer clearing' for the * floating point error pointer exception handling. In the past, this has been * true for all AMD K7 & K8 CPUs, although newer AMD CPUs have been changed to * behave the same as Intel. This is checked via the CPUID_AMD_EBX_ERR_PTR_ZERO * feature bit and is reflected in the cpi_fp_amd_save member. */ boolean_t ! cpuid_need_fp_excp_handling() { return (cpuid_info0.cpi_vendor == X86_VENDOR_AMD && cpuid_info0.cpi_fp_amd_save != 0); } --- 6093,6160 ---- if (vabits) *vabits = cpi->cpi_vabits; } size_t ! cpuid_get_xsave_size(void) { return (MAX(cpuid_info0.cpi_xsave.xsav_max_size, sizeof (struct xsave_state))); } /* + * Export information about known offsets to the kernel. We only care about + * things we have actually enabled support for in %xcr0. + */ + void + cpuid_get_xsave_info(uint64_t bit, size_t *sizep, size_t *offp) + { + size_t size, off; + + VERIFY3U(bit & xsave_bv_all, !=, 0); + + if (sizep == NULL) + sizep = &size; + if (offp == NULL) + offp = &off; + + switch (bit) { + case XFEATURE_LEGACY_FP: + case XFEATURE_SSE: + *sizep = sizeof (struct fxsave_state); + *offp = 0; + break; + case XFEATURE_AVX: + *sizep = cpuid_info0.cpi_xsave.ymm_size; + *offp = cpuid_info0.cpi_xsave.ymm_offset; + break; + case XFEATURE_AVX512_OPMASK: + *sizep = cpuid_info0.cpi_xsave.opmask_size; + *offp = cpuid_info0.cpi_xsave.opmask_offset; + break; + case XFEATURE_AVX512_ZMM: + *sizep = cpuid_info0.cpi_xsave.zmmlo_size; + *offp = cpuid_info0.cpi_xsave.zmmlo_offset; + break; + case XFEATURE_AVX512_HI_ZMM: + *sizep = cpuid_info0.cpi_xsave.zmmhi_size; + *offp = cpuid_info0.cpi_xsave.zmmhi_offset; + break; + default: + panic("asked for unsupported xsave feature: 0x%lx", bit); + } + } + + /* * Return true if the CPUs on this system require 'pointer clearing' for the * floating point error pointer exception handling. In the past, this has been * true for all AMD K7 & K8 CPUs, although newer AMD CPUs have been changed to * behave the same as Intel. This is checked via the CPUID_AMD_EBX_ERR_PTR_ZERO * feature bit and is reflected in the cpi_fp_amd_save member. */ boolean_t ! cpuid_need_fp_excp_handling(void) { return (cpuid_info0.cpi_vendor == X86_VENDOR_AMD && cpuid_info0.cpi_fp_amd_save != 0); }