From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 107557 invoked by alias); 9 Dec 2016 17:00:02 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 107477 invoked by uid 89); 9 Dec 2016 17:00:01 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=Hx-languages-length:2535, bfd_byte, Hx-spam-relays-external:74.125.83.68, H*RU:74.125.83.68 X-Spam-User: qpsmtpd, 2 recipients X-HELO: mail-pg0-f68.google.com Received: from mail-pg0-f68.google.com (HELO mail-pg0-f68.google.com) (74.125.83.68) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 09 Dec 2016 16:59:51 +0000 Received: by mail-pg0-f68.google.com with SMTP id p66so2819609pga.2; Fri, 09 Dec 2016 08:59:51 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=Bo8zNm6+E8HAn+nQuMj9UpJxryG0P0X5yEL0iLlJCDQ=; b=F9XbDHped83LaeEmNewLgy1FaUxlycO+Hc3QKWE0jxInjhyeMKpol9Imm+zFEk5nD+ SBgIe9ijX0KW5t2xoik9iOhxxtbNujeA1Y5Zr8tk86SQuLDemg7FB6iReugjsyWYGKaI qq7jXGcnaAayfvpGrVMhol8w2MiSlo4qLV/he3k5LAMTXAcPdLL2EnBCxa2j9/VNYYIn TCshkZNt1XegpK6IccXGWn1k37IpC9iWJn2VrlXpkIwWjXePNpDe7m+ZktDlvsi062Rq ZVDTohB7UULthXnaOOHZTqbIpSI1OFnBk1hFcm6/3iM2ytXoVDbPKmOBv6f2+D0iIC3/ gKTg== X-Gm-Message-State: AKaTC01omtLsWWKY8cu5PtjIna3NuYDDZwtLyNIwHOqoI+S3KNqsaic92NemhlEeWJlPTA== X-Received: by 10.99.114.2 with SMTP id n2mr146161193pgc.130.1481302789702; Fri, 09 Dec 2016 08:59:49 -0800 (PST) Received: from E107787-LIN.cambridge.arm.com (gcc1-power7.osuosl.org. [140.211.15.137]) by smtp.gmail.com with ESMTPSA id p64sm58797369pfi.88.2016.12.09.08.59.48 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 09 Dec 2016 08:59:49 -0800 (PST) From: Yao Qi X-Google-Original-From: Yao Qi To: binutils@sourceware.org Cc: gdb-patches@sourceware.org Subject: [PATCH] Handle memory error in print_insn_rl78_common Date: Fri, 09 Dec 2016 17:00:00 -0000 Message-Id: <1481302775-8931-1-git-send-email-yao.qi@linaro.org> X-IsSubscribed: yes X-SW-Source: 2016-12/txt/msg00249.txt.bz2 Nowadays, memory error in rl78 disassembly is not handled, so if I start a fresh GDB, and disassemble, (gdb) set architecture rl78 The target architecture is assumed to be rl78 (gdb) disassemble 0x0,+4 Dump of assembler code from 0x0 to 0x4: 0x00000000: nop 0x00000001: nop 0x00000002: nop 0x00000003: nop the output is wrong. This patch adds code to call dis->memory_error_func on memory error, and longjmp to print_insn_rl78_common. With this patch applied, (gdb) set architecture rl78 The target architecture is assumed to be rl78 (gdb) disassemble 0,+4 Dump of assembler code from 0x0 to 0x4: 0x00000000: Cannot access memory at address 0x0 Regression tested with all targets enabled. Is it OK? opcodes: 2016-12-08 Yao Qi * rl78-dis.c: Include . (struct private): New. (rl78_get_byte): Check return value of read_memory_func, and call memory_error_func and OPCODES_SIGLONGJMP on error. (print_insn_rl78_common): Call OPCODES_SIGJMP. --- opcodes/rl78-dis.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/opcodes/rl78-dis.c b/opcodes/rl78-dis.c index a23999d..c2b36db 100644 --- a/opcodes/rl78-dis.c +++ b/opcodes/rl78-dis.c @@ -29,6 +29,8 @@ #include "opcode/rl78.h" #include "elf/rl78.h" +#include + #define DEBUG_SEMANTICS 0 typedef struct @@ -37,16 +39,30 @@ typedef struct disassemble_info * dis; } RL78_Data; +struct private +{ + OPCODES_SIGJMP_BUF bailout; +}; + static int rl78_get_byte (void * vdata) { bfd_byte buf[1]; RL78_Data *rl78_data = (RL78_Data *) vdata; + int status; + + status = rl78_data->dis->read_memory_func (rl78_data->pc, + buf, + 1, + rl78_data->dis); + if (status != 0) + { + struct private *priv = (struct private *) rl78_data->dis->private_data; - rl78_data->dis->read_memory_func (rl78_data->pc, - buf, - 1, - rl78_data->dis); + rl78_data->dis->memory_error_func (status, rl78_data->pc, + rl78_data->dis); + OPCODES_SIGLONGJMP (priv->bailout, 1); + } rl78_data->pc ++; return buf[0]; @@ -92,10 +108,18 @@ print_insn_rl78_common (bfd_vma addr, disassemble_info * dis, RL78_Dis_Isa isa) #if DEBUG_SEMANTICS static char buf[200]; #endif + struct private priv; + dis->private_data = (PTR) &priv; rl78_data.pc = addr; rl78_data.dis = dis; + if (OPCODES_SIGSETJMP (priv.bailout) != 0) + { + /* Error return. */ + return -1; + } + rv = rl78_decode_opcode (addr, &opcode, rl78_get_byte, &rl78_data, isa); dis->bytes_per_line = 10; -- 1.9.1