From patchwork Fri Dec 13 20:50:29 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Charlie Jenkins X-Patchwork-Id: 103102 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 429CF3858C78 for ; Fri, 13 Dec 2024 20:52:52 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 429CF3858C78 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=BS5N7G5T X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-pj1-x1033.google.com (mail-pj1-x1033.google.com [IPv6:2607:f8b0:4864:20::1033]) by sourceware.org (Postfix) with ESMTPS id BA1493858D35 for ; Fri, 13 Dec 2024 20:50:46 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org BA1493858D35 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 BA1493858D35 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::1033 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1734123047; cv=none; b=sq9A/mjY15v7DKED16CZmnxD+m6OgV/BiaWtf+JxEeVSpXuc028bfazgJZXIWo6LREuZyFpUS9abN0swAw/2fnvwktHK7iiKpywO6gRi9w6f4OkLVQYhDUd0Hyg0QHiAFg0rTNgELYhYVIz3nlYcpSREQU9VmLV0uUNfGXYbciE= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1734123047; c=relaxed/simple; bh=7Bh+8esd1NKNsJ7KTSUOfYI3LblSsU3QXS972ZhLxek=; h=DKIM-Signature:From:Date:Subject:MIME-Version:Message-Id:To; b=dn6elKmPI9en0tQVTT+FAplAiAkv4gai85kf/ALdjdP0FaWYt/k/bhbz+ELpMQXgs2OkArNFctvfbDDKjSOwbYz/AQuEVqDwUMS0pqQV7vrxHJNduHjX9T8VSqaWRxedvB8ySSeW9+6rCTT88Ugf8JAZgV2XeF2LwTNOaNl3rgM= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BA1493858D35 Received: by mail-pj1-x1033.google.com with SMTP id 98e67ed59e1d1-2ee67e9287fso1909273a91.0 for ; Fri, 13 Dec 2024 12:50:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1734123046; x=1734727846; 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=zyTqW7ecGzLKEBYXiKNQG9pe7AbkAMYtCd/40Ymts5c=; b=BS5N7G5TbTmNKOgg6iypguuGVf8E7iWK4r6WxcHWFK5RhPfN2nwajAxlH7TyIOstVa mq5HHu8JDn2WbPLKKD9RgD4bNDekDWGW+Pcp4rgc384OZxLWSSl5/MZ+LAyeve0O+jMR okkI7cyKjEJsTM+SUULiaT3jK5IaUsuTaBeuXOvvFOVlIA9oZm1yiop3WdEKfxcZvbEP 1eGiyEORB5xNcNOdhf3+KJFH+8Nlc17fbT3Ezzmms1QS+rk3ZwGTpK/A4zxMZOvE30VK G0f8gDekwYCRvZJITzWsmm2AZZ/93bqIchtZHxvu/AN23ehISleBs/95TAAYzrbirhuQ KQIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734123046; x=1734727846; 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=zyTqW7ecGzLKEBYXiKNQG9pe7AbkAMYtCd/40Ymts5c=; b=ACnf6F7A9kXvQfh+J6NCB3/Q8S3cU49mPXmgY1HjvgTWzlLGmWZL6RbDr4ajiVJkfo /mECeVwfB8f2F6Uef78H+R0Ls4RVW20BMqzIDU4Zo6zqmhHFZGvrNcA9w3GQkZ6Wa++W HsvQUkRFf8kNbh+Ad1O1Y7xIWDLOdTb0K6shLshkX0eZbJZXoJu2Vh0AqSF7CfmKQTky Xr+jyYNz4AWn9Dgfza+c/HA7vahpHB/dtqy/IAo+wC01vhWKs2kB+I1C47mOMZuZrFDz uCaadqFRRN7WFf+tL8A3vHsOiGWJZY9NpjfSISiCmq9RdMNZahExlZDriyJJUDBpdP5/ vIaQ== X-Forwarded-Encrypted: i=1; AJvYcCWDQL0yp7VYurGf4IhuhWcSjmZU+lFaxcR2LUUp0DAPu6TFj/i1zQ+iBn+L+otvMWac6Caw9gZdEQ==@sourceware.org X-Gm-Message-State: AOJu0Yw4vtTEhyOHvOUxdkE3m3SaG+DNuqEM7kd77IHFJTNNLjyn/9PU kqA+wTuiz4Yyh1QiISAIw+OnfH62tyFLn43cwpCVamgqgQhMMX9yxOq1VB0x2GM= X-Gm-Gg: ASbGncssVvZkSx9Q4ugMNZ1e6rTHKsDPvesbinuQ6hBbdLSrjJZwU+BZ3JDiY6zBwet ZQit1kmKJhwurUWi8+m2H9n60WvhFfGNLTog6YSd2jtndRmz8GNlCj+Y1IWaR/y7UmBMspJYgPq mLeL/O9BUjErHMBsGe84RuKpjHwqAwkSLF67IvzuXMfkvyES1XSr5KbuO8lTVq8xIGcWSNkaKqE VLXbC9zytk7JAqFzgGDV3hCNrGfAw3yLj3QAiNfYp6rDnwHWfGUuz3ap9XUvSsBk9se+VSb X-Google-Smtp-Source: AGHT+IFmKMYOxv9W5N01cVceimbXlwBoDMG2qBuKBIWZDgovjRWN7d6rkbM1MR52E1/+DnAfLZiwPg== X-Received: by 2002:a17:90b:3e88:b0:2ea:5054:6c49 with SMTP id 98e67ed59e1d1-2f28f8691ebmr7355793a91.0.1734123045661; Fri, 13 Dec 2024 12:50:45 -0800 (PST) Received: from charlie.ba.rivosinc.com ([64.71.180.162]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f142daea9fsm3655226a91.15.2024.12.13.12.50.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Dec 2024 12:50:45 -0800 (PST) From: Charlie Jenkins Date: Fri, 13 Dec 2024 12:50:29 -0800 Subject: [PATCH] RISC-V: Fix disassembly of partial instructions MIME-Version: 1.0 Message-Id: <20241213-fix_objdump_partial_insn-v1-1-7a4963e655d5@rivosinc.com> X-B4-Tracking: v=1; b=H4sIABSeXGcC/x2M7QpAMBRAX0X3t5V9JLyKtMYurpi1ISXvbvl56 pzzQMRAGKHJHgh4UaTdJeB5BsNs3ISMbGIQhVCcC85GuvXeL/bcvPYmHGRWTS46VisUshyl7WU FKfcBk/uv2+59P515RINqAAAA X-Change-ID: 20241121-fix_objdump_partial_insn-94e236f3db38 To: jiawei , =?utf-8?b?6YOR5a2d5p6XICjkupHnn4Up?= , Nelson Chu , Charlie Jenkins Cc: gdb-patches , Binutils X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=5904; i=charlie@rivosinc.com; h=from:subject:message-id; bh=7Bh+8esd1NKNsJ7KTSUOfYI3LblSsU3QXS972ZhLxek=; b=owGbwMvMwCHWx5hUnlvL8Y3xtFoSQ3rMPNkj9anTzikIS8b9SbP0KxWb8lL/SPOvA1cbJVrtP zZn/0rtKGVhEONgkBVTZOG51sDceke/7Kho2QSYOaxMIEMYuDgFYCKOCxkZWsJFZURvuv79P225 gRMHo2th5/ojxrWM8aJb430tzVf6MvwvkPhf1Lo2OOFHwlGfMwHeS75EbFAw0CxjahK94jeh6Bk 7AA== X-Developer-Key: i=charlie@rivosinc.com; a=openpgp; fpr=7D834FF11B1D8387E61C776FFB10D1F27D6B1354 X-Spam-Status: No, score=-12.5 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: binutils@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: binutils-bounces~patchwork=sourceware.org@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. --- opcodes/riscv-dis.c | 50 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 5 deletions(-) --- base-commit: 978324718990b6b371d4eeeba02cfe13a0ebf120 change-id: 20241121-fix_objdump_partial_insn-94e236f3db38 diff --git a/opcodes/riscv-dis.c b/opcodes/riscv-dis.c index 101380f93aafbd528ba0020371f0c43a85f41bd1..b0dc67c3a18caf7437a0a6d6229108299e8514a7 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,41 @@ 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);