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: u64, 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: u64, 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 flags: PageFlags::zeroed(),
29 extended_flags: PageExtFlags::zeroed(),
30 access: PageAccess::zeroed(),
31 wire_count: 0,
32 act_count: 0,
33 pindex: 0,
34 }),
35 unk1: 0,
36 }
37 }
38}
39
40impl PartialEq for VmPage {
41 fn eq(&self, other: &Self) -> bool {
42 self.addr == other.addr
43 }
44}
45
46impl Eq for VmPage {}
47
48impl Hash for VmPage {
49 fn hash<H: Hasher>(&self, state: &mut H) {
50 self.addr.hash(state);
51 }
52}
53
54pub struct PageState {
56 pub pool: usize, pub order: usize, pub flags: PageFlags, pub extended_flags: PageExtFlags, pub access: PageAccess, pub wire_count: usize, pub act_count: u8, pub pindex: usize, }
65
66#[bitflag(u8)]
68pub enum PageFlags {
69 Cached = 0x01,
71 Zero = 0x08,
73}
74
75#[bitflag(u16)]
77pub enum PageExtFlags {
78 Busy = 0x0001,
80 Unmanaged = 0x0004,
82}
83
84#[bitflag(u8)]
86pub enum PageAccess {}