geniezone: Pass memory region purpose to hypervisor

Feature:
- Modify set_user_memory_region function
- Encode memory region purpose to flags

Bug: 278959491
Test: tools/presubmit --all

Signed-off-by: Jerry Wang <ze-yu.wang@mediatek.com>
Signed-off-by: Yi-De Wu <yi-de.wu@mediatek.com>
Change-Id: I8b46219ba73c24eae9ca7ca80174cdec3a6f822d
Reviewed-on: https://chromium-review.googlesource.com/c/crosvm/crosvm/+/4413735
Reviewed-by: Frederick Mayle <fmayle@google.com>
Reviewed-by: Daniel Verkamp <dverkamp@chromium.org>
This commit is contained in:
Yi-De Wu 2023-03-30 14:43:16 +08:00 committed by crosvm LUCI
parent 8656c2f8c3
commit 27dff281ae
2 changed files with 16 additions and 3 deletions

View file

@ -134,6 +134,9 @@ pub const GIC_V3_NR_LRS: u32 = 16;
pub const GZVM_IOC_MAGIC: u32 = 146;
pub const GZVM_CAP_ARM_VM_IPA_SIZE: u32 = 165;
pub const GZVM_CAP_ARM_PROTECTED_VM: u32 = 4290435761;
pub const GZVM_USER_MEM_REGION_GUEST_MEM: u32 = 1;
pub const GZVM_USER_MEM_REGION_PROTECT_FW: u32 = 2;
pub const GZVM_USER_MEM_REGION_STATIC_SWIOTLB: u32 = 4;
pub const GZVM_IRQ_VCPU2_SHIFT: u32 = 28;
pub const GZVM_IRQ_VCPU2_MASK: u32 = 15;
pub const GZVM_IRQ_TYPE_SHIFT: u32 = 24;
@ -282,7 +285,7 @@ pub const GZVM_FUNC_IRQ_LINE: ::std::os::raw::c_uint = 10;
pub const GZVM_FUNC_CREATE_DEVICE: ::std::os::raw::c_uint = 11;
pub const GZVM_FUNC_PROBE: ::std::os::raw::c_uint = 12;
pub const GZVM_FUNC_ENABLE_CAP: ::std::os::raw::c_uint = 13;
pub const NR_GZVM_FUNC: ::std::os::raw::c_uint = 14;
pub const GZVM_FUNC_MEMREGION_PURPOSE: ::std::os::raw::c_uint = 14;
pub type _bindgen_ty_1 = ::std::os::raw::c_uint;
pub type gzvm_id_t = u16;
pub type gzvm_vcpu_id_t = u16;

View file

@ -56,6 +56,7 @@ use sync::Mutex;
use vm_memory::GuestAddress;
use vm_memory::GuestMemory;
use vm_memory::MemoryRegionInformation;
use vm_memory::MemoryRegionPurpose;
use crate::ClockState;
use crate::Config;
@ -493,8 +494,8 @@ unsafe fn set_user_memory_region(
guest_addr: u64,
memory_size: u64,
userspace_addr: *mut u8,
flags: u32,
) -> Result<()> {
let flags = 0;
let region = gzvm_userspace_memory_region {
slot,
flags,
@ -607,8 +608,14 @@ impl GeniezoneVm {
guest_addr,
size,
host_addr,
options,
..
}| {
let flags = match options.purpose {
MemoryRegionPurpose::GuestMemoryRegion => GZVM_USER_MEM_REGION_GUEST_MEM,
MemoryRegionPurpose::ProtectedFirmwareRegion => GZVM_USER_MEM_REGION_PROTECT_FW,
MemoryRegionPurpose::StaticSwiotlbRegion => GZVM_USER_MEM_REGION_STATIC_SWIOTLB,
};
unsafe {
// Safe because the guest regions are guaranteed not to overlap.
set_user_memory_region(
@ -619,6 +626,7 @@ impl GeniezoneVm {
guest_addr.offset(),
size as u64,
host_addr as *mut u8,
flags,
)
}
},
@ -912,6 +920,7 @@ impl Vm for GeniezoneVm {
Some(gap) => gap.0,
None => (regions.len() + self.guest_mem.num_regions() as usize) as MemSlot,
};
let flags = 0;
// Safe because we check that the given guest address is valid and has no overlaps. We also
// know that the pointer and size are correct because the MemoryMapping interface ensures
@ -926,6 +935,7 @@ impl Vm for GeniezoneVm {
guest_addr.offset(),
size,
mem.as_ptr(),
flags,
)
};
@ -956,7 +966,7 @@ impl Vm for GeniezoneVm {
}
// Safe because the slot is checked against the list of memory slots.
unsafe {
set_user_memory_region(&self.vm, slot, false, false, 0, 0, std::ptr::null_mut())?;
set_user_memory_region(&self.vm, slot, false, false, 0, 0, std::ptr::null_mut(), 0)?;
}
self.mem_slot_gaps.lock().push(Reverse(slot));
// This remove will always succeed because of the contains_key check above.