diff options
author | Michael Sevakis <jethead71@rockbox.org> | 2009-02-20 02:33:40 +0000 |
---|---|---|
committer | Michael Sevakis <jethead71@rockbox.org> | 2009-02-20 02:33:40 +0000 |
commit | ec67912b638e0fae3cae7b4182d23db6d36c5135 (patch) | |
tree | 8101f45d02947a828d20174a45d1a6d19fafa3b2 /firmware/target/sh | |
parent | 07ae1e4fb9a1fd9d6ce9c48c5300b53e87303937 (diff) |
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
Diffstat (limited to 'firmware/target/sh')
-rw-r--r-- | firmware/target/sh/archos/app.lds | 22 | ||||
-rw-r--r-- | firmware/target/sh/crt0.S | 23 |
2 files changed, 24 insertions, 21 deletions
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 |