6
6
// found in the THIRD-PARTY file.
7
7
8
8
use std:: cell:: Cell ;
9
+ use std:: collections:: HashMap ;
9
10
use std:: fmt:: { Display , Formatter } ;
10
11
use std:: io;
11
12
use std:: result;
@@ -176,7 +177,7 @@ pub struct Vcpu {
176
177
id : u8 ,
177
178
boot_entry_addr : u64 ,
178
179
boot_receiver : Option < Receiver < u64 > > ,
179
- boot_senders : Option < Vec < Sender < u64 > > > ,
180
+ boot_senders : Option < HashMap < u64 , Sender < u64 > > > ,
180
181
fdt_addr : u64 ,
181
182
mmio_bus : Option < devices:: Bus > ,
182
183
#[ cfg_attr( all( test, target_arch = "aarch64" ) , allow( unused) ) ]
@@ -280,7 +281,7 @@ impl Vcpu {
280
281
fdt_addr : 0 ,
281
282
mmio_bus : None ,
282
283
exit_evt,
283
- mpidr : 0 ,
284
+ mpidr : id as u64 ,
284
285
event_receiver,
285
286
event_sender : Some ( event_sender) ,
286
287
response_receiver : Some ( response_receiver) ,
@@ -304,19 +305,16 @@ impl Vcpu {
304
305
self . mmio_bus = Some ( mmio_bus) ;
305
306
}
306
307
307
- pub fn set_boot_senders ( & mut self , boot_senders : Vec < Sender < u64 > > ) {
308
+ pub fn set_boot_senders ( & mut self , boot_senders : HashMap < u64 , Sender < u64 > > ) {
308
309
self . boot_senders = Some ( boot_senders) ;
309
310
}
310
311
311
312
/// Configures an aarch64 specific vcpu.
312
313
///
313
314
/// # Arguments
314
315
///
315
- /// * `vm_fd` - The kvm `VmFd` for this microvm.
316
316
/// * `guest_mem` - The guest memory used by this microvm.
317
- /// * `kernel_load_addr` - Offset from `guest_mem` at which the kernel is loaded.
318
317
pub fn configure_aarch64 ( & mut self , guest_mem : & GuestMemoryMmap ) -> Result < ( ) > {
319
- self . mpidr = self . id as u64 ;
320
318
self . fdt_addr = arch:: aarch64:: get_fdt_addr ( guest_mem) ;
321
319
322
320
Ok ( ( ) )
@@ -369,13 +367,12 @@ impl Vcpu {
369
367
"CpuOn: mpidr=0x{:x} entry=0x{:x} context_id={}" ,
370
368
mpidr, entry, context_id
371
369
) ;
372
- // assuming a flat CPU hierarchy, only the bottom bits of mpidr should be used,
373
- // and cpuid == mpidr
374
- let cpuid: usize = mpidr as usize ;
375
370
if let Some ( boot_senders) = & self . boot_senders {
376
- if let Some ( sender) = boot_senders. get ( cpuid - 1 ) {
371
+ if let Some ( sender) = boot_senders. get ( & mpidr ) {
377
372
sender. send ( entry) . unwrap ( )
378
373
}
374
+ } else {
375
+ error ! ( "CpuOn request coming from an unexpected vCPU={}" , self . id) ;
379
376
}
380
377
Ok ( VcpuEmulation :: Handled )
381
378
}
@@ -432,7 +429,7 @@ impl Vcpu {
432
429
433
430
/// Main loop of the vCPU thread.
434
431
pub fn run ( & mut self , init_tls_sender : Sender < bool > ) {
435
- let mut hvf_vcpu = HvfVcpu :: new ( ) . expect ( "Can't create HVF vCPU" ) ;
432
+ let mut hvf_vcpu = HvfVcpu :: new ( self . mpidr ) . expect ( "Can't create HVF vCPU" ) ;
436
433
let hvf_vcpuid = hvf_vcpu. id ( ) ;
437
434
438
435
init_tls_sender
0 commit comments