summaryrefslogtreecommitdiff
path: root/firmware/target
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2009-02-20 02:33:40 +0000
committerMichael Sevakis <jethead71@rockbox.org>2009-02-20 02:33:40 +0000
commitec67912b638e0fae3cae7b4182d23db6d36c5135 (patch)
tree8101f45d02947a828d20174a45d1a6d19fafa3b2 /firmware/target
parent07ae1e4fb9a1fd9d6ce9c48c5300b53e87303937 (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')
-rw-r--r--firmware/target/arm/crt0-pp.S25
-rw-r--r--firmware/target/arm/ipod/app.lds4
-rw-r--r--firmware/target/arm/iriver/app.lds4
-rw-r--r--firmware/target/arm/olympus/app.lds4
-rw-r--r--firmware/target/arm/philips/app.lds4
-rw-r--r--firmware/target/arm/sandisk/app.lds6
-rw-r--r--firmware/target/coldfire/crt0.S21
-rw-r--r--firmware/target/coldfire/iaudio/app.lds14
-rw-r--r--firmware/target/coldfire/iriver/app.lds14
-rw-r--r--firmware/target/sh/archos/app.lds22
-rw-r--r--firmware/target/sh/crt0.S23
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