use core::intrinsics::{volatile_load, volatile_store}; use core::mem::uninitialized; use core::ops::{BitAnd, BitOr, Not}; use super::io::Io; #[repr(packed)] pub struct Mmio { value: T, } impl Mmio { /// Create a new Mmio without initializing pub fn new() -> Self { Mmio { value: unsafe { uninitialized() } } } } impl Io for Mmio where T: Copy + PartialEq + BitAnd + BitOr + Not { type Value = T; fn read(&self) -> T { unsafe { volatile_load(&self.value) } } fn write(&mut self, value: T) { unsafe { volatile_store(&mut self.value, value) }; } }