feat(kernel): add RequestPages and ReleasePages syscalls
This commit is contained in:
49
crates/kernel/src/tests/memory.rs
Normal file
49
crates/kernel/src/tests/memory.rs
Normal file
@@ -0,0 +1,49 @@
|
||||
use super::*;
|
||||
use crate::{SyscallOutcome, SyscallResult};
|
||||
use domain::syscall::Syscall;
|
||||
use types::bounded::PageCount;
|
||||
use types::address::VirtualAddress;
|
||||
|
||||
#[test]
|
||||
fn request_pages_allocates_and_grants_cap() {
|
||||
let (mut k, _) = kernel_with_process();
|
||||
let outcome = k.handle_syscall(Syscall::RequestPages {
|
||||
count: PageCount::new(4).unwrap(),
|
||||
});
|
||||
assert!(matches!(
|
||||
outcome,
|
||||
SyscallOutcome::Complete(SyscallResult::Slot(_))
|
||||
));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn request_pages_reduces_pool() {
|
||||
let (mut k, _) = kernel_with_process();
|
||||
let before = k.free_page_count();
|
||||
k.handle_syscall(Syscall::RequestPages {
|
||||
count: PageCount::new(10).unwrap(),
|
||||
});
|
||||
assert_eq!(k.free_page_count(), before - 10);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn release_pages_frees_and_restores_pool() {
|
||||
let (mut k, _) = kernel_with_process();
|
||||
let before = k.free_page_count();
|
||||
let slot = match k.handle_syscall(Syscall::RequestPages {
|
||||
count: PageCount::new(4).unwrap(),
|
||||
}) {
|
||||
SyscallOutcome::Complete(SyscallResult::Slot(s)) => s,
|
||||
_ => panic!("expected slot"),
|
||||
};
|
||||
|
||||
let outcome = k.handle_syscall(Syscall::ReleasePages {
|
||||
addr: VirtualAddress::from_raw(0x8000_0000),
|
||||
count: PageCount::new(4).unwrap(),
|
||||
});
|
||||
assert!(matches!(
|
||||
outcome,
|
||||
SyscallOutcome::Complete(SyscallResult::Ok)
|
||||
));
|
||||
assert_eq!(k.free_page_count(), before);
|
||||
}
|
||||
Reference in New Issue
Block a user