libvmm 0.1.0

Virtual Machine Monitor
#![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) }
    }
}