aboutsummaryrefslogtreecommitdiff
path: root/libctf
diff options
context:
space:
mode:
authorBenjamin Teoh <Benjamin.Teoh@arm.com>2023-12-06 17:20:40 +0000
committerAlex Coplan <alex.coplan@arm.com>2023-12-06 18:40:59 +0000
commitb107ba426e4559789d7358691a066ba6a92e86bb (patch)
treefc67689c0f06a3e99ac162fcdade0e53283001a1 /libctf
parent690199d5d4180f287074f2976a12d2df1e415d67 (diff)
downloadgdb-b107ba426e4559789d7358691a066ba6a92e86bb.zip
gdb-b107ba426e4559789d7358691a066ba6a92e86bb.tar.gz
gdb-b107ba426e4559789d7358691a066ba6a92e86bb.tar.bz2
morello/disassembler: Fixed objdump of adrp inst with negative offset
When an adrp instruction references a symbol that is more than a page in memory behind the instruction, it would have a negative offset. An example of this is: foo: nop .zero 4096 adrp c0, foo where adrp references 'foo' that is more than a page in memory behind it. In the case where the offset is negative, when translating from its binary format, the offset was seen as an unsigned integer, which caused a spurious high bit set in the resolved address in the adrp instruction like in: 0000000000400078 <foo>: 400078: d503201f nop ... 40107c: f0ffffe0 adrp c0, 100400000 <__bss_end__+0xfffeeff8> There was an issue with how the imm field of the adrp instruction was extracted in `aarch64_ext_imm`. The value was not sign extended correctly for capability mode targets. This was caused by the imm field having its `P` bit being removed before the sign extension, which is exclusive to 64-bit capability targets. This was remedied by shortening the width of the imm field before sign extending the imm value, resulting in: 0000000000400078 <foo>: 400078: d503201f nop ... 40107c: f0ffffe0 adrp c0, 400000 <foo-0x78>
Diffstat (limited to 'libctf')
0 files changed, 0 insertions, 0 deletions