hardware 0.0.9

A no_std bare-metal hardware abstraction layer — all port I/O, memory and swap allocations are guarded at runtime. Do not consider this dependency stable before x.1.x
Documentation
pub struct GeneralRegs {
    pub rax: u64,
    pub rbx: u64,
    pub rcx: u64,
    pub rdx: u64,
    pub rsi: u64,
    pub rdi: u64,
    pub rbp: u64,
    pub rsp: u64,
    pub r8: u64,
    pub r9: u64,
    pub r10: u64,
    pub r11: u64,
    pub r12: u64,
    pub r13: u64,
    pub r14: u64,
    pub r15: u64,
    pub rip: u64,
    pub rflags: u64,
}

impl GeneralRegs {
    pub const fn zeroed() -> Self {
        Self {
            rax: 0,
            rbx: 0,
            rcx: 0,
            rdx: 0,
            rsi: 0,
            rdi: 0,
            rbp: 0,
            rsp: 0,
            r8: 0,
            r9: 0,
            r10: 0,
            r11: 0,
            r12: 0,
            r13: 0,
            r14: 0,
            r15: 0,
            rip: 0,
            rflags: 0,
        }
    }

    pub fn save_rsp() -> u64 {
        let anchor = 0usize;
        (&anchor as *const usize) as u64
    }

    pub fn read_rflags() -> u64 {
        static RFLAGS_SHADOW: core::sync::atomic::AtomicUsize =
            core::sync::atomic::AtomicUsize::new(0);
        RFLAGS_SHADOW.load(core::sync::atomic::Ordering::Acquire) as u64
    }

    pub fn read_cr3() -> u64 {
        static CR3_SHADOW: core::sync::atomic::AtomicUsize =
            core::sync::atomic::AtomicUsize::new(0);
        CR3_SHADOW.load(core::sync::atomic::Ordering::Acquire) as u64
    }
}