sim: Simplify `slot` parameters

Many places in the image code pass a pair of

    slots: &[SlotInfo], slot: usize,

around as arguments.  Simplify this by just passing a `&SlotInfo`.  For
the few instances where code needs to know the index of a slot, add an
index field to the `SlotInfo` struct for these to use.  This eliminates
an argument from 4 functions/methods, and the numerous places they are
called.

Signed-off-by: David Brown <david.brown@linaro.org>
diff --git a/sim/src/image.rs b/sim/src/image.rs
index becd2c4..ac238e7 100644
--- a/sim/src/image.rs
+++ b/sim/src/image.rs
@@ -101,6 +101,7 @@
                 trailer_off: primary_base + primary_len - offset_from_end,
                 len: primary_len as usize,
                 dev_id: primary_dev_id,
+                index: 0,
             };
 
             // And an upgrade image.
@@ -109,6 +110,7 @@
                 trailer_off: secondary_base + secondary_len - offset_from_end,
                 len: secondary_len as usize,
                 dev_id: secondary_dev_id,
+                index: 1,
             };
 
             slots.push([primary, secondary]);
@@ -140,8 +142,8 @@
     pub fn make_no_upgrade_image(self) -> Images {
         let mut flash = self.flash;
         let images = self.slots.into_iter().map(|slots| {
-            let primaries = install_image(&mut flash, &slots, 0, 42784, false);
-            let upgrades = install_image(&mut flash, &slots, 1, 46928, false);
+            let primaries = install_image(&mut flash, &slots[0], 42784, false);
+            let upgrades = install_image(&mut flash, &slots[1], 46928, false);
             OneImage {
                 slots: slots,
                 primaries: primaries,
@@ -176,8 +178,8 @@
     pub fn make_bad_secondary_slot_image(self) -> Images {
         let mut bad_flash = self.flash;
         let images = self.slots.into_iter().map(|slots| {
-            let primaries = install_image(&mut bad_flash, &slots, 0, 32784, false);
-            let upgrades = install_image(&mut bad_flash, &slots, 1, 41928, true);
+            let primaries = install_image(&mut bad_flash, &slots[0], 32784, false);
+            let upgrades = install_image(&mut bad_flash, &slots[1], 41928, true);
             OneImage {
                 slots: slots,
                 primaries: primaries,
@@ -947,7 +949,7 @@
     /// against the expected image.
     fn verify_images(&self, flash: &SimMultiFlash, slot: usize, against: usize) -> bool {
         for image in &self.images {
-            if !verify_image(flash, &image.slots, slot,
+            if !verify_image(flash, &image.slots[slot],
                              match against {
                                  0 => &image.primaries,
                                  1 => &image.upgrades,
@@ -965,7 +967,7 @@
                              magic: Option<u8>, image_ok: Option<u8>,
                              copy_done: Option<u8>) -> bool {
         for image in &self.images {
-            if verify_trailer(flash, &image.slots, slot,
+            if verify_trailer(flash, &image.slots[slot],
                               magic, image_ok, copy_done) {
                 return true;
             }
@@ -979,7 +981,7 @@
                        magic: Option<u8>, image_ok: Option<u8>,
                        copy_done: Option<u8>) -> bool {
         for image in &self.images {
-            if !verify_trailer(flash, &image.slots, slot,
+            if !verify_trailer(flash, &image.slots[slot],
                                magic, image_ok, copy_done) {
                 return false;
             }
@@ -1015,11 +1017,11 @@
 
 /// Install a "program" into the given image.  This fakes the image header, or at least all of the
 /// fields used by the given code.  Returns a copy of the image that was written.
-fn install_image(flash: &mut SimMultiFlash, slots: &[SlotInfo], slot: usize, len: usize,
+fn install_image(flash: &mut SimMultiFlash, slot: &SlotInfo, len: usize,
                  bad_sig: bool) -> ImageData {
-    let offset = slots[slot].base_off;
-    let slot_len = slots[slot].len;
-    let dev_id = slots[slot].dev_id;
+    let offset = slot.base_off;
+    let slot_len = slot.len;
+    let dev_id = slot.dev_id;
 
     let mut tlv: Box<dyn ManifestGen> = Box::new(make_tlv());
 
@@ -1100,7 +1102,7 @@
 
     let dev = flash.get_mut(&dev_id).unwrap();
 
-    if slot == 0 {
+    if slot.index == 0 {
         let enc_copy: Option<Vec<u8>>;
 
         if is_encrypted {
@@ -1204,14 +1206,13 @@
 }
 
 /// Verify that given image is present in the flash at the given offset.
-fn verify_image(flash: &SimMultiFlash, slots: &[SlotInfo], slot: usize,
-                images: &ImageData) -> bool {
-    let image = images.find(slot);
+fn verify_image(flash: &SimMultiFlash, slot: &SlotInfo, images: &ImageData) -> bool {
+    let image = images.find(slot.index);
     let buf = image.as_slice();
-    let dev_id = slots[slot].dev_id;
+    let dev_id = slot.dev_id;
 
     let mut copy = vec![0u8; buf.len()];
-    let offset = slots[slot].base_off;
+    let offset = slot.base_off;
     let dev = flash.get(&dev_id).unwrap();
     dev.read(offset, &mut copy).unwrap();
 
@@ -1219,7 +1220,7 @@
         for i in 0 .. buf.len() {
             if buf[i] != copy[i] {
                 info!("First failure for slot{} at {:#x} {:#x}!={:#x}",
-                      slot, offset + i, buf[i], copy[i]);
+                      slot.index, offset + i, buf[i], copy[i]);
                 break;
             }
         }
@@ -1229,15 +1230,15 @@
     }
 }
 
-fn verify_trailer(flash: &SimMultiFlash, slots: &[SlotInfo], slot: usize,
+fn verify_trailer(flash: &SimMultiFlash, slot: &SlotInfo,
                   magic: Option<u8>, image_ok: Option<u8>,
                   copy_done: Option<u8>) -> bool {
     if Caps::OverwriteUpgrade.present() {
         return true;
     }
 
-    let offset = slots[slot].trailer_off + c::boot_max_align();
-    let dev_id = slots[slot].dev_id;
+    let offset = slot.trailer_off + c::boot_max_align();
+    let dev_id = slot.dev_id;
     let mut copy = vec![0u8; c::boot_magic_sz() + c::boot_max_align() * 3];
     let mut failed = false;
 
@@ -1320,6 +1321,8 @@
     pub base_off: usize,
     pub trailer_off: usize,
     pub len: usize,
+    // Which slot within this device.
+    pub index: usize,
     pub dev_id: u8,
 }