Skip to main content

obkrnl/vm/
page.rs

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
8/// Implementation of `vm_page` structure.
9pub struct VmPage {
10    pub index: usize,
11    pub vm: usize,
12    pub addr: usize,    // phys_addr
13    pub segment: usize, // segind
14    /// This **MUST** be locked after free queue.
15    pub state: Mutex<PageState>,
16    pub unk1: u8,
17}
18
19impl VmPage {
20    pub const FREE_ORDER: usize = 13; // VM_NFREEORDER
21
22    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
58/// Contains mutable data for [VmPage];
59pub struct PageState {
60    pub pool: usize,                  // pool
61    pub order: usize,                 // order
62    pub object: Option<PageObj>,      // object
63    pub flags: PageFlags,             // flags
64    pub extended_flags: PageExtFlags, // oflags
65    pub access: PageAccess,           // aflags
66    pub wire_count: usize,            // wire_count
67    pub act_count: u8,                // act_count
68    pub pindex: usize,                // pindex
69}
70
71/// Value for [PageState::flags].
72#[bitflag(u8)]
73pub enum PageFlags {
74    /// `PG_CACHED`.
75    Cached = 0x01,
76    /// `PG_ZERO`.
77    Zero = 0x08,
78}
79
80/// Value for [PageState::extended_flags].
81#[bitflag(u16)]
82pub enum PageExtFlags {
83    /// `VPO_BUSY`.
84    Busy = 0x0001,
85    /// `VPO_UNMANAGED`.
86    Unmanaged = 0x0004,
87}
88
89/// Value for [PageState::access].
90#[bitflag(u8)]
91pub enum PageAccess {}
92
93/// Associated object with [VmPage].
94pub enum PageObj {
95    Slab(Pin<Strong<Slab>>),
96}