virtfw-libhw 0.5.0

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

use core::arch::asm;

pub fn writeb(addr: u64, value: u8) {
    unsafe { asm!("strb {value:w}, [{addr}]", value = in(reg) value, addr = in(reg) addr) }
}

pub fn readb(addr: u64) -> u8 {
    unsafe {
        let ret: u8;
        asm!("ldrb {value:w}, [{addr}]", addr = in(reg) addr, value = out(reg) ret);
        ret
    }
}

pub fn writew(addr: u64, value: u16) {
    unsafe { asm!("strh {value:w}, [{addr}]", value = in(reg) value, addr = in(reg) addr) }
}

pub fn readw(addr: u64) -> u16 {
    unsafe {
        let ret: u16;
        asm!("ldrh {value:w}, [{addr}]", addr = in(reg) addr, value = out(reg) ret);
        ret
    }
}

pub fn writel(addr: u64, value: u32) {
    unsafe { asm!("str {value:w}, [{addr}]", value = in(reg) value, addr = in(reg) addr) }
}

pub fn readl(addr: u64) -> u32 {
    unsafe {
        let ret: u32;
        asm!("ldr {value:w}, [{addr}]", addr = in(reg) addr, value = out(reg) ret);
        ret
    }
}

pub fn writeq(addr: u64, value: u64) {
    unsafe { asm!("str {value:x}, [{addr}]", value = in(reg) value, addr = in(reg) addr) }
}

pub fn readq(addr: u64) -> u64 {
    unsafe {
        let ret: u64;
        asm!("ldr {value:x}, [{addr}]", addr = in(reg) addr, value = out(reg) ret);
        ret
    }
}