[U-Boot] [BUG] incorrect crash dump output for thumbs mode

Marek Vasut marex at denx.de
Sun Jun 23 10:50:04 UTC 2019


On 6/23/19 8:06 AM, Heinrich Schuchardt wrote:
>>> Hello Marek,
>>>
>>> please, have a look at arch/arm/lib/interrupts.c.
>>>
>>> If the processor is in thumbs mode when crashing the output is formatted
>>> in a different way than when not in thumbs mode, cf. dump_instr(). Is
>>> there something wrong with the thumbs mode detection?
>>
>> Well, try maybe objdump ?
>>
>> What is more plausible, that the above completely nonsensical
>> disassembly actually works and the CPU triggers undefined instruction --
>> or that the CPU is actually in thumb mode (hint: imx6 u-boot builds are
>> built in thumb2) and there's a bug in efi_device_path.c ? I think the
>> later.
>>
>> I think maybe you should slow down and consider this option.
>>
> 
> On a Wandboard which is also imx I had a look at the output of exceptions:
> 
> => exception unaligned
> 
> data abort
> 
> pc : [<8f7a2b1a>]          lr : [<8f7ab1b7>]
> 
> reloc pc : [<1780cb1a>]    lr : [<178151b7>]
> 
> sp : 8ed8c3f8  ip : 8f7a2b15     fp : 00000002
> 
> r10: 8f7f81f0  r9 : 8ed95ea8     r8 : 8ed99488
> 
> r7 : 8f7ab109  r6 : 00000000     r5 : 8ed8c3f9  r4 : 8f7f6358
> r3 : 8ed9948c  r2 : 00000001     r1 : 00000000  r0 : 8f7f6358
> Flags: nzCv  IRQs off  FIQs off  Mode SVC_32
> Code: 8f7e1907 8f7e191f 8f7e193d f105466d (e9d50501)
> Resetting CPU ...
> 
> cat u-boot.map
> 
>  .text.do_unaligned
>                 0x1780cb14        0xe cmd/built-in.o
> 
> objdump -S -D cmd/arm/exception.o
> 
> 00000000 <do_unaligned>:
>         /*
>          * The LDRD instruction requires the data source to be four
> byte aligned
>          * even if strict alignment fault checking is disabled in the
> system
>          * control register.
>          */
>         asm volatile (
>    0:   466d            mov     r5, sp
>    2:   f105 0501       add.w   r5, r5, #1
>    6:   e9d5 6700       ldrd    r6, r7, [r5]
>                 "MOV r5, sp\n"
>                 "ADD r5, #1\n"
>                 "LDRD r6, r7, [r5]\n");
>         return CMD_RET_FAILURE;
> }
>    a:   2001            movs    r0, #1
>    c:   4770            bx      lr
> 
> So there is a bug in arch/arm/lib/interrupts.c such that it does not
> detect thumb mode and outputs the code arround PC incorrectly.
> 
> Macro thumb_mode(regs) returns 0 though the thumbs flag is set:
> 
> CPSR: 200001f3
> THUMBS_FLAG: 00000020
> 
> The reason is that in arch/arm/include/asm/proc-armv/ptrace.h
> we are checking non-existent CONFIG_ARM_THUMB. We should check
> CONFIG_IS_ENABLED(SYS_THUMB_BUILD).
> 
> I will send a patch to correct this. With the patch applied the output
> is correct:
> 
> => exception unaligned
> 
> data abort
> 
> pc : [<8f7a2b52>]          lr : [<8f7ab1ef>]
> 
> reloc pc : [<1780cb52>]    lr : [<178151ef>]
> 
> sp : 8ed8c3f8  ip : 8f7a2b4d     fp : 00000002
> 
> r10: 8f7f8228  r9 : 8ed95ea8     r8 : 8ed99488
> 
> r7 : 8f7ab141  r6 : 00000000     r5 : 8ed8c3f9  r4 : 8f7f6390
> 
> r3 : 8ed9948c  r2 : 00000001     r1 : 00000000  r0 : 8f7f6390
> Flags: nzCv  IRQs off  FIQs off  Mode SVC_32 (T)
> Code: 8f7e 466d f105 0501 (e9d5) 6700
> Resetting CPU ...
> 
> Thanks for rubbing my nose into it.

No problem.

-- 
Best regards,
Marek Vasut


More information about the U-Boot mailing list