@@ -40,9 +40,12 @@ use kvm_bindings::{
40
40
kvm_clock_data, kvm_debugregs, kvm_irqchip, kvm_lapic_state, kvm_mp_state, kvm_pit_config,
41
41
kvm_pit_state2, kvm_regs, kvm_sregs, kvm_vcpu_events, kvm_xcrs, kvm_xsave, CpuId , MsrList ,
42
42
Msrs , KVM_CLOCK_TSC_STABLE , KVM_IRQCHIP_IOAPIC , KVM_IRQCHIP_PIC_MASTER , KVM_IRQCHIP_PIC_SLAVE ,
43
- KVM_MAX_CPUID_ENTRIES , KVM_PIT_SPEAKER_DUMMY ,
43
+ KVM_MAX_CPUID_ENTRIES , KVM_MEMORY_ATTRIBUTE_PRIVATE , KVM_PIT_SPEAKER_DUMMY ,
44
+ } ;
45
+ use kvm_bindings:: {
46
+ kvm_create_guest_memfd, kvm_memory_attributes, kvm_userspace_memory_region2, KVM_API_VERSION ,
47
+ KVM_MEM_GUEST_MEMFD ,
44
48
} ;
45
- use kvm_bindings:: { kvm_userspace_memory_region, KVM_API_VERSION } ;
46
49
use kvm_ioctls:: * ;
47
50
use utils:: eventfd:: EventFd ;
48
51
use utils:: signal:: { register_signal_handler, sigrtmin, Killable } ;
@@ -103,7 +106,9 @@ pub enum Error {
103
106
/// Error setting up the global interrupt controller.
104
107
SetupGIC ( arch:: aarch64:: gic:: Error ) ,
105
108
/// Cannot set the memory regions.
106
- SetUserMemoryRegion ( kvm_ioctls:: Error ) ,
109
+ SetUserMemoryRegion2 ( kvm_ioctls:: Error ) ,
110
+ /// Unable to set memory region attributes.
111
+ SetMemoryAttributes ( kvm_ioctls:: Error ) ,
107
112
/// Error creating memory map for SHM region.
108
113
ShmMmap ( io:: Error ) ,
109
114
#[ cfg( feature = "amd-sev" ) ]
@@ -255,7 +260,8 @@ impl Display for Error {
255
260
f,
256
261
"Cannot set the local interruption due to bad configuration: {e:?}"
257
262
) ,
258
- SetUserMemoryRegion ( e) => write ! ( f, "Cannot set the memory regions: {e}" ) ,
263
+ SetUserMemoryRegion2 ( e) => write ! ( f, "Cannot set the memory regions: {e}" ) ,
264
+ SetMemoryAttributes ( e) => write ! ( f, "Unable to set memory attributes: {e}" ) ,
259
265
ShmMmap ( e) => write ! ( f, "Error creating memory map for SHM region: {e}" ) ,
260
266
#[ cfg( feature = "tee" ) ]
261
267
SnpSecVirtInit ( e) => write ! (
@@ -526,20 +532,47 @@ impl Vm {
526
532
// It's safe to unwrap because the guest address is valid.
527
533
let host_addr = guest_mem. get_host_address ( region. start_addr ( ) ) . unwrap ( ) ;
528
534
debug ! ( "Guest memory starts at {:x?}" , host_addr) ;
529
- let memory_region = kvm_userspace_memory_region {
535
+
536
+ let guest_memfd = self
537
+ . fd
538
+ . create_guest_memfd ( kvm_create_guest_memfd {
539
+ size : region. size ( ) as u64 ,
540
+ flags : 0 ,
541
+ reserved : [ 0 ; 6 ] ,
542
+ } )
543
+ . unwrap ( ) ;
544
+
545
+ let memory_region = kvm_userspace_memory_region2 {
530
546
slot : self . next_mem_slot ,
547
+ flags : KVM_MEM_GUEST_MEMFD ,
531
548
guest_phys_addr : region. start_addr ( ) . raw_value ( ) ,
532
549
memory_size : region. len ( ) ,
533
550
userspace_addr : host_addr as u64 ,
534
- flags : 0 ,
551
+ guest_memfd_offset : 0 ,
552
+ guest_memfd : guest_memfd as u32 ,
553
+ pad1 : 0 ,
554
+ pad2 : [ 0 ; 14 ] ,
535
555
} ;
556
+
536
557
// Safe because we mapped the memory region, we made sure that the regions
537
558
// are not overlapping.
538
559
unsafe {
539
560
self . fd
540
- . set_user_memory_region ( memory_region)
541
- . map_err ( Error :: SetUserMemoryRegion ) ?;
561
+ . set_user_memory_region2 ( memory_region)
562
+ . map_err ( Error :: SetUserMemoryRegion2 ) ?;
542
563
} ;
564
+
565
+ let attr = kvm_memory_attributes {
566
+ address : region. start_addr ( ) . raw_value ( ) ,
567
+ size : region. len ( ) ,
568
+ attributes : KVM_MEMORY_ATTRIBUTE_PRIVATE as u64 ,
569
+ flags : 0 ,
570
+ } ;
571
+
572
+ self . fd
573
+ . set_memory_attributes ( attr)
574
+ . map_err ( Error :: SetMemoryAttributes ) ?;
575
+
543
576
self . next_mem_slot += 1 ;
544
577
}
545
578
0 commit comments