summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2017-12-12 15:31:27 -0800
committerKeith Packard <keithp@keithp.com>2017-12-12 15:31:27 -0800
commit28dbe9a04b16f79db255baecbf0cd486c510ef58 (patch)
tree854d8962d5266d1a15c20d976c3da88933a96d49
parentdb352bd0723e8d640bb034bc14e5ad193f0afe1d (diff)
altos/stm: Align 'data' to 8 bytes, just like textram
The textram section must be aligned to 8 bytes to keep the linker happy. However, if that section contains no data, the declaration will set the __data_start__ value to that alignment, but the data section itself would start on a 4-byte alignment, potentially 4 bytes lower than the value indicated by __data_start__. This completely scrambles initialized memory as the startup code will copy the data segment to __data_start__, 4 bytes off of the actual data segment start. Fix this by forcing the data segment to also be aligned to 8 bytes. Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--src/micropeak-v2.0/micropeak.ld10
-rw-r--r--src/stm/altos-loader.ld3
-rw-r--r--src/stmf0/altos-loader.ld5
3 files changed, 10 insertions, 8 deletions
diff --git a/src/micropeak-v2.0/micropeak.ld b/src/micropeak-v2.0/micropeak.ld
index 77717e16..baeae5b8 100644
--- a/src/micropeak-v2.0/micropeak.ld
+++ b/src/micropeak-v2.0/micropeak.ld
@@ -19,8 +19,8 @@
MEMORY {
rom (rx) : ORIGIN = 0x08001000, LENGTH = 20K
flash(rx) : ORIGIN = 0x08006000, LENGTH = 8K
- ram (!w) : ORIGIN = 0x20000000, LENGTH = 6k - 128
- stack (!w) : ORIGIN = 0x20000000 + 6k - 128, LENGTH = 128
+ ram (!w) : ORIGIN = 0x20000000, LENGTH = 6k - 512
+ stack (!w) : ORIGIN = 0x20000000 + 6k - 512, LENGTH = 512
}
INCLUDE registers.ld
@@ -94,11 +94,11 @@ SECTIONS {
*(.ramtext)
} >ram AT>rom
- /* Data -- relocated to RAM, but written to ROM
+ /* Data -- relocated to RAM, but written to ROM,
+ * also aligned to 8 bytes to agree with textram
*/
- .data : {
+ .data BLOCK(8): {
*(.data) /* initialized data */
- . = ALIGN(4);
__data_end__ = .;
} >ram AT>rom
diff --git a/src/stm/altos-loader.ld b/src/stm/altos-loader.ld
index a4a7dc43..806b4842 100644
--- a/src/stm/altos-loader.ld
+++ b/src/stm/altos-loader.ld
@@ -72,8 +72,9 @@ SECTIONS {
} >ram AT>rom
/* Data -- relocated to RAM, but written to ROM
+ * Also aligned to 8 bytes to agree with textram
*/
- .data : {
+ .data BLOCK(8): {
*(.data) /* initialized data */
__data_end__ = .;
} >ram AT>rom
diff --git a/src/stmf0/altos-loader.ld b/src/stmf0/altos-loader.ld
index c458116b..05887d0e 100644
--- a/src/stmf0/altos-loader.ld
+++ b/src/stmf0/altos-loader.ld
@@ -72,9 +72,10 @@ SECTIONS {
__text_ram_end = .;
} >ram AT>rom
- /* Data -- relocated to RAM, but written to ROM
+ /* Data -- relocated to RAM, but written to ROM.
+ * also aligned to 8 bytes in case textram is empty
*/
- .data : {
+ .data BLOCK(8): {
*(.data) /* initialized data */
__data_end__ = .;
} >ram AT>rom