sim: Put AreaDesc in an Rc
Since there are references to this struct passed to C code, put it into an Rc so
that it won't move around when the data is moved.
Signed-off-by: David Brown <david.brown@linaro.org>
diff --git a/sim/src/image.rs b/sim/src/image.rs
index 270ef24..4cd6488 100644
--- a/sim/src/image.rs
+++ b/sim/src/image.rs
@@ -19,10 +19,7 @@
rngs::SmallRng,
};
use std::{
- collections::{BTreeMap, HashSet},
- io::{Cursor, Write},
- mem,
- slice,
+ collections::{BTreeMap, HashSet}, io::{Cursor, Write}, mem, rc::Rc, slice
};
use aes::{
Aes128,
@@ -67,7 +64,7 @@
#[derive(Clone)]
pub struct ImagesBuilder {
flash: SimMultiFlash,
- areadesc: AreaDesc,
+ areadesc: Rc<AreaDesc>,
slots: Vec<[SlotInfo; 2]>,
ram: RamData,
}
@@ -77,7 +74,7 @@
/// and upgrades hold the expected contents of these images.
pub struct Images {
flash: SimMultiFlash,
- areadesc: AreaDesc,
+ areadesc: Rc<AreaDesc>,
images: Vec<OneImage>,
total_count: Option<i32>,
ram: RamData,
@@ -433,7 +430,7 @@
}
/// Build the Flash and area descriptor for a given device.
- pub fn make_device(device: DeviceName, align: usize, erased_val: u8) -> (SimMultiFlash, AreaDesc, &'static [Caps]) {
+ pub fn make_device(device: DeviceName, align: usize, erased_val: u8) -> (SimMultiFlash, Rc<AreaDesc>, &'static [Caps]) {
match device {
DeviceName::Stm32f4 => {
// STM style flash. Large sectors, with a large scratch area.
@@ -454,7 +451,7 @@
let mut flash = SimMultiFlash::new();
flash.insert(dev_id, dev);
- (flash, areadesc, &[Caps::SwapUsingMove])
+ (flash, Rc::new(areadesc), &[Caps::SwapUsingMove])
}
DeviceName::K64f => {
// NXP style flash. Small sectors, one small sector for scratch.
@@ -469,7 +466,7 @@
let mut flash = SimMultiFlash::new();
flash.insert(dev_id, dev);
- (flash, areadesc, &[])
+ (flash, Rc::new(areadesc), &[])
}
DeviceName::K64fBig => {
// Simulating an STM style flash on top of an NXP style flash. Underlying flash device
@@ -485,7 +482,7 @@
let mut flash = SimMultiFlash::new();
flash.insert(dev_id, dev);
- (flash, areadesc, &[Caps::SwapUsingMove])
+ (flash, Rc::new(areadesc), &[Caps::SwapUsingMove])
}
DeviceName::Nrf52840 => {
// Simulating the flash on the nrf52840 with partitions set up so that the scratch size
@@ -501,7 +498,7 @@
let mut flash = SimMultiFlash::new();
flash.insert(dev_id, dev);
- (flash, areadesc, &[])
+ (flash, Rc::new(areadesc), &[])
}
DeviceName::Nrf52840UnequalSlots => {
let dev = SimFlash::new(vec![4096; 128], align as usize, erased_val);
@@ -514,7 +511,7 @@
let mut flash = SimMultiFlash::new();
flash.insert(dev_id, dev);
- (flash, areadesc, &[Caps::SwapUsingScratch, Caps::OverwriteUpgrade])
+ (flash, Rc::new(areadesc), &[Caps::SwapUsingScratch, Caps::OverwriteUpgrade])
}
DeviceName::Nrf52840SpiFlash => {
// Simulate nrf52840 with external SPI flash. The external SPI flash
@@ -533,7 +530,7 @@
let mut flash = SimMultiFlash::new();
flash.insert(0, dev0);
flash.insert(1, dev1);
- (flash, areadesc, &[Caps::SwapUsingMove])
+ (flash, Rc::new(areadesc), &[Caps::SwapUsingMove])
}
DeviceName::K64fMulti => {
// NXP style flash, but larger, to support multiple images.
@@ -550,7 +547,7 @@
let mut flash = SimMultiFlash::new();
flash.insert(dev_id, dev);
- (flash, areadesc, &[])
+ (flash, Rc::new(areadesc), &[])
}
}
}