1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
// Copyright 2025 The Axvisor Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! Virtual machine management APIs for the AxVisor hypervisor.
//!
//! This module provides APIs for managing virtual machines (VMs) and virtual
//! CPUs (vCPUs), including querying VM/vCPU information and interrupt
//! injection.
//!
//! # Overview
//!
//! The VMM (Virtual Machine Monitor) APIs enable:
//! - Querying the current VM and vCPU context
//! - Getting information about VMs and their vCPUs
//! - Injecting interrupts into virtual CPUs
//! - Timer expiration notifications
//!
//! # Types
//!
//! - [`VMId`] - Virtual machine identifier.
//! - [`VCpuId`] - Virtual CPU identifier.
//! - [`InterruptVector`] - Interrupt vector number.
//!
//! # Helper Functions
//!
//! In addition to the core API trait, this module provides helper functions:
//! - [`current_vm_vcpu_num`] - Get the vCPU count of the current VM.
//! - [`current_vm_active_vcpus`] - Get the active vCPU mask of the current VM.
//!
//! # Implementation
//!
//! To implement these APIs, use the [`api_impl`](crate::api_impl) attribute
//! macro on an impl block:
//!
//! ```rust,ignore
//! struct VmmIfImpl;
//!
//! #[axvisor_api::api_impl]
//! impl axvisor_api::vmm::VmmIf for VmmIfImpl {
//! fn current_vm_id() -> VMId {
//! // Return the current VM's ID
//! }
//! // ... implement other functions
//! }
//! ```
/// Virtual machine identifier type.
///
/// Each virtual machine is assigned a unique identifier that can be used
/// to reference it in API calls.
pub type VMId = usize;
/// Virtual CPU identifier type.
///
/// Each vCPU within a VM is assigned a unique identifier (0-indexed).
pub type VCpuId = usize;
/// Interrupt vector type.
///
/// Represents the interrupt vector number to be injected into a guest.
pub type InterruptVector = u8;
/// The maximum number of virtual CPUs supported in a virtual machine.
pub const MAX_VCPU_NUM: usize = 64;
/// A set of virtual CPUs.
pub type VCpuSet = CpuMask;
/// The API trait for virtual machine management functionalities.
///
/// This trait defines the core VM management interface required by the
/// hypervisor components. Implementations should be provided by the VMM
/// layer.
/// Get the number of virtual CPUs in the current virtual machine executing on
/// the current physical CPU.
///
/// This is a convenience function that combines [`current_vm_id`] and
/// [`vcpu_num`].
///
/// # Returns
///
/// The number of vCPUs in the current VM.
///
/// # Panics
///
/// Panics if called outside of a valid VM context (when [`current_vm_id`]
/// returns an invalid ID).
/// Get the bitmask of active virtual CPUs in the current virtual machine
/// executing on the current physical CPU.
///
/// This is a convenience function that combines [`current_vm_id`] and
/// [`active_vcpus`].
///
/// # Returns
///
/// The active vCPU bitmask for the current VM.
///
/// # Panics
///
/// Panics if called outside of a valid VM context (when [`current_vm_id`]
/// returns an invalid ID).