use crate::backend::mmio_ops::MmioOps;
unsafe extern "Rust" {
fn __safe_mmio_read_u8(src: *const u8) -> u8;
fn __safe_mmio_read_u16(src: *const u16) -> u16;
fn __safe_mmio_read_u32(src: *const u32) -> u32;
fn __safe_mmio_read_u64(src: *const u64) -> u64;
fn __safe_mmio_write_u8(dst: *mut u8, value: u8);
fn __safe_mmio_write_u16(dst: *mut u16, value: u16);
fn __safe_mmio_write_u32(dst: *mut u32, value: u32);
fn __safe_mmio_write_u64(dst: *mut u64, value: u64);
}
#[macro_export]
macro_rules! set_mmio_ops {
($t:ty) => {
#[unsafe(no_mangle)]
unsafe fn __safe_mmio_read_u8(src: *const u8) -> u8 {
unsafe { <$t as $crate::MmioOps>::read_u8(src) }
}
#[unsafe(no_mangle)]
unsafe fn __safe_mmio_read_u16(src: *const u16) -> u16 {
unsafe { <$t as $crate::MmioOps>::read_u16(src) }
}
#[unsafe(no_mangle)]
unsafe fn __safe_mmio_read_u32(src: *const u32) -> u32 {
unsafe { <$t as $crate::MmioOps>::read_u32(src) }
}
#[unsafe(no_mangle)]
unsafe fn __safe_mmio_read_u64(src: *const u64) -> u64 {
unsafe { <$t as $crate::MmioOps>::read_u64(src) }
}
#[unsafe(no_mangle)]
unsafe fn __safe_mmio_write_u8(dst: *mut u8, value: u8) {
unsafe { <$t as $crate::MmioOps>::write_u8(dst, value) }
}
#[unsafe(no_mangle)]
unsafe fn __safe_mmio_write_u16(dst: *mut u16, value: u16) {
unsafe { <$t as $crate::MmioOps>::write_u16(dst, value) }
}
#[unsafe(no_mangle)]
unsafe fn __safe_mmio_write_u32(dst: *mut u32, value: u32) {
unsafe { <$t as $crate::MmioOps>::write_u32(dst, value) }
}
#[unsafe(no_mangle)]
unsafe fn __safe_mmio_write_u64(dst: *mut u64, value: u64) {
unsafe { <$t as $crate::MmioOps>::write_u64(dst, value) }
}
};
}
pub struct Ops;
impl MmioOps for Ops {
unsafe fn read_u8(src: *const u8) -> u8 {
unsafe { __safe_mmio_read_u8(src) }
}
unsafe fn read_u16(src: *const u16) -> u16 {
unsafe { __safe_mmio_read_u16(src) }
}
unsafe fn read_u32(src: *const u32) -> u32 {
unsafe { __safe_mmio_read_u32(src) }
}
unsafe fn read_u64(src: *const u64) -> u64 {
unsafe { __safe_mmio_read_u64(src) }
}
unsafe fn write_u8(dst: *mut u8, value: u8) {
unsafe {
__safe_mmio_write_u8(dst, value);
}
}
unsafe fn write_u16(dst: *mut u16, value: u16) {
unsafe {
__safe_mmio_write_u16(dst, value);
}
}
unsafe fn write_u32(dst: *mut u32, value: u32) {
unsafe {
__safe_mmio_write_u32(dst, value);
}
}
unsafe fn write_u64(dst: *mut u64, value: u64) {
unsafe {
__safe_mmio_write_u64(dst, value);
}
}
}
#[cfg(test)]
mod testing {
struct VolatileOps;
impl super::MmioOps for VolatileOps {
unsafe fn read_u8(src: *const u8) -> u8 {
unsafe { src.read_volatile() }
}
unsafe fn read_u16(src: *const u16) -> u16 {
unsafe { src.read_volatile() }
}
unsafe fn read_u32(src: *const u32) -> u32 {
unsafe { src.read_volatile() }
}
unsafe fn read_u64(src: *const u64) -> u64 {
unsafe { src.read_volatile() }
}
unsafe fn write_u8(dst: *mut u8, value: u8) {
unsafe { dst.write_volatile(value) }
}
unsafe fn write_u16(dst: *mut u16, value: u16) {
unsafe { dst.write_volatile(value) }
}
unsafe fn write_u32(dst: *mut u32, value: u32) {
unsafe { dst.write_volatile(value) }
}
unsafe fn write_u64(dst: *mut u64, value: u64) {
unsafe { dst.write_volatile(value) }
}
}
set_mmio_ops!(VolatileOps);
}