Skip to main content

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: usize,    // 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: 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
55/// Contains mutable data for [VmPage];
56pub struct PageState {
57    pub pool: usize,                  // pool
58    pub order: usize,                 // order
59    pub object: Option<PageObj>,      // object
60    pub flags: PageFlags,             // flags
61    pub extended_flags: PageExtFlags, // oflags
62    pub access: PageAccess,           // aflags
63    pub wire_count: usize,            // wire_count
64    pub act_count: u8,                // act_count
65    pub pindex: usize,                // pindex
66}
67
68/// Value for [PageState::flags].
69#[bitflag(u8)]
70pub enum PageFlags {
71    /// `PG_CACHED`.
72    Cached = 0x01,
73    /// `PG_ZERO`.
74    Zero = 0x08,
75}
76
77/// Value for [PageState::extended_flags].
78#[bitflag(u16)]
79pub enum PageExtFlags {
80    /// `VPO_BUSY`.
81    Busy = 0x0001,
82    /// `VPO_UNMANAGED`.
83    Unmanaged = 0x0004,
84}
85
86/// Value for [PageState::access].
87#[bitflag(u8)]
88pub enum PageAccess {}
89
90/// Associated object with [VmPage].
91pub enum PageObj {
92    Slab, // TODO: Figure out how to store Slab.
93}