diff --git a/sim/src/image.rs b/sim/src/image.rs index d5355eb4..c3f8452c 100644 --- a/sim/src/image.rs +++ b/sim/src/image.rs @@ -969,6 +969,35 @@ impl Images { } } + /// Test the direct XIP configuration. With this mode, flash images are never moved, and the + /// bootloader merely selects which partition is the proper one to boot. + pub fn run_direct_xip(&self) -> bool { + if !Caps::DirectXip.present() { + return false; + } + + // Clone the flash so we can tell if unchanged. + let mut flash = self.flash.clone(); + + let result = c::boot_go(&mut flash, &self.areadesc, None, true); + + // Ensure the boot was successful. + let resp = if let Some(resp) = result.resp() { + resp + } else { + panic!("Boot didn't return a valid result"); + }; + + // This configuration should always try booting from the first upgrade slot. + if let Some((offset, _, dev_id)) = self.areadesc.find(FlashId::Image1) { + assert_eq!(offset, resp.image_off as usize); + assert_eq!(dev_id, resp.flash_dev_id); + } else { + panic!("Unable to find upgrade image"); + } + false + } + /// Adds a new flash area that fails statistically fn mark_bad_status_with_rate(&self, flash: &mut SimMultiFlash, slot: usize, rate: f32) { diff --git a/sim/tests/core.rs b/sim/tests/core.rs index 4e2d9c10..104fe797 100644 --- a/sim/tests/core.rs +++ b/sim/tests/core.rs @@ -59,6 +59,8 @@ sim_test!(status_write_fails_complete, make_image(&NO_DEPS, true), run_with_stat sim_test!(status_write_fails_with_reset, make_image(&NO_DEPS, true), run_with_status_fails_with_reset()); sim_test!(downgrade_prevention, make_image(&REV_DEPS, true), run_nodowngrade()); +sim_test!(direct_xip_first, make_no_upgrade_image(&NO_DEPS), run_direct_xip()); + // Test various combinations of incorrect dependencies. test_shell!(dependency_combos, r, { // Only test setups with two images.