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);
  }