whp/
x64.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4#![cfg(target_arch = "x86_64")]
5
6use crate::RegisterName;
7use crate::RegisterValue;
8use crate::abi;
9
10/// 64-bit registers
11#[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/// Segment registers
116#[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/// Table registers
130#[repr(u32)]
131#[derive(Clone, Copy, Debug)]
132pub enum RegisterTable {
133    Idtr = abi::WHvX64RegisterIdtr.0,
134    Gdtr = abi::WHvX64RegisterGdtr.0,
135}
136
137/// 128-bit registers
138#[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        // SAFETY: any bit pattern is a valid `Self`.
191        unsafe { std::mem::transmute(*self) }
192    }
193
194    fn from_abi(value: &abi::WHV_REGISTER_VALUE) -> Self {
195        // SAFETY: `Self` is safe to cast to a set of bytes, and any bit pattern
196        // is a valid `WHV_UINT128`.
197        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        // SAFETY: any bit pattern is a valid `Self`.
204        unsafe { std::mem::transmute(*self) }
205    }
206
207    fn from_abi(value: &abi::WHV_REGISTER_VALUE) -> Self {
208        // SAFETY: `Self` is safe to cast to a set of bytes, and any bit pattern
209        // is a valid `WHV_UINT128`.
210        unsafe { std::mem::transmute(value.0) }
211    }
212}