From patchwork Fri May 11 10:52:55 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Hayward X-Patchwork-Id: 27238 Received: (qmail 102212 invoked by alias); 11 May 2018 10:53:23 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 102084 invoked by uid 89); 11 May 2018 10:53:22 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.0 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 spammy=ptid_t, ptid X-HELO: EUR01-VE1-obe.outbound.protection.outlook.com Received: from mail-ve1eur01on0049.outbound.protection.outlook.com (HELO EUR01-VE1-obe.outbound.protection.outlook.com) (104.47.1.49) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 11 May 2018 10:53:20 +0000 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Alan.Hayward@arm.com; Received: from C02TF0U7HF1T.arm.com (217.140.96.140) by VI1PR0802MB2143.eurprd08.prod.outlook.com (2603:10a6:800:9b::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.755.16; Fri, 11 May 2018 10:53:06 +0000 From: Alan Hayward To: gdb-patches@sourceware.org Cc: nd@arm.com, Alan Hayward Subject: [PATCH 7/8] Add methods to gdbserver regcache and raw_compare Date: Fri, 11 May 2018 11:52:55 +0100 Message-Id: <20180511105256.27388-8-alan.hayward@arm.com> In-Reply-To: <20180511105256.27388-1-alan.hayward@arm.com> References: <20180511105256.27388-1-alan.hayward@arm.com> MIME-Version: 1.0 X-ClientProxiedBy: CWXP265CA0010.GBRP265.PROD.OUTLOOK.COM (2603:10a6:400:2e::22) To VI1PR0802MB2143.eurprd08.prod.outlook.com (2603:10a6:800:9b::12) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(5600026)(48565401081)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603328)(7153060)(7193020); SRVR:VI1PR0802MB2143; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0802MB2143; 3:DEAkjPvobtLs0l6+P0O/uM1++S9MnDFtu0pWDnJQct5l3r39EBEyv0wUH5ae6Zh6X+tBxv5T7Q6GQkNRytTWOKmnTKs04LaNreHCsaJBCWHdKTEgIzmdBKqP2FSFOFqEf684IjDacq0rZjwUocejwC1Q8nQYodfiviOP9XuZ+oLxnsfJfXawN/fzSCeXe9+5JxdXmYMN6fVgkwtaVNaz3snrINZxyzsnU5ppzDnegMDM8bcs1bq0JCrUGIBEaA2N; 25:GP4crhVhHXkdNXumulS59tvDRmotBBrJMGf4SUnDenGZJJ3xX2224oUNTwNW69nNwU3Iotj7IUkKMJ+hVr9MhlmfK9Re8b/kAl63JXCxsYMy406tW9ZPxHAOSpsbKfvr9Lt8/ZGRt2C51pGDPfmYOd+xCyHJpquvmjZqaPP27kZU16sWRCTtYmauh2ZR6S1lQ9G9Pk9C+u8mtG5ZOwnc92BOABv0iarGLHwwusSnlOAKesI+mZkya9XXF0OmlI5AvEzABvYNGpXXvKdqoBThWCFKX3SgrXAPlzam2tKigz0MPJYTKBgIHiQlNifyM/tbPOm8w1ZXWC/a9u40aR8w0w==; 31:fPZ/hbbWje29imO0WRhTIMW1u9PH1AM9b+T6CqI721/fP0ktduTDnd8L1gnTwjqoqqJ7IlXFbsU2zAiNL7B/N4jJR/DsMW7mVB781w8hlf4D/kyqeUQqY+lnAb/zkVHVABYLYLvHkXc/A/NIXlSfn2ZK/Qbw40iJAWlo3/O6za9qQZCiy/HSL/o1gx/7r4GW8+F0BpxKH8Xb0uwtXKfTpNRDxWGZlPalE6itIsdvW54= X-MS-TrafficTypeDiagnostic: VI1PR0802MB2143: NoDisclaimer: True X-Microsoft-Exchange-Diagnostics: 1; VI1PR0802MB2143; 20:tgPtEhdMqrkKOVTTWI4DxSx9cNvxWHJ+Gsrjf4LeS70tfY8n9fiLuR4zk/uYZMh0M3ZXemuaO8iOCeDR0rz998fjMx5uhld3z7HWtCi5976pMCQCNCbipWLfzg2ednlayW4mp30rZspB5Eyk95xG7fKpLeMsw+FBS39Wm+lX3iLMPI86Ib9ujOycy6j8uKLfgk544vPRwHRzoJEWMqzxliwwKf4OxGGuYIw2DFxSVi0vAa+KCnLt+WyUTQ3ZvZi7; 4:BXlQOKx6sQ4RBmQ/2e6Mf+DujZ7PJNVtsCtVYsAa9Aid7BTdx4m+9KVSag54YZSasFocMvEVR+/2EsJdFvR97Xep7fXsacMvPDF7/bL7p3rP+R1yEJHTFI3m2y/5oQZfQQbTGCms9ZMF2M8aIr0tOtjcjAOdIp3x/A06GBclfQEBX53xkZqX7JmKKEjp0d0+e12HrWMBGDIPdlnbEjUhd0dFMlq01kb8BUjr3RY8O+YxHeCAbMwW5BDDozO9j2QU8HRod413kR5X2nRoDc2wvoilXa7nSHH37ulyJNWBMV/ieDeI7dj/gMpPLKjebJlA X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(180628864354917); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(93006095)(93001095)(3002001)(10201501046)(3231254)(944501410)(52105095)(6055026)(149027)(150027)(6041310)(20161123558120)(20161123562045)(20161123560045)(20161123564045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011); SRVR:VI1PR0802MB2143; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0802MB2143; X-Forefront-PRVS: 06691A4183 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(366004)(39380400002)(376002)(39860400002)(346002)(396003)(189003)(199004)(377424004)(476003)(956004)(11346002)(2616005)(97736004)(4326008)(48376002)(53936002)(2906002)(50466002)(446003)(66066001)(52116002)(76176011)(2351001)(72206003)(68736007)(51416003)(86362001)(47776003)(575784001)(6116002)(386003)(7696005)(3846002)(1076002)(6486002)(26005)(6666003)(25786009)(16586007)(316002)(478600001)(486006)(53416004)(2361001)(8676002)(81156014)(50226002)(5660300001)(81166006)(305945005)(7736002)(36756003)(105586002)(8936002)(106356001)(6916009)(44832011)(186003)(16526019); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR0802MB2143; H:C02TF0U7HF1T.arm.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; Received-SPF: None (protection.outlook.com: arm.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0802MB2143; 23:5FLnDfZlfV+9cz0HSvFcagscMjFIAairZIdVBOC?= =?us-ascii?Q?5jfhPRNE78i4IpOn1NmYgNyKf6S/eDSDHBonLWf2utxvHKT/5HHpoQxbuTMo?= =?us-ascii?Q?gbLmww5aMcNhIAApVj8dUYWNgk6NiDMhAb82JWsYOcOCd/l4DYKHDgMN9nFu?= =?us-ascii?Q?X98uH5TXOwsM1YCxwaS7STlmSEHAgCSKp42kPQp9ZSFlGz0ISyBaoRFoXk/V?= =?us-ascii?Q?tCTCDTKDBxMK5kosRlt8pbyd3rEI0eRQEmLWkD7izg7y/s6/8E01ogKsqydg?= =?us-ascii?Q?uWP7EFopPLbSuJaM+tumtB/aiRcdV6GI6s3h/CGtkuzz7srPxtcmNNUiWryA?= =?us-ascii?Q?CFITrk2BjGjuptIWP8NdgJoKCVvxJJt7jyWzRZlkv2EWWW7i9PitC+7St+bz?= =?us-ascii?Q?BSO/0NagnKrtcckd+k78dOogRSRMgkL+g6/hHTVBCvX+ZqyVHj4eN2npkSWG?= =?us-ascii?Q?BGlkhDpTEMl65opmjnOEF5VLBgy1X10PJqwL7YdxPJ3iguMlaMSTwymHLclA?= =?us-ascii?Q?sLtwEt5hAOtCDrz0grFZ4RAppGRZMxNl6QQfn9GCw1Tf5yPNpjZifm0UjAph?= =?us-ascii?Q?f4tLkGZLK80s6iC3QD6E0ZUcJKfU0wslyFV5jjzUei0vbBVK4j2j8Y6hSn1L?= =?us-ascii?Q?fM/MowZ33bGt89k6T451IfAbgVcq4Y8HXNMdbJoTxAF2bZGV0pS9OYpKbKx+?= =?us-ascii?Q?6euH1geKQRMsXCyur32QdhrhVpL37yUiURPzAYppXZdNNdvXNDxU3vUHifc8?= =?us-ascii?Q?b676ac5XwgMDTOlk6A+LaZj3UiHXiNYv9LaUQkvzhzMlb8bCicW1XltsAAt4?= =?us-ascii?Q?v6PkohxurIanDnP6+W6Q7rYy2Jeu9trsUIi9YgrNimWqOOVqs4F3GAIAtiMo?= =?us-ascii?Q?Q5ZJS4oHpLYQXFd45UzgxXowesltJRfJkdZuR+qojtNIYmfgpm0PSPf1mlhx?= =?us-ascii?Q?PITRc1iO+MaYw6SEcVIojPNB1wK42frW5DhIVTs63q+4Y/76EJgxUe8QUn8W?= =?us-ascii?Q?CIFleXq/NhZLqNiT17e682JEjBt8GVgaIOzmOZfO7yoPBatmb4EGZ2KX1epT?= =?us-ascii?Q?Km75n9N+mXnR08T6sU7pdT4qR774TOUloUG5EYYcGtnjPOi6hM50FNNYRJnw?= =?us-ascii?Q?uMKifgienfE/0Cs41/7jI+N+xIHRkdfmSCytXQoeqI46vy5CdPWapoBuEu7E?= =?us-ascii?Q?lnZqgoWzguR3qxG8YnkcxQA/gNRFVgPAVBhwJBw6yty8nQD8RElgKTHzMgwT?= =?us-ascii?Q?PebaYRxNbTskFQI4kJCNdReUuPXOCvltujE5txbLBJ4E5qAYThgQSLQ0KOdz?= =?us-ascii?Q?xJD05RorFAI3WfrfTOeWWnRYatJ9YrKQ2VC9VhSWSLUSr?= X-Microsoft-Antispam-Message-Info: 5CaCGcNphsaVA08NZxvrL+YoBiQBMskvJLxi8eqmZLDnvtFi8CZVax71oJoT0iXNx7+lk+/4nhVPL37ONzsKOaXCDuZSZH7HmC0M35q1do65uqSvaA6grI2vlZ5Lx6bBtnCbgXQlc4aGtyXPe0bYyMWcb1HIjulXoVqsBN4XcWcl4qHNgUvA/d4oYD/8+Yhi X-Microsoft-Exchange-Diagnostics: 1; VI1PR0802MB2143; 6:XMd7jxZZmjOvyTEfNJvFlDUf1aALRFzb3QfLuhe7CJdChRVJ83FwT6pmmzpJ1un7+suADpQR5Hlecm/oTPeE9rkXUknk5/MxdDhgp0A60ilv8ZjdKfsQlfz00Uxb7bsS086AhIHJGqN/eF3w2OzBUOgmvlWxJWqT/Rv9a0XRh2bujzFugyJN/ERFR5WkIx5Z7FLeQ4jieL1Tuid4DFj5sUmMyT2/V55lFYg7VcXsEVlkic+O5Jrh1hbFXkCe+UMd0snipk84T9spOVQRpHo6KQdcppE5QF7KF3KcL9ViDjZRb2avaKtPc55XVyJoh49zRsQw/gY70BSWDGCf1U48JhoVQMNf4m41DD5DCy+dbQBqegFjjcTqUVWg7YPLo9bfXBNItbz5FKQAg1BwZvbpbX8folPdwIpm2HZHdo4a+GrFNAxlT4KOaJr0h5nntKXVApKKYVzNioSEAMY+TJdHUg==; 5:4F6Xu+HSDPNALo1sPAvkIJ1kEWMKyFb4ahHX4RKQRrIUSCoBSqUQxYjh2qSMo+OaiLmO9mO0QffmfTMAmw14J7O9HpmZln98Djd4BL1N4pIG79I3P11cR7jegIeIu8li+tC76+QBj1RK/kEC3TLESseWvLJwfhVErLF2ForsKaY=; 24:B2jJJl5YzKEqN3C+whb4Y6p4YWKs74cEIVpKwHbJPTk+1naV7L91t5WctpMc7KQ4/Zxrryhpv8qg05Zzm7QboCw0DLmoVZ8xnKzb36yu+KY= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0802MB2143; 7:gGgPnsqimhbUYxJP6B9xwtPuMQfiWgKzwkL3wMIi46JRsMQK2lHApJ7VfamnPCxRoxi5tr+RHZdJl87Dg8jeWu5K4J6dHggrGYjWqbN78R0pzWF7FEDkQ34Vg6Pj5FWAQ62feb5iYlqraYT6asdWQxlKLUshBDadKCTxvqaxQLSqgjZ8oNLWqPKo6+ijhMUuXLuahnLWLj1mhc9sSsfI2yuW7bBuJvngePwTuCqh2bZMD9QEcZpwj/eGFB406/UH X-MS-Office365-Filtering-Correlation-Id: b3ec2930-2c8d-4211-ad07-08d5b72d60aa X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 May 2018 10:53:06.2565 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: b3ec2930-2c8d-4211-ad07-08d5b72d60aa X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0802MB2143 X-IsSubscribed: yes Add additional functions to gdbserver regcache to make it more like gdb regcache. This will allow the next patch to add a common function which uses regcache. The alternatives for the next patch would be to either duplicate the common code in both gdb and gdbserver, or alternatively pass function pointers for read register, write register, get status to the common code. In addition, add a register compare function. This will be used in the next patch. Alternatively instead of adding a new function, I could read into a buffer and then compare. 2018-05-11 Alan Hayward gdb/ * regcache.c (regcache::raw_compare): New function. * regcache.h (regcache::raw_compare): New declaration. gdbserver/ * regcache.c (register_data): New function. (supply_register): Call member function. (regcache::raw_supply): Replacement for supply_register. (collect_register): Call member function. (regcache::raw_collect): Replacement for collect_register. (regcache::get_register_status): New function. (regcache::raw_compare): Likewise. * regcache.h: (regcache::raw_supply): New declaration. * (regcache::raw_collect): Likewise. * (regcache::raw_compare): Likewise. * (regcache::get_register_status): Likewise. --- gdb/gdbserver/regcache.c | 55 ++++++++++++++++++++++++++++++++++++++---------- gdb/gdbserver/regcache.h | 8 +++++++ gdb/regcache.c | 17 +++++++++++++++ gdb/regcache.h | 2 ++ 4 files changed, 71 insertions(+), 11 deletions(-) diff --git a/gdb/gdbserver/regcache.c b/gdb/gdbserver/regcache.c index 0718b9f9a0..88f0db0483 100644 --- a/gdb/gdbserver/regcache.c +++ b/gdb/gdbserver/regcache.c @@ -300,7 +300,7 @@ regcache_register_size (const struct regcache *regcache, int n) } static unsigned char * -register_data (struct regcache *regcache, int n, int fetch) +register_data (const struct regcache *regcache, int n, int fetch) { return (regcache->registers + find_register_by_number (regcache->tdesc, n).offset / 8); @@ -312,23 +312,27 @@ register_data (struct regcache *regcache, int n, int fetch) void supply_register (struct regcache *regcache, int n, const void *buf) +{ + return regcache->raw_supply (n, buf); +} + +void +regcache::raw_supply (int n, const void *buf) { if (buf) { - memcpy (register_data (regcache, n, 0), buf, - register_size (regcache->tdesc, n)); + memcpy (register_data (this, n, 0), buf, register_size (tdesc, n)); #ifndef IN_PROCESS_AGENT - if (regcache->register_status != NULL) - regcache->register_status[n] = REG_VALID; + if (register_status != NULL) + register_status[n] = REG_VALID; #endif } else { - memset (register_data (regcache, n, 0), 0, - register_size (regcache->tdesc, n)); + memset (register_data (this, n, 0), 0, register_size (tdesc, n)); #ifndef IN_PROCESS_AGENT - if (regcache->register_status != NULL) - regcache->register_status[n] = REG_UNAVAILABLE; + if (register_status != NULL) + register_status[n] = REG_UNAVAILABLE; #endif } } @@ -410,10 +414,16 @@ supply_register_by_name (struct regcache *regcache, void collect_register (struct regcache *regcache, int n, void *buf) { - memcpy (buf, register_data (regcache, n, 1), - register_size (regcache->tdesc, n)); + regcache->raw_collect (n, buf); +} + +void +regcache::raw_collect (int n, void *buf) const +{ + memcpy (buf, register_data (this, n, 1), register_size (tdesc, n)); } + enum register_status regcache_raw_read_unsigned (struct regcache *regcache, int regnum, ULONGEST *val) @@ -480,3 +490,26 @@ regcache_write_pc (struct regcache *regcache, CORE_ADDR pc) } #endif + +enum register_status +regcache::get_register_status (int regnum) const +{ +#ifndef IN_PROCESS_AGENT + gdb_assert (regnum >= 0 && regnum < tdesc->reg_defs.size ()); + return (enum register_status) (register_status[regnum]); +#else + return REG_VALID; +#endif +} + +/* Compare the contents of the register stored in the regcache (ignoring the + first OFFSET bytes) to the contents of BUF (without any offset). Returns 0 + if identical. */ + +int +regcache::raw_compare (int regnum, const void *buf, int offset) const +{ + gdb_assert (register_size (tdesc, regnum) > offset); + return memcmp (buf, register_data (this, regnum, 1) + offset, + register_size (tdesc, regnum) - offset); +} diff --git a/gdb/gdbserver/regcache.h b/gdb/gdbserver/regcache.h index 2c0df648f6..b3631bebd2 100644 --- a/gdb/gdbserver/regcache.h +++ b/gdb/gdbserver/regcache.h @@ -45,6 +45,14 @@ struct regcache /* One of REG_UNAVAILBLE or REG_VALID. */ unsigned char *register_status; #endif + + void raw_supply (int regnum, const void *buf); + + void raw_collect (int regnum, void *buf) const; + + int raw_compare (int regnum, const void *buf, int offset) const; + + enum register_status get_register_status (int regnum) const; }; struct regcache *init_register_cache (struct regcache *regcache, diff --git a/gdb/regcache.c b/gdb/regcache.c index a3cc7743a2..92b9a69593 100644 --- a/gdb/regcache.c +++ b/gdb/regcache.c @@ -1197,6 +1197,23 @@ regcache::collect_regset (const struct regset *regset, transfer_regset (regset, NULL, regnum, NULL, buf, size); } +/* Compare the contents of the register stored in the regcache (ignoring the + first OFFSET bytes) to the contents of BUF (without any offset). Returns 0 + if identical. */ + +int +regcache::raw_compare (int regnum, const void *buf, int offset) const +{ + const char *regbuf; + size_t size; + + gdb_assert (buf != NULL); + assert_regnum (regnum); + + regbuf = (const char *) register_buffer (regnum); + size = m_descr->sizeof_register[regnum]; + return memcmp (buf, regbuf + offset, size - offset); +} /* Special handling for register PC. */ diff --git a/gdb/regcache.h b/gdb/regcache.h index d7bb8b5c93..61d6e33c98 100644 --- a/gdb/regcache.h +++ b/gdb/regcache.h @@ -357,6 +357,8 @@ public: void collect_regset (const struct regset *regset, int regnum, void *buf, size_t size) const; + int raw_compare (int regnum, const void *buf, int offset) const; + ptid_t ptid () const { return m_ptid;