Skip to main content

obkrnl/vm/
page.rs

1use crate::lock::Mutex;
2use crate::uma::Slab;
3use core::hash::{Hash, Hasher};
4use core::ptr::NonNull;
5use macros::bitflag;
6
7/// Implementation of `vm_page` structure.
8pub struct VmPage {
9    pub index: usize,
10    pub vm: usize,
11    pub addr: usize,    // phys_addr
12    pub segment: usize, // segind
13    /// This **MUST** be locked after free queue.
14    pub state: Mutex<PageState>,
15    pub unk1: u8,
16}
17
18impl VmPage {
19    pub const FREE_ORDER: usize = 13; // VM_NFREEORDER
20
21    pub fn new(index: usize, vm: usize, pool: usize, addr: usize, segment: usize) -> Self {
22        Self {
23            index,
24            vm,
25            addr,
26            segment,
27            state: Mutex::new(PageState {
28                pool,
29                order: Self::FREE_ORDER,
30                object: None,
31                flags: PageFlags::zeroed(),
32                extended_flags: PageExtFlags::zeroed(),
33                access: PageAccess::zeroed(),
34                wire_count: 0,
35                act_count: 0,
36                pindex: 0,
37            }),
38            unk1: 0,
39        }
40    }
41}
42
43impl PartialEq for VmPage {
44    fn eq(&self, other: &Self) -> bool {
45        self.addr == other.addr
46    }
47}
48
49impl Eq for VmPage {}
50
51impl Hash for VmPage {
52    fn hash<H: Hasher>(&self, state: &mut H) {
53        self.addr.hash(state);
54    }
55}
56
57/// Contains mutable data for [VmPage];
58pub struct PageState {
59    pub pool: usize,                  // pool
60    pub order: usize,                 // order
61    pub object: Option<PageObj>,      // object
62    pub flags: PageFlags,             // flags
63    pub extended_flags: PageExtFlags, // oflags
64    pub access: PageAccess,           // aflags
65    pub wire_count: usize,            // wire_count
66    pub act_count: u8,                // act_count
67    pub pindex: usize,                // pindex
68}
69
70/// Value for [PageState::flags].
71#[bitflag(u8)]
72pub enum PageFlags {
73    /// `PG_CACHED`.
74    Cached = 0x01,
75    /// `PG_ZERO`.
76    Zero = 0x08,
77}
78
79/// Value for [PageState::extended_flags].
80#[bitflag(u16)]
81pub enum PageExtFlags {
82    /// `VPO_BUSY`.
83    Busy = 0x0001,
84    /// `VPO_UNMANAGED`.
85    Unmanaged = 0x0004,
86}
87
88/// Value for [PageState::access].
89#[bitflag(u8)]
90pub enum PageAccess {}
91
92/// Associated object with [VmPage].
93pub enum PageObj {
94    Slab(NonNull<Slab>), // TODO: Find a better way.
95}
96
97unsafe impl Send for PageObj {} // TODO: Remove this.
98unsafe impl Sync for PageObj {} // TODO: Remove this.