@@ -13,12 +13,6 @@ use std::io;
13
13
14
14
use std:: os:: unix:: io:: RawFd ;
15
15
16
- #[ cfg( feature = "tee" ) ]
17
- use kvm_ioctls:: VcpuExit :: Unsupported ;
18
-
19
- use std:: sync:: Arc ;
20
- use std:: sync:: Mutex ;
21
-
22
16
use std:: result;
23
17
use std:: sync:: atomic:: { fence, Ordering } ;
24
18
#[ cfg( not( test) ) ]
@@ -45,18 +39,14 @@ use kvm_bindings::{
45
39
KVM_CLOCK_TSC_STABLE , KVM_IRQCHIP_IOAPIC , KVM_IRQCHIP_PIC_MASTER , KVM_IRQCHIP_PIC_SLAVE ,
46
40
KVM_MAX_CPUID_ENTRIES ,
47
41
} ;
48
- #[ cfg( feature = "tee" ) ]
49
42
use 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 ,
53
46
} ;
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 :: * , * } ;
60
50
use utils:: eventfd:: EventFd ;
61
51
use utils:: signal:: { register_signal_handler, sigrtmin, Killable } ;
62
52
use utils:: sm:: StateMachine ;
@@ -781,13 +771,6 @@ pub struct VcpuConfig {
781
771
pub cpu_template : Option < CpuFeaturesTemplate > ,
782
772
}
783
773
784
- #[ cfg( feature = "tee" ) ]
785
- pub struct MemProperties {
786
- pub addr : u64 ,
787
- pub size : u64 ,
788
- pub attributes : u32 ,
789
- }
790
-
791
774
// Using this for easier explicit type-casting to help IDEs interpret the code.
792
775
type VcpuCell = Cell < Option < * mut Vcpu > > ;
793
776
@@ -810,10 +793,6 @@ pub struct Vcpu {
810
793
#[ cfg( target_arch = "aarch64" ) ]
811
794
mpidr : u64 ,
812
795
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
-
817
796
// The receiving end of events channel owned by the vcpu side.
818
797
event_receiver : Receiver < VcpuEvent > ,
819
798
// The transmitting end of the events channel which will be given to the handler.
@@ -961,12 +940,7 @@ impl Vcpu {
961
940
/// * `exit_evt` - An `EventFd` that will be written into when this vcpu exits.
962
941
/// * `create_ts` - A timestamp used by the vcpu to calculate its lifetime.
963
942
#[ 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 > {
970
944
let kvm_vcpu = vm_fd. create_vcpu ( id as u64 ) . map_err ( Error :: VcpuFd ) ?;
971
945
let ( event_sender, event_receiver) = unbounded ( ) ;
972
946
let ( response_sender, response_receiver) = unbounded ( ) ;
@@ -981,8 +955,6 @@ impl Vcpu {
981
955
event_sender : Some ( event_sender) ,
982
956
response_receiver : Some ( response_receiver) ,
983
957
response_sender,
984
- #[ cfg( feature = "tee" ) ]
985
- sender_io,
986
958
} )
987
959
}
988
960
@@ -1275,6 +1247,17 @@ impl Vcpu {
1275
1247
self . io_bus . write ( 0 , u64:: from ( addr) , data) ;
1276
1248
Ok ( VcpuEmulation :: Handled )
1277
1249
}
1250
+ #[ cfg( feature = "tee" ) ]
1251
+ VcpuExit :: MemoryFault { gpa, size, flags } => {
1252
+ let private = ( flags & ( KVM_MEMORY_EXIT_FLAG_PRIVATE as u64 ) ) != 0 ;
1253
+
1254
+ let mem_properties = MemoryProperties { gpa, size, private } ;
1255
+
1256
+ self . pm_sender . 0 . send ( mem_properties) . unwrap ( ) ;
1257
+ let _ = self . pm_sender . 1 . read ( ) . unwrap ( ) ;
1258
+
1259
+ Ok ( VcpuEmulation :: Handled )
1260
+ }
1278
1261
VcpuExit :: MmioRead ( addr, data) => {
1279
1262
if let Some ( ref mmio_bus) = self . mmio_bus {
1280
1263
mmio_bus. read ( 0 , addr, data) ;
@@ -1295,38 +1278,6 @@ impl Vcpu {
1295
1278
info ! ( "Received KVM_EXIT_SHUTDOWN signal" ) ;
1296
1279
Ok ( VcpuEmulation :: Stopped )
1297
1280
}
1298
- #[ cfg( feature = "tee" ) ]
1299
- VcpuExit :: MemoryFault { flags, gpa, size } => {
1300
- if flags & !KVM_MEMORY_EXIT_FLAG_PRIVATE as u64 != 0 {
1301
- error ! ( "KVM_EXIT_MEMORY_FAULT: Unknown flag {}" , flags) ;
1302
- Err ( Error :: VcpuUnhandledKvmExit )
1303
- } else {
1304
- // from private to shared
1305
- let mut attr = 0 ;
1306
- // from shared to private
1307
- if flags & KVM_MEMORY_EXIT_FLAG_PRIVATE as u64
1308
- == KVM_MEMORY_EXIT_FLAG_PRIVATE as u64
1309
- {
1310
- attr = KVM_MEMORY_ATTRIBUTE_PRIVATE ;
1311
- } ;
1312
-
1313
- let _ = self . sender_io . try_send ( MemProperties {
1314
- addr : gpa,
1315
- size,
1316
- attributes : attr,
1317
- } ) ;
1318
- Ok ( VcpuEmulation :: Handled )
1319
- }
1320
- }
1321
- // Documentation specifices that when KVM exists with KVM_EXIT_MEMORY_FAULT,
1322
- // userspace should assume kvm_run.exit_reason is stale/undefined for error numbers
1323
- // different than EFAULT or EHWPOISON
1324
- #[ cfg( feature = "tee" ) ]
1325
- Unsupported ( KVM_EXIT_MEMORY_FAULT ) => Ok ( VcpuEmulation :: Handled ) ,
1326
- VcpuExit :: InternalError => {
1327
- error ! ( "Received KVM_EXIT_INTERNAL_ERROR signal" ) ;
1328
- Err ( Error :: VcpuUnhandledKvmExit )
1329
- }
1330
1281
// Documentation specifies that below kvm exits are considered
1331
1282
// errors.
1332
1283
VcpuExit :: FailEntry ( reason, vcpu) => {
0 commit comments