virtfw-libhw 0.2.3

library for direct hardware access
Documentation
#![cfg(target_arch = "x86_64")]

use core::arch::asm;

pub fn writeb(addr: u64, value: u8) {
    unsafe { asm!("movb %al, (%rdx)", in("al") value, in("rdx") addr, options(att_syntax)) }
}

pub fn readb(addr: u64) -> u8 {
    unsafe {
        let ret: u8;
        asm!("movb (%rdx), %al", in("rdx") addr, out("al") ret, options(att_syntax));
        ret
    }
}

pub fn writew(addr: u64, value: u16) {
    unsafe { asm!("movw %ax, (%rdx)", in("ax") value, in("rdx") addr, options(att_syntax)) }
}

pub fn readw(addr: u64) -> u16 {
    unsafe {
        let ret: u16;
        asm!("movw (%rdx), %ax", in("rdx") addr, out("ax") ret, options(att_syntax));
        ret
    }
}

pub fn writel(addr: u64, value: u32) {
    unsafe { asm!("movl %eax, (%rdx)", in("eax") value, in("rdx") addr, options(att_syntax)) }
}

pub fn readl(addr: u64) -> u32 {
    unsafe {
        let ret: u32;
        asm!("movl (%rdx), %eax", in("rdx") addr, out("eax") ret, options(att_syntax));
        ret
    }
}

pub fn writeq(addr: u64, value: u64) {
    unsafe { asm!("movq %rax, (%rdx)", in("rax") value, in("rdx") addr, options(att_syntax)) }
}

pub fn readq(addr: u64) -> u64 {
    unsafe {
        let ret: u64;
        asm!("movq (%rdx), %rax", in("rdx") addr, out("rax") ret, options(att_syntax));
        ret
    }
}