diff --git a/artiq/firmware/runtime/config.rs b/artiq/firmware/runtime/config.rs index cc0d2ab14..fd3c14efe 100644 --- a/artiq/firmware/runtime/config.rs +++ b/artiq/firmware/runtime/config.rs @@ -8,6 +8,7 @@ mod imp { mod lock { use core::slice; use core::sync::atomic::{AtomicUsize, Ordering, ATOMIC_USIZE_INIT}; + use board; static LOCKED: AtomicUsize = ATOMIC_USIZE_INIT; @@ -24,14 +25,20 @@ mod imp { pub fn data(&self) -> &'static [u8] { extern { + static _ftext: u8; static _fstorage: u8; static _estorage: u8; } unsafe { - let begin = &_fstorage as *const u8; - let end = &_estorage as *const u8; - slice::from_raw_parts(begin, end as usize - begin as usize) + let base = &_ftext as *const _ as usize; + let begin = &_fstorage as *const _ as usize; + let end = &_estorage as *const _ as usize; + + let ptr = board::mem::FLASH_BOOT_ADDRESS + (begin - base); + let len = end - begin; + + slice::from_raw_parts(ptr as *const u8, len) } } } @@ -71,7 +78,7 @@ mod imp { if record_size == !0 /* all ones; erased flash */ { return None } else if record_size < 4 || record_size > data.len() { - error!("offset {}: invalid record size", self.offset); + error!("offset {}: invalid record size {}", self.offset, record_size); return Some(Err(())) } diff --git a/artiq/firmware/runtime/runtime.ld b/artiq/firmware/runtime/runtime.ld index 7346d6188..d629e4ff8 100644 --- a/artiq/firmware/runtime/runtime.ld +++ b/artiq/firmware/runtime/runtime.ld @@ -69,8 +69,8 @@ SECTIONS .storage : { /* Keep in sync with artiq_flash.py */ - _fstorage = .; . = _ftext + 0x100000; + _fstorage = .; . += /*SPIFLASH_SECTOR_SIZE*/ 0x10000; _estorage = .; } > runtime