we've done it, it boots!

This commit is contained in:
Alex Zenla
2024-01-16 23:07:34 -08:00
parent 0d68db8523
commit 5c1bb3d8fc
7 changed files with 161 additions and 40 deletions

View File

@ -1,4 +1,4 @@
use crate::sys::XEN_PAGE_SHIFT;
use crate::sys::{XEN_PAGE_SHIFT, XEN_PAGE_SIZE};
use crate::XenClientError;
use libc::munmap;
use log::debug;
@ -114,6 +114,36 @@ impl PhysicalPages<'_> {
Ok(addr)
}
pub fn map_foreign_pages(&mut self, mfn: u64, size: u64) -> Result<u64, XenClientError> {
let num = ((size + XEN_PAGE_SIZE - 1) >> XEN_PAGE_SHIFT) as usize;
let mut pfns = vec![u64::MAX; num];
for (i, item) in pfns.iter_mut().enumerate().take(num) {
*item = mfn + i as u64;
}
let actual_mmap_len = (num as u64) << XEN_PAGE_SHIFT;
let addr = self
.call
.mmap(0, actual_mmap_len)
.ok_or(XenClientError::new("failed to mmap address"))?;
debug!("mapped {:#x} foreign bytes at {:#x}", actual_mmap_len, addr);
let result = self.call.mmap_batch(self.domid, num as u64, addr, pfns)?;
if result != 0 {
return Err(XenClientError::new("mmap_batch call failed"));
}
let page = PhysicalPage {
pfn: u64::MAX,
ptr: addr,
count: num as u64,
};
debug!(
"alloc_mfn {:#x}+{:#x} at {:#x}",
page.pfn, page.count, page.ptr
);
self.pages.push(page);
Ok(addr)
}
pub fn unmap_all(&mut self) -> Result<(), XenClientError> {
for page in &self.pages {
unsafe {
@ -131,11 +161,11 @@ impl PhysicalPages<'_> {
}
pub fn unmap(&mut self, pfn: u64) -> Result<(), XenClientError> {
let page = self.pages.iter().find(|x| x.pfn == pfn);
let page = self.pages.iter().enumerate().find(|(_, x)| x.pfn == pfn);
if page.is_none() {
return Err(XenClientError::new("unable to find page to unmap"));
}
let page = page.unwrap();
let (i, page) = page.unwrap();
unsafe {
let err = munmap(
@ -150,6 +180,7 @@ impl PhysicalPages<'_> {
if err != 0 {
return Err(XenClientError::new("failed to munmap page"));
}
self.pages.remove(i);
}
Ok(())
}