sim: Make various functions into methods
The functions `try_upgrade`, `try_revert`, `try_revert_with_fail_at`,
and `try_random_fails` make more sense as methods. Move them into the
`Images` impl so they have access to `self` and some various fields.
Signed-off-by: David Brown <david.brown@linaro.org>
diff --git a/sim/src/image.rs b/sim/src/image.rs
index e563653..e7dc382 100644
--- a/sim/src/image.rs
+++ b/sim/src/image.rs
@@ -243,7 +243,7 @@
/// Returns the number of flash operations which can later be used to
/// inject failures at chosen steps.
pub fn run_basic_upgrade(&self) -> Result<i32, ()> {
- let (flash, total_count) = try_upgrade(&self.flash, &self, None);
+ let (flash, total_count) = self.try_upgrade(None);
info!("Total flash operation count={}", total_count);
if !verify_image(&flash, &self.slots, 0, &self.upgrades) {
@@ -265,7 +265,7 @@
if Caps::SwapUpgrade.present() {
for count in 2 .. 5 {
info!("Try revert: {}", count);
- let flash = try_revert(&self.flash, &self.areadesc, count);
+ let flash = self.try_revert(count);
if !verify_image(&flash, &self.slots, 0, &self.primaries) {
error!("Revert failure on count {}", count);
fails += 1;
@@ -283,7 +283,7 @@
// Let's try an image halfway through.
for i in 1 .. total_flash_ops {
info!("Try interruption at {}", i);
- let (flash, count) = try_upgrade(&self.flash, &self, Some(i));
+ let (flash, count) = self.try_upgrade(Some(i));
info!("Second boot, count={}", count);
if !verify_image(&flash, &self.slots, 0, &self.upgrades) {
warn!("FAIL at step {} of {}", i, total_flash_ops);
@@ -326,8 +326,7 @@
pub fn run_perm_with_random_fails(&self, total_fails: usize) -> bool {
let mut fails = 0;
let total_flash_ops = self.total_count.unwrap();
- let (flash, total_counts) = try_random_fails(&self.flash, &self,
- total_flash_ops, total_fails);
+ let (flash, total_counts) = self.try_random_fails(total_flash_ops, total_fails);
info!("Random interruptions at reset points={:?}", total_counts);
let primary_slot_ok = verify_image(&flash, &self.slots,
@@ -372,7 +371,7 @@
if Caps::SwapUpgrade.present() {
for i in 1 .. (self.total_count.unwrap() - 1) {
info!("Try interruption at {}", i);
- if try_revert_with_fail_at(&self.flash, &self, i) {
+ if self.try_revert_with_fail_at(i) {
error!("Revert failed at interruption {}", i);
fails += 1;
}
@@ -711,152 +710,148 @@
dev.set_verify_writes(false);
}
-}
+ /// Test a boot, optionally stopping after 'n' flash options. Returns a count
+ /// of the number of flash operations done total.
+ fn try_upgrade(&self, stop: Option<i32>) -> (SimMultiFlash, i32) {
+ // Clone the flash to have a new copy.
+ let mut flash = self.flash.clone();
-/// Test a boot, optionally stopping after 'n' flash options. Returns a count
-/// of the number of flash operations done total.
-fn try_upgrade(flash: &SimMultiFlash, images: &Images,
- stop: Option<i32>) -> (SimMultiFlash, i32) {
- // Clone the flash to have a new copy.
- let mut flash = flash.clone();
+ mark_permanent_upgrade(&mut flash, &self.slots[1]);
- mark_permanent_upgrade(&mut flash, &images.slots[1]);
+ let mut counter = stop.unwrap_or(0);
- let mut counter = stop.unwrap_or(0);
+ let (first_interrupted, count) = match c::boot_go(&mut flash, &self.areadesc, Some(&mut counter), false) {
+ (-0x13579, _) => (true, stop.unwrap()),
+ (0, _) => (false, -counter),
+ (x, _) => panic!("Unknown return: {}", x),
+ };
- let (first_interrupted, count) = match c::boot_go(&mut flash, &images.areadesc, Some(&mut counter), false) {
- (-0x13579, _) => (true, stop.unwrap()),
- (0, _) => (false, -counter),
- (x, _) => panic!("Unknown return: {}", x),
- };
+ counter = 0;
+ if first_interrupted {
+ // fl.dump();
+ match c::boot_go(&mut flash, &self.areadesc, Some(&mut counter), false) {
+ (-0x13579, _) => panic!("Shouldn't stop again"),
+ (0, _) => (),
+ (x, _) => panic!("Unknown return: {}", x),
+ }
+ }
- counter = 0;
- if first_interrupted {
- // fl.dump();
- match c::boot_go(&mut flash, &images.areadesc, Some(&mut counter), false) {
- (-0x13579, _) => panic!("Shouldn't stop again"),
+ (flash, count - counter)
+ }
+
+ fn try_revert(&self, count: usize) -> SimMultiFlash {
+ let mut flash = self.flash.clone();
+
+ // fl.write_file("image0.bin").unwrap();
+ for i in 0 .. count {
+ info!("Running boot pass {}", i + 1);
+ assert_eq!(c::boot_go(&mut flash, &self.areadesc, None, false), (0, 0));
+ }
+ flash
+ }
+
+ fn try_revert_with_fail_at(&self, stop: i32) -> bool {
+ let mut flash = self.flash.clone();
+ let mut fails = 0;
+
+ let mut counter = stop;
+ let (x, _) = c::boot_go(&mut flash, &self.areadesc, Some(&mut counter), false);
+ if x != -0x13579 {
+ warn!("Should have stopped at interruption point");
+ fails += 1;
+ }
+
+ if !verify_trailer(&flash, &self.slots, 0, None, None, BOOT_FLAG_UNSET) {
+ warn!("copy_done should be unset");
+ fails += 1;
+ }
+
+ let (x, _) = c::boot_go(&mut flash, &self.areadesc, None, false);
+ if x != 0 {
+ warn!("Should have finished upgrade");
+ fails += 1;
+ }
+
+ if !verify_image(&flash, &self.slots, 0, &self.upgrades) {
+ warn!("Image in the primary slot before revert is invalid at stop={}",
+ stop);
+ fails += 1;
+ }
+ if !verify_image(&flash, &self.slots, 1, &self.primaries) {
+ warn!("Image in the secondary slot before revert is invalid at stop={}",
+ stop);
+ fails += 1;
+ }
+ if !verify_trailer(&flash, &self.slots, 0, BOOT_MAGIC_GOOD,
+ BOOT_FLAG_UNSET, BOOT_FLAG_SET) {
+ warn!("Mismatched trailer for the primary slot before revert");
+ fails += 1;
+ }
+ if !verify_trailer(&flash, &self.slots, 1, BOOT_MAGIC_UNSET,
+ BOOT_FLAG_UNSET, BOOT_FLAG_UNSET) {
+ warn!("Mismatched trailer for the secondary slot before revert");
+ fails += 1;
+ }
+
+ // Do Revert
+ let (x, _) = c::boot_go(&mut flash, &self.areadesc, None, false);
+ if x != 0 {
+ warn!("Should have finished a revert");
+ fails += 1;
+ }
+
+ if !verify_image(&flash, &self.slots, 0, &self.primaries) {
+ warn!("Image in the primary slot after revert is invalid at stop={}",
+ stop);
+ fails += 1;
+ }
+ if !verify_image(&flash, &self.slots, 1, &self.upgrades) {
+ warn!("Image in the secondary slot after revert is invalid at stop={}",
+ stop);
+ fails += 1;
+ }
+ if !verify_trailer(&flash, &self.slots, 0, BOOT_MAGIC_GOOD,
+ BOOT_FLAG_SET, BOOT_FLAG_SET) {
+ warn!("Mismatched trailer for the secondary slot after revert");
+ fails += 1;
+ }
+ if !verify_trailer(&flash, &self.slots, 1, BOOT_MAGIC_UNSET,
+ BOOT_FLAG_UNSET, BOOT_FLAG_UNSET) {
+ warn!("Mismatched trailer for the secondary slot after revert");
+ fails += 1;
+ }
+
+ fails > 0
+ }
+
+ fn try_random_fails(&self, total_ops: i32, count: usize) -> (SimMultiFlash, Vec<i32>) {
+ let mut flash = self.flash.clone();
+
+ mark_permanent_upgrade(&mut flash, &self.slots[1]);
+
+ let mut rng = rand::thread_rng();
+ let mut resets = vec![0i32; count];
+ let mut remaining_ops = total_ops;
+ for i in 0 .. count {
+ let ops = Range::new(1, remaining_ops / 2);
+ let reset_counter = ops.ind_sample(&mut rng);
+ let mut counter = reset_counter;
+ match c::boot_go(&mut flash, &self.areadesc, Some(&mut counter), false) {
+ (0, _) | (-0x13579, _) => (),
+ (x, _) => panic!("Unknown return: {}", x),
+ }
+ remaining_ops -= reset_counter;
+ resets[i] = reset_counter;
+ }
+
+ match c::boot_go(&mut flash, &self.areadesc, None, false) {
+ (-0x13579, _) => panic!("Should not be have been interrupted!"),
(0, _) => (),
(x, _) => panic!("Unknown return: {}", x),
}
- }
- (flash, count - counter)
-}
-
-fn try_revert(flash: &SimMultiFlash, areadesc: &AreaDesc, count: usize) -> SimMultiFlash {
- let mut flash = flash.clone();
-
- // fl.write_file("image0.bin").unwrap();
- for i in 0 .. count {
- info!("Running boot pass {}", i + 1);
- assert_eq!(c::boot_go(&mut flash, &areadesc, None, false), (0, 0));
+ (flash, resets)
}
- flash
-}
-
-fn try_revert_with_fail_at(flash: &SimMultiFlash, images: &Images,
- stop: i32) -> bool {
- let mut flash = flash.clone();
- let mut fails = 0;
-
- let mut counter = stop;
- let (x, _) = c::boot_go(&mut flash, &images.areadesc, Some(&mut counter), false);
- if x != -0x13579 {
- warn!("Should have stopped at interruption point");
- fails += 1;
- }
-
- if !verify_trailer(&flash, &images.slots, 0, None, None, BOOT_FLAG_UNSET) {
- warn!("copy_done should be unset");
- fails += 1;
- }
-
- let (x, _) = c::boot_go(&mut flash, &images.areadesc, None, false);
- if x != 0 {
- warn!("Should have finished upgrade");
- fails += 1;
- }
-
- if !verify_image(&flash, &images.slots, 0, &images.upgrades) {
- warn!("Image in the primary slot before revert is invalid at stop={}",
- stop);
- fails += 1;
- }
- if !verify_image(&flash, &images.slots, 1, &images.primaries) {
- warn!("Image in the secondary slot before revert is invalid at stop={}",
- stop);
- fails += 1;
- }
- if !verify_trailer(&flash, &images.slots, 0, BOOT_MAGIC_GOOD,
- BOOT_FLAG_UNSET, BOOT_FLAG_SET) {
- warn!("Mismatched trailer for the primary slot before revert");
- fails += 1;
- }
- if !verify_trailer(&flash, &images.slots, 1, BOOT_MAGIC_UNSET,
- BOOT_FLAG_UNSET, BOOT_FLAG_UNSET) {
- warn!("Mismatched trailer for the secondary slot before revert");
- fails += 1;
- }
-
- // Do Revert
- let (x, _) = c::boot_go(&mut flash, &images.areadesc, None, false);
- if x != 0 {
- warn!("Should have finished a revert");
- fails += 1;
- }
-
- if !verify_image(&flash, &images.slots, 0, &images.primaries) {
- warn!("Image in the primary slot after revert is invalid at stop={}",
- stop);
- fails += 1;
- }
- if !verify_image(&flash, &images.slots, 1, &images.upgrades) {
- warn!("Image in the secondary slot after revert is invalid at stop={}",
- stop);
- fails += 1;
- }
- if !verify_trailer(&flash, &images.slots, 0, BOOT_MAGIC_GOOD,
- BOOT_FLAG_SET, BOOT_FLAG_SET) {
- warn!("Mismatched trailer for the secondary slot after revert");
- fails += 1;
- }
- if !verify_trailer(&flash, &images.slots, 1, BOOT_MAGIC_UNSET,
- BOOT_FLAG_UNSET, BOOT_FLAG_UNSET) {
- warn!("Mismatched trailer for the secondary slot after revert");
- fails += 1;
- }
-
- fails > 0
-}
-
-fn try_random_fails(flash: &SimMultiFlash, images: &Images,
- total_ops: i32, count: usize) -> (SimMultiFlash, Vec<i32>) {
- let mut flash = flash.clone();
-
- mark_permanent_upgrade(&mut flash, &images.slots[1]);
-
- let mut rng = rand::thread_rng();
- let mut resets = vec![0i32; count];
- let mut remaining_ops = total_ops;
- for i in 0 .. count {
- let ops = Range::new(1, remaining_ops / 2);
- let reset_counter = ops.ind_sample(&mut rng);
- let mut counter = reset_counter;
- match c::boot_go(&mut flash, &images.areadesc, Some(&mut counter), false) {
- (0, _) | (-0x13579, _) => (),
- (x, _) => panic!("Unknown return: {}", x),
- }
- remaining_ops -= reset_counter;
- resets[i] = reset_counter;
- }
-
- match c::boot_go(&mut flash, &images.areadesc, None, false) {
- (-0x13579, _) => panic!("Should not be have been interrupted!"),
- (0, _) => (),
- (x, _) => panic!("Unknown return: {}", x),
- }
-
- (flash, resets)
}
/// Show the flash layout.