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
34
35
36
37
38
#![no_std]
#![feature(asm)]
#![feature(global_asm)]

#[cfg(target_arch = "x86_64")]
extern crate libvmm_macros;

#[cfg(target_arch = "x86_64")]
pub mod x86_64;

const SHIFT_4K: u8 = 12;
const SHIFT_2M: u8 = 21;
const SHIFT_1G: u8 = 30;
const SHIFT_512G: u8 = 39;

const KiB: usize = 1024;
const MiB: usize = 0x100000;
const GiB: usize = 0x40000000;

const PAGE_4K: usize = 2 * KiB;
const PAGE_2M: usize = 2 * MiB;

trait AlignedAddress {
    fn aligned(&self, shift: u8) -> bool;
}

impl AlignedAddress for u64 {
    fn aligned(&self, shift: u8) -> bool {
        return ((*self) & ((1 << shift) - 1)) == 0;
    }
}

#[macro_export]
macro_rules! unsafe_cast {
    ($x:expr => $t:ty) => {
        unsafe { use core::mem::transmute; transmute::<_, $t>($x) }
    }
}