summaryrefslogtreecommitdiff
path: root/firmware/export
diff options
context:
space:
mode:
authorRafaël Carré <rafael.carre@gmail.com>2010-06-11 04:41:36 +0000
committerRafaël Carré <rafael.carre@gmail.com>2010-06-11 04:41:36 +0000
commit45c7498f59ad2889f2120a865a51043004eddd5d (patch)
tree1a62b0e8549a7f2750679de8d7dd3f82039c5719 /firmware/export
parentfe7ca44471b309a0adea563cce947de9efb62ab5 (diff)
downloadrockbox-45c7498f59ad2889f2120a865a51043004eddd5d.tar.gz
rockbox-45c7498f59ad2889f2120a865a51043004eddd5d.zip
FS#11335 by me: make ARM assembly functions thumb-friendly
We can't pop into pc on ARMv4t when using thumb: the T bit won't be modified if we are returning to a thumb function Code running on ARMv4t should use the new ldrpc / ldmpc macros instead of ldr pc, [sp], #4 and ldm(cond) sp!, {regs, pc} No modification on pure ARM builds and ARMv5+ Note: USE_THUMB is currently never defined, no targets can currently be built with -mthumb, see FS#6734 git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26756 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/export')
-rw-r--r--firmware/export/config.h20
1 files changed, 20 insertions, 0 deletions
diff --git a/firmware/export/config.h b/firmware/export/config.h
index 5947ca171e..3e269c287d 100644
--- a/firmware/export/config.h
+++ b/firmware/export/config.h
@@ -710,6 +710,26 @@ Lyre prototype 1 */
710#define ROCKBOX_STRICT_ALIGN 1 710#define ROCKBOX_STRICT_ALIGN 1
711#endif 711#endif
712 712
713#if defined(CPU_ARM) && defined(__ASSEMBLER__)
714/* ARMv4T doesn't switch the T bit when popping pc directly, we must use BX */
715.macro ldmpc cond="", order="ia", regs:req
716#if ARM_ARCH == 4 && defined(USE_THUMB)
717 ldm\cond\order sp!, { \regs, lr }
718 bx\cond lr
719#else
720 ldm\cond\order sp!, { \regs, pc }
721#endif
722.endm
723.macro ldrpc cond=""
724#if ARM_ARCH == 4 && defined(USE_THUMB)
725 ldr\cond lr, [sp], #4
726 bx\cond lr
727#else
728 ldr\cond pc, [sp], #4
729#endif
730.endm
731#endif
732
713#ifndef CODEC_SIZE 733#ifndef CODEC_SIZE
714#define CODEC_SIZE 0 734#define CODEC_SIZE 0
715#endif 735#endif