// Copyright (c) 2017-2019 Linaro LTD // // SPDX-License-Identifier: Apache-2.0 mod area; pub mod c; // The API needs to be public, even though it isn't intended to be called by Rust code, but the // functions are exported to C code. pub mod api; pub use crate::area::{AreaDesc, FlashId}; /// For testing the ram load feature, we need to emulate a block of RAM and be able to pass that /// down to the C code. The call down to boot_go should go through this object so that the buffer /// itself is managed properly. pub struct RamBlock { ram: Vec, offset: u32, // 32-bit offset. } impl RamBlock { pub fn new(size: u32, offset: u32) -> RamBlock { RamBlock { ram: vec![0; size as usize], offset: offset, } } /// Borrow the RAM buffer, with 'offset' being the beginning of the buffer. pub fn borrow(&self) -> &[u8] { &self.ram } /// Borrow a piece of the ram, with 'offset' being the beginning of the buffer. pub fn borrow_part(&self, base: usize, size: usize) -> &[u8] { &self.ram[base..base+size] } pub fn invoke(&self, act: F) -> R where F: FnOnce() -> R { api::set_ram_info(api::BootsimRamInfo { start: self.offset, size: self.ram.len() as u32, base: &self.ram[0] as *const u8 as usize - self.offset as usize, }); let result = act(); api::clear_ram_info(); result } }