1use crate::lock::Mutex;
2use crate::uma::Slab;
3use core::hash::{Hash, Hasher};
4use core::ptr::NonNull;
5use macros::bitflag;
6
7pub struct VmPage {
9 pub index: usize,
10 pub vm: usize,
11 pub addr: usize, pub segment: usize, pub state: Mutex<PageState>,
15 pub unk1: u8,
16}
17
18impl VmPage {
19 pub const FREE_ORDER: usize = 13; pub fn new(index: usize, vm: usize, pool: usize, addr: usize, segment: usize) -> Self {
22 Self {
23 index,
24 vm,
25 addr,
26 segment,
27 state: Mutex::new(PageState {
28 pool,
29 order: Self::FREE_ORDER,
30 object: None,
31 flags: PageFlags::zeroed(),
32 extended_flags: PageExtFlags::zeroed(),
33 access: PageAccess::zeroed(),
34 wire_count: 0,
35 act_count: 0,
36 pindex: 0,
37 }),
38 unk1: 0,
39 }
40 }
41}
42
43impl PartialEq for VmPage {
44 fn eq(&self, other: &Self) -> bool {
45 self.addr == other.addr
46 }
47}
48
49impl Eq for VmPage {}
50
51impl Hash for VmPage {
52 fn hash<H: Hasher>(&self, state: &mut H) {
53 self.addr.hash(state);
54 }
55}
56
57pub struct PageState {
59 pub pool: usize, pub order: usize, pub object: Option<PageObj>, pub flags: PageFlags, pub extended_flags: PageExtFlags, pub access: PageAccess, pub wire_count: usize, pub act_count: u8, pub pindex: usize, }
69
70#[bitflag(u8)]
72pub enum PageFlags {
73 Cached = 0x01,
75 Zero = 0x08,
77}
78
79#[bitflag(u16)]
81pub enum PageExtFlags {
82 Busy = 0x0001,
84 Unmanaged = 0x0004,
86}
87
88#[bitflag(u8)]
90pub enum PageAccess {}
91
92pub enum PageObj {
94 Slab(NonNull<Slab>), }
96
97unsafe impl Send for PageObj {} unsafe impl Sync for PageObj {}