linux_kvm/
raw.rs

1//! Raw data types for use with various KVM `ioctl` requests.
2
3/// The layout of the shared memory region used to communicate with the
4/// `KVM_RUN` ioctl request, which is `mmap`ed from the VCPU's file descriptor.
5#[allow(non_camel_case_types)]
6#[derive(Clone, Copy, Debug)]
7#[repr(C)]
8pub struct kvm_run {
9    pub request_interrupt_window: u8,
10    pub immediate_exit: u8,
11    pub padding1: [u8; 6],
12    pub exit_reason: u32,
13    pub ready_for_interrupt_injection: u8,
14    pub if_flag: u8,
15    pub flags: u16,
16    pub cr8: u64,
17    pub apic_base: u64,
18    pub exit_details: ExitDetails,
19}
20
21#[allow(non_camel_case_types)]
22#[derive(Clone, Copy, Debug)]
23#[repr(C)]
24pub struct kvm_userspace_memory_region {
25    pub slot: u32,
26    pub flags: u32,
27    pub guest_phys_addr: u64,
28    pub memory_size: u64,    // in bytes
29    pub userspace_addr: u64, // start of the userspace allocated memory
30}
31
32#[cfg(target_arch = "x86_64")]
33#[allow(non_camel_case_types)]
34#[derive(Clone, Copy, Debug)]
35#[repr(C)]
36pub struct kvm_regs {
37    pub rax: u64,
38    pub rbx: u64,
39    pub rcx: u64,
40    pub rdx: u64,
41    pub rsi: u64,
42    pub rdi: u64,
43    pub rsp: u64,
44    pub rbp: u64,
45    pub r8: u64,
46    pub r9: u64,
47    pub r10: u64,
48    pub r11: u64,
49    pub r12: u64,
50    pub r13: u64,
51    pub r14: u64,
52    pub r15: u64,
53    pub rip: u64,
54    pub rflags: u64,
55}
56
57#[cfg(target_arch = "aarch64")]
58#[allow(non_camel_case_types)]
59#[derive(Clone, Copy, Debug)]
60#[repr(C)]
61pub struct kvm_regs {
62    pub regs: aarch64_user_pt_regs,
63    pub sp_el1: u64,
64    pub elr_el1: u64,
65    pub spsr: [u64; 5],
66    pub fp_regs: aarch64_user_fpsimd_state,
67}
68
69#[cfg(target_arch = "aarch64")]
70#[allow(non_camel_case_types)]
71#[derive(Clone, Copy, Debug)]
72#[repr(C)]
73pub struct aarch64_user_pt_regs {
74    pub regs: [u64; 31],
75    pub sp: u64,
76    pub pc: u64,
77    pub pstate: u64,
78}
79
80#[cfg(target_arch = "aarch64")]
81#[allow(non_camel_case_types)]
82#[derive(Clone, Copy, Debug)]
83#[repr(C)]
84pub struct aarch64_user_fpsimd_state {
85    pub vregs: [u128; 32],
86    pub fpsr: u32,
87    pub fpcr: u32,
88    pub __reserved: [u32; 2],
89}
90
91#[cfg(target_arch = "riscv64")]
92#[allow(non_camel_case_types)]
93#[derive(Clone, Copy, Debug)]
94#[repr(C)]
95pub struct kvm_regs {
96    // The RISC-V port does not support getting/setting
97    // all registers together. It only supports individual
98    // register accesses using the GET_ONE_REG/SET_ONE_REG operations.
99}
100
101#[allow(non_camel_case_types)]
102#[derive(Clone, Copy, Debug)]
103#[repr(C)]
104pub struct kvm_one_reg {
105    pub id: u64,
106    pub addr: u64,
107}
108
109/// Used for the `exit_details` field of [`kvm_run`].
110#[derive(Clone, Copy)]
111#[repr(C)]
112pub union ExitDetails {
113    pub hw: ExitUnknown,
114    pub fail_entry: ExitFailEntry,
115    pub ex: ExitException,
116    pub io: ExitIo,
117    pub mmio: ExitMmio,
118    // TODO: The rest of these
119    pub padding: [linux_unsafe::char; 256],
120}
121
122impl core::fmt::Debug for ExitDetails {
123    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
124        f.debug_struct("ExitDetails").finish()
125    }
126}
127
128#[derive(Clone, Copy, Debug)]
129#[repr(C)]
130pub struct ExitUnknown {
131    pub hardware_exit_reason: u64,
132}
133
134#[derive(Clone, Copy, Debug)]
135#[repr(C)]
136pub struct ExitFailEntry {
137    pub hardware_entry_failure_reason: u64,
138    pub cpu: u32,
139}
140
141#[derive(Clone, Copy, Debug)]
142#[repr(C)]
143pub struct ExitException {
144    pub exception: u32,
145    pub error_code: u32,
146}
147
148#[derive(Clone, Copy, Debug)]
149#[repr(C)]
150pub struct ExitIo {
151    pub direction: u8,
152    pub size: u8,
153    pub port: u16,
154    pub count: u32,
155    pub data_offset: u64,
156}
157
158#[derive(Clone, Copy, Debug)]
159#[repr(C)]
160pub struct ExitMmio {
161    pub phys_addr: u64,
162    pub data: [u8; 8],
163    pub len: u32,
164    pub is_write: u8,
165}