Remove writable flash regions support

Removing support for writable flash regions permits to save 1 page in the binary
due to alignment constraints. It also permits to reduce the diff with libtock-rs
which doesn't support writable flash regions.

This commit also updates the `SyscallStorage` documentation.
This commit is contained in:
Julien Cretin
2020-05-06 15:18:27 +02:00
parent 1f22004133
commit 3edb387615
2 changed files with 9 additions and 20 deletions

View File

@@ -71,18 +71,6 @@ SECTIONS {
. = ALIGN(32); . = ALIGN(32);
} > FLASH =0xFF } > FLASH =0xFF
/* App state section. Used for persistent app data.
* We put this first because this is what libtock-c does. They provide the
* following explanation: if the app code changes but the persistent data
* doesn't, the app_state can be preserved.
*/
.wfr.app_state :
{
. = ALIGN(4K);
KEEP (*(.app_state))
. = ALIGN(4K);
} > FLASH =0xFFFFFFFF
/* Text section, Code! */ /* Text section, Code! */
.text : .text :
{ {

View File

@@ -55,7 +55,7 @@ impl SyscallStorage {
/// ///
/// # Safety /// # Safety
/// ///
/// The `storage` must be in a writeable flash region. /// The `storage` must be readable.
/// ///
/// # Errors /// # Errors
/// ///
@@ -74,14 +74,15 @@ impl SyscallStorage {
/// # extern crate ctap2; /// # extern crate ctap2;
/// # use ctap2::embedded_flash::SyscallStorage; /// # use ctap2::embedded_flash::SyscallStorage;
/// # use ctap2::embedded_flash::StorageResult; /// # use ctap2::embedded_flash::StorageResult;
/// # const NUM_PAGES: usize = 1; /// # const STORAGE_ADDR: usize = 0x1000;
/// # const PAGE_SIZE: usize = 1; /// # const STORAGE_SIZE: usize = 0x1000;
/// #[link_section = ".app_state"]
/// static mut STORAGE: [u8; NUM_PAGES * PAGE_SIZE] = [0xff; NUM_PAGES * PAGE_SIZE];
/// # fn foo() -> StorageResult<SyscallStorage> { /// # fn foo() -> StorageResult<SyscallStorage> {
/// // This is safe because this is the only use of `STORAGE` in the whole program and this is /// // This is safe because we create and use `storage` only once in the whole program.
/// // called only once. /// let storage = unsafe {
/// unsafe { SyscallStorage::new(&mut STORAGE) } /// core::slice::from_raw_parts_mut(STORAGE_ADDR as *mut u8, STORAGE_SIZE)
/// };
/// // This is safe because `storage` is readable.
/// unsafe { SyscallStorage::new(storage) }
/// # } /// # }
/// ``` /// ```
pub unsafe fn new(storage: &'static mut [u8]) -> StorageResult<SyscallStorage> { pub unsafe fn new(storage: &'static mut [u8]) -> StorageResult<SyscallStorage> {