summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomasz Malesinski <tomal@rockbox.org>2006-01-24 23:32:53 +0000
committerTomasz Malesinski <tomal@rockbox.org>2006-01-24 23:32:53 +0000
commite0bb10420d4beab02c7ea3f757e9c57b040c6bf4 (patch)
tree991d333d077319cb0929f0b2ae84588803dff4fc
parent27c616fd46bbaee58c54eddc9ed406e6810dd3ca (diff)
downloadrockbox-e0bb10420d4beab02c7ea3f757e9c57b040c6bf4.tar.gz
rockbox-e0bb10420d4beab02c7ea3f757e9c57b040c6bf4.tar.bz2
rockbox-e0bb10420d4beab02c7ea3f757e9c57b040c6bf4.zip
added .vectors section for ARM
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8442 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/app.lds37
-rw-r--r--firmware/crt0.S17
2 files changed, 41 insertions, 13 deletions
diff --git a/firmware/app.lds b/firmware/app.lds
index feff264d39..d49949930d 100644
--- a/firmware/app.lds
+++ b/firmware/app.lds
@@ -128,8 +128,8 @@ _pluginbuf = 0;
#define IRAMSIZE 0xc000
#elif CONFIG_CPU==PNX0101
#define DRAMORIG 0x24000000 + STUBOFFSET
-#define IRAMORIG 0x400100
-#define IRAMSIZE 0x7f00
+#define IRAMORIG 0x400000
+#define IRAMSIZE 0x8000
#else
#define DRAMORIG 0x09000000 + STUBOFFSET
#define IRAMORIG 0x0f000000
@@ -150,6 +150,7 @@ MEMORY
SECTIONS
{
+#ifndef CPU_ARM
.vectors :
{
loadaddress = .;
@@ -162,6 +163,12 @@ SECTIONS
.text :
{
+#else
+ .text :
+ {
+ loadaddress = .;
+ _loadaddress = .;
+#endif
. = ALIGN(0x200);
*(.init.text)
*(.text*)
@@ -193,7 +200,6 @@ SECTIONS
*(.data*)
. = ALIGN(0x4);
_dataend = .;
- _iramcopy = .;
} > DRAM
/DISCARD/ :
@@ -201,14 +207,31 @@ SECTIONS
*(.eh_frame)
}
- .iram IRAMORIG : AT ( _iramcopy)
+#ifdef CPU_ARM
+ .vectors 0x0 :
+ {
+ _vectorsstart = .;
+ *(.vectors);
+ _vectorsend = .;
+ } AT> DRAM
+
+ _vectorscopy = LOADADDR(.vectors);
+#endif
+
+#if CONFIG_CPU==PNX0101
+ .iram IRAMORIG + SIZEOF(.vectors) :
+#else
+ .iram IRAMORIG :
+#endif
{
_iramstart = .;
*(.icode)
*(.irodata)
*(.idata)
_iramend = .;
- } > IRAM
+ } > IRAM AT> DRAM
+
+ _iramcopy = LOADADDR(.iram);
.ibss (NOLOAD) :
{
@@ -238,8 +261,10 @@ SECTIONS
} > DRAM
#endif
-#if defined(CPU_COLDFIRE) || defined(CPU_ARM)
+#if defined(CPU_COLDFIRE)
.bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.iram):
+#elif defined(CPU_ARM)
+ .bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.iram) + SIZEOF(.vectors):
#else
.bss :
#endif
diff --git a/firmware/crt0.S b/firmware/crt0.S
index 54432c9731..ba478f804c 100644
--- a/firmware/crt0.S
+++ b/firmware/crt0.S
@@ -84,13 +84,13 @@ remap_end:
#endif /* PP specific */
/* Copy exception handler code to address 0 */
- ldr r2, =ecode
- ldr r3, =ecodeend
- mov r4, #0
+ ldr r2, =_vectorsstart
+ ldr r3, =_vectorsend
+ ldr r4, =_vectorscopy
1:
cmp r3, r2
- ldrhi r5, [r2], #4
- strhi r5, [r4], #4
+ ldrhi r5, [r4], #4
+ strhi r5, [r2], #4
bhi 1b
/* Zero out IBSS */
@@ -259,7 +259,7 @@ boot_table:
/* main() should never return */
/* Exception handlers. Will be copied to address 0 after memory remapping */
-ecode:
+ .section .vectors,"aw"
ldr pc, [pc, #24]
ldr pc, [pc, #24]
ldr pc, [pc, #24]
@@ -270,6 +270,8 @@ ecode:
ldr pc, [pc, #24]
/* Exception vectors */
+ .global vectors
+vectors:
.word start
.word undef_instr_handler
.word software_int_handler
@@ -278,7 +280,8 @@ ecode:
.word reserved_handler
.word irq_handler
.word fiq_handler
-ecodeend:
+
+ .text
.global irq
.global UIE