diff options
-rw-r--r-- | gdbsupport/x86-xstate.h | 65 |
1 files changed, 56 insertions, 9 deletions
diff --git a/gdbsupport/x86-xstate.h b/gdbsupport/x86-xstate.h index b8740fd..6ac1c39 100644 --- a/gdbsupport/x86-xstate.h +++ b/gdbsupport/x86-xstate.h @@ -20,22 +20,69 @@ #ifndef COMMON_X86_XSTATE_H #define COMMON_X86_XSTATE_H +/* The extended state feature IDs in the state component bitmap. */ +#define X86_XSTATE_X87_ID 0 +#define X86_XSTATE_SSE_ID 1 +#define X86_XSTATE_AVX_ID 2 +#define X86_XSTATE_BNDREGS_ID 3 +#define X86_XSTATE_BNDCFG_ID 4 +#define X86_XSTATE_K_ID 5 +#define X86_XSTATE_ZMM_H_ID 6 +#define X86_XSTATE_ZMM_ID 7 +#define X86_XSTATE_PKRU_ID 9 + /* The extended state feature bits. */ -#define X86_XSTATE_X87 (1ULL << 0) -#define X86_XSTATE_SSE (1ULL << 1) -#define X86_XSTATE_AVX (1ULL << 2) -#define X86_XSTATE_BNDREGS (1ULL << 3) -#define X86_XSTATE_BNDCFG (1ULL << 4) +#define X86_XSTATE_X87 (1ULL << X86_XSTATE_X87_ID) +#define X86_XSTATE_SSE (1ULL << X86_XSTATE_SSE_ID) +#define X86_XSTATE_AVX (1ULL << X86_XSTATE_AVX_ID) +#define X86_XSTATE_BNDREGS (1ULL << X86_XSTATE_BNDREGS_ID) +#define X86_XSTATE_BNDCFG (1ULL << X86_XSTATE_BNDCFG_ID) #define X86_XSTATE_MPX (X86_XSTATE_BNDREGS | X86_XSTATE_BNDCFG) /* AVX 512 adds three feature bits. All three must be enabled. */ -#define X86_XSTATE_K (1ULL << 5) -#define X86_XSTATE_ZMM_H (1ULL << 6) -#define X86_XSTATE_ZMM (1ULL << 7) +#define X86_XSTATE_K (1ULL << X86_XSTATE_K_ID) +#define X86_XSTATE_ZMM_H (1ULL << X86_XSTATE_ZMM_H_ID) +#define X86_XSTATE_ZMM (1ULL << X86_XSTATE_ZMM_ID) #define X86_XSTATE_AVX512 (X86_XSTATE_K | X86_XSTATE_ZMM_H \ | X86_XSTATE_ZMM) -#define X86_XSTATE_PKRU (1ULL << 9) +#define X86_XSTATE_PKRU (1ULL << X86_XSTATE_PKRU_ID) + +/* Total size of the XSAVE area extended region and offsets of + register states within the region. Offsets are set to 0 to + indicate the absence of the associated registers. */ + +struct x86_xsave_layout +{ + int sizeof_xsave = 0; + int avx_offset = 0; + int bndregs_offset = 0; + int bndcfg_offset = 0; + int k_offset = 0; + int zmm_h_offset = 0; + int zmm_offset = 0; + int pkru_offset = 0; +}; + +constexpr bool operator== (const x86_xsave_layout &lhs, + const x86_xsave_layout &rhs) +{ + return lhs.sizeof_xsave == rhs.sizeof_xsave + && lhs.avx_offset == rhs.avx_offset + && lhs.bndregs_offset == rhs.bndregs_offset + && lhs.bndcfg_offset == rhs.bndcfg_offset + && lhs.k_offset == rhs.k_offset + && lhs.zmm_h_offset == rhs.zmm_h_offset + && lhs.zmm_offset == rhs.zmm_offset + && lhs.pkru_offset == rhs.pkru_offset; +} + +constexpr bool operator!= (const x86_xsave_layout &lhs, + const x86_xsave_layout &rhs) +{ + return !(lhs == rhs); +} + /* Supported mask and size of the extended state. */ #define X86_XSTATE_X87_MASK X86_XSTATE_X87 |