obkrnl/vm/
page.rs

1use crate::lock::Mutex;
2use core::hash::{Hash, Hasher};
3use macros::bitflag;
4
5/// Implementation of `vm_page` structure.
6pub struct VmPage {
7    pub index: usize,
8    pub vm: usize,
9    pub addr: u64,      // phys_addr
10    pub segment: usize, // segind
11    /// This **MUST** be locked after free queue.
12    pub state: Mutex<PageState>,
13    pub unk1: u8,
14}
15
16impl VmPage {
17    pub const FREE_ORDER: usize = 13; // VM_NFREEORDER
18
19    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
54/// Contains mutable data for [VmPage];
55pub struct PageState {
56    pub pool: usize,                  // pool
57    pub order: usize,                 // order
58    pub flags: PageFlags,             // flags
59    pub extended_flags: PageExtFlags, // oflags
60    pub access: PageAccess,           // aflags
61    pub wire_count: usize,            // wire_count
62    pub act_count: u8,                // act_count
63    pub pindex: usize,                // pindex
64}
65
66/// Value for [VmPage::flags].
67#[bitflag(u8)]
68pub enum PageFlags {
69    /// `PG_CACHED`.
70    Cached = 0x01,
71    /// `PG_ZERO`.
72    Zero = 0x08,
73}
74
75/// Value for [VmPage::extended_flags].
76#[bitflag(u16)]
77pub enum PageExtFlags {
78    /// `VPO_BUSY`.
79    Busy = 0x0001,
80    /// `VPO_UNMANAGED`.
81    Unmanaged = 0x0004,
82}
83
84/// Value for [VmPage::access].
85#[bitflag(u8)]
86pub enum PageAccess {}