Skip to content

Commit fbdb81c

Browse files
committed
feat(vmm): add offset/gpa conversion functions
This is because vCPUs reason in GPAs while the secret-free UFFD protocol is guest_memfd-offset-based. Note that offset_to_gpa is not used yet, but will likely be needed to support async PF to pass the GPA to a new ioctl when notifying KVM of a fault resolution. Signed-off-by: Nikita Kalyazin <kalyazin@amazon.com>
1 parent 57812bf commit fbdb81c

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

src/vmm/src/vstate/memory.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -787,6 +787,12 @@ where
787787

788788
/// Discards a memory range, freeing up memory pages
789789
fn discard_range(&self, addr: GuestAddress, range_len: usize) -> Result<(), GuestMemoryError>;
790+
791+
/// Convert guest physical address to file offset
792+
fn gpa_to_offset(&self, gpa: GuestAddress) -> Option<u64>;
793+
794+
/// Convert file offset to guest physical address
795+
fn offset_to_gpa(&self, offset: u64) -> Option<GuestAddress>;
790796
}
791797

792798
/// State of a guest memory region saved to file/buffer.
@@ -964,6 +970,33 @@ impl GuestMemoryExtension for GuestMemoryMmap {
964970
region.discard_range(start, len)
965971
})
966972
}
973+
974+
/// Convert guest physical address to file offset
975+
fn gpa_to_offset(&self, gpa: GuestAddress) -> Option<u64> {
976+
self.find_region(gpa).map(|r| {
977+
gpa.0 - r.start_addr().0 + r.file_offset().expect("File offset is None").start()
978+
})
979+
}
980+
981+
/// Convert file offset to guest physical address
982+
fn offset_to_gpa(&self, offset: u64) -> Option<GuestAddress> {
983+
self.iter().find_map(|region| {
984+
if let Some(reg_offset) = region.file_offset() {
985+
let region_start = reg_offset.start();
986+
let region_size = region.size();
987+
988+
if offset >= region_start && offset < region_start + region_size as u64 {
989+
Some(GuestAddress(
990+
region.start_addr().0 + (offset - region_start),
991+
))
992+
} else {
993+
None
994+
}
995+
} else {
996+
None
997+
}
998+
})
999+
}
9671000
}
9681001

9691002
/// Creates a memfd of the given size and huge pages configuration

0 commit comments

Comments
 (0)