[AArch64] Use int64_t for address offset
In AArch64 displaced stepping and fast tracepoint, GDB/GDBserver needs to check whether the offset can fit in the range. We are using int32_t for offset, it is sufficient to get an offset from an instruction, but it is not enough to get an offset from two addresses. For example, we have a BL in shared lib which is at 0x0000002000040774, and the scratch pad for displaced stepping is at 0x400698. The offset can't fit in 28 bit imm. However, since we are using int32_t for offset, GDB thinks the offset can fit it, and generate the B instruction with wrong offset. It fixes the following fail, -FAIL: gdb.base/dso2dso.exp: next over call to sub2 gdb: 2016-06-28 Yao Qi <yao.qi@linaro.org> * aarch64-tdep.c (aarch64_displaced_step_b): Use int64_t for variable new_offset. gdb/gdbserver: 2016-06-28 Yao Qi <yao.qi@linaro.org> * linux-aarch64-low.c (aarch64_ftrace_insn_reloc_b): Use int64_t for variable new_offset. (aarch64_ftrace_insn_reloc_b_cond): Likewise. (aarch64_ftrace_insn_reloc_cb): Likewise. (aarch64_ftrace_insn_reloc_tb): Likewise. (aarch64_install_fast_tracepoint_jump_pad): Likewise. Use PRIx64 instead of PRIx32.
This commit is contained in:
parent
bb95c51a23
commit
2ac09a5bbb
4 changed files with 23 additions and 8 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2016-06-28 Yao Qi <yao.qi@linaro.org>
|
||||||
|
|
||||||
|
* aarch64-tdep.c (aarch64_displaced_step_b): Use int64_t for
|
||||||
|
variable new_offset.
|
||||||
|
|
||||||
2016-06-27 Manish Goregaokar <manish@mozilla.com>
|
2016-06-27 Manish Goregaokar <manish@mozilla.com>
|
||||||
|
|
||||||
* rust-lang.c (rust_print_type, rust_decorations): Print unit
|
* rust-lang.c (rust_print_type, rust_decorations): Print unit
|
||||||
|
|
|
@ -2322,7 +2322,7 @@ aarch64_displaced_step_b (const int is_bl, const int32_t offset,
|
||||||
{
|
{
|
||||||
struct aarch64_displaced_step_data *dsd
|
struct aarch64_displaced_step_data *dsd
|
||||||
= (struct aarch64_displaced_step_data *) data;
|
= (struct aarch64_displaced_step_data *) data;
|
||||||
int32_t new_offset = data->insn_addr - dsd->new_addr + offset;
|
int64_t new_offset = data->insn_addr - dsd->new_addr + offset;
|
||||||
|
|
||||||
if (can_encode_int32 (new_offset, 28))
|
if (can_encode_int32 (new_offset, 28))
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,3 +1,13 @@
|
||||||
|
2016-06-28 Yao Qi <yao.qi@linaro.org>
|
||||||
|
|
||||||
|
* linux-aarch64-low.c (aarch64_ftrace_insn_reloc_b): Use int64_t
|
||||||
|
for variable new_offset.
|
||||||
|
(aarch64_ftrace_insn_reloc_b_cond): Likewise.
|
||||||
|
(aarch64_ftrace_insn_reloc_cb): Likewise.
|
||||||
|
(aarch64_ftrace_insn_reloc_tb): Likewise.
|
||||||
|
(aarch64_install_fast_tracepoint_jump_pad): Likewise. Use
|
||||||
|
PRIx64 instead of PRIx32.
|
||||||
|
|
||||||
2016-06-28 Yao Qi <yao.qi@linaro.org>
|
2016-06-28 Yao Qi <yao.qi@linaro.org>
|
||||||
|
|
||||||
* linux-arm-low.c (arm_get_syscall_trapinfo): New function.
|
* linux-arm-low.c (arm_get_syscall_trapinfo): New function.
|
||||||
|
|
|
@ -1575,7 +1575,7 @@ aarch64_ftrace_insn_reloc_b (const int is_bl, const int32_t offset,
|
||||||
{
|
{
|
||||||
struct aarch64_insn_relocation_data *insn_reloc
|
struct aarch64_insn_relocation_data *insn_reloc
|
||||||
= (struct aarch64_insn_relocation_data *) data;
|
= (struct aarch64_insn_relocation_data *) data;
|
||||||
int32_t new_offset
|
int64_t new_offset
|
||||||
= insn_reloc->base.insn_addr - insn_reloc->new_addr + offset;
|
= insn_reloc->base.insn_addr - insn_reloc->new_addr + offset;
|
||||||
|
|
||||||
if (can_encode_int32 (new_offset, 28))
|
if (can_encode_int32 (new_offset, 28))
|
||||||
|
@ -1590,7 +1590,7 @@ aarch64_ftrace_insn_reloc_b_cond (const unsigned cond, const int32_t offset,
|
||||||
{
|
{
|
||||||
struct aarch64_insn_relocation_data *insn_reloc
|
struct aarch64_insn_relocation_data *insn_reloc
|
||||||
= (struct aarch64_insn_relocation_data *) data;
|
= (struct aarch64_insn_relocation_data *) data;
|
||||||
int32_t new_offset
|
int64_t new_offset
|
||||||
= insn_reloc->base.insn_addr - insn_reloc->new_addr + offset;
|
= insn_reloc->base.insn_addr - insn_reloc->new_addr + offset;
|
||||||
|
|
||||||
if (can_encode_int32 (new_offset, 21))
|
if (can_encode_int32 (new_offset, 21))
|
||||||
|
@ -1627,7 +1627,7 @@ aarch64_ftrace_insn_reloc_cb (const int32_t offset, const int is_cbnz,
|
||||||
{
|
{
|
||||||
struct aarch64_insn_relocation_data *insn_reloc
|
struct aarch64_insn_relocation_data *insn_reloc
|
||||||
= (struct aarch64_insn_relocation_data *) data;
|
= (struct aarch64_insn_relocation_data *) data;
|
||||||
int32_t new_offset
|
int64_t new_offset
|
||||||
= insn_reloc->base.insn_addr - insn_reloc->new_addr + offset;
|
= insn_reloc->base.insn_addr - insn_reloc->new_addr + offset;
|
||||||
|
|
||||||
if (can_encode_int32 (new_offset, 21))
|
if (can_encode_int32 (new_offset, 21))
|
||||||
|
@ -1664,7 +1664,7 @@ aarch64_ftrace_insn_reloc_tb (const int32_t offset, int is_tbnz,
|
||||||
{
|
{
|
||||||
struct aarch64_insn_relocation_data *insn_reloc
|
struct aarch64_insn_relocation_data *insn_reloc
|
||||||
= (struct aarch64_insn_relocation_data *) data;
|
= (struct aarch64_insn_relocation_data *) data;
|
||||||
int32_t new_offset
|
int64_t new_offset
|
||||||
= insn_reloc->base.insn_addr - insn_reloc->new_addr + offset;
|
= insn_reloc->base.insn_addr - insn_reloc->new_addr + offset;
|
||||||
|
|
||||||
if (can_encode_int32 (new_offset, 16))
|
if (can_encode_int32 (new_offset, 16))
|
||||||
|
@ -1800,7 +1800,7 @@ aarch64_install_fast_tracepoint_jump_pad (CORE_ADDR tpoint,
|
||||||
{
|
{
|
||||||
uint32_t buf[256];
|
uint32_t buf[256];
|
||||||
uint32_t *p = buf;
|
uint32_t *p = buf;
|
||||||
int32_t offset;
|
int64_t offset;
|
||||||
int i;
|
int i;
|
||||||
uint32_t insn;
|
uint32_t insn;
|
||||||
CORE_ADDR buildaddr = *jump_entry;
|
CORE_ADDR buildaddr = *jump_entry;
|
||||||
|
@ -2137,7 +2137,7 @@ aarch64_install_fast_tracepoint_jump_pad (CORE_ADDR tpoint,
|
||||||
{
|
{
|
||||||
sprintf (err,
|
sprintf (err,
|
||||||
"E.Jump back from jump pad too far from tracepoint "
|
"E.Jump back from jump pad too far from tracepoint "
|
||||||
"(offset 0x%" PRIx32 " cannot be encoded in 28 bits).",
|
"(offset 0x%" PRIx64 " cannot be encoded in 28 bits).",
|
||||||
offset);
|
offset);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -2151,7 +2151,7 @@ aarch64_install_fast_tracepoint_jump_pad (CORE_ADDR tpoint,
|
||||||
{
|
{
|
||||||
sprintf (err,
|
sprintf (err,
|
||||||
"E.Jump pad too far from tracepoint "
|
"E.Jump pad too far from tracepoint "
|
||||||
"(offset 0x%" PRIx32 " cannot be encoded in 28 bits).",
|
"(offset 0x%" PRIx64 " cannot be encoded in 28 bits).",
|
||||||
offset);
|
offset);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue