50 lines
1.4 KiB
Rust
50 lines
1.4 KiB
Rust
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);
|
|
}
|