kata-memory-interface: improve portability

Change-Id: I8b436a32aabbc5e0e57d14680cc7d09f46b7bc30
GitOrigin-RevId: 79e28f7b6f5ac4bb96a2e09f152ac92bb91dc5f7
This commit is contained in:
Sam Leffler 2022-10-13 22:33:57 +00:00
parent 130887a482
commit 34809a47e1

View File

@ -33,7 +33,9 @@ use sel4_sys::seL4_Error;
use sel4_sys::seL4_ObjectType;
use sel4_sys::seL4_ObjectType::*;
use sel4_sys::seL4_PageBits;
use sel4_sys::seL4_PageTableObject;
use sel4_sys::seL4_Result;
use sel4_sys::seL4_SmallPageObject;
use sel4_sys::seL4_WordBits;
use slot_allocator::KATA_CSPACE_SLOTS;
@ -560,17 +562,17 @@ pub fn kata_reply_alloc() -> Result<ObjDescBundle, MemoryManagerError> {
Ok(objs)
}
// Wrapper for allocating 4K pages.
// Wrapper for allocating small pages.
#[inline]
pub fn kata_frame_alloc(space_bytes: usize) -> Result<ObjDescBundle, MemoryManagerError> {
fn howmany(value: usize, unit: usize) -> usize { (value + (unit - 1)) / unit }
// NB: always allocate 4K pages
// NB: always allocate small pages
let mut objs = ObjDescBundle::new(
unsafe { MEMORY_RECV_CNODE },
unsafe { MEMORY_RECV_CNODE_DEPTH },
// NB: always allocate 4K pages
vec![ObjDesc::new(
seL4_RISCV_4K_Page,
seL4_SmallPageObject,
howmany(space_bytes, 1 << seL4_PageBits),
/*cptr=*/ 0,
)],
@ -585,7 +587,7 @@ pub fn kata_frame_alloc(space_bytes: usize) -> Result<ObjDescBundle, MemoryManag
#[inline]
pub fn kata_frame_alloc_in_cnode(space_bytes: usize) -> Result<ObjDescBundle, MemoryManagerError> {
fn howmany(value: usize, unit: usize) -> usize { (value + (unit - 1)) / unit }
// NB: always allocate 4K pages
// NB: always allocate small pages
let npages = howmany(space_bytes, 1 << seL4_PageBits);
// XXX horrible band-aid to workaround Retype "fanout" limit of 256
// objects: split our request accordingly. This shold be handled in
@ -593,11 +595,15 @@ pub fn kata_frame_alloc_in_cnode(space_bytes: usize) -> Result<ObjDescBundle, Me
assert!(npages <= 512); // XXX 2MB
if npages > 256 {
kata_object_alloc_in_cnode(vec![
ObjDesc::new(seL4_RISCV_4K_Page, 256, /*cptr=*/ 0),
ObjDesc::new(seL4_RISCV_4K_Page, npages - 256, /*cptr=*/ 256),
ObjDesc::new(seL4_SmallPageObject, 256, /*cptr=*/ 0),
ObjDesc::new(seL4_SmallPageObject, npages - 256, /*cptr=*/ 256),
])
} else {
kata_object_alloc_in_cnode(vec![ObjDesc::new(seL4_RISCV_4K_Page, npages, /*cptr=*/ 0)])
kata_object_alloc_in_cnode(vec![ObjDesc::new(
seL4_SmallPageObject,
npages,
/*cptr=*/ 0,
)])
}
}
@ -606,11 +612,7 @@ pub fn kata_page_table_alloc() -> Result<ObjDescBundle, MemoryManagerError> {
let mut objs = ObjDescBundle::new(
unsafe { MEMORY_RECV_CNODE },
unsafe { MEMORY_RECV_CNODE_DEPTH },
vec![ObjDesc::new(
seL4_RISCV_PageTableObject,
1,
/*cptr=*/ 0,
)],
vec![ObjDesc::new(seL4_PageTableObject, 1, /*cptr=*/ 0)],
);
kata_object_alloc(&objs)?;
objs.move_objects_to_toplevel()