David Brown | de7729e | 2017-01-09 10:41:35 -0700 | [diff] [blame] | 1 | //! HAL api for MyNewt applications |
| 2 | |
| 3 | use flash::{Result, Flash}; |
| 4 | use libc; |
David Brown | 2d1d7cf | 2017-05-10 08:55:09 -0600 | [diff] [blame^] | 5 | use log::LogLevel; |
David Brown | de7729e | 2017-01-09 10:41:35 -0700 | [diff] [blame] | 6 | use std::slice; |
| 7 | |
| 8 | // This isn't meant to call directly, but by a wrapper. |
| 9 | |
| 10 | #[no_mangle] |
| 11 | pub 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] |
| 17 | pub 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] |
| 24 | pub 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 | |
| 30 | fn map_err(err: Result<()>) -> libc::c_int { |
| 31 | match err { |
| 32 | Ok(()) => 0, |
Fabio Utzig | 19b2c1a | 2017-04-20 07:32:44 -0300 | [diff] [blame] | 33 | Err(e) => { |
| 34 | warn!("{}", e); |
| 35 | -1 |
| 36 | }, |
David Brown | de7729e | 2017-01-09 10:41:35 -0700 | [diff] [blame] | 37 | } |
| 38 | } |
David Brown | 2d1d7cf | 2017-05-10 08:55:09 -0600 | [diff] [blame^] | 39 | |
| 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] |
| 47 | pub 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 | } |