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

*** 22,31 **** --- 22,35 ---- /* * Copyright 2005 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ + /* + * Copyright 2023 Oxide Computer Company + */ + #ifndef _SYS_PROCFS_ISA_H #define _SYS_PROCFS_ISA_H /* * Instruction Set Architecture specific component of <sys/procfs.h>
*** 110,119 **** --- 114,258 ---- #define R_FP EBP #define R_R0 EAX #define R_R1 EDX #endif + /* + * The x86 xregs structure is a blob of data that contains a header with several + * descriptors that describe the region of additional data that corresponds to + * it. Effectively this looks like: + * + * 0 +-----------------+ + * | prxregset_hdr_t | + * +-----------------+ + * | Info 0 (XCR) |-------+ + * +-----------------+ | + * | Info 1 (XSAVE) |----------+ + * +-----------------+ | | + * ... | | + * +-----------------+ | | + * | Info n (Hi ZMM) |-------------+ + * +-----------------+ | | | + * +-----------------+ | | | + * | prxregset_xcr_t |<------+ | | + * +-----------------+ | | + * +-------------------+ | | + * | prxregset_xsave_t |<-------+ | + * | | | + * | XMM + xsave | | + * +-------------------+ | + * ... | + * +---------------------+ | + * | prxregset_hi_zmm_t |<--------+ + * | | + * | 1 KiB %zmm16-%zmm31 | + * +---------------------+ + * + * The actual structure size will vary based on the CPU features present. For + * more information, see proc(5). When adding structures, please make sure all + * structures are multiples of 16 bytes (0x10) so as to ensure alignment. + */ + typedef struct prxregset prxregset_t; + + #define PRX_INFO_XCR 0x01 + #define PRX_INFO_XSAVE 0x02 + #define PRX_INFO_YMM 0x03 + #define PRX_INFO_OPMASK 0x04 + #define PRX_INFO_ZMM 0x05 + #define PRX_INFO_HI_ZMM 0x06 + + typedef struct prxregset_info { + uint32_t pri_type; + uint32_t pri_flags; + uint32_t pri_size; + uint32_t pri_offset; + } prxregset_info_t; + + #define PR_TYPE_XSAVE 0x01 + + typedef struct prxregset_hdr { + uint32_t pr_type; + uint32_t pr_size; + uint32_t pr_flags; + uint32_t pr_pad[4]; + uint32_t pr_ninfo; + #if defined(_STDC_C99) || defined(__C99FEATURES__) + prxregset_info_t pr_info[]; + #endif + } prxregset_hdr_t; + + typedef struct prxregset_xcr { + uint64_t prx_xcr_xcr0; + uint64_t prx_xcr_xfd; + uint64_t prx_xcr_pad[2]; + } prxregset_xcr_t; + + typedef struct prxregset_xsave { + uint16_t prx_fx_fcw; + uint16_t prx_fx_fsw; + uint16_t prx_fx_fctw; /* compressed tag word */ + uint16_t prx_fx_fop; + #if defined(__amd64) + uint64_t prx_fx_rip; + uint64_t prx_fx_rdp; + #else + uint32_t prx_fx_eip; + uint16_t prx_fx_cs; + uint16_t __prx_fx_ign0; + uint32_t prx_fx_dp; + uint16_t prx_fx_ds; + uint16_t __prx_fx_ign1; + #endif + uint32_t prx_fx_mxcsr; + uint32_t prx_fx_mxcsr_mask; + union { + uint16_t prx_fpr_16[5]; /* 80-bits of x87 state */ + u_longlong_t prx_fpr_mmx; /* 64-bit mmx register */ + uint32_t _prx__fpr_pad[4]; /* (pad out to 128-bits) */ + } fx_st[8]; + #if defined(__amd64) + upad128_t prx_fx_xmm[16]; /* 128-bit registers */ + upad128_t __prx_fx_ign2[6]; + #else + upad128_t prx_fx_xmm[8]; /* 128-bit registers */ + upad128_t __prx_fx_ign2[14]; + #endif + uint64_t prx_xsh_xstate_bv; + uint64_t prx_xsh_xcomp_bv; + uint64_t prx_xsh_reserved[6]; + } prxregset_xsave_t; + + typedef struct prxregset_ymm { + #if defined(__amd64) + upad128_t prx_ymm[16]; + #else + upad128_t prx_ymm[8]; + upad128_t prx_rsvd[8]; + #endif + } prxregset_ymm_t; + + typedef struct prxregset_opmask { + uint64_t prx_opmask[8]; + } prxregset_opmask_t; + + typedef struct prxregset_zmm { + #if defined(__amd64) + upad256_t prx_zmm[16]; + #else + upad256_t prx_zmm[8]; + upad256_t prx_rsvd[8]; + #endif + } prxregset_zmm_t; + + typedef struct prxregset_hi_zmm { + #if defined(__amd64) + upad512_t prx_hi_zmm[16]; + #else + upad512_t prx_rsvd[16]; + #endif + } prxregset_hi_zmm_t; + #ifdef __cplusplus } #endif #endif /* _SYS_PROCFS_ISA_H */