[U-Boot] [PATCH v2 4/9] arm: add _thumb1_case_uqi to libgcc

Allen Martin amartin at nvidia.com
Tue Aug 14 02:36:26 CEST 2012


On Mon, Aug 13, 2012 at 04:44:05PM -0700, Stephen Warren wrote:
> 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.

The function is supposed to be thumb code, it's basically a thumb
optimization of a switch statement, and in the ARM case the compiler
just emits the code directly instead of calling into libgcc.  So it
doesn't really make sense for the function to be anything but thumb.

I think the real problem is the linker incorrectly thought the code
was ARM so it generated a thumb to ARM interworking veneer.

Can you try adding a ".type __gnu_thumb1_case_uqi STT_FUNC" instead?
I've seen cases where the assembler generates the wrong type of symbol
without some explicit guidance which messes up the linker's
interworking generator.  This might be one of those.

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

-Allen
-- 
nvpublic


More information about the U-Boot mailing list