@@ -13,12 +13,6 @@ use std::io;
1313
1414use std:: os:: unix:: io:: RawFd ;
1515
16- #[ cfg( feature = "tee" ) ]
17- use kvm_ioctls:: VcpuExit :: Unsupported ;
18-
19- use std:: sync:: Arc ;
20- use std:: sync:: Mutex ;
21-
2216use std:: result;
2317use std:: sync:: atomic:: { fence, Ordering } ;
2418#[ cfg( not( test) ) ]
@@ -45,18 +39,14 @@ use kvm_bindings::{
4539 KVM_CLOCK_TSC_STABLE , KVM_IRQCHIP_IOAPIC , KVM_IRQCHIP_PIC_MASTER , KVM_IRQCHIP_PIC_SLAVE ,
4640 KVM_MAX_CPUID_ENTRIES ,
4741} ;
48- #[ cfg( feature = "tee" ) ]
4942use kvm_bindings:: {
50- kvm_create_guest_memfd, kvm_memory_attributes, kvm_userspace_memory_region2 , KVM_API_VERSION ,
51- KVM_EXIT_MEMORY_FAULT , KVM_MEMORY_ATTRIBUTE_PRIVATE , KVM_MEMORY_EXIT_FLAG_PRIVATE ,
52- KVM_MEM_GUEST_MEMFD ,
43+ kvm_create_guest_memfd, kvm_memory_attributes, kvm_userspace_memory_region ,
44+ kvm_userspace_memory_region2 , KVM_API_VERSION , KVM_MEMORY_ATTRIBUTE_PRIVATE ,
45+ KVM_MEM_GUEST_MEMFD , KVM_SYSTEM_EVENT_RESET , KVM_SYSTEM_EVENT_SHUTDOWN ,
5346} ;
54- #[ cfg( not( feature = "tee" ) ) ]
55- use kvm_bindings:: { kvm_userspace_memory_region, KVM_API_VERSION } ;
56- use kvm_bindings:: {
57- kvm_userspace_memory_region, KVM_API_VERSION , KVM_SYSTEM_EVENT_RESET , KVM_SYSTEM_EVENT_SHUTDOWN ,
58- } ;
59- use kvm_ioctls:: * ;
47+ #[ cfg( feature = "tee" ) ]
48+ use kvm_bindings:: { kvm_enable_cap, KVM_CAP_EXIT_HYPERCALL , KVM_MEMORY_EXIT_FLAG_PRIVATE } ;
49+ use kvm_ioctls:: { Cap :: * , * } ;
6050use utils:: eventfd:: EventFd ;
6151use utils:: signal:: { register_signal_handler, sigrtmin, Killable } ;
6252use utils:: sm:: StateMachine ;
@@ -781,13 +771,6 @@ pub struct VcpuConfig {
781771 pub cpu_template : Option < CpuFeaturesTemplate > ,
782772}
783773
784- #[ cfg( feature = "tee" ) ]
785- pub struct MemProperties {
786- pub addr : u64 ,
787- pub size : u64 ,
788- pub attributes : u32 ,
789- }
790-
791774// Using this for easier explicit type-casting to help IDEs interpret the code.
792775type VcpuCell = Cell < Option < * mut Vcpu > > ;
793776
@@ -810,10 +793,6 @@ pub struct Vcpu {
810793 #[ cfg( target_arch = "aarch64" ) ]
811794 mpidr : u64 ,
812795
813- // The transmitting end of the events channel which will be given to the vcpu side
814- #[ cfg( feature = "tee" ) ]
815- sender_io : Sender < MemProperties > ,
816-
817796 // The receiving end of events channel owned by the vcpu side.
818797 event_receiver : Receiver < VcpuEvent > ,
819798 // The transmitting end of the events channel which will be given to the handler.
@@ -961,12 +940,7 @@ impl Vcpu {
961940 /// * `exit_evt` - An `EventFd` that will be written into when this vcpu exits.
962941 /// * `create_ts` - A timestamp used by the vcpu to calculate its lifetime.
963942 #[ cfg( target_arch = "aarch64" ) ]
964- pub fn new_aarch64 (
965- id : u8 ,
966- vm_fd : & VmFd ,
967- exit_evt : EventFd ,
968- #[ cfg( feature = "tee" ) ] sender_io : Sender < MemProperties > ,
969- ) -> Result < Self > {
943+ pub fn new_aarch64 ( id : u8 , vm_fd : & VmFd , exit_evt : EventFd ) -> Result < Self > {
970944 let kvm_vcpu = vm_fd. create_vcpu ( id as u64 ) . map_err ( Error :: VcpuFd ) ?;
971945 let ( event_sender, event_receiver) = unbounded ( ) ;
972946 let ( response_sender, response_receiver) = unbounded ( ) ;
@@ -981,8 +955,6 @@ impl Vcpu {
981955 event_sender : Some ( event_sender) ,
982956 response_receiver : Some ( response_receiver) ,
983957 response_sender,
984- #[ cfg( feature = "tee" ) ]
985- sender_io,
986958 } )
987959 }
988960
@@ -1274,6 +1246,17 @@ impl Vcpu {
12741246 self . io_bus . write ( 0 , u64:: from ( addr) , data) ;
12751247 Ok ( VcpuEmulation :: Handled )
12761248 }
1249+ #[ cfg( feature = "tee" ) ]
1250+ VcpuExit :: MemoryFault { gpa, size, flags } => {
1251+ let private = ( flags & ( KVM_MEMORY_EXIT_FLAG_PRIVATE as u64 ) ) != 0 ;
1252+
1253+ let mem_properties = MemoryProperties { gpa, size, private } ;
1254+
1255+ self . pm_sender . 0 . send ( mem_properties) . unwrap ( ) ;
1256+ let _ = self . pm_sender . 1 . read ( ) . unwrap ( ) ;
1257+
1258+ Ok ( VcpuEmulation :: Handled )
1259+ }
12771260 VcpuExit :: MmioRead ( addr, data) => {
12781261 if let Some ( ref mmio_bus) = self . mmio_bus {
12791262 mmio_bus. read ( 0 , addr, data) ;
@@ -1294,38 +1277,6 @@ impl Vcpu {
12941277 info ! ( "Received KVM_EXIT_SHUTDOWN signal" ) ;
12951278 Ok ( VcpuEmulation :: Stopped )
12961279 }
1297- #[ cfg( feature = "tee" ) ]
1298- VcpuExit :: MemoryFault { flags, gpa, size } => {
1299- if flags & !KVM_MEMORY_EXIT_FLAG_PRIVATE as u64 != 0 {
1300- error ! ( "KVM_EXIT_MEMORY_FAULT: Unknown flag {}" , flags) ;
1301- Err ( Error :: VcpuUnhandledKvmExit )
1302- } else {
1303- // from private to shared
1304- let mut attr = 0 ;
1305- // from shared to private
1306- if flags & KVM_MEMORY_EXIT_FLAG_PRIVATE as u64
1307- == KVM_MEMORY_EXIT_FLAG_PRIVATE as u64
1308- {
1309- attr = KVM_MEMORY_ATTRIBUTE_PRIVATE ;
1310- } ;
1311-
1312- let _ = self . sender_io . try_send ( MemProperties {
1313- addr : gpa,
1314- size,
1315- attributes : attr,
1316- } ) ;
1317- Ok ( VcpuEmulation :: Handled )
1318- }
1319- }
1320- // Documentation specifices that when KVM exists with KVM_EXIT_MEMORY_FAULT,
1321- // userspace should assume kvm_run.exit_reason is stale/undefined for error numbers
1322- // different than EFAULT or EHWPOISON
1323- #[ cfg( feature = "tee" ) ]
1324- Unsupported ( KVM_EXIT_MEMORY_FAULT ) => Ok ( VcpuEmulation :: Handled ) ,
1325- VcpuExit :: InternalError => {
1326- error ! ( "Received KVM_EXIT_INTERNAL_ERROR signal" ) ;
1327- Err ( Error :: VcpuUnhandledKvmExit )
1328- }
13291280 // Documentation specifies that below kvm exits are considered
13301281 // errors.
13311282 VcpuExit :: FailEntry ( reason, vcpu) => {
0 commit comments