summaryrefslogtreecommitdiff
path: root/utils/hwstub/stub/crt0.S
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2013-08-11 19:17:36 +0200
committerAmaury Pouly <amaury.pouly@gmail.com>2013-08-11 19:17:36 +0200
commit0ec1536d64d98d0b3a4affda3fc1f54d1f02f3c1 (patch)
treef40ec797c1fbf5c910b71b16040feca1fc8f8c1a /utils/hwstub/stub/crt0.S
parentcb8274373be8bf1ba4006e7d61cbef2ce351d210 (diff)
downloadrockbox-0ec1536d64d98d0b3a4affda3fc1f54d1f02f3c1.tar.gz
rockbox-0ec1536d64d98d0b3a4affda3fc1f54d1f02f3c1.zip
hwstub: allow the stub to relocate itself
Change-Id: Iab60c6ec0e8eda19c76c84241f8367d53cb4f87b
Diffstat (limited to 'utils/hwstub/stub/crt0.S')
-rw-r--r--utils/hwstub/stub/crt0.S22
1 files changed, 22 insertions, 0 deletions
diff --git a/utils/hwstub/stub/crt0.S b/utils/hwstub/stub/crt0.S
index e2d4742d36..5ba71905c9 100644
--- a/utils/hwstub/stub/crt0.S
+++ b/utils/hwstub/stub/crt0.S
@@ -3,8 +3,30 @@
3.align 0x04 3.align 0x04
4.global start 4.global start
5start: 5start:
6 sub r7, pc, #8 /* Copy running address */
6 msr cpsr_c, #0xd3 /* enter supervisor mode, disable IRQ/FIQ */ 7 msr cpsr_c, #0xd3 /* enter supervisor mode, disable IRQ/FIQ */
8 /* Disable MMU, disable caching and buffering;
9 * use low exception range address */
10 mrc p15, 0, r0, c1, c0, 0
11 ldr r1, =0x3005
12 bic r0, r1
13 mcr p15, 0, r0, c1, c0, 0
7 ldr sp, =oc_stackend 14 ldr sp, =oc_stackend
15 /* Relocate to right address */
16 mov r2, r7
17 ldr r3, =_copystart
18 ldr r4, =_copyend
191:
20 cmp r4, r3
21 ldrhi r5, [r2], #4
22 strhi r5, [r3], #4
23 bhi 1b
24
25 mov r2, #0
26 mcr p15, 0, r2, c7, c5, 0 @ Invalidate ICache
27 /* Jump to real location */
28 ldr pc, =remap
29remap:
8 /* clear bss */ 30 /* clear bss */
9 ldr r2, =bss_start 31 ldr r2, =bss_start
10 ldr r3, =bss_end 32 ldr r3, =bss_end