use lazy_static::lazy_static;
use crate::{PageFormat, PageLevel};
pub const PAGE_PRESENT: u64 = 1 << 0;
pub const PAGE_WRITE: u64 = 1 << 1;
pub const PAGE_USER: u64 = 1 << 2;
pub const PAGE_HUGE: u64 = 1 << 7;
static PAGE_LEVELS_4K: &'static [PageLevel<u64>] = &[
PageLevel {
shift_bits: 12,
va_bits: 9,
present_bit: (PAGE_PRESENT, PAGE_PRESENT),
huge_page_bit: (0, 0),
page_table_mask: 0,
},
PageLevel {
shift_bits: 21,
va_bits: 9,
present_bit: (PAGE_PRESENT, PAGE_PRESENT),
huge_page_bit: (PAGE_HUGE, PAGE_HUGE),
page_table_mask: PAGE_PRESENT | PAGE_WRITE | PAGE_USER,
},
PageLevel {
shift_bits: 30,
va_bits: 9,
present_bit: (PAGE_PRESENT, PAGE_PRESENT),
huge_page_bit: (PAGE_HUGE, PAGE_HUGE),
page_table_mask: PAGE_PRESENT | PAGE_WRITE | PAGE_USER,
},
PageLevel {
shift_bits: 39,
va_bits: 9,
present_bit: (PAGE_PRESENT, PAGE_PRESENT),
huge_page_bit: (0, 0),
page_table_mask: PAGE_PRESENT | PAGE_WRITE | PAGE_USER,
},
PageLevel {
shift_bits: 48,
va_bits: 9,
present_bit: (PAGE_PRESENT, PAGE_PRESENT),
huge_page_bit: (0, 0),
page_table_mask: PAGE_PRESENT | PAGE_WRITE | PAGE_USER,
},
];
lazy_static! {
pub static ref PAGE_FORMAT_4K_L4: PageFormat<'static, u64> = PageFormat {
levels: &PAGE_LEVELS_4K[0..4],
physical_mask: 0x000f_ffff_ffff_f000,
};
pub static ref PAGE_FORMAT_4K_L5: PageFormat<'static, u64> = PageFormat {
levels: PAGE_LEVELS_4K,
physical_mask: 0x000f_ffff_ffff_f000,
};
pub static ref PAGE_FORMAT_LA57: PageFormat<'static, u64> = PAGE_FORMAT_4K_L5.clone();
pub static ref DEFAULT_PAGE_FORMAT: PageFormat<'static, u64> = PAGE_FORMAT_4K_L4.clone();
}