ARM/THUMB instructions that change execution path?

Has anybody come across a list of ARM & THUMB instructions that cause deviation from the linear instruction stream?

I've been trying to figure out gdb-stub single stepping using software interrupts, and in single stepping you need to find

the next instruction(s) where the next breakpoint instruction needs to be set.

There are three cases:

1) current instruction doesn't change the execution path. Next instruction is the next word.

2) current instruction is a jump. The operand defines the next instruction address

3) current instruction is conditional branch. One possible next instruction is the next word, the other possible

instruction address is defined by the operand. (That includes conditional add with PC as the target, and the like).

To implement single stepping, I need to tell those cases apart and figure out how to find out the possible branching address.

I could go through manuals of numerous processors instruction by instruction and maybe I'd be done within the next couple of years,

or I could find a list of instructions to check, or a paper that explains how to "decode" the instructions in a useful way.

Also, there doesn't seem to be lots of sources of ARM gdb servers or stubs around that use software breakpoints.

Parents
  • I do not have a list of instructions, but try to think in the "disassembler" direction.

    First of all, make a table, where each entry consist of a mask and a value and a handler.

    The actual instruction is ANDed with the mask, then compared against the value.

    If the value match, you jump to the handler.

    The handler could for instance handle adding r0+r1 like in Martin's example above.

    This would simplify the task a little.

    I know that OpenOCD can disassemble, so I just made a quick grep -iR 'rrx' * in order to find the disassembler; it seems it's located in src/target/arm_disassembler.c

    Unfortunately, it appears to be a bit bulky, but I think it would be helpful anyway.

    In addition to this, you might want to head over to the ARM Information Center > ARM architecture > Reference Manuals and download these PDF files. You can download them for free; you just need to register first.

    I especially find the Thumb Instruction Set Encoding chapter in ARMv7-M_ARM.pdf interesting.

Reply
  • I do not have a list of instructions, but try to think in the "disassembler" direction.

    First of all, make a table, where each entry consist of a mask and a value and a handler.

    The actual instruction is ANDed with the mask, then compared against the value.

    If the value match, you jump to the handler.

    The handler could for instance handle adding r0+r1 like in Martin's example above.

    This would simplify the task a little.

    I know that OpenOCD can disassemble, so I just made a quick grep -iR 'rrx' * in order to find the disassembler; it seems it's located in src/target/arm_disassembler.c

    Unfortunately, it appears to be a bit bulky, but I think it would be helpful anyway.

    In addition to this, you might want to head over to the ARM Information Center > ARM architecture > Reference Manuals and download these PDF files. You can download them for free; you just need to register first.

    I especially find the Thumb Instruction Set Encoding chapter in ARMv7-M_ARM.pdf interesting.

Children