@@ -23,6 +23,7 @@ use arraydeque::ArrayDeque;
23
23
use arrayvec:: ArrayVec ;
24
24
use core:: default:: Default ;
25
25
use core:: mem;
26
+ use core:: pin:: Pin ;
26
27
use core:: sync:: atomic:: AtomicU32 ;
27
28
use spin:: RwLock ;
28
29
@@ -92,7 +93,7 @@ pub enum VirtualMachineMsg {
92
93
struct VirtualMachineContext {
93
94
core_id : percore:: CoreId ,
94
95
95
- vm : & ' static VirtualMachine ,
96
+ vm : Pin < & ' static VirtualMachine > ,
96
97
97
98
/// The per-core RX message queue
98
99
msgqueue : RwLock < ArrayDeque < [ VirtualMachineMsg ; MAX_PENDING_MSG ] > > ,
@@ -138,13 +139,13 @@ impl VirtualMachineSet {
138
139
}
139
140
140
141
// Initialize the per-VM local apic access page
141
- vm . setup_guest_local_apic_page ( ) ?;
142
+ Pin :: static_ref ( vm ) . setup_guest_local_apic_page ( ) ?;
142
143
143
144
// Create the communication queues
144
145
for cpu in vm. cpus . iter ( ) {
145
146
self . contexts . push ( VirtualMachineContext {
146
147
core_id : * cpu,
147
- vm : vm ,
148
+ vm : Pin :: static_ref ( vm ) ,
148
149
msgqueue : RwLock :: new ( ArrayDeque :: new ( ) ) ,
149
150
} )
150
151
}
@@ -194,12 +195,15 @@ impl VirtualMachineSet {
194
195
pub unsafe fn get_by_core_id (
195
196
& self ,
196
197
core_id : percore:: CoreId ,
197
- ) -> Option < & ' static VirtualMachine > {
198
+ ) -> Option < Pin < & ' static VirtualMachine > > {
198
199
self . context_by_core_id ( core_id) . map ( |context| context. vm )
199
200
}
200
201
201
202
/// Get a VirtualMachine by its vmid
202
- pub fn get_by_vm_id ( & self , vmid : u32 ) -> Option < & ' static VirtualMachine > {
203
+ pub fn get_by_vm_id (
204
+ & self ,
205
+ vmid : u32 ,
206
+ ) -> Option < Pin < & ' static VirtualMachine > > {
203
207
self . context_by_vm_id ( vmid) . map ( |context| context. vm )
204
208
}
205
209
@@ -479,7 +483,7 @@ impl VirtualMachine {
479
483
480
484
/// Setup the local APIC access page for the guest. This _must_ be called
481
485
/// only once the VirtualMachine is in a final location.
482
- pub fn setup_guest_local_apic_page ( & ' static self ) -> Result < ( ) > {
486
+ pub fn setup_guest_local_apic_page ( self : Pin < & ' static Self > ) -> Result < ( ) > {
483
487
// Map the guest local apic addr to the access page. This will be set in each
484
488
// core's vmcs
485
489
let apic_frame = memory:: HostPhysFrame :: from_start_address (
0 commit comments