1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use core::marker::PhantomData;

use crate::tt::FinalLevel;

use super::*;

impl<L: FinalLevel> DescriptorBuilder<L> {
    pub fn page(self, pa: usize) -> PageDescriptorBuilder<L> {
        // TODO: verify PA alignment and size, attributes
        let bits = pa as u64 | 0b11;

        PageDescriptorBuilder {
            bits,
            phantom: PhantomData,
        }
    }
}

impl<L: FinalLevel> PageDescriptorBuilder<L> {
    pub fn access_flag(mut self, access_flag: bool) -> PageDescriptorBuilder<L> {
        if access_flag {
            self.bits |= 1 << 10;
        } else {
            self.bits &= !(1 << 10);
        }

        self
    }

    pub fn build(self) -> PageDescriptor<L> {
        unsafe { PageDescriptor::from_bits_unchecked(self.bits) }
    }
}