[U-Boot] [PATCH v2 4/9] arm: add _thumb1_case_uqi to libgcc
Stephen Warren
swarren at wwwdotorg.org
Tue Aug 14 01:44:05 CEST 2012
On 08/01/2012 02:32 PM, Allen Martin wrote:
> Add function required by some thumb switch statements
> diff --git a/arch/arm/lib/_thumb1_case_uqi.S b/arch/arm/lib/_thumb1_case_uqi.S
> + .force_thumb
I believe that line should be removed.
The issue here is that when gcc emits Thumb code to call this function,
it actually emits:
> 108af8: f000 f94a bl 108d90 <____gnu_thumb1_case_uqi_from_thumb>
which is implemented as:
> 00108d90 <____gnu_thumb1_case_uqi_from_thumb>:
> 108d90: 4778 bx pc
> 108d92: 46c0 nop ; (mov r8, r8)
> 108d94: eafffde1 b 108520 <__gnu_thumb1_case_uqi>
i.e. it switches to ARM mode then jumps to that function. Hence,
__gnu_thumb1_case_uqi must be compiled as ARM, not as Thumb.
(renaming the function to ____gnu_thumb1_case_uqi_from_thumb in the hope
it'll be called directly instead of going through a stub doesn't seem to
work)
If I make that change, then this patch series starts working on
Whistler, which for reference, uses UARTA, so triggers funcmux.c's
funcmux_select() to enter case PERIPH_ID_UART1, which then uses
____gnu_thumb1_case_uqi_from_thumb to perform the nested switch (config).
More information about the U-Boot
mailing list