Implement new swap scheme for devices with large erase size using scratch with status area
diff --git a/sim/simflash/src/lib.rs b/sim/simflash/src/lib.rs
index 532fb0e..c52f53e 100644
--- a/sim/simflash/src/lib.rs
+++ b/sim/simflash/src/lib.rs
@@ -66,6 +66,8 @@
 
     fn align(&self) -> usize;
     fn erased_val(&self) -> u8;
+
+    fn set_erase_by_sector(&mut self, enable: bool);
 }
 
 fn ebounds<T: AsRef<str>>(message: T) -> FlashError {
@@ -94,6 +96,7 @@
     align: usize,
     verify_writes: bool,
     erased_val: u8,
+    erase_by_sector: bool,
 }
 
 impl SimFlash {
@@ -130,11 +133,11 @@
 
     // Scan the sector map, and return the base and offset within a sector for this given byte.
     // Returns None if the value is outside of the device.
-    fn get_sector(&self, offset: usize) -> Option<(usize, usize)> {
+    fn get_sector(&self, offset: usize) -> Option<(usize, usize, usize)> {
         let mut offset = offset;
         for (sector, &size) in self.sectors.iter().enumerate() {
             if offset < size {
-                return Some((sector, offset));
+                return Some((sector, offset, size));
             }
             offset -= size;
         }
@@ -150,8 +153,21 @@
     /// strict, and make sure that the passed arguments are exactly at a sector boundary, otherwise
     /// return an error.
     fn erase(&mut self, offset: usize, len: usize) -> Result<()> {
-        let (_start, slen) = self.get_sector(offset).ok_or_else(|| ebounds("start"))?;
-        let (end, elen) = self.get_sector(offset + len - 1).ok_or_else(|| ebounds("end"))?;
+        let (_start, mut slen, ssize) = self.get_sector(offset).ok_or_else(|| ebounds("start"))?;
+        let (end, mut elen, _) = self.get_sector(offset + len - 1).ok_or_else(|| ebounds("end"))?;
+
+        let mut offset = offset;
+        let mut len = len;
+
+        if self.erase_by_sector {
+            // info!("erase_by_sector: {:#X}/{:#X} -> {:#X}/{:#X}", offset, len, offset - slen, ssize);
+
+            offset = offset - slen;
+            len = ssize;
+
+            slen = 0;
+            elen = self.sectors[end] - 1;
+        }
 
         if slen != 0 {
             bail!(ebounds("offset not at start of sector"));
@@ -267,6 +283,10 @@
     fn erased_val(&self) -> u8 {
         self.erased_val
     }
+
+    fn set_erase_by_sector(&mut self, enable: bool) {
+        self.erase_by_sector = enable;
+    }
 }
 
 /// It is possible to iterate over the sectors in the device, each element returning this.