diff options
author | Yao Qi <yao.qi@linaro.org> | 2016-12-12 09:03:34 +0000 |
---|---|---|
committer | Yao Qi <yao.qi@linaro.org> | 2016-12-12 09:03:34 +0000 |
commit | 029e9d52de3ac7fe984dc079ebd24506fd1eace7 (patch) | |
tree | b9bdd7fc3b6147497a3ee55bd51e4691e4ebbfab /opcodes/rx-dis.c | |
parent | Handle memory error in print_insn_rl78_common (diff) | |
download | binutils-gdb-029e9d52de3ac7fe984dc079ebd24506fd1eace7.tar.gz binutils-gdb-029e9d52de3ac7fe984dc079ebd24506fd1eace7.tar.bz2 binutils-gdb-029e9d52de3ac7fe984dc079ebd24506fd1eace7.zip |
Handle memory error in print_insn_rx
Nowadays, memory error in rx disassembly is not handled, so if I
start a fresh GDB, and disassemble,
(gdb) set architecture rx
The target architecture is assumed to be rx
(gdb) disassemble 0x0,+4
Dump of assembler code from 0x0 to 0x4:
0x00000000: brk
0x00000001: brk
0x00000002: brk
0x00000003: brk
the output is wrong. This patch adds code to call dis->memory_error_func
on memory error, and longjmp to print_insn_rx. With this patch applied,
(gdb) set architecture rx
The target architecture is assumed to be rx
(gdb) disassemble 0,+4
Dump of assembler code from 0x0 to 0x4:
0x00000000: Cannot access memory at address 0x0
opcodes:
2016-12-12 Yao Qi <yao.qi@linaro.org>
* rx-dis.c: Include <setjmp.h>
(struct private): New.
(rx_get_byte): Check return value of read_memory_func, and
call memory_error_func and OPCODES_SIGLONGJMP on error.
(print_insn_rx): Call OPCODES_SIGSETJMP.
Diffstat (limited to 'opcodes/rx-dis.c')
-rw-r--r-- | opcodes/rx-dis.c | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/opcodes/rx-dis.c b/opcodes/rx-dis.c index b0ff4b36974..5f2bf352ff5 100644 --- a/opcodes/rx-dis.c +++ b/opcodes/rx-dis.c @@ -27,22 +27,38 @@ #include "dis-asm.h" #include "opcode/rx.h" +#include <setjmp.h> + typedef struct { bfd_vma pc; disassemble_info * dis; } RX_Data; +struct private +{ + OPCODES_SIGJMP_BUF bailout; +}; + static int rx_get_byte (void * vdata) { bfd_byte buf[1]; RX_Data *rx_data = (RX_Data *) vdata; + int status; + + status = rx_data->dis->read_memory_func (rx_data->pc, + buf, + 1, + rx_data->dis); + if (status != 0) + { + struct private *priv = (struct private *) rx_data->dis->private_data; - rx_data->dis->read_memory_func (rx_data->pc, - buf, - 1, - rx_data->dis); + rx_data->dis->memory_error_func (status, rx_data->pc, + rx_data->dis); + OPCODES_SIGLONGJMP (priv->bailout, 1); + } rx_data->pc ++; return buf[0]; @@ -92,10 +108,18 @@ print_insn_rx (bfd_vma addr, disassemble_info * dis) RX_Data rx_data; RX_Opcode_Decoded opcode; const char * s; + struct private priv; + dis->private_data = (PTR) &priv; rx_data.pc = addr; rx_data.dis = dis; + if (OPCODES_SIGSETJMP (priv.bailout) != 0) + { + /* Error return. */ + return -1; + } + rv = rx_decode_opcode (addr, &opcode, rx_get_byte, &rx_data); dis->bytes_per_line = 10; |