1use zerocopy::FromBytes;
7use zerocopy::Immutable;
8use zerocopy::IntoBytes;
9use zerocopy::KnownLayout;
10
11#[repr(C)]
12#[derive(Clone, Debug, IntoBytes, Immutable, KnownLayout, FromBytes)]
13pub struct Fxsave {
14 pub fcw: u16,
15 pub fsw: u16,
16 pub ftw: u8,
17 pub reserved: u8,
18 pub fop: u16,
19 pub fip: u64,
20 pub fdp: u64,
21 pub mxcsr: u32,
22 pub mxcsr_mask: u32,
23 pub st: [[u8; 16]; 8],
24 pub xmm: [[u8; 16]; 16],
25 pub reserved2: [u8; 48],
26 pub unused: [u8; 48],
27}
28
29#[repr(C)]
30#[derive(Clone, Debug, IntoBytes, Immutable, KnownLayout, FromBytes)]
31pub struct XsaveHeader {
32 pub xstate_bv: u64,
33 pub xcomp_bv: u64,
34 pub reserved: [u64; 6],
35}
36
37pub const DEFAULT_MXCSR: u32 = 0x1f80;
38pub const INIT_FCW: u16 = 0x37f;
39
40pub const XSAVE_LEGACY_LEN: usize = size_of::<Fxsave>();
41pub const XSAVE_HEADER_LEN: usize = size_of::<XsaveHeader>();
42pub const XSAVE_VARIABLE_OFFSET: usize = XSAVE_LEGACY_LEN + XSAVE_HEADER_LEN;
43pub const XSAVE_MINIMUM_XSAVE_AREA_SIZE: u32 = 576;
44pub const XSAVE_REQUIRED_XSAVE_AREA_ALIGNMENT: u32 = 64;
45
46const XSAVE_FEATURE_INDEX_LEGACY_X87: u32 = 0;
48const XSAVE_FEATURE_INDEX_LEGACY_SSE: u32 = 1;
49const XSAVE_FEATURE_INDEX_AVX: u32 = 2;
50const XSAVE_FEATURE_INDEX_MPX_BNDREG: u32 = 3;
51const XSAVE_FEATURE_INDEX_MPX_BNDCSR: u32 = 4;
52const XSAVE_FEATURE_INDEX_AVX512_OPMASK: u32 = 5;
53const XSAVE_FEATURE_INDEX_AVX512_ZMMHI: u32 = 6;
54const XSAVE_FEATURE_INDEX_AVX512_ZMM16_31: u32 = 7;
55const XSAVE_SUPERVISOR_FEATURE_INDEX_PASID: u32 = 10;
56pub const XSAVE_SUPERVISOR_FEATURE_INDEX_CET_U: u32 = 11;
57pub const XSAVE_SUPERVISOR_FEATURE_INDEX_CET_S: u32 = 12;
58const XSAVE_FEATURE_INDEX_XTILECFG: u32 = 17;
59const XSAVE_FEATURE_INDEX_XTILEDATA: u32 = 18;
60
61pub const XFEATURE_X87: u64 = 1u64 << XSAVE_FEATURE_INDEX_LEGACY_X87;
62pub const XFEATURE_SSE: u64 = 1u64 << XSAVE_FEATURE_INDEX_LEGACY_SSE;
63pub const XFEATURE_YMM: u64 = 1u64 << XSAVE_FEATURE_INDEX_AVX;
64pub const XFEATURE_MPX_BNDCSR: u64 = 1u64 << XSAVE_FEATURE_INDEX_MPX_BNDCSR;
65pub const XFEATURE_MPX_BNDREG: u64 = 1u64 << XSAVE_FEATURE_INDEX_MPX_BNDREG;
66pub const XFEATURE_MPX: u64 = XFEATURE_MPX_BNDREG | XFEATURE_MPX_BNDCSR;
67
68pub const XFEATURE_AVX512: u64 = (1u64 << XSAVE_FEATURE_INDEX_AVX512_OPMASK)
69 | (1u64 << XSAVE_FEATURE_INDEX_AVX512_ZMMHI)
70 | (1u64 << XSAVE_FEATURE_INDEX_AVX512_ZMM16_31);
71
72pub const XFEATURE_XTILEDATA: u64 = 1u64 << XSAVE_FEATURE_INDEX_XTILEDATA;
73
74pub const XFEATURE_AMX: u64 =
75 (1u64 << XSAVE_FEATURE_INDEX_XTILECFG) | (1u64 << XSAVE_FEATURE_INDEX_XTILEDATA);
76
77pub const XSAVE_SUPERVISOR_FEATURE_PASID: u64 = 1u64 << XSAVE_SUPERVISOR_FEATURE_INDEX_PASID;
78
79pub const XSAVE_SUPERVISOR_FEATURE_CET_U: u64 = 1 << XSAVE_SUPERVISOR_FEATURE_INDEX_CET_U;
80pub const XSAVE_SUPERVISOR_FEATURE_CET_S: u64 = 1 << XSAVE_SUPERVISOR_FEATURE_INDEX_CET_S;
81
82pub const XSAVE_SUPERVISOR_FEATURE_CET: u64 =
83 XSAVE_SUPERVISOR_FEATURE_CET_U | XSAVE_SUPERVISOR_FEATURE_CET_S;
84
85pub const X86X_XSAVE_LEGACY_FEATURES: u64 = XFEATURE_X87 | XFEATURE_SSE;
86pub const X86X_XSAVE_NUM_LEGACY_FEATURES: u32 = 2;
87
88pub const XSAVE_EXTENDED_USER_FEATURES: u64 =
89 XFEATURE_YMM | XFEATURE_MPX | XFEATURE_AVX512 | XFEATURE_AMX;
90
91pub const X86X_XSAVE_USER_FEATURES: u64 = X86X_XSAVE_LEGACY_FEATURES | XSAVE_EXTENDED_USER_FEATURES;
92
93pub const X86X_XSAVE_SUPERVISOR_FEATURES: u64 =
94 XSAVE_SUPERVISOR_FEATURE_PASID | XSAVE_SUPERVISOR_FEATURE_CET;
95
96pub const X86X_XSAVE_EXTENDED_FEATURES: u64 =
97 XSAVE_EXTENDED_USER_FEATURES | X86X_XSAVE_SUPERVISOR_FEATURES;
98
99pub const X86X_XSAVE_FEATURES: u64 = X86X_XSAVE_USER_FEATURES | X86X_XSAVE_SUPERVISOR_FEATURES;
100
101pub const XCOMP_COMPRESSED: u64 = 1 << 63;
102
103pub const X86X_CET_CONFIG_MSR_RESERVED: u64 = 0x3C0;
104pub const X86X_CET_CONFIG_MSR_SS_MASK: u64 = 0x3;
105pub const X86X_CET_CONFIG_MSR_IBT_MASK: u64 = 0xFFFFFFFFFFFFFC3C;