diff options
author | Amaury Pouly <amaury.pouly@gmail.com> | 2013-08-11 19:17:36 +0200 |
---|---|---|
committer | Amaury Pouly <amaury.pouly@gmail.com> | 2013-08-11 19:17:36 +0200 |
commit | 0ec1536d64d98d0b3a4affda3fc1f54d1f02f3c1 (patch) | |
tree | f40ec797c1fbf5c910b71b16040feca1fc8f8c1a /utils/hwstub | |
parent | cb8274373be8bf1ba4006e7d61cbef2ce351d210 (diff) | |
download | rockbox-0ec1536d64d98d0b3a4affda3fc1f54d1f02f3c1.tar.gz rockbox-0ec1536d64d98d0b3a4affda3fc1f54d1f02f3c1.zip |
hwstub: allow the stub to relocate itself
Change-Id: Iab60c6ec0e8eda19c76c84241f8367d53cb4f87b
Diffstat (limited to 'utils/hwstub')
-rw-r--r-- | utils/hwstub/stub/crt0.S | 22 | ||||
-rw-r--r-- | utils/hwstub/stub/hwstub.lds | 2 | ||||
-rw-r--r-- | utils/hwstub/stub/main.c | 2 |
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 |
5 | start: | 5 | start: |
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 | ||
19 | 1: | ||
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 | ||
29 | remap: | ||
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: |