summaryrefslogtreecommitdiff
path: root/utils/hwstub/stub
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
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')
-rw-r--r--utils/hwstub/stub/crt0.S22
-rw-r--r--utils/hwstub/stub/hwstub.lds2
-rw-r--r--utils/hwstub/stub/main.c2
3 files changed, 25 insertions, 1 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
diff --git a/utils/hwstub/stub/hwstub.lds b/utils/hwstub/stub/hwstub.lds
index 61504a3e75..549e4ab96c 100644
--- a/utils/hwstub/stub/hwstub.lds
+++ b/utils/hwstub/stub/hwstub.lds
@@ -36,11 +36,13 @@ SECTIONS
36{ 36{
37 .octext : 37 .octext :
38 { 38 {
39 _copystart = .;
39 oc_codestart = .; 40 oc_codestart = .;
40 *(.text*) 41 *(.text*)
41 *(.icode*) 42 *(.icode*)
42 *(.data*) 43 *(.data*)
43 *(.rodata*) 44 *(.rodata*)
45 _copyend = .;
44 } > OCRAM 46 } > OCRAM
45 47
46 .bss (NOLOAD) : 48 .bss (NOLOAD) :
diff --git a/utils/hwstub/stub/main.c b/utils/hwstub/stub/main.c
index c3cc429949..0923bf85ce 100644
--- a/utils/hwstub/stub/main.c
+++ b/utils/hwstub/stub/main.c
@@ -496,7 +496,7 @@ void main(uint32_t arg)
496 { 496 {
497 struct usb_ctrlrequest req; 497 struct usb_ctrlrequest req;
498 usb_drv_recv_setup(&req); 498 usb_drv_recv_setup(&req);
499 499
500 switch(req.bRequestType & USB_TYPE_MASK) 500 switch(req.bRequestType & USB_TYPE_MASK)
501 { 501 {
502 case USB_TYPE_STANDARD: 502 case USB_TYPE_STANDARD: