summaryrefslogtreecommitdiffstats
path: root/firmware
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2005-10-18 20:51:18 +0000
committerJens Arnold <amiconn@rockbox.org>2005-10-18 20:51:18 +0000
commitb4f0afd429eebfb48798d9f7dba54a12b14a38bb (patch)
treee478e56ef0e04fe59b0ceacac53e26dd187b9a17 /firmware
parent09b4743707ca2acb86abd96816f62663b79a99df (diff)
downloadrockbox-b4f0afd429eebfb48798d9f7dba54a12b14a38bb.tar.gz
rockbox-b4f0afd429eebfb48798d9f7dba54a12b14a38bb.zip
SH1: More compact init code, only doing the special vector copy for debug builds. All: Added correct section flags for .init.text
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7640 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r--firmware/crt0.S72
1 files changed, 33 insertions, 39 deletions
diff --git a/firmware/crt0.S b/firmware/crt0.S
index 6cec3ec3ce..fee5a30fee 100644
--- a/firmware/crt0.S
+++ b/firmware/crt0.S
@@ -19,7 +19,7 @@
#include "config.h"
#include "cpu.h"
- .section .init.text
+ .section .init.text,"ax",@progbits
.global start
start:
#if CONFIG_CPU == TCC730
@@ -319,15 +319,13 @@ vectors:
/* Fill in code here */
#else
- /* Platform: Archos Jukebox
- * We begin with some tricks. If we have built our code to be loaded
- * via the standalone GDB stub, we will have out VBR at some other
- * location than 0x9000000. We must copy the trap vectors for the
- * GDB stub to our vector table.
- * If, on the other hand, we are running standalone we will have
- * the VBR at 0x9000000, and the copy will not do any harm.
- */
+ /* Platform: Archos Jukebox */
+
mov.l vbr_k,r1
+#ifdef DEBUG
+ /* If we have built our code to be loaded via the standalone GDB
+ * stub, we will have out VBR at some other location than 0x9000000.
+ * We must copy the trap vectors for the GDB stub to our vector table. */
mov.l orig_vbr_k,r2
/* Move the invalid instruction vector (4) */
@@ -389,35 +387,31 @@ vectors:
shll2 r0
mov.l @(r0,r2),r3
mov.l r3,@(r0,r1)
-
+#endif /* DEBUG */
ldc r1,vbr
/* Now let's get on with the normal business */
- mov.l stack_k,r15
+ mov.l stackend_k,r15
/* zero out bss */
mov.l edata_k,r0
mov.l end_k,r1
mov #0,r2
-start_l:
- mov.l r2,@r0
- add #4,r0
- cmp/ge r1,r0
- bf start_l
- nop
+edata_l: /* backwards is faster and shorter */
+ mov.l r2,@-r1
+ cmp/hi r0,r1
+ bt edata_l
/* copy the .iram section */
mov.l iramcopy_k,r0
mov.l iram_k,r1
mov.l iramend_k,r2
-copy_l:
- mov.l @r0,r3
+iramcopy_l:
+ mov.l @r0+,r3
mov.l r3,@r1
- add #4,r0
add #4,r1
- cmp/ge r2,r1
- bf copy_l
- nop
+ cmp/hi r1,r2
+ bt iramcopy_l
/* copy the .data section, for rombased execution */
mov.l datacopy_k,r0
@@ -426,25 +420,22 @@ copy_l:
/* Don't copy if src and dest are equal */
cmp/eq r0,r1
bt nodatacopy
-copy_l2:
- mov.l @r0,r3
+data_l:
+ mov.l @r0+,r3
mov.l r3,@r1
- add #4,r0
add #4,r1
- cmp/ge r2,r1
- bf copy_l2
- nop
+ cmp/hi r1,r2
+ bt data_l
nodatacopy:
+
/* Munge the main thread stack */
- mov.l stack_k,r2
- mov.l deadbeef_k,r0
- mov.l stackbegin_k,r1
-munge_loop:
- mov.l r0,@r1
- add #4,r1
- cmp/ge r2,r1
- bf munge_loop
- nop
+ mov.l stackbegin_k,r0
+ mov.l stackend_k,r1
+ mov.l deadbeef_k,r2
+munge_l: /* backwards is faster and shorter */
+ mov.l r2,@-r1
+ cmp/hi r0,r1
+ bt munge_l
mov #0,r0
ldc r0,gbr
@@ -455,9 +446,10 @@ munge_loop:
nop
.hoo:
bra .hoo
+ nop
.align 2
-stack_k:
+stackend_k:
.long _stackend
stackbegin_k:
.long _stackbegin
@@ -483,8 +475,10 @@ main_k:
.long _main
vbr_k:
.long vectors
+#ifdef DEBUG
orig_vbr_k:
.long 0x9000000
+#endif
.section .resetvectors
vectors: