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