@@ -12,6 +12,7 @@ use std::io;
12
12
use std:: os:: fd:: AsRawFd ;
13
13
use std:: path:: PathBuf ;
14
14
use std:: sync:: { Arc , Mutex } ;
15
+ use std:: cmp:: max;
15
16
16
17
use super :: { Error , Vmm } ;
17
18
@@ -68,7 +69,7 @@ use vm_memory::mmap::MmapRegion;
68
69
#[ cfg( any( target_arch = "aarch64" , feature = "tee" ) ) ]
69
70
use vm_memory:: Bytes ;
70
71
use vm_memory:: GuestMemory ;
71
- use vm_memory:: { GuestAddress , GuestMemoryMmap } ;
72
+ use vm_memory:: { GuestAddress , GuestMemoryMmap , GuestMemoryRegion , Address } ;
72
73
73
74
#[ cfg( feature = "efi" ) ]
74
75
static EDK2_BINARY : & [ u8 ] = include_bytes ! ( "../../../edk2/KRUN_EFI.silent.fd" ) ;
@@ -809,7 +810,7 @@ fn load_cmdline(vmm: &Vmm) -> std::result::Result<(), StartMicrovmError> {
809
810
. map_err ( StartMicrovmError :: LoadCommandline )
810
811
}
811
812
812
- #[ cfg( all( target_os = "linux" , not( feature = "tee" ) ) ) ]
813
+ #[ cfg( all( target_os = "linux" , not( feature = "tee" ) , not ( feature = "cca" ) ) ) ]
813
814
pub ( crate ) fn setup_vm (
814
815
guest_memory : & GuestMemoryMmap ,
815
816
) -> std:: result:: Result < Vm , StartMicrovmError > {
@@ -824,6 +825,29 @@ pub(crate) fn setup_vm(
824
825
. map_err ( StartMicrovmError :: Internal ) ?;
825
826
Ok ( vm)
826
827
}
828
+ #[ cfg( all( target_os = "linux" , feature = "cca" ) ) ]
829
+ pub ( crate ) fn setup_vm (
830
+ guest_memory : & GuestMemoryMmap ,
831
+ ) -> std:: result:: Result < Vm , StartMicrovmError > {
832
+ let kvm = KvmContext :: new ( )
833
+ . map_err ( Error :: KvmContext )
834
+ . map_err ( StartMicrovmError :: Internal ) ?;
835
+
836
+ // calculate max_addr for max_ipa
837
+ let mut max_addr = 0 ;
838
+ for ( _index, region) in guest_memory. iter ( ) . enumerate ( ) {
839
+ max_addr = max ( max_addr, region. start_addr ( ) . raw_value ( ) + region. len ( ) ) ;
840
+ }
841
+
842
+ let mut vm = Vm :: new ( kvm. fd ( ) , max_addr as usize )
843
+ . map_err ( Error :: Vm )
844
+ . map_err ( StartMicrovmError :: Internal ) ?;
845
+
846
+ vm. memory_init ( guest_memory, kvm. max_memslots ( ) , true )
847
+ . map_err ( Error :: Vm )
848
+ . map_err ( StartMicrovmError :: Internal ) ?;
849
+ Ok ( vm)
850
+ }
827
851
#[ cfg( all( target_os = "linux" , feature = "tee" ) ) ]
828
852
pub ( crate ) fn setup_vm (
829
853
kvm : & KvmContext ,
0 commit comments