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
    
      
        | Split | 
	Close | 
      
      | Expand all | 
      | Collapse all | 
    
    
          --- old/usr/src/uts/intel/sys/procfs_isa.h
          +++ new/usr/src/uts/intel/sys/procfs_isa.h
   1    1  /*
   2    2   * CDDL HEADER START
   3    3   *
   4    4   * The contents of this file are subject to the terms of the
   5    5   * Common Development and Distribution License, Version 1.0 only
   6    6   * (the "License").  You may not use this file except in compliance
   7    7   * with the License.
   8    8   *
   9    9   * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10   10   * or http://www.opensolaris.org/os/licensing.
  11   11   * See the License for the specific language governing permissions
  12   12   * and limitations under the License.
  13   13   *
  14   14   * When distributing Covered Code, include this CDDL HEADER in each
  15   15   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16   16   * If applicable, add the following below this CDDL HEADER, with the
  
    | 
      ↓ open down ↓ | 
    16 lines elided | 
    
      ↑ open up ↑ | 
  
  17   17   * fields enclosed by brackets "[]" replaced with your own identifying
  18   18   * information: Portions Copyright [yyyy] [name of copyright owner]
  19   19   *
  20   20   * CDDL HEADER END
  21   21   */
  22   22  /*
  23   23   * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
  24   24   * Use is subject to license terms.
  25   25   */
  26   26  
       27 +/*
       28 + * Copyright 2023 Oxide Computer Company
       29 + */
       30 +
  27   31  #ifndef _SYS_PROCFS_ISA_H
  28   32  #define _SYS_PROCFS_ISA_H
  29   33  
  30   34  /*
  31   35   * Instruction Set Architecture specific component of <sys/procfs.h>
  32   36   * i386 version
  33   37   */
  34   38  
  35   39  #include <sys/regset.h>
  36   40  
  37   41  #ifdef  __cplusplus
  38   42  extern "C" {
  39   43  #endif
  40   44  
  41   45  /*
  42   46   * Possible values of pr_dmodel.
  43   47   * This isn't isa-specific, but it needs to be defined here for other reasons.
  44   48   */
  45   49  #define PR_MODEL_UNKNOWN 0
  46   50  #define PR_MODEL_ILP32  1       /* process data model is ILP32 */
  47   51  #define PR_MODEL_LP64   2       /* process data model is LP64 */
  48   52  
  49   53  /*
  50   54   * To determine whether application is running native.
  51   55   */
  52   56  #if defined(_LP64)
  53   57  #define PR_MODEL_NATIVE PR_MODEL_LP64
  54   58  #elif defined(_ILP32)
  55   59  #define PR_MODEL_NATIVE PR_MODEL_ILP32
  56   60  #else
  57   61  #error "No DATAMODEL_NATIVE specified"
  58   62  #endif  /* _LP64 || _ILP32 */
  59   63  
  60   64  #if defined(__i386) || defined(__amd64)
  61   65  /*
  62   66   * Holds one i386 or amd64 instruction
  63   67   */
  64   68  typedef uchar_t instr_t;
  65   69  #endif
  66   70  
  67   71  #define NPRGREG         _NGREG
  68   72  #define prgreg_t        greg_t
  69   73  #define prgregset_t     gregset_t
  70   74  #define prfpregset      _fpu
  71   75  #define prfpregset_t    fpregset_t
  72   76  
  73   77  #if defined(_SYSCALL32)
  74   78  /*
  75   79   * kernel view of the ia32 register set
  76   80   */
  77   81  typedef uchar_t         instr32_t;
  78   82  #if defined(__amd64)
  79   83  #define NPRGREG32       _NGREG32
  80   84  #define prgreg32_t      greg32_t
  81   85  #define prgregset32_t   gregset32_t
  82   86  #define prfpregset32    fpu32
  83   87  #define prfpregset32_t  fpregset32_t
  84   88  #else
  85   89  #define NPRGREG32       _NGREG
  86   90  #define prgreg32_t      greg_t
  87   91  #define prgregset32_t   gregset_t
  88   92  #define prfpregset32    _fpu
  89   93  #define prfpregset32_t  fpregset_t
  90   94  #endif
  91   95  #endif  /* _SYSCALL32 */
  92   96  
  93   97  #if defined(__amd64)
  94   98  /*
  95   99   * The following defines are for portability (see <sys/regset.h>).
  96  100   */
  97  101  #define R_PC    REG_RIP
  98  102  #define R_PS    REG_RFL
  99  103  #define R_SP    REG_RSP
 100  104  #define R_FP    REG_RBP
 101  105  #define R_R0    REG_RAX
 102  106  #define R_R1    REG_RDX
 103  107  #elif defined(__i386)
 104  108  /*
  
    | 
      ↓ open down ↓ | 
    68 lines elided | 
    
      ↑ open up ↑ | 
  
 105  109   * The following defines are for portability (see <sys/regset.h>).
 106  110   */
 107  111  #define R_PC    EIP
 108  112  #define R_PS    EFL
 109  113  #define R_SP    UESP
 110  114  #define R_FP    EBP
 111  115  #define R_R0    EAX
 112  116  #define R_R1    EDX
 113  117  #endif
 114  118  
      119 +/*
      120 + * The x86 xregs structure is a blob of data that contains a header with several
      121 + * descriptors that describe the region of additional data that corresponds to
      122 + * it. Effectively this looks like:
      123 + *
      124 + * 0  +-----------------+
      125 + *    | prxregset_hdr_t |
      126 + *    +-----------------+
      127 + *    | Info 0 (XCR)    |-------+
      128 + *    +-----------------+       |
      129 + *    | Info 1 (XSAVE)  |----------+
      130 + *    +-----------------+       |  |
      131 + *           ...                |  |
      132 + *    +-----------------+       |  |
      133 + *    | Info n (Hi ZMM) |-------------+
      134 + *    +-----------------+       |  |  |
      135 + *    +-----------------+       |  |  |
      136 + *    | prxregset_xcr_t |<------+  |  |
      137 + *    +-----------------+          |  |
      138 + *    +-------------------+        |  |
      139 + *    | prxregset_xsave_t |<-------+  |
      140 + *    |                   |           |
      141 + *    | XMM + xsave       |           |
      142 + *    +-------------------+           |
      143 + *           ...                      |
      144 + *    +---------------------+         |
      145 + *    | prxregset_hi_zmm_t  |<--------+
      146 + *    |                     |
      147 + *    | 1 KiB %zmm16-%zmm31 |
      148 + *    +---------------------+
      149 + *
      150 + * The actual structure size will vary based on the CPU features present. For
      151 + * more information, see proc(5). When adding structures, please make sure all
      152 + * structures are multiples of 16 bytes (0x10) so as to ensure alignment.
      153 + */
      154 +typedef struct prxregset prxregset_t;
      155 +
      156 +#define PRX_INFO_XCR    0x01
      157 +#define PRX_INFO_XSAVE  0x02
      158 +#define PRX_INFO_YMM    0x03
      159 +#define PRX_INFO_OPMASK 0x04
      160 +#define PRX_INFO_ZMM    0x05
      161 +#define PRX_INFO_HI_ZMM 0x06
      162 +
      163 +typedef struct prxregset_info {
      164 +        uint32_t pri_type;
      165 +        uint32_t pri_flags;
      166 +        uint32_t pri_size;
      167 +        uint32_t pri_offset;
      168 +} prxregset_info_t;
      169 +
      170 +#define PR_TYPE_XSAVE   0x01
      171 +
      172 +typedef struct prxregset_hdr {
      173 +        uint32_t        pr_type;
      174 +        uint32_t        pr_size;
      175 +        uint32_t        pr_flags;
      176 +        uint32_t        pr_pad[4];
      177 +        uint32_t        pr_ninfo;
      178 +#if defined(_STDC_C99) || defined(__C99FEATURES__)
      179 +        prxregset_info_t pr_info[];
      180 +#endif
      181 +} prxregset_hdr_t;
      182 +
      183 +typedef struct prxregset_xcr {
      184 +        uint64_t        prx_xcr_xcr0;
      185 +        uint64_t        prx_xcr_xfd;
      186 +        uint64_t        prx_xcr_pad[2];
      187 +} prxregset_xcr_t;
      188 +
      189 +typedef struct prxregset_xsave {
      190 +        uint16_t        prx_fx_fcw;
      191 +        uint16_t        prx_fx_fsw;
      192 +        uint16_t        prx_fx_fctw;    /* compressed tag word */
      193 +        uint16_t        prx_fx_fop;
      194 +#if defined(__amd64)
      195 +        uint64_t        prx_fx_rip;
      196 +        uint64_t        prx_fx_rdp;
      197 +#else
      198 +        uint32_t        prx_fx_eip;
      199 +        uint16_t        prx_fx_cs;
      200 +        uint16_t        __prx_fx_ign0;
      201 +        uint32_t        prx_fx_dp;
      202 +        uint16_t        prx_fx_ds;
      203 +        uint16_t        __prx_fx_ign1;
      204 +#endif
      205 +        uint32_t        prx_fx_mxcsr;
      206 +        uint32_t        prx_fx_mxcsr_mask;
      207 +        union {
      208 +                uint16_t prx_fpr_16[5]; /* 80-bits of x87 state */
      209 +                u_longlong_t prx_fpr_mmx;       /* 64-bit mmx register */
      210 +                uint32_t _prx__fpr_pad[4];      /* (pad out to 128-bits) */
      211 +        } fx_st[8];
      212 +#if defined(__amd64)
      213 +        upad128_t       prx_fx_xmm[16]; /* 128-bit registers */
      214 +        upad128_t       __prx_fx_ign2[6];
      215 +#else
      216 +        upad128_t       prx_fx_xmm[8];  /* 128-bit registers */
      217 +        upad128_t       __prx_fx_ign2[14];
      218 +#endif
      219 +        uint64_t        prx_xsh_xstate_bv;
      220 +        uint64_t        prx_xsh_xcomp_bv;
      221 +        uint64_t        prx_xsh_reserved[6];
      222 +} prxregset_xsave_t;
      223 +
      224 +typedef struct prxregset_ymm {
      225 +#if defined(__amd64)
      226 +        upad128_t       prx_ymm[16];
      227 +#else
      228 +        upad128_t       prx_ymm[8];
      229 +        upad128_t       prx_rsvd[8];
      230 +#endif
      231 +} prxregset_ymm_t;
      232 +
      233 +typedef struct prxregset_opmask {
      234 +        uint64_t        prx_opmask[8];
      235 +} prxregset_opmask_t;
      236 +
      237 +typedef struct prxregset_zmm {
      238 +#if defined(__amd64)
      239 +        upad256_t       prx_zmm[16];
      240 +#else
      241 +        upad256_t       prx_zmm[8];
      242 +        upad256_t       prx_rsvd[8];
      243 +#endif
      244 +} prxregset_zmm_t;
      245 +
      246 +typedef struct prxregset_hi_zmm {
      247 +#if defined(__amd64)
      248 +        upad512_t       prx_hi_zmm[16];
      249 +#else
      250 +        upad512_t       prx_rsvd[16];
      251 +#endif
      252 +} prxregset_hi_zmm_t;
      253 +
 115  254  #ifdef  __cplusplus
 116  255  }
 117  256  #endif
 118  257  
 119  258  #endif  /* _SYS_PROCFS_ISA_H */
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX