1#![cfg(target_arch = "x86_64")]
5
6use crate::RegisterName;
7use crate::RegisterValue;
8use crate::abi;
9
10#[repr(u32)]
12#[derive(Clone, Copy, Debug, Eq, PartialEq)]
13pub enum Register64 {
14 Rax = abi::WHvX64RegisterRax.0,
15 Rcx = abi::WHvX64RegisterRcx.0,
16 Rdx = abi::WHvX64RegisterRdx.0,
17 Rbx = abi::WHvX64RegisterRbx.0,
18 Rsp = abi::WHvX64RegisterRsp.0,
19 Rbp = abi::WHvX64RegisterRbp.0,
20 Rsi = abi::WHvX64RegisterRsi.0,
21 Rdi = abi::WHvX64RegisterRdi.0,
22 R8 = abi::WHvX64RegisterR8.0,
23 R9 = abi::WHvX64RegisterR9.0,
24 R10 = abi::WHvX64RegisterR10.0,
25 R11 = abi::WHvX64RegisterR11.0,
26 R12 = abi::WHvX64RegisterR12.0,
27 R13 = abi::WHvX64RegisterR13.0,
28 R14 = abi::WHvX64RegisterR14.0,
29 R15 = abi::WHvX64RegisterR15.0,
30 Rip = abi::WHvX64RegisterRip.0,
31 Rflags = abi::WHvX64RegisterRflags.0,
32 Cr0 = abi::WHvX64RegisterCr0.0,
33 Cr2 = abi::WHvX64RegisterCr2.0,
34 Cr3 = abi::WHvX64RegisterCr3.0,
35 Cr4 = abi::WHvX64RegisterCr4.0,
36 Cr8 = abi::WHvX64RegisterCr8.0,
37 Dr0 = abi::WHvX64RegisterDr0.0,
38 Dr1 = abi::WHvX64RegisterDr1.0,
39 Dr2 = abi::WHvX64RegisterDr2.0,
40 Dr3 = abi::WHvX64RegisterDr3.0,
41 Dr6 = abi::WHvX64RegisterDr6.0,
42 Dr7 = abi::WHvX64RegisterDr7.0,
43 XCr0 = abi::WHvX64RegisterXCr0.0,
44
45 Tsc = abi::WHvX64RegisterTsc.0,
46 Efer = abi::WHvX64RegisterEfer.0,
47 KernelGsBase = abi::WHvX64RegisterKernelGsBase.0,
48 ApicBase = abi::WHvX64RegisterApicBase.0,
49 Pat = abi::WHvX64RegisterPat.0,
50 SysenterCs = abi::WHvX64RegisterSysenterCs.0,
51 SysenterEip = abi::WHvX64RegisterSysenterEip.0,
52 SysenterEsp = abi::WHvX64RegisterSysenterEsp.0,
53 Star = abi::WHvX64RegisterStar.0,
54 Lstar = abi::WHvX64RegisterLstar.0,
55 Cstar = abi::WHvX64RegisterCstar.0,
56 Sfmask = abi::WHvX64RegisterSfmask.0,
57 MsrMtrrCap = abi::WHvX64RegisterMsrMtrrCap.0,
58 MsrMtrrDefType = abi::WHvX64RegisterMsrMtrrDefType.0,
59 MsrMtrrPhysBase0 = abi::WHvX64RegisterMsrMtrrPhysBase0.0,
60 MsrMtrrPhysBase1 = abi::WHvX64RegisterMsrMtrrPhysBase1.0,
61 MsrMtrrPhysBase2 = abi::WHvX64RegisterMsrMtrrPhysBase2.0,
62 MsrMtrrPhysBase3 = abi::WHvX64RegisterMsrMtrrPhysBase3.0,
63 MsrMtrrPhysBase4 = abi::WHvX64RegisterMsrMtrrPhysBase4.0,
64 MsrMtrrPhysBase5 = abi::WHvX64RegisterMsrMtrrPhysBase5.0,
65 MsrMtrrPhysBase6 = abi::WHvX64RegisterMsrMtrrPhysBase6.0,
66 MsrMtrrPhysBase7 = abi::WHvX64RegisterMsrMtrrPhysBase7.0,
67 MsrMtrrPhysBase8 = abi::WHvX64RegisterMsrMtrrPhysBase8.0,
68 MsrMtrrPhysBase9 = abi::WHvX64RegisterMsrMtrrPhysBase9.0,
69 MsrMtrrPhysBaseA = abi::WHvX64RegisterMsrMtrrPhysBaseA.0,
70 MsrMtrrPhysBaseB = abi::WHvX64RegisterMsrMtrrPhysBaseB.0,
71 MsrMtrrPhysBaseC = abi::WHvX64RegisterMsrMtrrPhysBaseC.0,
72 MsrMtrrPhysBaseD = abi::WHvX64RegisterMsrMtrrPhysBaseD.0,
73 MsrMtrrPhysBaseE = abi::WHvX64RegisterMsrMtrrPhysBaseE.0,
74 MsrMtrrPhysBaseF = abi::WHvX64RegisterMsrMtrrPhysBaseF.0,
75 MsrMtrrPhysMask0 = abi::WHvX64RegisterMsrMtrrPhysMask0.0,
76 MsrMtrrPhysMask1 = abi::WHvX64RegisterMsrMtrrPhysMask1.0,
77 MsrMtrrPhysMask2 = abi::WHvX64RegisterMsrMtrrPhysMask2.0,
78 MsrMtrrPhysMask3 = abi::WHvX64RegisterMsrMtrrPhysMask3.0,
79 MsrMtrrPhysMask4 = abi::WHvX64RegisterMsrMtrrPhysMask4.0,
80 MsrMtrrPhysMask5 = abi::WHvX64RegisterMsrMtrrPhysMask5.0,
81 MsrMtrrPhysMask6 = abi::WHvX64RegisterMsrMtrrPhysMask6.0,
82 MsrMtrrPhysMask7 = abi::WHvX64RegisterMsrMtrrPhysMask7.0,
83 MsrMtrrPhysMask8 = abi::WHvX64RegisterMsrMtrrPhysMask8.0,
84 MsrMtrrPhysMask9 = abi::WHvX64RegisterMsrMtrrPhysMask9.0,
85 MsrMtrrPhysMaskA = abi::WHvX64RegisterMsrMtrrPhysMaskA.0,
86 MsrMtrrPhysMaskB = abi::WHvX64RegisterMsrMtrrPhysMaskB.0,
87 MsrMtrrPhysMaskC = abi::WHvX64RegisterMsrMtrrPhysMaskC.0,
88 MsrMtrrPhysMaskD = abi::WHvX64RegisterMsrMtrrPhysMaskD.0,
89 MsrMtrrPhysMaskE = abi::WHvX64RegisterMsrMtrrPhysMaskE.0,
90 MsrMtrrPhysMaskF = abi::WHvX64RegisterMsrMtrrPhysMaskF.0,
91 MsrMtrrFix64k00000 = abi::WHvX64RegisterMsrMtrrFix64k00000.0,
92 MsrMtrrFix16k80000 = abi::WHvX64RegisterMsrMtrrFix16k80000.0,
93 MsrMtrrFix16kA0000 = abi::WHvX64RegisterMsrMtrrFix16kA0000.0,
94 MsrMtrrFix4kC0000 = abi::WHvX64RegisterMsrMtrrFix4kC0000.0,
95 MsrMtrrFix4kC8000 = abi::WHvX64RegisterMsrMtrrFix4kC8000.0,
96 MsrMtrrFix4kD0000 = abi::WHvX64RegisterMsrMtrrFix4kD0000.0,
97 MsrMtrrFix4kD8000 = abi::WHvX64RegisterMsrMtrrFix4kD8000.0,
98 MsrMtrrFix4kE0000 = abi::WHvX64RegisterMsrMtrrFix4kE0000.0,
99 MsrMtrrFix4kE8000 = abi::WHvX64RegisterMsrMtrrFix4kE8000.0,
100 MsrMtrrFix4kF0000 = abi::WHvX64RegisterMsrMtrrFix4kF0000.0,
101 MsrMtrrFix4kF8000 = abi::WHvX64RegisterMsrMtrrFix4kF8000.0,
102 TscAux = abi::WHvX64RegisterTscAux.0,
103 SpecCtrl = abi::WHvX64RegisterSpecCtrl.0,
104 PredCmd = abi::WHvX64RegisterPredCmd.0,
105 TscVirtualOffset = abi::WHvX64RegisterTscVirtualOffset.0,
106 ApicId = abi::WHvX64RegisterApicId.0,
107 InitialApicId = abi::WHvX64RegisterInitialApicId.0,
108 ApicVersion = abi::WHvX64RegisterApicVersion.0,
109 PendingInterruption = abi::WHvRegisterPendingInterruption.0,
110 InterruptState = abi::WHvRegisterInterruptState.0,
111 DeliverabilityNotifications = abi::WHvRegisterDeliverabilityNotifications.0,
112 InternalActivityState = abi::WHvRegisterInternalActivityState.0,
113}
114
115#[repr(u32)]
117#[derive(Clone, Copy, Debug)]
118pub enum RegisterSegment {
119 Es = abi::WHvX64RegisterEs.0,
120 Cs = abi::WHvX64RegisterCs.0,
121 Ss = abi::WHvX64RegisterSs.0,
122 Ds = abi::WHvX64RegisterDs.0,
123 Fs = abi::WHvX64RegisterFs.0,
124 Gs = abi::WHvX64RegisterGs.0,
125 Ldtr = abi::WHvX64RegisterLdtr.0,
126 Tr = abi::WHvX64RegisterTr.0,
127}
128
129#[repr(u32)]
131#[derive(Clone, Copy, Debug)]
132pub enum RegisterTable {
133 Idtr = abi::WHvX64RegisterIdtr.0,
134 Gdtr = abi::WHvX64RegisterGdtr.0,
135}
136
137#[repr(u32)]
139#[derive(Clone, Copy, Debug)]
140pub enum Register128 {
141 Xmm0 = abi::WHvX64RegisterXmm0.0,
142 Xmm1 = abi::WHvX64RegisterXmm1.0,
143 Xmm2 = abi::WHvX64RegisterXmm2.0,
144 Xmm3 = abi::WHvX64RegisterXmm3.0,
145 Xmm4 = abi::WHvX64RegisterXmm4.0,
146 Xmm5 = abi::WHvX64RegisterXmm5.0,
147 Xmm6 = abi::WHvX64RegisterXmm6.0,
148 Xmm7 = abi::WHvX64RegisterXmm7.0,
149 Xmm8 = abi::WHvX64RegisterXmm8.0,
150 Xmm9 = abi::WHvX64RegisterXmm9.0,
151 Xmm10 = abi::WHvX64RegisterXmm10.0,
152 Xmm11 = abi::WHvX64RegisterXmm11.0,
153 Xmm12 = abi::WHvX64RegisterXmm12.0,
154 Xmm13 = abi::WHvX64RegisterXmm13.0,
155 Xmm14 = abi::WHvX64RegisterXmm14.0,
156 Xmm15 = abi::WHvX64RegisterXmm15.0,
157 FpMmx0 = abi::WHvX64RegisterFpMmx0.0,
158 FpMmx1 = abi::WHvX64RegisterFpMmx1.0,
159 FpMmx2 = abi::WHvX64RegisterFpMmx2.0,
160 FpMmx3 = abi::WHvX64RegisterFpMmx3.0,
161 FpMmx4 = abi::WHvX64RegisterFpMmx4.0,
162 FpMmx5 = abi::WHvX64RegisterFpMmx5.0,
163 FpMmx6 = abi::WHvX64RegisterFpMmx6.0,
164 FpMmx7 = abi::WHvX64RegisterFpMmx7.0,
165 FpControlStatus = abi::WHvX64RegisterFpControlStatus.0,
166 XmmControlStatus = abi::WHvX64RegisterXmmControlStatus.0,
167
168 PendingEvent = abi::WHvRegisterPendingEvent.0,
169 PendingEvent1 = abi::WHvRegisterPendingEvent1.0,
170}
171
172impl RegisterName for RegisterTable {
173 type Value = abi::WHV_X64_TABLE_REGISTER;
174
175 fn as_abi(&self) -> abi::WHV_REGISTER_NAME {
176 abi::WHV_REGISTER_NAME(*self as u32)
177 }
178}
179
180impl RegisterName for RegisterSegment {
181 type Value = abi::WHV_X64_SEGMENT_REGISTER;
182
183 fn as_abi(&self) -> abi::WHV_REGISTER_NAME {
184 abi::WHV_REGISTER_NAME(*self as u32)
185 }
186}
187
188impl RegisterValue for abi::WHV_X64_SEGMENT_REGISTER {
189 fn as_abi(&self) -> abi::WHV_REGISTER_VALUE {
190 unsafe { std::mem::transmute(*self) }
192 }
193
194 fn from_abi(value: &abi::WHV_REGISTER_VALUE) -> Self {
195 unsafe { std::mem::transmute(value.0) }
198 }
199}
200
201impl RegisterValue for abi::WHV_X64_TABLE_REGISTER {
202 fn as_abi(&self) -> abi::WHV_REGISTER_VALUE {
203 unsafe { std::mem::transmute(*self) }
205 }
206
207 fn from_abi(value: &abi::WHV_REGISTER_VALUE) -> Self {
208 unsafe { std::mem::transmute(value.0) }
211 }
212}