From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id 4P/xFHX+PGA3JAAAWB0awg (envelope-from ) for ; Mon, 01 Mar 2021 09:47:17 -0500 Received: by simark.ca (Postfix, from userid 112) id 52D471EF7C; Mon, 1 Mar 2021 09:47:17 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-1.1 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,MAILING_LIST_MULTI,MSGID_FROM_MTA_HEADER,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from 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 RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 5DC711E590 for ; Mon, 1 Mar 2021 09:47:15 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 88952393A435; Mon, 1 Mar 2021 14:47:14 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 88952393A435 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1614610034; bh=CUofjSJcPXcCVgnyhWOLr2I4YWBo0Fv+PyXU/tuhBo0=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=yRa86BY2W1C+FSFmEafk6b0qXzlVxdq7L/QgnoL+iWbe2OzhH+Q+aNxMN2a9z7RZ1 z9sL+4U+7m2z2cpr5Mr8o4JAuol5/C+ULrilhBxz/TfnYBZ2F+1Rey2VfY0k/BwAtO L+AziMRHJzeSwjNUUTF41vVoN6c2F2x9WoYklklo= Received: from NAM12-MW2-obe.outbound.protection.outlook.com (mail-mw2nam12on2075.outbound.protection.outlook.com [40.107.244.75]) by sourceware.org (Postfix) with ESMTPS id C224E3939C0C for ; Mon, 1 Mar 2021 14:47:10 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org C224E3939C0C ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=gg2WtHYh59NcCr3ZeAx5LMZZR1cAsSUHBvzTBNRJh+RYKsDpAFxxzOKXFXvS6/U40H4/x70fNYobHUpAQxCHDHm/s4kBEPE7s8kkNuvUO/uAST4BaVUTu1Sfrih8U6b4QODim61LKMVG5czR3IHKJBWAZA3/Ns0unoS2XqCydHPJRH3j3O/RCWzNgxSSVP/qrF9wOPi4rW2clfgCUgFL7km4dqY4m14aY+x7IxE+O72Z3m/0H0oL6aNO0o/UyYo1rWsNDjZsv4qQCD0bDbRdO/kuRRkJPsYkT8JSoy6sOSmBEXQ15QENOZQl49rJqazuPcRQ7GlC69iXGcxiY1laLA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=CUofjSJcPXcCVgnyhWOLr2I4YWBo0Fv+PyXU/tuhBo0=; b=dOsfJtwqBj3WfGf4zjwbNQaJhA5QmqdmcItV6/PR/Y2jH4FctlqEjsqrQrHUGFawsjL2EEl3Hgy6rebE6dhRljOwVs/dIjKssU9lYMx1UuAMm2PSqTC5o4Pxwk98OQCKBqAQcj18JxY4Zi8dkjceqHhVtTy8BHbkbod7NYeOGSy1Trh+lv1X1V+zMxF0LLzQQs+5EFS/7JFkkNEJ5ArHBZqvkC0yp9vLREJFNLzaqCdAiy4fZpvCvMUO8gIdhnvjVxNPAwZpL7GQgsG3VBPnOb4/OeeLCk2xvK1A8PKt5baOnjXPWFhP7Ov8RuScQdy93IkHS+b5Q98sN8xF/mnpVQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none Received: from DM6PR12MB2762.namprd12.prod.outlook.com (2603:10b6:5:45::15) by DM6PR12MB3676.namprd12.prod.outlook.com (2603:10b6:5:1c7::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3890.19; Mon, 1 Mar 2021 14:46:59 +0000 Received: from DM6PR12MB2762.namprd12.prod.outlook.com ([fe80::31d8:f503:f7b2:f44]) by DM6PR12MB2762.namprd12.prod.outlook.com ([fe80::31d8:f503:f7b2:f44%3]) with mapi id 15.20.3868.033; Mon, 1 Mar 2021 14:46:59 +0000 To: gdb-patches@sourceware.org Subject: [PATCH 18/43] Add new register access interface to expr.c Date: Mon, 1 Mar 2021 14:45:55 +0000 Message-Id: <20210301144620.103016-19-Zoran.Zaric@amd.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210301144620.103016-1-Zoran.Zaric@amd.com> References: <20210301144620.103016-1-Zoran.Zaric@amd.com> Content-Type: text/plain X-Originating-IP: [2a00:23c7:5a85:6801:b4ed:fe7b:8064:d4d] X-ClientProxiedBy: AM0PR04CA0073.eurprd04.prod.outlook.com (2603:10a6:208:be::14) To DM6PR12MB2762.namprd12.prod.outlook.com (2603:10b6:5:45::15) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from localhost.localdomain (2a00:23c7:5a85:6801:b4ed:fe7b:8064:d4d) by AM0PR04CA0073.eurprd04.prod.outlook.com (2603:10a6:208:be::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3890.19 via Frontend Transport; Mon, 1 Mar 2021 14:46:59 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 41c90123-ab5d-42c7-94cc-08d8dcc0de5f X-MS-TrafficTypeDiagnostic: DM6PR12MB3676: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:6108; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: aZAGxW+nJdLrddU2ncdl6G8oO3or2hWaRVedQe26mLZqPBRllVqWWyAt4afFWqZXKDMM1UtOGAcUvo8vH16p9vIy8+bF3H63GnI2m8o5/+xCHO9/0nXWs3J1WRNoLaNpwZw/WQoXP71KcCN77mDhKX7tbis8n/VxqpGAqVp+uasE6LZRejpi8gBQjkb4YNeQe7Hr59If6fcJuH0VJgAtmqbBt1o8R4QtSDKVzHs6g2Vj+zdOB3sX8POind6Kgrt8XAnf3s4MQ9LPwWegsMnUUhacFzOuDK8T+1vxQxXKc+q8r8BoDc2Ha0oy6NC/obIgkehiPB4CkZiBXiYmTiHwdlNI0+cyYSytuAe/WJp+J5PGGfyoRe9XQuZmL7NSBODZYoExdwHwONB+y/9SbVbqxe4Yp6WdofXTXZdyOyN1noYxI2ppMiZw+ORH9Nu8majtOwyP1SyjWx0tcScolspmYifO3R3S3fnzIV6x4JV8kAPOtgGoI8fkqLdkUCTCfa5L3HXFQ99d4HCnshNX4LUY5dVe8tq7i87B5N87629U1+W4lAd+x04yv7qpRr4hectOCibWkCPSaaTZ99m9QBLSCA== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DM6PR12MB2762.namprd12.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(376002)(366004)(396003)(346002)(136003)(39860400002)(6666004)(16526019)(1076003)(83380400001)(2616005)(69590400012)(2906002)(186003)(36756003)(66946007)(316002)(66476007)(8936002)(52116002)(86362001)(6506007)(478600001)(5660300002)(4326008)(6486002)(8676002)(6916009)(6512007)(66556008); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?8PtkPb0VzZVd8RHgqGIubEYhV1z297ApEX1xhPD+a+mxKq1RCqvLNdmKnNcw?= =?us-ascii?Q?iOWYen6IuIPvzwceHLJK141i9QCkrKP6qzXvVVjE+PGSDaad1r1+mTPNmXtR?= =?us-ascii?Q?2wvtvLQlUs9i+yv9d8t+Zbg7wBSJ1iKrBKWJMVC26gj6T6zSs0T34ZMqJ+pY?= =?us-ascii?Q?9pQnk5TbeErIaHZ93sD//KgZe45kFA5xf1PqiGi5bZd8XYrSD/khEx2cGlfR?= =?us-ascii?Q?Snxgd+MfG0mBo/qIXGAs9YbTeOtaMrb7ldI1tkbpF483uLQlmZuLtq9UbgmQ?= =?us-ascii?Q?UhwqZyH+SisJNKE00HOiBP3RJniQ4NF96QjqpitgWVD8fS7ykugUabdyIQrT?= =?us-ascii?Q?ZKdcAImqjHMlGilwNZrSbI2Z7Dan/+KFxQLoUKx3Qc9WIqjLn2UgvVHwh73R?= =?us-ascii?Q?DNDVFsbK6U677eZLNGvC2WTOlBQY2bQEamA+Tv81ohVrx3lSCgwerus12o5k?= =?us-ascii?Q?B6QLR7c0oRD3oo+Jdzn9Aws3tX6YzIwsgLQFNzVGcjf/yDmuJ2XkW44Z0Hwe?= =?us-ascii?Q?6kE3Tw1xAoLzbYaJTPRVe+t1eoJuyVjOOPFLxEcCSaX2ToGnV4LzzVU/gyho?= =?us-ascii?Q?gPzqXo/JsMylhGZMcqHdTalN2EU7cH2xgjCm5LvgzFjvQbJoxcR9624kFEFQ?= =?us-ascii?Q?ypWSO1FyS2MyRE9c/K8HrTvajYduojMqMQXVo+R16bavYwnLVYbFT1Axx39/?= =?us-ascii?Q?xGdObck3xFv8hUdqoI2psUzl01MND5JGspvuS2x8PgailXt5R0TOJvG3tr27?= =?us-ascii?Q?c1h+pnSC7Noq8fDT+bav0sW1rgHNub/k3wE4CLpy0k3NONuv5BPxUYmrvV3e?= =?us-ascii?Q?yJrhSDh4ssWhiElzAWVBSCoQzYlOD89ONMy1kHdgvE89hUZGcFTPb8wUneGM?= =?us-ascii?Q?kArEnDLgwLKDZSmsXG6GO4BxwuVLSC4wkojqoz+iKwMCRDCm0/LrnOaSE/5B?= =?us-ascii?Q?l6JBp29CiJQr5sR2bv+dSsttfTzOKmsYkuECaJo+wcVDmBCf1qL5gM4sUpAN?= =?us-ascii?Q?wcqIlk8Pi4ZlDDcJlNn/0CVn/531ewEHDQVKoX7Qe7oJjBpsaq0zSQBuPnaK?= =?us-ascii?Q?3wqaDb2JzaOZp01TEkldq8PbHulg4056vJdn98LKqMJ14lX75NvRiYKUsQJP?= =?us-ascii?Q?jiYWe0LEZNf6IH2m0L8lkasjJak7lDkTBi15kHlM3nR5yjCrT+9Bc64safxA?= =?us-ascii?Q?BdFV8aCZFz0ze1g9k4/HSTr/VGQAvioxOaDl8QzbblF4gBsfCXUZLeG5X2Jf?= =?us-ascii?Q?ijS+2WVry5W2j4VhyYtdFNoRIy1lodEIBKTF6xlGf1jIEzNVspJaYSfYjuTV?= =?us-ascii?Q?YYFOZKmIjb0KvG0f2yKPhoKHO/Z4pEsC6cob1J2BCdC9p3iD3DpbrdA9qsKj?= =?us-ascii?Q?c4vPFKS/MF1BA04pL0Oja3ymX7/D?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: 41c90123-ab5d-42c7-94cc-08d8dcc0de5f X-MS-Exchange-CrossTenant-AuthSource: DM6PR12MB2762.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Mar 2021 14:46:59.6851 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 6TJpSUTiqg1oMMZ6VrErPEXnIWn0Vt+as+FL/eSkJQxKBwevyKYdMRXpj85ylGR5CXPNDXcj4I2sxzZIuiLskg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR12MB3676 X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Zoran Zaric via Gdb-patches Reply-To: Zoran Zaric Errors-To: gdb-patches-bounces@sourceware.org Sender: "Gdb-patches" DWARF expression evaluator is currently using get_frame_register_bytes and put_frame_register_bytes interface for register access. The problem with evaluator using this interface is that it allows a bleed out register access. This means that if the caller specifies a larger amount of data then the size of a specified register, the operation will continue accessing the neighboring registers until a full amount of data has been reached. DWARF specification does not define this behavior, so a new simplified register access interface is needed instead. * dwarf2/expr.c (read_from_register): New function. (write_to_register): New function. (rw_pieced_value): Now calls the read_from_register and write_to_register functions. --- gdb/dwarf2/expr.c | 128 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 106 insertions(+), 22 deletions(-) diff --git a/gdb/dwarf2/expr.c b/gdb/dwarf2/expr.c index c50bb3c8d90..5a1fd5b941f 100644 --- a/gdb/dwarf2/expr.c +++ b/gdb/dwarf2/expr.c @@ -106,6 +106,96 @@ read_addr_from_reg (struct frame_info *frame, int reg) return address_from_register (regnum, frame); } +/* Read register REGNUM's contents in a given FRAME context. + + The data read is offsetted by OFFSET, and the number of bytes read + is defined by LENGTH. The data is then copied into the + caller-managed buffer BUF. + + If the register is optimized out or unavailable for the given + FRAME, the OPTIMIZED and UNAVAILABLE outputs are set + accordingly */ + +static void +read_from_register (struct frame_info *frame, int regnum, + CORE_ADDR offset, gdb::array_view buf, + int *optimized, int *unavailable) +{ + struct gdbarch *gdbarch = get_frame_arch (frame); + int regsize = register_size (gdbarch, regnum); + int numregs = gdbarch_num_cooked_regs (gdbarch); + int length = buf.size (); + + /* If a register is wholly inside the OFFSET, skip it. */ + if (frame == NULL || !regsize + || offset + length > regsize || numregs < regnum) + { + *optimized = 0; + *unavailable = 1; + return; + } + + gdb::byte_vector temp_buf (regsize); + enum lval_type lval; + CORE_ADDR address; + int realnum; + + frame_register (frame, regnum, optimized, unavailable, + &lval, &address, &realnum, temp_buf.data ()); + + if (!*optimized && !*unavailable) + memcpy (buf.data (), (char *) temp_buf.data () + offset, length); + + return; +} + +/* Write register REGNUM's contents in a given FRAME context. + + The data written is offsetted by OFFSET, and the number of bytes + written is defined by LENGTH. The data is copied from + caller-managed buffer BUF. + + If the register is optimized out or unavailable for the given + FRAME, the OPTIMIZED and UNAVAILABLE outputs are set + accordingly. */ + +static void +write_to_register (struct frame_info *frame, int regnum, + CORE_ADDR offset, gdb::array_view buf, + int *optimized, int *unavailable) +{ + struct gdbarch *gdbarch = get_frame_arch (frame); + int regsize = register_size (gdbarch, regnum); + int numregs = gdbarch_num_cooked_regs (gdbarch); + int length = buf.size (); + + /* If a register is wholly inside of OFFSET, skip it. */ + if (frame == NULL || !regsize + || offset + length > regsize || numregs < regnum) + { + *optimized = 0; + *unavailable = 1; + return; + } + + gdb::byte_vector temp_buf (regsize); + enum lval_type lval; + CORE_ADDR address; + int realnum; + + frame_register (frame, regnum, optimized, unavailable, + &lval, &address, &realnum, temp_buf.data ()); + + if (!*optimized && !*unavailable) + { + memcpy ((char *) temp_buf.data () + offset, buf.data (), length); + + put_frame_register (frame, regnum, temp_buf.data ()); + } + + return; +} + struct piece_closure { /* Reference count. */ @@ -243,22 +333,18 @@ rw_pieced_value (struct value *v, struct value *from) if (from == NULL) { /* Read mode. */ - if (!get_frame_register_bytes (frame, gdb_regnum, - bits_to_skip / 8, - buffer, &optim, &unavail)) - { - if (optim) - mark_value_bits_optimized_out (v, offset, - this_size_bits); - if (unavail) - mark_value_bits_unavailable (v, offset, - this_size_bits); - break; - } - - copy_bitwise (v_contents, offset, - buffer.data (), bits_to_skip % 8, - this_size_bits, bits_big_endian); + read_from_register (frame, gdb_regnum, bits_to_skip / 8, + buffer, &optim, &unavail); + + if (optim) + mark_value_bits_optimized_out (v, offset, this_size_bits); + if (unavail) + mark_value_bits_unavailable (v, offset, this_size_bits); + /* Only copy data if valid. */ + if (!optim && !unavail) + copy_bitwise (v_contents, offset, + buffer.data (), bits_to_skip % 8, + this_size_bits, bits_big_endian); } else { @@ -267,9 +353,8 @@ rw_pieced_value (struct value *v, struct value *from) { /* Data is copied non-byte-aligned into the register. Need some bits from original register value. */ - get_frame_register_bytes (frame, gdb_regnum, - bits_to_skip / 8, - buffer, &optim, &unavail); + read_from_register (frame, gdb_regnum, bits_to_skip / 8, + buffer, &optim, &unavail); if (optim) throw_error (OPTIMIZED_OUT_ERROR, _("Can't do read-modify-write to " @@ -285,9 +370,8 @@ rw_pieced_value (struct value *v, struct value *from) copy_bitwise (buffer.data (), bits_to_skip % 8, from_contents, offset, this_size_bits, bits_big_endian); - put_frame_register_bytes (frame, gdb_regnum, - bits_to_skip / 8, - buffer); + write_to_register (frame, gdb_regnum, bits_to_skip / 8, + buffer, &optim, &unavail); } } break; -- 2.17.1