
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).