Skip to main content

ostd/arch/x86/vm/
types.rs

1// SPDX-License-Identifier: MPL-2.0
2
3//! Types that represent guest-visible x86 CPU state.
4
5/// Guest general-purpose registers, instruction pointer, and flags.
6#[repr(C)]
7#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
8pub struct VcpuRegs {
9    /// The `RAX` register.
10    pub rax: usize,
11    /// The `RBX` register.
12    pub rbx: usize,
13    /// The `RCX` register.
14    pub rcx: usize,
15    /// The `RDX` register.
16    pub rdx: usize,
17    /// The `RSI` register.
18    pub rsi: usize,
19    /// The `RDI` register.
20    pub rdi: usize,
21    /// The `RBP` register.
22    pub rbp: usize,
23    /// The stack pointer.
24    pub rsp: usize,
25    /// The `R8` register.
26    pub r8: usize,
27    /// The `R9` register.
28    pub r9: usize,
29    /// The `R10` register.
30    pub r10: usize,
31    /// The `R11` register.
32    pub r11: usize,
33    /// The `R12` register.
34    pub r12: usize,
35    /// The `R13` register.
36    pub r13: usize,
37    /// The `R14` register.
38    pub r14: usize,
39    /// The `R15` register.
40    pub r15: usize,
41    /// The instruction pointer.
42    pub rip: usize,
43    /// The flags register.
44    pub rflags: usize,
45}
46
47/// Guest special-register state.
48#[repr(C)]
49#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
50pub struct VcpuSregs {
51    /// The code segment.
52    pub cs: VcpuSegment,
53    /// The data segment.
54    pub ds: VcpuSegment,
55    /// The extra data segment.
56    pub es: VcpuSegment,
57    /// The `FS` segment, including the `IA32_FS_BASE` MSR value.
58    pub fs: VcpuSegment,
59    /// The `GS` segment, including the `IA32_GS_BASE` MSR value.
60    pub gs: VcpuSegment,
61    /// The stack segment.
62    pub ss: VcpuSegment,
63    /// The task register and its cached segment descriptor.
64    pub tr: VcpuSegment,
65    /// The local descriptor-table register and its cached segment descriptor.
66    pub ldt: VcpuSegment,
67    /// The global descriptor-table register.
68    pub gdt: VcpuDescTable,
69    /// The interrupt descriptor-table register.
70    pub idt: VcpuDescTable,
71    /// The `CR0` control register.
72    pub cr0: u64,
73    /// The page-fault linear address.
74    pub cr2: u64,
75    /// The page-table root and control bits.
76    pub cr3: u64,
77    /// The `CR4` control register.
78    pub cr4: u64,
79    /// The extended feature enable register.
80    pub efer: u64,
81    /// The local APIC base address and control bits.
82    pub apic_base: u64,
83    /// The pending interrupt vectors, with one bit per vector.
84    pub interrupt_bitmap: [u64; 4],
85}
86
87/// Guest segment-register state.
88///
89/// Refer to: Intel SDM Vol. 3A, 3.4.5 "Segment Descriptors".
90#[repr(C)]
91#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
92pub struct VcpuSegment {
93    /// The segment base address.
94    pub base: u64,
95    /// The effective segment limit in bytes, with granularity already applied.
96    pub limit: u32,
97    /// The segment selector.
98    pub selector: u16,
99    /// The four-bit segment type.
100    pub type_: u8,
101    /// The segment-present bit.
102    pub present: u8,
103    /// The descriptor privilege level.
104    pub dpl: u8,
105    /// The default operation size or upper-bound bit.
106    pub db: u8,
107    /// The descriptor class bit: zero for system, one for code or data.
108    pub s: u8,
109    /// The 64-bit code-segment bit.
110    pub l: u8,
111    /// The granularity bit: zero for byte, one for 4-KiB granularity.
112    pub g: u8,
113    /// The descriptor bit available to software.
114    pub avl: u8,
115    /// The VMX unusable-segment bit.
116    pub unusable: u8,
117    /// The reserved padding byte.
118    pub padding: u8,
119}
120
121/// Guest descriptor-table state.
122#[repr(C)]
123#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
124pub struct VcpuDescTable {
125    /// The linear base address of the descriptor table.
126    pub base: u64,
127    /// The table size in bytes minus one.
128    pub limit: u16,
129    /// The reserved padding words.
130    pub padding: [u16; 3],
131}
132
133/// Guest MSR state that is not already stored in [`VcpuSregs`].
134#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
135pub struct VcpuMsrs {
136    /// The page attribute table.
137    pub pat: u64,
138    /// The kernel GS base exchanged by `SWAPGS`.
139    pub kernel_gs_base: u64,
140    /// The `SYSCALL` and `SYSRET` segment selectors.
141    pub star: u64,
142    /// The 64-bit `SYSCALL` entry point.
143    pub lstar: u64,
144    /// The compatibility-mode `SYSCALL` entry point.
145    pub cstar: u64,
146    /// The flags cleared on `SYSCALL` entry.
147    pub syscall_mask: u64,
148    /// The accumulated TSC adjustment.
149    pub tsc_adjust: u64,
150    /// The auxiliary TSC value returned by `RDTSCP`.
151    pub tsc_aux: u64,
152    /// The `SYSENTER` code-segment selector.
153    pub sysenter_cs: u64,
154    /// The `SYSENTER` stack pointer.
155    pub sysenter_esp: u64,
156    /// The `SYSENTER` instruction pointer.
157    pub sysenter_eip: u64,
158    /// The miscellaneous processor feature controls.
159    pub misc_enable: u64,
160}