blob: bc3fc49382670f84c73109c3ccabf4704ddc7cba [file] [log] [blame]
// 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<u8>,
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<F, R>(&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
}
}