From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id SCEZBdGoYGd8Xh0AWB0awg (envelope-from ) for ; Mon, 16 Dec 2024 17:25:21 -0500 Authentication-Results: simark.ca; 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=E5FJeRcE; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 0FE981E097; Mon, 16 Dec 2024 17:25:21 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 4.0.0 (2022-12-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-5.3 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_SIGNED,DKIM_VALID,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=unavailable autolearn_force=no version=4.0.0 Received: from server2.sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 7EEA61E091 for ; Mon, 16 Dec 2024 17:25:20 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 2CD693858420 for ; Mon, 16 Dec 2024 22:25:20 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2CD693858420 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=E5FJeRcE Received: from mail-pf1-x435.google.com (mail-pf1-x435.google.com [IPv6:2607:f8b0:4864:20::435]) by sourceware.org (Postfix) with ESMTPS id EA14F3858420 for ; Mon, 16 Dec 2024 22:23:25 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org EA14F3858420 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 EA14F3858420 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::435 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1734387806; cv=none; b=nFBniBwoLvS95fa1JcQvylYMkCntT5kqATiF+3yoitBGGHKZP2T5RhlKK5IL92UjXOuQv9TJHOB0eHD27WTTDOd8YSTr1CxKSOwLWpawgBz0BiLiiesiBZ10PLVvoc/geJ2CVKM7z0IWJucBJti8crVivE4v2fBN8x0IsxWtQyc= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1734387806; c=relaxed/simple; bh=KdJ9DuLQvmiCmV6qNuf+n6chLZBl4FlgnRsC0Vi768w=; h=DKIM-Signature:From:Date:Subject:MIME-Version:Message-Id:To; b=sOKIzlHGA+C+Xb9dliwKfSXHwtrDqSYYUs1h022kdbRh8TBw+CF5KGwxRmEYY4MIgVzd1aM4uEmS498opjI0tTGULRoiD/FW1ZArSG4Zz0niVU1xpZ1yjw5JyIg7D7oauPZe5uLsRj+RL8Cht5G6ulxhH06G12b10UoFUPN8KIA= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org EA14F3858420 Received: by mail-pf1-x435.google.com with SMTP id d2e1a72fcca58-728f1525565so5467940b3a.1 for ; Mon, 16 Dec 2024 14:23:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1734387804; x=1734992604; darn=sourceware.org; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:from:to:cc:subject:date:message-id:reply-to; bh=HNJ2xDynvipJZxMI8UqPWRks25YHKQxsPSFzbLRaMG8=; b=E5FJeRcE6YH/oFd77r9UvataakcigNvr6vmc8BUr8V472vf6PfUql9QgAfZFSfQ3nr ZqVLVUmioWsl2C//F4a7CYScnWFmlfOmSwS0SAZm37K07IgFmWa4eX/w1xf1v4Rssd61 TW07F7Ir0eMSk5/ALIThJuj+zvoDlsFKqeEedfCIBMDYrECcZuOVe0D8rOYQi7PRTQDw DySh1LxWKP4euFofzZiTtGYwU4PhBdM9Jv1MjPjbhvgFnNNzEp9cga+ATIlWJzg9CvQT PBLyvbortYMsrIkJmyYpsKD72n0pPH28x0hp/qump6d+ZUkxx2eEAsNyn/Ma8wgDUMRC Pp7Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734387804; x=1734992604; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=HNJ2xDynvipJZxMI8UqPWRks25YHKQxsPSFzbLRaMG8=; b=r1Msn3lQSty71KC3jDQ+K3eRNyCiGqn3XSzmbtj4RgD0dpldpZ5yBb/eW9f2/FdZWa +Biv8Zff+3H4/48ZXsD+j/oM36NoQR7pLW/QFNm0urOq8PEcpDEefZgQ+kPTQbBf8mgf pQSgK1/eII1vQLcxgknAOIzdJ7KcCigti0NVYa0m8RwyoNwVH1mRh02Kv+hIGcPF+TU/ A9BMum9Ydm0vM0A65sSmSH9WQ4rdVb4EGpfcB3WKxT+XTznQDRjKMm9bF+DE1sDCzo20 C//hsiq02rc680bXEI/3nzDVKXeOHFyMCQpMEOnd33i/CCu6RYvvnWgaFwUsBYVPEh8O NI8Q== X-Gm-Message-State: AOJu0YxgbzlHy8oGbDNpaWdiZmOhA4dTOikzpdOpIGIM3tG+S2/d6no6 S5s+N1IIo3cvL9CAEDU0LcayVL2WlSfgr52cXv92SvJUAqAJ+yr/K15OXBVcmfNv3lW8u1AmeLv a X-Gm-Gg: ASbGncsYgGRv/boQE3FeRfv1x1XCc9UwwFLi5pJvPwI6P08s1f/afWx10LTswKIsA2n KKufgGAJCsmKLgDIB3hVOCn9hXtuoLrVI8UZQPgWC3CL0oJ+vKBrTbFeUWLoVhLQj3aMs9UCRE/ ZGDaEq1vWQ7j5FpsIw93i5AZZXRntqtdwcSkTMcJDphstGYDVjGqrnFjuOzYkPA3UYqk4VXkrkL KlfC1AXcwyXk4t7nhZL38KNPRs9INjKm2xbftof4/LjePgtSvvtTsD355vfVE9tZW2M1XQa X-Google-Smtp-Source: AGHT+IHQwhWHe4gBpyw5EFlK8lxm+wRztkDwN0xR2eHpkz/JUSunZXqBG14opK46Mqqk2W+ypRjoFA== X-Received: by 2002:a05:6a00:6ca5:b0:71e:4296:2e with SMTP id d2e1a72fcca58-7290c181261mr17874594b3a.11.1734387804147; Mon, 16 Dec 2024 14:23:24 -0800 (PST) Received: from charlie.ba.rivosinc.com ([64.71.180.162]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-72918bad827sm5427593b3a.144.2024.12.16.14.23.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Dec 2024 14:23:23 -0800 (PST) From: Charlie Jenkins Date: Mon, 16 Dec 2024 14:23:13 -0800 Subject: [PATCH v2] RISC-V: Fix disassembly of partial instructions MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20241216-fix_objdump_partial_insn-v2-1-8de88a115dbc@rivosinc.com> X-B4-Tracking: v=1; b=H4sIAFCoYGcC/3WNwQ6CMBBEf4Xs2Rq3BRRP/ochpNBF1khLWmw0h H+34tnjm8y8WSCQZwpwzhbwFDmwswnkLoNu0PZGgk1ikAeZI0oUPb8a197Nc5yaSfuZ9aNhG6y ocpKq7JVp1QnSfPKUupv6WiceOMzOv7eniN/0J5Wo/ksjChRHnVelorIoTHHxHF1g2+07N0K9r usHRlZVnMMAAAA= X-Change-ID: 20241121-fix_objdump_partial_insn-94e236f3db38 To: jiawei , Nelson Chu , Charlie Jenkins Cc: gdb-patches , Binutils X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6074; i=charlie@rivosinc.com; h=from:subject:message-id; bh=KdJ9DuLQvmiCmV6qNuf+n6chLZBl4FlgnRsC0Vi768w=; b=owGbwMvMwCHWx5hUnlvL8Y3xtFoSQ3rCipCqhk2lC8xOmh9RvrQzKb2iPueu0Z0v61YxGZ5lt twmy7mso5SFQYyDQVZMkYXnWgNz6x39sqOiZRNg5rAygQxh4OIUgIm4z2Nk+P5Mek/qjldnF80q LFQJVvtQZxlV6CT+ZN+91qXs+XUdmxn+6bfrxq19tqgvof5hxjrhaS7PJzNN6Hv/7Eng/hvvjzG f4QQA X-Developer-Key: i=charlie@rivosinc.com; a=openpgp; fpr=7D834FF11B1D8387E61C776FFB10D1F27D6B1354 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~public-inbox=simark.ca@sourceware.org As of commit e43d8768d909 ("RISC-V: Fix disassemble fetch fail return value.") partial instructions are no longer disassembled. 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 disassembled once again and only return -1 if no part of the instruction was able to be disassembled. Fixes: e43d8768d909 ("RISC-V: Fix disassemble fetch fail return value.") Signed-off-by: Charlie Jenkins --- When testing linux perf, I noticed that this behavior of objdump has changed. Before this patch and running `perf test` on riscv the following test fails due to objdump not returning all of the expected bytes. Bytes read differ from those read by objdump buf1 (dso): 0x97 0xf7 0x11 0x00 0x93 0x87 0xc7 0x7c 0x22 0x85 0x7c 0xec 0xef 0x50 0x80 0x12 0xa6 0x85 0xce 0x86 0x4a 0x86 0x22 0x85 0xef 0x50 0x40 0x40 0xa2 0x84 0x1d 0xc9 0x7c 0x58 0x85 0x8b 0x85 0xc3 0x1c 0x40 0xa1 0x8b 0x89 0xcf 0x83 0x27 0x04 0x0c 0x63 0x51 0xf0 0x04 0x97 0xf7 0x11 0x00 0x93 0x87 0x07 0x45 0xbe 0x86 0x58 0x70 0x74 0xec 0x7c 0xf3 0xa2 0x70 0x02 0x74 0x42 0x69 0xa2 0x69 0x26 0x85 0xe2 0x64 0x45 0x61 0x82 0x80 0x22 0x85 0xef 0x50 0x50 0x52 0x22 0x85 0xef 0x00 0xb1 0x39 0xa2 0x70 0x02 0x74 0x81 0x44 0x42 0x69 0xa2 0x69 0x26 0x85 0xe2 0x64 0x45 0x61 0x82 0x80 0x97 0x06 0x12 0x00 0x93 0x86 0xa6 0x8a 0x97 0xf7 0x11 0x00 0x93 0x87 buf2 (objdump): 0x97 0xf7 0x11 0x00 0x93 0x87 0xc7 0x7c 0x22 0x85 0x7c 0xec 0xef 0x50 0x80 0x12 0xa6 0x85 0xce 0x86 0x4a 0x86 0x22 0x85 0xef 0x50 0x40 0x40 0xa2 0x84 0x1d 0xc9 0x7c 0x58 0x85 0x8b 0x85 0xc3 0x1c 0x40 0xa1 0x8b 0x89 0xcf 0x83 0x27 0x04 0x0c 0x63 0x51 0xf0 0x04 0x97 0xf7 0x11 0x00 0x93 0x87 0x07 0x45 0xbe 0x86 0x58 0x70 0x74 0xec 0x7c 0xf3 0xa2 0x70 0x02 0x74 0x42 0x69 0xa2 0x69 0x26 0x85 0xe2 0x64 0x45 0x61 0x82 0x80 0x22 0x85 0xef 0x50 0x50 0x52 0x22 0x85 0xef 0x00 0xb1 0x39 0xa2 0x70 0x02 0x74 0x81 0x44 0x42 0x69 0xa2 0x69 0x26 0x85 0xe2 0x64 0x45 0x61 0x82 0x80 0x97 0x06 0x12 0x00 0x93 0x86 0xa6 0x8a 0x97 0xf7 0x11 0x00 0xad 0x00 ---- end(-1) ---- 24: Object code reading : FAILED! After this patch, this test case no longer fails, as objdump returns the expected values. --- Changes in v2: - Fix comment spacing (Jiawei) - Link to v1: https://lore.kernel.org/r/20241213-fix_objdump_partial_insn-v1-1-7a4963e655d5@rivosinc.com --- opcodes/riscv-dis.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 5 deletions(-) diff --git a/opcodes/riscv-dis.c b/opcodes/riscv-dis.c index 101380f93aafbd528ba0020371f0c43a85f41bd1..492135d4642a29d86757ba0d2ec8261dab66275f 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,13 +1368,28 @@ 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; - int status; + volatile bfd_vma dump_size, bytes_fetched; + volatile int status; enum riscv_seg_mstate mstate; int (*riscv_disassembler) (bfd_vma, insn_t, const bfd_byte *, struct disassemble_info *); @@ -1398,24 +1421,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); --- base-commit: 978324718990b6b371d4eeeba02cfe13a0ebf120 change-id: 20241121-fix_objdump_partial_insn-94e236f3db38 -- - Charlie