From patchwork Tue Jan 7 21:35:44 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Charlie Jenkins X-Patchwork-Id: 104303 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 4D7833858416 for ; Tue, 7 Jan 2025 21:37:50 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4D7833858416 Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.a=rsa-sha256 header.s=20230601 header.b=ulLlQwmm X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mail-pl1-x62f.google.com (mail-pl1-x62f.google.com [IPv6:2607:f8b0:4864:20::62f]) by sourceware.org (Postfix) with ESMTPS id B95613857C5D for ; Tue, 7 Jan 2025 21:36:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B95613857C5D Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=rivosinc.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=rivosinc.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org B95613857C5D Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::62f ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1736285762; cv=none; b=hBnKCn6ZZZOundFXzlt9PvTfYowkgmLT59VKNGrSmykJwtfEz+FjfGtAhoYHZUfpKUAgcbQg09UrBZlM9QicRCAXetViFm8AokeRXJgFsXLO1dFKkVAKrUhxpGjxL/6yxr3+iI8lHvukpkR0zgmNDyNHmtVsbgj0L4AyZE9pwI0= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1736285762; c=relaxed/simple; bh=8kJxpAnLfnfc5QHGdxLiuoAC4PZAS8jEY7N8YaKqx3s=; h=DKIM-Signature:From:Date:Subject:MIME-Version:Message-Id:To; b=W1M/obzxio5GZ51JKwzsLPoZtHFlBtyrRZ4pDwVMFChpGIV9rMYn9dH2Xyey8McBJnxKM8/SZFKFPlGzJPPCrDsyhWWRYlg2qmTerDRVqhDQ3Nk/R3lCPGT7vS13umiEpGUDddd7+QBg5rqHpPoncxFpDQX4CbQdqboOpQVuSuw= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-pl1-x62f.google.com with SMTP id d9443c01a7336-2166022c5caso210767955ad.2 for ; Tue, 07 Jan 2025 13:36:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1736285758; x=1736890558; darn=sourceware.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=gYLkFM7UDHLc7uD4Crj2/BUt6Y6in74DSSbaCCrD1lw=; b=ulLlQwmmTok7rM5duXA1wojeamb2lv7zjQUJKvWhIJJeOYYSFLj6axYHMfsyn8S2Y2 UVQ0MYboabEuHokH63BhXHi1xIoFxE34I91ESasuIDEBVEJeCzLgi2T/B44pheicEpZm F1j+5p3bDdivf9FeJMjMRqmV1A0q5Dh9yYyQWG6b0grxlIOrC812RztZTh9nkaHF5pA4 uVMmQOohy4YBp2cgCBwTeD3dAPkXQjrPfATWZMUHKnDZBM62A/Lt97atlPQR94qMqvdQ eosMlX3+685hn7Jk7nDIotAYVxH9s7jo4UIPU9zeeWI2rYJhqydxETja/NnyK9mQNvcn 8LFg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736285758; x=1736890558; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=gYLkFM7UDHLc7uD4Crj2/BUt6Y6in74DSSbaCCrD1lw=; b=bAapM9zSl4gCubeEUaQOIFLFkErj9BTm+E10jyxJZD768G5tt0l8oyVWEOKfcHS78R l1FuMWtKzuPoQdaGo4ctxhbxdYLVIqwiWZYAR1ryMplfZ6BGR44WO/NNgm8fE6NggySF r8h44XBmYxSFRnQ8m3LDPcT3sDh/cGWoOuRXAAJHuyNl+UiwYVeDIpj2cSHhc3qkEw8c lmXyNHIpAQgdA+15c8VMZI8pvLHq/Ka43HYCBoi6F3kuEsPMJ4im/E3clbmHrgG5hO+0 w9N1ekrBsXBT2ZPAYRP4brLWl6CFvI3Kyc3h/0aXY/u9g+4c9mav7B+NCC2IFonBE19W Q2FQ== X-Gm-Message-State: AOJu0YxwLqj6wRfRmzun6xy6UYC3g8HNDAZWiui6SoaQx/D0qiDCexK2 AszrPpmZl/CD0gq7Frmx1qrKqgn6XLziHMssMZt7MiUftFsExkXzWGVDORICQjo= X-Gm-Gg: ASbGncsixHya7/aba06MAMta4nVFTM21lNi/en0jh1a45KzfwS4S+LuMxx2CoLD/kKW VIc0v0znMoCdFD65j1NHZQKMuYbjLc8M5upHHgAz8ocyEUpDoFaztaMQUF40FqN4HV09+NWms5d uBZSeKo2zonBgN2BxcIXpxe+rcrRVr3pnpNT9z/qiHxRE6o4aTOojNckJqUnGSH6k/WnBshSSAe cJa7USwtE1UBFCfjDoTm67TA8R/0VwjInpXSVGMI+uBl2dQa7euIBWnsFlORz9qRiLgxqEE X-Google-Smtp-Source: AGHT+IEYbnp1mvmyr+KDCkq18U+/enyW53B4nd5IPjaU6c6NB56OJJ1suP3GC3YIg6BEQHtY7soAOQ== X-Received: by 2002:aa7:8887:0:b0:72a:bb83:7804 with SMTP id d2e1a72fcca58-72d21fd2e16mr666081b3a.17.1736285758038; Tue, 07 Jan 2025 13:35:58 -0800 (PST) Received: from charlie.ba.rivosinc.com ([64.71.180.162]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-72aad8fb851sm33951646b3a.132.2025.01.07.13.35.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Jan 2025 13:35:57 -0800 (PST) From: Charlie Jenkins Date: Tue, 07 Jan 2025 13:35:44 -0800 Subject: [PATCH v4 1/2] RISC-V: Fix display of partial instructions MIME-Version: 1.0 Message-Id: <20250107-fix_objdump_partial_insn-v4-1-5bca13284275@rivosinc.com> References: <20250107-fix_objdump_partial_insn-v4-0-5bca13284275@rivosinc.com> In-Reply-To: <20250107-fix_objdump_partial_insn-v4-0-5bca13284275@rivosinc.com> To: jiawei , Nelson Chu , Charlie Jenkins , Jan Beulich , Andrew Burgess Cc: gdb-patches , Binutils X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4033; i=charlie@rivosinc.com; h=from:subject:message-id; bh=8kJxpAnLfnfc5QHGdxLiuoAC4PZAS8jEY7N8YaKqx3s=; b=owGbwMvMwCHWx5hUnlvL8Y3xtFoSQ3rtPGslZcuZjvt+/Iqa7zj9in8eT69Z8Hapf5+6fRt+n xFYzb+ko5SFQYyDQVZMkYXnWgNz6x39sqOiZRNg5rAygQxh4OIUgIncX8jwP8YyZRP7xDV/3nYk 7xXYtat89u/HLdNthOKEysIr0k1vVTIybDhd6qj5PdVLebHLnJvG6fo1vqf7XGZN/ByQzfOz5aI ZHwA= X-Developer-Key: i=charlie@rivosinc.com; a=openpgp; fpr=7D834FF11B1D8387E61C776FFB10D1F27D6B1354 X-Spam-Status: No, score=-12.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~patchwork=sourceware.org@sourceware.org As of commit e43d8768d909 ("RISC-V: Fix disassemble fetch fail return value.") partial instructions are no longer displayed by objdump. While that commit fixed the behavior of print_insn_riscv() returning the arbitrary status value upon failure, it caused the behavior of dumping instructions to change. Allow partial instructions to be displayed once again and only return -1 if no part of the instruction was able to be displayed. Fixes: e43d8768d909 ("RISC-V: Fix disassemble fetch fail return value.") Signed-off-by: Charlie Jenkins Acked-By: Andrew Burgess --- opcodes/riscv-dis.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/opcodes/riscv-dis.c b/opcodes/riscv-dis.c index 101380f93aafbd528ba0020371f0c43a85f41bd1..8f551f5bddb9289458b54dfee90d6c014941f9a3 100644 --- a/opcodes/riscv-dis.c +++ b/opcodes/riscv-dis.c @@ -1308,6 +1308,14 @@ riscv_disassemble_data (bfd_vma memaddr ATTRIBUTE_UNUSED, (*info->fprintf_styled_func) (info->stream, dis_style_immediate, "0x%04x", (unsigned) data); break; + case 3: + info->bytes_per_line = 7; + (*info->fprintf_styled_func) + (info->stream, dis_style_assembler_directive, ".word"); + (*info->fprintf_styled_func) (info->stream, dis_style_text, "\t"); + (*info->fprintf_styled_func) + (info->stream, dis_style_immediate, "0x%06x", (unsigned) data); + break; case 4: info->bytes_per_line = 8; (*info->fprintf_styled_func) @@ -1360,12 +1368,31 @@ riscv_init_disasm_info (struct disassemble_info *info) return true; } +/* Fetch an instruction. If only a partial instruction is able to be fetched, + return the number of accessible bytes. */ + +static bfd_vma +fetch_insn (bfd_vma memaddr, + bfd_byte *packet, + bfd_vma dump_size, + struct disassemble_info *info, + volatile int *status) +{ + do + { + *status = (*info->read_memory_func) (memaddr, packet, dump_size, info); + } + while (*status != 0 && dump_size-- > 1); + + return dump_size; +} + int print_insn_riscv (bfd_vma memaddr, struct disassemble_info *info) { bfd_byte packet[RISCV_MAX_INSN_LEN]; insn_t insn = 0; - bfd_vma dump_size; + bfd_vma dump_size, bytes_fetched; int status; enum riscv_seg_mstate mstate; int (*riscv_disassembler) (bfd_vma, insn_t, const bfd_byte *, @@ -1398,24 +1425,42 @@ print_insn_riscv (bfd_vma memaddr, struct disassemble_info *info) else { /* Get the first 2-bytes to check the lenghth of instruction. */ - status = (*info->read_memory_func) (memaddr, packet, 2, info); + bytes_fetched = fetch_insn (memaddr, packet, 2, info, &status); if (status != 0) { (*info->memory_error_func) (status, memaddr, info); return -1; } + else if (bytes_fetched != 2) + { + /* Only the first byte was able to be read. Dump the partial + instruction. */ + dump_size = bytes_fetched; + info->bytes_per_chunk = dump_size; + riscv_disassembler = riscv_disassemble_data; + goto print; + } insn = (insn_t) bfd_getl16 (packet); dump_size = riscv_insn_length (insn); riscv_disassembler = riscv_disassemble_insn; } - /* Fetch the instruction to dump. */ - status = (*info->read_memory_func) (memaddr, packet, dump_size, info); + bytes_fetched = fetch_insn (memaddr, packet, dump_size, info, &status); + if (status != 0) { (*info->memory_error_func) (status, memaddr, info); return -1; } + else if (bytes_fetched != dump_size) + { + dump_size = bytes_fetched; + info->bytes_per_chunk = dump_size; + riscv_disassembler = riscv_disassemble_data; + } + + print: + insn = (insn_t) bfd_get_bits (packet, dump_size * 8, false); return (*riscv_disassembler) (memaddr, insn, packet, info);