sim: Naive move of binding into mcuboot-sys

Create a crate `mcuboot-sys` to hold the building and binding of the
mcuboot code.  There aren't any substantive code changes here, just
moving the code into a separate crate.

Signed-off-by: David Brown <david.brown@linaro.org>
diff --git a/sim/src/api.rs b/sim/src/api.rs
deleted file mode 100644
index 0347b65..0000000
--- a/sim/src/api.rs
+++ /dev/null
@@ -1,85 +0,0 @@
-//! HAL api for MyNewt applications
-
-use simflash::{Result, Flash};
-use libc;
-use log::LogLevel;
-use mem;
-use std::slice;
-
-// The current active flash device.  The 'static is a lie, and we manage the lifetime ourselves.
-static mut FLASH: Option<*mut Flash> = None;
-
-// Set the flash device to be used by the simulation.  The pointer is unsafely stashed away.
-pub unsafe fn set_flash(dev: &mut Flash) {
-    let dev: &'static mut Flash = mem::transmute(dev);
-    FLASH = Some(dev as *mut Flash);
-}
-
-pub unsafe fn clear_flash() {
-    FLASH = None;
-}
-
-// Retrieve the flash, returning an error from the enclosing function.  We can't panic here because
-// we've called through C and unwinding is prohibited (it seems to just exit the program).
-macro_rules! get_flash {
-    () => {
-        match FLASH {
-            Some(x) => &mut *x,
-            None => return -19,
-        }
-    }
-}
-
-// This isn't meant to call directly, but by a wrapper.
-
-#[no_mangle]
-pub extern fn sim_flash_erase(offset: u32, size: u32) -> libc::c_int {
-    let dev = unsafe { get_flash!() };
-    map_err(dev.erase(offset as usize, size as usize))
-}
-
-#[no_mangle]
-pub extern fn sim_flash_read(offset: u32, dest: *mut u8, size: u32) -> libc::c_int {
-    let dev = unsafe { get_flash!() };
-    let mut buf: &mut[u8] = unsafe { slice::from_raw_parts_mut(dest, size as usize) };
-    map_err(dev.read(offset as usize, &mut buf))
-}
-
-#[no_mangle]
-pub extern fn sim_flash_write(offset: u32, src: *const u8, size: u32) -> libc::c_int {
-    let dev = unsafe { get_flash!() };
-    let buf: &[u8] = unsafe { slice::from_raw_parts(src, size as usize) };
-    map_err(dev.write(offset as usize, &buf))
-}
-
-fn map_err(err: Result<()>) -> libc::c_int {
-    match err {
-        Ok(()) => 0,
-        Err(e) => {
-            warn!("{}", e);
-            -1
-        },
-    }
-}
-
-/// Called by C code to determine if we should log at this level.  Levels are defined in
-/// bootutil/bootutil_log.h.  This makes the logging from the C code controlled by bootsim::api, so
-/// for example, it can be enabled with something like:
-///     RUST_LOG=bootsim::api=info cargo run --release runall
-/// or
-///     RUST_LOG=bootsim=info cargo run --release runall
-#[no_mangle]
-pub extern fn sim_log_enabled(level: libc::c_int) -> libc::c_int {
-    let res = match level {
-        1 => log_enabled!(LogLevel::Error),
-        2 => log_enabled!(LogLevel::Warn),
-        3 => log_enabled!(LogLevel::Info),
-        4 => log_enabled!(LogLevel::Trace),
-        _ => false,
-    };
-    if res {
-        1
-    } else {
-        0
-    }
-}
diff --git a/sim/src/area.rs b/sim/src/area.rs
deleted file mode 100644
index 5a1ef6c..0000000
--- a/sim/src/area.rs
+++ /dev/null
@@ -1,192 +0,0 @@
-//! Describe flash areas.
-
-use simflash::{Flash, SimFlash, Sector};
-use std::ptr;
-
-/// Structure to build up the boot area table.
-#[derive(Debug)]
-pub struct AreaDesc {
-    areas: Vec<Vec<FlashArea>>,
-    whole: Vec<FlashArea>,
-    sectors: Vec<Sector>,
-}
-
-impl AreaDesc {
-    pub fn new(flash: &SimFlash) -> AreaDesc {
-        AreaDesc {
-            areas: vec![],
-            whole: vec![],
-            sectors: flash.sector_iter().collect(),
-        }
-    }
-
-    /// Add a slot to the image.  The slot must align with erasable units in the flash device.
-    /// Panics if the description is not valid.  There are also bootloader assumptions that the
-    /// slots are SLOT0, SLOT1, and SCRATCH in that order.
-    pub fn add_image(&mut self, base: usize, len: usize, id: FlashId) {
-        let nid = id as usize;
-        let orig_base = base;
-        let orig_len = len;
-        let mut base = base;
-        let mut len = len;
-
-        while nid > self.areas.len() {
-            self.areas.push(vec![]);
-            self.whole.push(Default::default());
-        }
-
-        if nid != self.areas.len() {
-            panic!("Flash areas not added in order");
-        }
-
-        let mut area = vec![];
-
-        for sector in &self.sectors {
-            if len == 0 {
-                break;
-            };
-            if base > sector.base + sector.size - 1 {
-                continue;
-            }
-            if sector.base != base {
-                panic!("Image does not start on a sector boundary");
-            }
-
-            area.push(FlashArea {
-                flash_id: id,
-                device_id: 42,
-                pad16: 0,
-                off: sector.base as u32,
-                size: sector.size as u32,
-            });
-
-            base += sector.size;
-            len -= sector.size;
-        }
-
-        if len != 0 {
-            panic!("Image goes past end of device");
-        }
-
-        self.areas.push(area);
-        self.whole.push(FlashArea {
-            flash_id: id,
-            device_id: 42,
-            pad16: 0,
-            off: orig_base as u32,
-            size: orig_len as u32,
-        });
-    }
-
-    // Add a simple slot to the image.  This ignores the device layout, and just adds the area as a
-    // single unit.  It assumes that the image lines up with image boundaries.  This tests
-    // configurations where the partition table uses larger sectors than the underlying flash
-    // device.
-    pub fn add_simple_image(&mut self, base: usize, len: usize, id: FlashId) {
-        let area = vec![FlashArea {
-            flash_id: id,
-            device_id: 42,
-            pad16: 0,
-            off: base as u32,
-            size: len as u32,
-        }];
-
-        self.areas.push(area);
-        self.whole.push(FlashArea {
-            flash_id: id,
-            device_id: 42,
-            pad16: 0,
-            off: base as u32,
-            size: len as u32,
-        });
-    }
-
-    // Look for the image with the given ID, and return its base and size.  Panics if the area is
-    // not present.
-    pub fn find(&self, id: FlashId) -> (usize, usize) {
-        for area in &self.whole {
-            if area.flash_id == id {
-                return (area.off as usize, area.size as usize);
-            }
-        }
-        panic!("Requesting area that is not present in flash");
-    }
-
-    pub fn get_c(&self) -> CAreaDesc {
-        let mut areas: CAreaDesc = Default::default();
-
-        assert_eq!(self.areas.len(), self.whole.len());
-
-        for (i, area) in self.areas.iter().enumerate() {
-            if area.len() > 0 {
-                areas.slots[i].areas = &area[0];
-                areas.slots[i].whole = self.whole[i].clone();
-                areas.slots[i].num_areas = area.len() as u32;
-                areas.slots[i].id = area[0].flash_id;
-            }
-        }
-
-        areas.num_slots = self.areas.len() as u32;
-
-        areas
-    }
-}
-
-/// The area descriptor, C format.
-#[repr(C)]
-#[derive(Debug, Default)]
-pub struct CAreaDesc {
-    slots: [CArea; 16],
-    num_slots: u32,
-}
-
-#[repr(C)]
-#[derive(Debug)]
-pub struct CArea {
-    whole: FlashArea,
-    areas: *const FlashArea,
-    num_areas: u32,
-    id: FlashId,
-}
-
-impl Default for CArea {
-    fn default() -> CArea {
-        CArea {
-            areas: ptr::null(),
-            whole: Default::default(),
-            id: FlashId::BootLoader,
-            num_areas: 0,
-        }
-    }
-}
-
-/// Flash area map.
-#[repr(u8)]
-#[derive(Copy, Clone, Debug, Eq, PartialEq)]
-#[allow(dead_code)]
-pub enum FlashId {
-    BootLoader = 0,
-    Image0 = 1,
-    Image1 = 2,
-    ImageScratch = 3,
-    Nffs = 4,
-    Core = 5,
-    RebootLog = 6
-}
-
-impl Default for FlashId {
-    fn default() -> FlashId {
-        FlashId::BootLoader
-    }
-}
-
-#[repr(C)]
-#[derive(Debug, Clone, Default)]
-pub struct FlashArea {
-    flash_id: FlashId,
-    device_id: u8,
-    pad16: u16,
-    off: u32,
-    size: u32,
-}
-
diff --git a/sim/src/c.rs b/sim/src/c.rs
deleted file mode 100644
index a3a6b4f..0000000
--- a/sim/src/c.rs
+++ /dev/null
@@ -1,64 +0,0 @@
-/// Interface wrappers to C API entering to the bootloader
-
-use area::AreaDesc;
-use simflash::Flash;
-use libc;
-use api;
-
-/// Invoke the bootloader on this flash device.
-pub fn boot_go(flash: &mut Flash, areadesc: &AreaDesc) -> i32 {
-    unsafe { api::set_flash(flash) };
-    let result = unsafe { raw::invoke_boot_go(&areadesc.get_c() as *const _) as i32 };
-    unsafe { api::clear_flash(); };
-    result
-}
-
-/// Setter/getter for the flash counter.  This isn't thread safe.
-pub fn get_flash_counter() -> i32 {
-    unsafe { raw::flash_counter as i32 }
-}
-
-/// Set the flash counter.  Zero indicates the flash should not be interrupted.  The counter will
-/// then go negative for each flash operation.
-pub fn set_flash_counter(counter: i32) {
-    unsafe { raw::flash_counter = counter as libc::c_int };
-}
-
-pub fn boot_trailer_sz() -> u32 {
-    unsafe { raw::boot_slots_trailer_sz(raw::sim_flash_align) }
-}
-
-pub fn get_sim_flash_align() -> u8 {
-    unsafe { raw::sim_flash_align }
-}
-
-pub fn set_sim_flash_align(align: u8) {
-    unsafe { raw::sim_flash_align = align };
-}
-
-pub fn boot_magic_sz() -> usize {
-    unsafe { raw::BOOT_MAGIC_SZ as usize }
-}
-
-pub fn boot_max_align() -> usize {
-    unsafe { raw::BOOT_MAX_ALIGN as usize }
-}
-
-mod raw {
-    use area::CAreaDesc;
-    use libc;
-
-    extern "C" {
-        // This generates a warning about `CAreaDesc` not being foreign safe.  There doesn't appear to
-        // be any way to get rid of this warning.  See https://github.com/rust-lang/rust/issues/34798
-        // for information and tracking.
-        pub fn invoke_boot_go(areadesc: *const CAreaDesc) -> libc::c_int;
-        pub static mut flash_counter: libc::c_int;
-
-        pub static mut sim_flash_align: u8;
-        pub fn boot_slots_trailer_sz(min_write_sz: u8) -> u32;
-
-        pub static BOOT_MAGIC_SZ: u32;
-        pub static BOOT_MAX_ALIGN: u32;
-    }
-}
diff --git a/sim/src/main.rs b/sim/src/main.rs
index acd15a9..61eb2c0 100644
--- a/sim/src/main.rs
+++ b/sim/src/main.rs
@@ -9,6 +9,7 @@
 extern crate rustc_serialize;
 extern crate simflash;
 extern crate untrusted;
+extern crate mcuboot_sys;
 
 use docopt::Docopt;
 use rand::{Rng, SeedableRng, XorShiftRng};
@@ -19,14 +20,12 @@
 use std::process;
 use std::slice;
 
-mod area;
-mod c;
-pub mod api;
 mod caps;
 mod tlv;
 
 use simflash::{Flash, SimFlash};
-use area::{AreaDesc, FlashId};
+use mcuboot_sys::area::{AreaDesc, FlashId};
+use mcuboot_sys::c;
 use caps::Caps;
 use tlv::TlvGen;