diff options
author | Amaury Pouly <amaury.pouly@gmail.com> | 2014-02-17 19:02:21 +0100 |
---|---|---|
committer | Amaury Pouly <amaury.pouly@gmail.com> | 2014-02-17 19:02:21 +0100 |
commit | 8927df42054d1b3aae505f917281a20fe2536ec6 (patch) | |
tree | fac684651cf84c3069705f94c94399474ad92169 /firmware/target/arm/imx233/crt0.S | |
parent | dd6f5cfb1e324fa38f1f05b7dc83e0cd1d694a81 (diff) | |
download | rockbox-8927df42054d1b3aae505f917281a20fe2536ec6.tar.gz rockbox-8927df42054d1b3aae505f917281a20fe2536ec6.zip |
imx233: fix app.lds to properly support INIT_ATTR
Original fix by Marcin: it had a problem because crt0 on imx233 is more
complicated than many targets: since we use virtual memory, we first disable
the MMU, then move the entire image (including init and itext stuff), then
setup a temporary stack to setup the MMU. Only when the MMU is enabled, can
we move the init and itext stuff to its right location and finally boot.
This requires some trickery because:
- the initial move copies everything, including init and itext
- the stack overlaps with init and itext to reclaim space
- the temporary stack cannot be the same as the main stack to avoid trashing
the init and itext code, also it needs to be a physical address
Change-Id: Ibaf331c7d90b61f99225d93c9e621eb0f3f8f2dc
Diffstat (limited to 'firmware/target/arm/imx233/crt0.S')
-rw-r--r-- | firmware/target/arm/imx233/crt0.S | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/firmware/target/arm/imx233/crt0.S b/firmware/target/arm/imx233/crt0.S index 0a71da5d08..5e1720c7c9 100644 --- a/firmware/target/arm/imx233/crt0.S +++ b/firmware/target/arm/imx233/crt0.S | |||
@@ -56,9 +56,12 @@ start: | |||
56 | bic r0, r1 | 56 | bic r0, r1 |
57 | mcr p15, 0, r0, c1, c0, 0 | 57 | mcr p15, 0, r0, c1, c0, 0 |
58 | 58 | ||
59 | /* To call the C code we need a stack, since the stack is in virtual memory | 59 | /* To call the C code we need a stack, since the loader's stack might be |
60 | * use the stack's physical address */ | 60 | * in virtual memory, we need a physical address for the stack. Furthermore, |
61 | ldr sp, =stackend_phys | 61 | * we cannot use the main firmware stack yet because it overlaps with the |
62 | * init code which will be moved later. We rely on the linker to provide | ||
63 | * a safe, temporary stack */ | ||
64 | ldr sp, =crt0_tmpstack_phys | ||
62 | 65 | ||
63 | /* Enable MMU */ | 66 | /* Enable MMU */ |
64 | bl memory_init | 67 | bl memory_init |