From ec67912b638e0fae3cae7b4182d23db6d36c5135 Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Fri, 20 Feb 2009 02:33:40 +0000 Subject: Reclaim .iram areas in DRAM by overlapping their load addresses with the uninitialized data sections. I did what I could test out-- not any flash image linker scripts or other target processors. Move any .iram copies in crt0.S's to be the first operation even if not _strictly_ necessary to be emphatic (aka. 'beware'). git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20061 a1c6a512-1295-4272-9138-f99709370657 --- firmware/target/arm/crt0-pp.S | 25 +++++++++++++------------ firmware/target/arm/ipod/app.lds | 4 ++-- firmware/target/arm/iriver/app.lds | 4 ++-- firmware/target/arm/olympus/app.lds | 4 ++-- firmware/target/arm/philips/app.lds | 4 ++-- firmware/target/arm/sandisk/app.lds | 6 +++--- firmware/target/coldfire/crt0.S | 21 ++++++++++++--------- firmware/target/coldfire/iaudio/app.lds | 14 ++++++++------ firmware/target/coldfire/iriver/app.lds | 14 ++++++++------ firmware/target/sh/archos/app.lds | 22 +++++++++++----------- firmware/target/sh/crt0.S | 23 +++++++++++++---------- 11 files changed, 76 insertions(+), 65 deletions(-) diff --git a/firmware/target/arm/crt0-pp.S b/firmware/target/arm/crt0-pp.S index f698783017..210b560560 100644 --- a/firmware/target/arm/crt0-pp.S +++ b/firmware/target/arm/crt0-pp.S @@ -41,7 +41,6 @@ start: .equ COP_CTRL, 0xcf004058 .equ CPU_STATUS, 0xcf004050 .equ COP_STATUS, 0xcf004050 - .equ IIS_CONFIG, 0xc0002500 .equ SLEEP, 0x000000ca .equ WAKE, 0x000000ce .equ CPUSLEEPING, 0x00008000 @@ -63,7 +62,6 @@ start: .equ COP_ICLR, 0x60004038 .equ COP_CTRL, 0x60007004 .equ COP_STATUS, 0x60007004 - .equ IIS_CONFIG, 0x70002800 .equ SLEEP, 0x80000000 .equ WAKE, 0x00000000 .equ CPUSLEEPING, 0x80000000 @@ -186,6 +184,9 @@ cpu_init: ldr r3, [r4] tst r3, #COPSLEEPING beq 1b + + /* Vectors and IRAM copy is done first since they are reclaimed for + * other uninitialized sections */ /* Copy exception handler code to address 0 */ ldr r2, =_vectorsstart @@ -196,16 +197,7 @@ cpu_init: ldrhi r5, [r4], #4 strhi r5, [r2], #4 bhi 1b - - /* Zero out IBSS */ - ldr r2, =_iedata - ldr r3, =_iend - mov r4, #0 -1: - cmp r3, r2 - strhi r4, [r2], #4 - bhi 1b - + /* Copy the IRAM */ ldr r2, =_iramcopy ldr r3, =_iramstart @@ -216,6 +208,15 @@ cpu_init: strhi r5, [r3], #4 bhi 1b + /* Zero out IBSS */ + ldr r2, =_iedata + ldr r3, =_iend + mov r4, #0 +1: + cmp r3, r2 + strhi r4, [r2], #4 + bhi 1b + /* Initialise bss section to zero */ ldr r2, =_edata ldr r3, =_end diff --git a/firmware/target/arm/ipod/app.lds b/firmware/target/arm/ipod/app.lds index d7159e8e1e..22468192eb 100644 --- a/firmware/target/arm/ipod/app.lds +++ b/firmware/target/arm/ipod/app.lds @@ -103,6 +103,7 @@ SECTIONS } AT> DRAM _vectorscopy = LOADADDR(.vectors); + _noloaddram = LOADADDR(.vectors); .ibss IRAMORIG (NOLOAD) : { @@ -148,8 +149,7 @@ SECTIONS /* .bss and .ncbss are treated as a single section to use one init loop to * zero it - note "_edata" and "_end" */ - .bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.ncdata) +\ - SIZEOF(.iram) + SIZEOF(.vectors) (NOLOAD) : + .bss _noloaddram (NOLOAD) : { _edata = .; *(.bss*) diff --git a/firmware/target/arm/iriver/app.lds b/firmware/target/arm/iriver/app.lds index d7159e8e1e..22468192eb 100644 --- a/firmware/target/arm/iriver/app.lds +++ b/firmware/target/arm/iriver/app.lds @@ -103,6 +103,7 @@ SECTIONS } AT> DRAM _vectorscopy = LOADADDR(.vectors); + _noloaddram = LOADADDR(.vectors); .ibss IRAMORIG (NOLOAD) : { @@ -148,8 +149,7 @@ SECTIONS /* .bss and .ncbss are treated as a single section to use one init loop to * zero it - note "_edata" and "_end" */ - .bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.ncdata) +\ - SIZEOF(.iram) + SIZEOF(.vectors) (NOLOAD) : + .bss _noloaddram (NOLOAD) : { _edata = .; *(.bss*) diff --git a/firmware/target/arm/olympus/app.lds b/firmware/target/arm/olympus/app.lds index d7159e8e1e..22468192eb 100644 --- a/firmware/target/arm/olympus/app.lds +++ b/firmware/target/arm/olympus/app.lds @@ -103,6 +103,7 @@ SECTIONS } AT> DRAM _vectorscopy = LOADADDR(.vectors); + _noloaddram = LOADADDR(.vectors); .ibss IRAMORIG (NOLOAD) : { @@ -148,8 +149,7 @@ SECTIONS /* .bss and .ncbss are treated as a single section to use one init loop to * zero it - note "_edata" and "_end" */ - .bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.ncdata) +\ - SIZEOF(.iram) + SIZEOF(.vectors) (NOLOAD) : + .bss _noloaddram (NOLOAD) : { _edata = .; *(.bss*) diff --git a/firmware/target/arm/philips/app.lds b/firmware/target/arm/philips/app.lds index d7159e8e1e..22468192eb 100644 --- a/firmware/target/arm/philips/app.lds +++ b/firmware/target/arm/philips/app.lds @@ -103,6 +103,7 @@ SECTIONS } AT> DRAM _vectorscopy = LOADADDR(.vectors); + _noloaddram = LOADADDR(.vectors); .ibss IRAMORIG (NOLOAD) : { @@ -148,8 +149,7 @@ SECTIONS /* .bss and .ncbss are treated as a single section to use one init loop to * zero it - note "_edata" and "_end" */ - .bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.ncdata) +\ - SIZEOF(.iram) + SIZEOF(.vectors) (NOLOAD) : + .bss _noloaddram (NOLOAD) : { _edata = .; *(.bss*) diff --git a/firmware/target/arm/sandisk/app.lds b/firmware/target/arm/sandisk/app.lds index d7159e8e1e..3010644b72 100644 --- a/firmware/target/arm/sandisk/app.lds +++ b/firmware/target/arm/sandisk/app.lds @@ -103,6 +103,7 @@ SECTIONS } AT> DRAM _vectorscopy = LOADADDR(.vectors); + _noloaddram = LOADADDR(.vectors); .ibss IRAMORIG (NOLOAD) : { @@ -145,11 +146,10 @@ SECTIONS . += 0x2000; stackend = .; } > IRAM - + /* .bss and .ncbss are treated as a single section to use one init loop to * zero it - note "_edata" and "_end" */ - .bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.ncdata) +\ - SIZEOF(.iram) + SIZEOF(.vectors) (NOLOAD) : + .bss _noloaddram (NOLOAD) : { _edata = .; *(.bss*) diff --git a/firmware/target/coldfire/crt0.S b/firmware/target/coldfire/crt0.S index dbf01a347c..bc8a370823 100644 --- a/firmware/target/coldfire/crt0.S +++ b/firmware/target/coldfire/crt0.S @@ -234,15 +234,8 @@ start: movec.l %d0,%acr1 #ifndef BOOTLOADER - /* zero out .ibss */ - lea _iedata,%a2 - lea _iend,%a4 - bra.b .iedatastart -.iedataloop: - clr.l (%a2)+ -.iedatastart: - cmp.l %a2,%a4 - bhi.b .iedataloop + /* .iram copy is done first since it is reclaimed for other + * uninitialized sections */ /* copy the .iram section */ lea _iramcopy,%a2 @@ -254,6 +247,16 @@ start: .iramstart: cmp.l %a3,%a4 bhi.b .iramloop + + /* zero out .ibss */ + lea _iedata,%a2 + lea _iend,%a4 + bra.b .iedatastart +.iedataloop: + clr.l (%a2)+ +.iedatastart: + cmp.l %a2,%a4 + bhi.b .iedataloop #endif /* !BOOTLOADER */ #ifdef IRIVER_H300_SERIES diff --git a/firmware/target/coldfire/iaudio/app.lds b/firmware/target/coldfire/iaudio/app.lds index d3ccce24f0..5cb2f6cb3f 100644 --- a/firmware/target/coldfire/iaudio/app.lds +++ b/firmware/target/coldfire/iaudio/app.lds @@ -94,6 +94,7 @@ SECTIONS } > IRAM AT> DRAM _iramcopy = LOADADDR(.iram); + _noloaddram = LOADADDR(.iram); .ibss (NOLOAD) : { @@ -103,7 +104,7 @@ SECTIONS _iend = .; } > IRAM - .stack : + .stack (NOLOAD) : { *(.stack) stackbegin = .; @@ -111,7 +112,7 @@ SECTIONS stackend = .; } > IRAM - .bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.iram): + .bss _noloaddram (NOLOAD): { _edata = .; *(.bss*) @@ -120,25 +121,26 @@ SECTIONS _end = .; } > DRAM - .audiobuf ALIGN(4) : + .audiobuf (NOLOAD) : { + . = ALIGN(4); _audiobuffer = .; audiobuffer = .; } > DRAM - .audiobufend ENDAUDIOADDR: + .audiobufend ENDAUDIOADDR (NOLOAD) : { audiobufend = .; _audiobufend = .; } > DRAM - .codec ENDAUDIOADDR: + .codec ENDAUDIOADDR (NOLOAD) : { codecbuf = .; _codecbuf = .; } - .plugin ENDADDR: + .plugin ENDADDR (NOLOAD) : { _pluginbuf = .; pluginbuf = .; diff --git a/firmware/target/coldfire/iriver/app.lds b/firmware/target/coldfire/iriver/app.lds index ae21ecd9de..d087f997c8 100644 --- a/firmware/target/coldfire/iriver/app.lds +++ b/firmware/target/coldfire/iriver/app.lds @@ -90,6 +90,7 @@ SECTIONS } > IRAM AT> DRAM _iramcopy = LOADADDR(.iram); + _noloaddram = LOADADDR(.iram); .ibss (NOLOAD) : { @@ -99,7 +100,7 @@ SECTIONS _iend = .; } > IRAM - .stack : + .stack (NOLOAD) : { *(.stack) stackbegin = .; @@ -107,7 +108,7 @@ SECTIONS stackend = .; } > IRAM - .bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.iram): + .bss _noloaddram (NOLOAD) : { _edata = .; *(.bss*) @@ -116,25 +117,26 @@ SECTIONS _end = .; } > DRAM - .audiobuf ALIGN(4) : + .audiobuf (NOLOAD) : { + . = ALIGN(4); _audiobuffer = .; audiobuffer = .; } > DRAM - .audiobufend ENDAUDIOADDR: + .audiobufend ENDAUDIOADDR (NOLOAD) : { audiobufend = .; _audiobufend = .; } > DRAM - .codec ENDAUDIOADDR: + .codec ENDAUDIOADDR (NOLOAD) : { codecbuf = .; _codecbuf = .; } - .plugin ENDADDR: + .plugin ENDADDR (NOLOAD) : { _pluginbuf = .; pluginbuf = .; diff --git a/firmware/target/sh/archos/app.lds b/firmware/target/sh/archos/app.lds index 02ed6bef77..225f11f705 100644 --- a/firmware/target/sh/archos/app.lds +++ b/firmware/target/sh/archos/app.lds @@ -90,6 +90,7 @@ SECTIONS } > IRAM AT> DRAM _iramcopy = LOADADDR(.iram); + _noloaddram = LOADADDR(.iram); .ibss (NOLOAD) : { @@ -98,18 +99,16 @@ SECTIONS . = ALIGN(0x4); _iend = .; } > IRAM - - /* TRICK ALERT! We want 0x2000 bytes of stack, but we set the section - size smaller, and allow the stack to grow into the .iram copy */ - .stack ADDR(.data) + SIZEOF(.data) + SIZEOF(.iram): + + .stack _noloaddram (NOLOAD) : { *(.stack) - _stackbegin = . - SIZEOF(.iram); - . += 0x2000 - SIZEOF(.iram); + _stackbegin = .; + . += 0x2000; _stackend = .; } > DRAM - .bss : + .bss (NOLOAD) : { _edata = .; *(.bss*) @@ -118,25 +117,26 @@ SECTIONS _end = .; } > DRAM - .audiobuf ALIGN(4) : + .audiobuf (NOLOAD) : { + . = ALIGN(4); _audiobuffer = .; audiobuffer = .; } > DRAM - .audiobufend ENDAUDIOADDR: + .audiobufend ENDAUDIOADDR (NOLOAD) : { audiobufend = .; _audiobufend = .; } > DRAM - .codec ENDAUDIOADDR: + .codec ENDAUDIOADDR (NOLOAD) : { codecbuf = .; _codecbuf = .; } - .plugin ENDADDR: + .plugin ENDADDR (NOLOAD) : { _pluginbuf = .; pluginbuf = .; diff --git a/firmware/target/sh/crt0.S b/firmware/target/sh/crt0.S index a87bee899f..0e8bbfdd68 100644 --- a/firmware/target/sh/crt0.S +++ b/firmware/target/sh/crt0.S @@ -98,16 +98,8 @@ start: mov #0,r0 ldc r0,gbr - /* zero out .ibss */ - mov.l .iedata_k,r0 - mov.l .iend_k,r1 - bra .iedatastart - mov #0,r2 -.iedataloop: /* backwards is faster and shorter */ - mov.l r2,@-r1 -.iedatastart: - cmp/hi r0,r1 - bt .iedataloop + /* .iram copy is done first since it is reclaimed for other + * uninitialized sections */ /* copy the .iram section */ mov.l .iramcopy_k,r0 @@ -127,6 +119,17 @@ start: bt .iramloop .noiramcopy: + /* zero out .ibss */ + mov.l .iedata_k,r0 + mov.l .iend_k,r1 + bra .iedatastart + mov #0,r2 +.iedataloop: /* backwards is faster and shorter */ + mov.l r2,@-r1 +.iedatastart: + cmp/hi r0,r1 + bt .iedataloop + /* zero out bss */ mov.l .edata_k,r0 mov.l .end_k,r1 -- cgit v1.2.3