[Lldb-commits] [PATCH] D71498: Fix ARM32 inferior calls

Muhammad Omair Javaid via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Tue Dec 17 01:16:49 PST 2019


omjavaid added a comment.

In D71498#1786341 <https://reviews.llvm.org/D71498#1786341>, @clayborg wrote:

> As I am reading this, I just wanted to send out a note of something else that can cause crashes in ARM/Thumb code. For anyone working with ARM/Thumb on systems that don't use the ARM and Thumb BKPT instruction when setting software breakpoints (like all lldb linux and android flavors IIRC): if you try to overwrite a 32 bit thumb instruction that is a conditional instruction in a Thumb IT instruction with a 16 bit trap or illegal instruction you can crash your program. The issue arises for code like:
>
>   0x1000: xx xx         ITTTEE
>   0x1002: 00 11 22 33   32 bit thumb instruction (if condition)
>   0x1006: 44 55 66 77   32 bit thumb instruction (if condition)
>   0x100a: 88 99 aa bb   32 bit thumb instruction (else condition) 
>   0x100e: cc dd ee ff   32 bit thumb instruction (else condition)
>
>
> If you try to set a breakpoint at any of the instructions in [0x1002-0x100e) using a 16 bit trap or illegal instruction (I use "bb bb" below for this trap for example purposes), you change the size of the instructions and which instructions are conditional. If we try to write "bb bb" to 0x1002 we now have:
>
>   0x1000: xx xx         ITTTEE
>   0x1002: bb bb         (if condition) the first conditional instruction is now 16 bit instead of 32 bit
>   0x1004: 22 33 44 55   (if condition) this has the last half of the previous instruction 
>   0x1008: 66 77 88 99   (else condition) this has the last half of the previous instruction 
>   0x100c: aa bb         (else condition) this has the last half of the previous instruction 
>   0x100e: cc dd ee ff   32 bit thumb instruction (NOT conditional anymore)
>
>
> This will work if using the BKPT instruction only. Sorry for the noise if lldb-server is already using the BKPT instruction. But I just wanted to throw this out there in case this issue if affecting anyone.


I do have this thing on my future agenda but it requires wider testing. When BKPT was implemented in lldb-server back when we were initially adding support for arm/linux, we encountered some unsupported behavior which i dont remember exactly that resulted in sticking with legacy behavior.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D71498/new/

https://reviews.llvm.org/D71498





More information about the lldb-commits mailing list