blob: 21806ce4e1c5157841f970347fcb8eb2f6e70095 [file] [log] [blame]
David Brownde7729e2017-01-09 10:41:35 -07001//! HAL api for MyNewt applications
2
3use flash::{Result, Flash};
4use libc;
David Brown2d1d7cf2017-05-10 08:55:09 -06005use log::LogLevel;
David Brownde7729e2017-01-09 10:41:35 -07006use std::slice;
7
8// This isn't meant to call directly, but by a wrapper.
9
10#[no_mangle]
11pub extern fn sim_flash_erase(dev: *mut Flash, offset: u32, size: u32) -> libc::c_int {
12 let mut dev: &mut Flash = unsafe { &mut *dev };
13 map_err(dev.erase(offset as usize, size as usize))
14}
15
16#[no_mangle]
17pub extern fn sim_flash_read(dev: *const Flash, offset: u32, dest: *mut u8, size: u32) -> libc::c_int {
18 let dev: &Flash = unsafe { &*dev };
19 let mut buf: &mut[u8] = unsafe { slice::from_raw_parts_mut(dest, size as usize) };
20 map_err(dev.read(offset as usize, &mut buf))
21}
22
23#[no_mangle]
24pub extern fn sim_flash_write(dev: *mut Flash, offset: u32, src: *const u8, size: u32) -> libc::c_int {
25 let mut dev: &mut Flash = unsafe { &mut *dev };
26 let buf: &[u8] = unsafe { slice::from_raw_parts(src, size as usize) };
27 map_err(dev.write(offset as usize, &buf))
28}
29
30fn map_err(err: Result<()>) -> libc::c_int {
31 match err {
32 Ok(()) => 0,
Fabio Utzig19b2c1a2017-04-20 07:32:44 -030033 Err(e) => {
34 warn!("{}", e);
35 -1
36 },
David Brownde7729e2017-01-09 10:41:35 -070037 }
38}
David Brown2d1d7cf2017-05-10 08:55:09 -060039
40/// Called by C code to determine if we should log at this level. Levels are defined in
41/// bootutil/bootutil_log.h. This makes the logging from the C code controlled by bootsim::api, so
42/// for example, it can be enabled with something like:
43/// RUST_LOG=bootsim::api=info cargo run --release runall
44/// or
45/// RUST_LOG=bootsim=info cargo run --release runall
46#[no_mangle]
47pub extern fn sim_log_enabled(level: libc::c_int) -> libc::c_int {
48 let res = match level {
49 1 => log_enabled!(LogLevel::Error),
50 2 => log_enabled!(LogLevel::Warn),
51 3 => log_enabled!(LogLevel::Info),
52 4 => log_enabled!(LogLevel::Trace),
53 _ => false,
54 };
55 if res {
56 1
57 } else {
58 0
59 }
60}