1use crate::lock::Mutex;
2use crate::mem::Strong;
3use crate::uma::Slab;
4use core::hash::{Hash, Hasher};
5use core::pin::Pin;
6use macros::bitflag;
7
8pub struct VmPage {
10 pub index: usize,
11 pub vm: usize,
12 pub addr: usize, pub segment: usize, pub state: Mutex<PageState>,
16 pub unk1: u8,
17}
18
19impl VmPage {
20 pub const FREE_ORDER: usize = 13; pub fn new(index: usize, vm: usize, pool: usize, addr: usize, segment: usize) -> Self {
23 Self {
24 index,
25 vm,
26 addr,
27 segment,
28 state: Mutex::new(PageState {
29 pool,
30 order: Self::FREE_ORDER,
31 object: None,
32 flags: PageFlags::zeroed(),
33 extended_flags: PageExtFlags::zeroed(),
34 access: PageAccess::zeroed(),
35 wire_count: 0,
36 act_count: 0,
37 pindex: 0,
38 }),
39 unk1: 0,
40 }
41 }
42}
43
44impl PartialEq for VmPage {
45 fn eq(&self, other: &Self) -> bool {
46 self.addr == other.addr
47 }
48}
49
50impl Eq for VmPage {}
51
52impl Hash for VmPage {
53 fn hash<H: Hasher>(&self, state: &mut H) {
54 self.addr.hash(state);
55 }
56}
57
58pub struct PageState {
60 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, }
70
71#[bitflag(u8)]
73pub enum PageFlags {
74 Cached = 0x01,
76 Zero = 0x08,
78}
79
80#[bitflag(u16)]
82pub enum PageExtFlags {
83 Busy = 0x0001,
85 Unmanaged = 0x0004,
87}
88
89#[bitflag(u8)]
91pub enum PageAccess {}
92
93pub enum PageObj {
95 Slab(Pin<Strong<Slab>>),
96}