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/fp.h
          +++ new/usr/src/uts/intel/sys/fp.h
↓ open down ↓ 13 lines elided ↑ open up ↑
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  /*
  22   22   * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
  23   23   * Copyright (c) 2018, Joyent, Inc.
  24      - * Copyright 2022 Oxide Computer Company
       24 + * Copyright 2023 Oxide Computer Company
  25   25   *
  26   26   * Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved.
  27   27   */
  28   28  
  29   29  /*      Copyright (c) 1990, 1991 UNIX System Laboratories, Inc. */
  30   30  /*      Copyright (c) 1984, 1986, 1987, 1988, 1989, 1990 AT&T   */
  31   31  /*              All Rights Reserved                             */
  32   32  
  33   33  #ifndef _SYS_FP_H
  34   34  #define _SYS_FP_H
↓ open down ↓ 93 lines elided ↑ open up ↑
 128  128   */
 129  129  #define FPS_SW_EFLAGS   \
 130  130          (FPS_IE|FPS_DE|FPS_ZE|FPS_OE|FPS_UE|FPS_PE|FPS_SF|FPS_ES|FPS_B)
 131  131  
 132  132  /*
 133  133   * Initial value of FPU control word as per 4th ed. ABI document
 134  134   * - affine infinity
 135  135   * - round to nearest or even
 136  136   * - 64-bit double precision
 137  137   * - all exceptions masked
      138 + *
      139 + * The 4th ed. SVR4 ABI didn't discuss the value of reserved bits. The ISA
      140 + * defines bit 6 (0x40) as reserved, but also that it is set (rather than clear,
      141 + * like many other Reserved bits). We preserve that in our value here.
 138  142   */
 139      -#define FPU_CW_INIT     0x133f
      143 +#define FPU_CW_INIT     0x137f
 140  144  
 141  145  /*
      146 + * This is the Intel mandated form of the default value of the x87 control word.
      147 + * This is different from what we use and should only be used in the context of
      148 + * representing that default state (e.g. in /proc xregs).
      149 + */
      150 +#define FPU_CW_INIT_HW  0x037f
      151 +
      152 +/*
 142  153   * masks and flags for SSE/SSE2 MXCSR
 143  154   */
 144  155  #define SSE_IE  0x00000001      /* invalid operation                    */
 145  156  #define SSE_DE  0x00000002      /* denormalized operand                 */
 146  157  #define SSE_ZE  0x00000004      /* zero divide                          */
 147  158  #define SSE_OE  0x00000008      /* overflow                             */
 148  159  #define SSE_UE  0x00000010      /* underflow                            */
 149  160  #define SSE_PE  0x00000020      /* precision                            */
 150  161  #define SSE_DAZ 0x00000040      /* denormals are zero                   */
 151  162  #define SSE_IM  0x00000080      /* invalid op exception mask            */
↓ open down ↓ 142 lines elided ↑ open up ↑
 294  305  #define MIN_XSAVE_SIZE  (sizeof (struct fxsave_state) + \
 295  306                              sizeof (struct xsave_header))
 296  307  
 297  308  /*
 298  309   * Kernel's FPU save area
 299  310   */
 300  311  typedef struct {
 301  312          union _kfpu_u {
 302  313                  void *kfpu_generic;
 303  314                  struct fxsave_state *kfpu_fx;
 304      -#if defined(__i386)
 305      -                struct fnsave_state *kfpu_fn;
 306      -#endif
 307  315                  struct xsave_state *kfpu_xs;
 308  316          } kfpu_u;
 309  317          uint32_t kfpu_status;           /* saved at #mf exception */
 310  318          uint32_t kfpu_xstatus;          /* saved at #xm exception */
 311  319  } kfpu_t;
 312  320  
 313      -extern int fp_kind;             /* kind of fp support                   */
 314      -extern int fp_save_mech;        /* fp save/restore mechanism            */
 315      -extern int fpu_exists;          /* FPU hw exists                        */
      321 +extern int fp_kind;             /* kind of fp support */
      322 +extern int fp_save_mech;        /* fp save/restore mechanism */
      323 +extern int fpu_exists;          /* FPU hw exists */
      324 +extern int fp_elf;              /* FP elf type */
      325 +extern uint64_t xsave_bv_all;   /* Set of enabed xcr0 values */
 316  326  
 317  327  #ifdef _KERNEL
 318  328  
 319  329  extern int fpu_ignored;
 320  330  extern int fpu_pentium_fdivbug;
 321  331  
 322  332  extern uint32_t sse_mxcsr_mask;
 323  333  
 324  334  extern void fpu_probe(void);
 325  335  extern uint_t fpu_initial_probe(void);
 326  336  
 327  337  extern void fpu_auxv_info(int *, size_t *);
      338 +extern boolean_t fpu_xsave_enabled(void);
 328  339  
 329  340  extern void fpnsave_ctxt(void *);
 330  341  extern void fpxsave_ctxt(void *);
 331  342  extern void xsave_ctxt(void *);
 332  343  extern void xsaveopt_ctxt(void *);
 333  344  extern void fpxsave_excp_clr_ctxt(void *);
 334  345  extern void xsave_excp_clr_ctxt(void *);
 335  346  extern void xsaveopt_excp_clr_ctxt(void *);
 336  347  extern void (*fpsave_ctxt)(void *);
 337  348  extern void (*xsavep)(struct xsave_state *, uint64_t);
 338  349  
 339  350  extern void fpxrestore_ctxt(void *);
 340  351  extern void xrestore_ctxt(void *);
 341  352  extern void (*fprestore_ctxt)(void *);
 342  353  
 343  354  extern void fxsave_insn(struct fxsave_state *);
 344      -extern void fpsave(struct fnsave_state *);
 345      -extern void fprestore(struct fnsave_state *);
 346  355  extern void fpxsave(struct fxsave_state *);
 347  356  extern void fpxrestore(struct fxsave_state *);
 348  357  extern void xsave(struct xsave_state *, uint64_t);
 349  358  extern void xsaveopt(struct xsave_state *, uint64_t);
 350  359  extern void xrestore(struct xsave_state *, uint64_t);
 351  360  
 352  361  extern void fpenable(void);
 353  362  extern void fpdisable(void);
 354  363  extern void fpinit(void);
 355  364  
↓ open down ↓ 10 lines elided ↑ open up ↑
 366  375  extern void fp_seed(void);
 367  376  extern void fp_exec(void);
 368  377  struct _klwp;
 369  378  extern void fp_lwp_init(struct _klwp *);
 370  379  extern void fp_lwp_cleanup(struct _klwp *);
 371  380  extern void fp_lwp_dup(struct _klwp *);
 372  381  
 373  382  extern const struct fxsave_state sse_initial;
 374  383  extern const struct xsave_state avx_initial;
 375  384  
      385 +struct proc;
      386 +struct ucontext;
      387 +extern void fpu_proc_xregs_info(struct proc *, uint32_t *, uint32_t *,
      388 +    uint32_t *);
      389 +extern size_t fpu_proc_xregs_max_size(void);
      390 +extern void fpu_proc_xregs_get(struct _klwp *, void *);
      391 +extern int fpu_proc_xregs_set(struct _klwp *, void *);
      392 +extern int fpu_signal_copyin(struct _klwp *, struct ucontext *);
      393 +typedef int (*fpu_copyout_f)(const void *, void *, size_t);
      394 +extern int fpu_signal_copyout(struct _klwp *, uintptr_t, fpu_copyout_f);
      395 +extern void fpu_set_xsave(struct _klwp *, const void *);
      396 +extern size_t fpu_signal_size(struct _klwp *);
      397 +
      398 +extern void fpu_get_fpregset(struct _klwp *, fpregset_t *);
      399 +extern void fpu_set_fpregset(struct _klwp *, const fpregset_t *);
      400 +
 376  401  #endif  /* _KERNEL */
 377  402  
 378  403  #ifdef __cplusplus
 379  404  }
 380  405  #endif
 381  406  
 382  407  #endif  /* _SYS_FP_H */
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX