// SPDX-License-Identifier: MIT OR Apache-2.0 // // Copyright (c) 2018-2020 Andre Richter //! Memory Management. pub mod mmu; use core::ops::Range; //-------------------------------------------------------------------------------------------------- // Public Code //-------------------------------------------------------------------------------------------------- /// Zero out a memory range. /// /// # Safety /// /// - `range.start` and `range.end` must be valid. /// - `range.start` and `range.end` must be `T` aligned. pub unsafe fn zero_volatile(range: Range<*mut T>) where T: From, { let mut ptr = range.start; while ptr < range.end { core::ptr::write_volatile(ptr, T::from(0)); ptr = ptr.offset(1); } } //-------------------------------------------------------------------------------------------------- // Testing //-------------------------------------------------------------------------------------------------- #[cfg(test)] mod tests { use super::*; use test_macros::kernel_test; /// Check `zero_volatile()`. #[kernel_test] fn zero_volatile_works() { let mut x: [usize; 3] = [10, 11, 12]; let x_range = x.as_mut_ptr_range(); unsafe { zero_volatile(x_range) }; assert_eq!(x, [0, 0, 0]); } }