Skip to content

Commit

Permalink
Prepares VMM to supports multiple page size (#933)
Browse files Browse the repository at this point in the history
  • Loading branch information
ultimaweapon committed Aug 18, 2024
1 parent b7838d8 commit 30b712b
Show file tree
Hide file tree
Showing 8 changed files with 197 additions and 174 deletions.
3 changes: 1 addition & 2 deletions src/core/src/vmm/hv/linux/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,11 +83,10 @@ impl Kvm {
// Set RAM.
let vm = unsafe { OwnedFd::from_raw_fd(vm) };
let slot = 0;
let addr = ram.addr().try_into().unwrap();
let len = ram.len().try_into().unwrap();
let mem = ram.host_addr().cast_mut().cast();

match unsafe { kvm_set_user_memory_region(vm.as_raw_fd(), slot, addr, len, mem) } {
match unsafe { kvm_set_user_memory_region(vm.as_raw_fd(), slot, 0, len, mem) } {
0 => {}
v => return Err(VmmError::MapRamFailed(Error::from_raw_os_error(v))),
}
Expand Down
8 changes: 2 additions & 6 deletions src/core/src/vmm/hv/macos/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,8 @@ impl Hf {
let vm = Vm::new().map_err(VmmError::CreateVmFailed)?;

// Map memory.
vm.vm_map(
ram.host_addr().cast_mut().cast(),
ram.addr().try_into().unwrap(),
ram.len(),
)
.map_err(VmmError::MapRamFailed)?;
vm.vm_map(ram.host_addr().cast_mut().cast(), 0, ram.len())
.map_err(VmmError::MapRamFailed)?;

Ok(Self { vm, ram })
}
Expand Down
8 changes: 2 additions & 6 deletions src/core/src/vmm/hv/windows/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,8 @@ impl Whp {
part.setup().map_err(VmmError::SetupPartitionFailed)?;

// Map memory.
part.map_gpa(
ram.host_addr().cast(),
ram.addr().try_into().unwrap(),
ram.len().try_into().unwrap(),
)
.map_err(VmmError::MapRamFailed)?;
part.map_gpa(ram.host_addr().cast(), 0, ram.len().try_into().unwrap())
.map_err(VmmError::MapRamFailed)?;

Ok(Self { part, ram })
}
Expand Down
17 changes: 12 additions & 5 deletions src/core/src/vmm/hw/console/mod.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use self::context::Context;
use super::{Device, DeviceContext, Ram, PAGE_SIZE};
use obvirt::console::MsgType;
use super::{Device, DeviceContext, Ram};
use obvirt::console::{Memory, MsgType};
use std::collections::VecDeque;
use std::num::NonZero;
use std::sync::Mutex;
Expand All @@ -10,15 +10,22 @@ mod context;
/// Virtual console for the VM.
pub struct Console {
addr: usize,
len: NonZero<usize>,
logs: Mutex<VecDeque<Log>>,
}

impl Console {
pub(crate) const SIZE: NonZero<usize> = PAGE_SIZE;
pub fn new(addr: usize, vm_page_size: NonZero<usize>) -> Self {
let len = size_of::<Memory>()
.checked_next_multiple_of(vm_page_size.get())
.and_then(NonZero::new)
.unwrap();

addr.checked_add(len.get()).unwrap();

pub fn new(addr: usize) -> Self {
Self {
addr,
len,
logs: Mutex::default(),
}
}
Expand All @@ -30,7 +37,7 @@ impl Device for Console {
}

fn len(&self) -> NonZero<usize> {
Self::SIZE
self.len
}

fn create_context<'a>(&'a self, ram: &'a Ram) -> Box<dyn DeviceContext + 'a> {
Expand Down
6 changes: 2 additions & 4 deletions src/core/src/vmm/hw/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,12 @@ pub use self::ram::*;
mod console;
mod ram;

pub(crate) const PAGE_SIZE: NonZero<usize> = unsafe { NonZero::new_unchecked(0x4000) };

pub fn setup_devices(start_addr: usize) -> DeviceTree {
pub fn setup_devices(start_addr: usize, vm_page_size: NonZero<usize>) -> DeviceTree {
let mut map = BTreeMap::<usize, Arc<dyn Device>>::new();

// Console.
let addr = start_addr;
let console = Arc::new(Console::new(addr));
let console = Arc::new(Console::new(addr, vm_page_size));

assert!(map.insert(console.addr(), console.clone()).is_none());

Expand Down
Loading

0 comments on commit 30b712b

Please sign in to comment.