sim: Fit unit tests to larger write align values
Signed-off-by: Gustavo Henrique Nihei <gustavo.nihei@espressif.com>
diff --git a/sim/Cargo.toml b/sim/Cargo.toml
index 5d5555e..856ccb2 100644
--- a/sim/Cargo.toml
+++ b/sim/Cargo.toml
@@ -28,8 +28,8 @@
multiimage = ["mcuboot-sys/multiimage"]
ram-load = ["mcuboot-sys/ram-load"]
direct-xip = ["mcuboot-sys/direct-xip"]
-large-write = []
downgrade-prevention = ["mcuboot-sys/downgrade-prevention"]
+max-align-32 = ["mcuboot-sys/max-align-32"]
[dependencies]
byteorder = "1.3"
diff --git a/sim/mcuboot-sys/Cargo.toml b/sim/mcuboot-sys/Cargo.toml
index 225ca0c..1f6b81c 100644
--- a/sim/mcuboot-sys/Cargo.toml
+++ b/sim/mcuboot-sys/Cargo.toml
@@ -80,9 +80,8 @@
# Check (in software) against version downgrades.
downgrade-prevention = []
-# Large write. Not meaningful, but present here so that the
-# full-suite tests will work for this configuration.
-large-write = []
+# Support images with 32-byte maximum write alignment value.
+max-align-32 = []
[build-dependencies]
cc = "1.0.25"
diff --git a/sim/mcuboot-sys/build.rs b/sim/mcuboot-sys/build.rs
index eb3ab34..550d980 100644
--- a/sim/mcuboot-sys/build.rs
+++ b/sim/mcuboot-sys/build.rs
@@ -40,6 +40,13 @@
conf.conf.define("MCUBOOT_USE_FLASH_AREA_GET_SECTORS", None);
conf.conf.define("MCUBOOT_HAVE_ASSERT_H", None);
conf.conf.define("MCUBOOT_MAX_IMG_SECTORS", Some("128"));
+
+#[cfg(not(feature = "max-align-32"))]
+ conf.conf.define("MCUBOOT_BOOT_MAX_ALIGN", Some("8"));
+
+#[cfg(feature = "max-align-32")]
+ conf.conf.define("MCUBOOT_BOOT_MAX_ALIGN", Some("32"));
+
conf.conf.define("MCUBOOT_IMAGE_NUMBER", Some(if multiimage { "2" } else { "1" }));
if downgrade_prevention && !overwrite_only {
diff --git a/sim/mcuboot-sys/csupport/run.c b/sim/mcuboot-sys/csupport/run.c
index 6c61228..cb2016b 100644
--- a/sim/mcuboot-sys/csupport/run.c
+++ b/sim/mcuboot-sys/csupport/run.c
@@ -477,5 +477,5 @@
uint32_t boot_magic_sz(void)
{
- return BOOT_MAGIC_SZ;
+ return BOOT_MAGIC_ALIGN_SIZE;
}
diff --git a/sim/src/image.rs b/sim/src/image.rs
index c7b9846..d3cc068 100644
--- a/sim/src/image.rs
+++ b/sim/src/image.rs
@@ -54,6 +54,7 @@
UpgradeInfo,
};
use crate::tlv::{ManifestGen, TlvGen, TlvFlags};
+use crate::utils::align_up;
use typenum::{U32, U16};
/// For testing, use a non-zero offset for the ram-load, to make sure the offset is getting used
@@ -1522,7 +1523,8 @@
// c::boot_status_sz(dev.align() as u32) as usize
16 + 4 * dev.align()
} else {
- c::boot_trailer_sz(dev.align() as u32) as usize
+ let sector_size = dev.sector_iter().next().unwrap().size as u32;
+ align_up(c::boot_trailer_sz(dev.align() as u32), sector_size) as usize
};
let tlv_len = tlv.estimate_size();
info!("slot: 0x{:x}, HDR: 0x{:x}, trailer: 0x{:x}",
@@ -1800,7 +1802,7 @@
failed |= match magic {
Some(v) => {
- let magic_off = c::boot_max_align() * 3;
+ let magic_off = (c::boot_max_align() * 3) + (c::boot_magic_sz() - MAGIC.len());
if v == 1 && ©[magic_off..] != MAGIC {
warn!("\"magic\" mismatch at {:#x}", offset);
true
@@ -1937,11 +1939,18 @@
pub dev_id: u8,
}
+#[cfg(not(feature = "max-align-32"))]
const MAGIC: &[u8] = &[0x77, 0xc2, 0x95, 0xf3,
0x60, 0xd2, 0xef, 0x7f,
0x35, 0x52, 0x50, 0x0f,
0x2c, 0xb6, 0x79, 0x80];
+#[cfg(feature = "max-align-32")]
+const MAGIC: &[u8] = &[0x20, 0x00, 0x2d, 0xe1,
+ 0x5d, 0x29, 0x41, 0x0b,
+ 0x8d, 0x77, 0x67, 0x9c,
+ 0x11, 0x0f, 0x1f, 0x8a];
+
// Replicates defines found in bootutil.h
const BOOT_MAGIC_GOOD: Option<u8> = Some(1);
const BOOT_MAGIC_UNSET: Option<u8> = Some(3);
@@ -1958,8 +1967,9 @@
// The write size is larger than the magic value. Fill a buffer
// with the erased value, put the MAGIC in it, and write it in its
// entirety.
- let mut buf = vec![dev.erased_val(); align];
- buf[(offset % align)..].copy_from_slice(MAGIC);
+ let mut buf = vec![dev.erased_val(); c::boot_max_align()];
+ let magic_off = (offset % align) + (c::boot_magic_sz() - MAGIC.len());
+ buf[magic_off..].copy_from_slice(MAGIC);
dev.write(offset - (offset % align), &buf).unwrap();
} else {
dev.write(offset, MAGIC).unwrap();
@@ -2024,12 +2034,12 @@
}
}
-#[cfg(not(feature = "large-write"))]
+#[cfg(not(feature = "max-align-32"))]
fn test_alignments() -> &'static [usize] {
&[1, 2, 4, 8]
}
-#[cfg(feature = "large-write")]
+#[cfg(feature = "max-align-32")]
fn test_alignments() -> &'static [usize] {
- &[1, 2, 4, 8, 128, 512]
+ &[32]
}
diff --git a/sim/src/lib.rs b/sim/src/lib.rs
index a491438..df1919e 100644
--- a/sim/src/lib.rs
+++ b/sim/src/lib.rs
@@ -16,6 +16,7 @@
mod depends;
mod image;
mod tlv;
+mod utils;
pub mod testlog;
pub use crate::{
diff --git a/sim/src/utils.rs b/sim/src/utils.rs
new file mode 100644
index 0000000..abbac3c
--- /dev/null
+++ b/sim/src/utils.rs
@@ -0,0 +1,11 @@
+// SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD
+//
+// SPDX-License-Identifier: Apache-2.0
+
+//! Utility functions used throughout MCUboot
+
+pub fn align_up(num: u32, align: u32) -> u32 {
+ assert!(align.is_power_of_two());
+
+ (num + (align - 1)) & !(align - 1)
+}