From patchwork Mon Apr 22 09:45:11 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bernd Edlinger X-Patchwork-Id: 88852 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 61A123858C66 for ; Mon, 22 Apr 2024 09:43:48 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from EUR02-DB5-obe.outbound.protection.outlook.com (mail-db5eur02olkn2020.outbound.protection.outlook.com [40.92.50.20]) by sourceware.org (Postfix) with ESMTPS id F40453858D38 for ; Mon, 22 Apr 2024 09:43:17 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org F40453858D38 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=hotmail.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=hotmail.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org F40453858D38 Authentication-Results: server2.sourceware.org; arc=pass smtp.remote-ip=40.92.50.20 ARC-Seal: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1713779000; cv=pass; b=N6wFykVtTFelaB8Jgnsrwh64mZqoIQ1LniLu03bqhqjjrxVPnqOm4nsXSEqgHLnlrlPOlTtG0/ouTmECnFDtu7g0hv/z+yipNCWACz/BuKN4TtKKpnJG+e0CwLMnMJerPdveyEU4cYb3JSUj296fGJrmcAgIaXHzmvw9+Va2Xps= ARC-Message-Signature: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1713779000; c=relaxed/simple; bh=uYTcbScADm6OyzSQOtHeR+WflAZ6gMR9xYsk1uJbLi0=; h=DKIM-Signature:Message-ID:Date:From:Subject:To:MIME-Version; b=qTsKgNRUU1Vur7E6upOnKIzVYwOkpIsFjFr8/UCVyTAoCPsPGEwAjwphQbeQB7OEukJ+vPsxNGE3uAUXZVA9/I+8u3XdvJbDdDpHbqYkbuKpttPNpQ7IzLMobNBnepvbfQLeultlkUen7Il/3XFihwNyYtDoxbQQmU+vkeb00ps= ARC-Authentication-Results: i=2; server2.sourceware.org ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=YNuuzSamfjOPg/fR/75xhMjmjgufLKmNwsKzNVRGedQn6PS6XMMnoCzousXUevTQhzPCA2upXxcRqhb0jw4y3R+ISIqZkEj+tASsCRVGN7rZn8WyJ1mYkBQjBMK/iWTm+8KOTbu3Vkqwv5DUDvjRJh+ySU0Iy4RsgUpdothbThzXJmu1QJcAzsSjNJz0t8+Cub6r+1XQZlIfcWigme8IlDAc6qtkCCm6LGkM58dDuzUDbG5AQhtzNJU8AK7S6YfLoPbVEfpvbpUHyeLvBXMImOSJaYGjmw9exEAfUMCzNtHXWN+AtZbinu+4VFUspBFNcyKEYA0mKXILPz+FXK/y4A== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=l7KIc48eMz98OkyK/yrlOVoT43H4GqmAeZakKxBCjyI=; b=brDH1M9VO+gGzsrxRL3vZcWeD+5IqfGYnXU8lTKehHzdN7hJWPN9iXHJEpXM2WYuWjK8evB4zUlvA3D5TjGvsvqjPP57utGDVB1iJhfR+HKbw2wp0p/VRdsBZDKSn9n6EW2DQKBhfZ7igwqRTkIDaqZqzgg82+AfKGi0gO/rWAGbrhT3qDqNONvb0KhQ8ulHOQH6TQER+U65vyFckVQo0Cmuffqep0RdX6wfDNbfNHn1H2cqqrqEjGDvDsT7MSMrcZV/GEDKqf9Ikoyzts7q0rDMq5N1IK+PrNnXCVle6VVcv+iLGS5W+l3MuR5Po25bTZQf2ZtV+Usxhvm5AWph0A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=HOTMAIL.DE; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=l7KIc48eMz98OkyK/yrlOVoT43H4GqmAeZakKxBCjyI=; b=ebpvXEUJBljBwfMtYpO7lBcuDee+vNKHI4hj1hoS8QhpifhAwCfQkzT8GoWYy8Yrg74v9paojnkjoj1ebrQuERkv6JlWGnwID82ciHCJO4Db90kyJ/Dirumw32kpmIgcrvHkvZhslwoUkb1WDFBNAF1eh6hYbmpruZYu9kOhcF8HAzVqX4yTLvlYpUmHFHkCgJxXmnbMDnpTLK40u87TA5d+AtkmYcdWe4qp23jmGcupoWY8+LQVYBuAaTjEq8kwkSn7pVu/LjoghGJnR53j7DyC3jH94oSIrxxi727TrUpRo7Xmmvt0KTMV/ACASB5E0LxgC03iqmazkiyIbGw2Jg== Received: from AS8P193MB1285.EURP193.PROD.OUTLOOK.COM (2603:10a6:20b:333::21) by GVXP193MB2526.EURP193.PROD.OUTLOOK.COM (2603:10a6:150:1f7::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7472.44; Mon, 22 Apr 2024 09:43:16 +0000 Received: from AS8P193MB1285.EURP193.PROD.OUTLOOK.COM ([fe80::5403:f1ad:efaf:1f71]) by AS8P193MB1285.EURP193.PROD.OUTLOOK.COM ([fe80::5403:f1ad:efaf:1f71%4]) with mapi id 15.20.7472.044; Mon, 22 Apr 2024 09:43:15 +0000 Message-ID: Date: Mon, 22 Apr 2024 11:45:11 +0200 User-Agent: Mozilla Thunderbird Content-Language: en-US From: Bernd Edlinger Subject: [PATCH] sim: riscv: Fix some issues with class-a instructions To: "gdb-patches@sourceware.org" X-TMN: [U7bd9ROSOGWhdwpX4ljfJjQ99a0weUGieegZpnw6gsb/tG78FQbf0sgHCwBBQoDt] X-ClientProxiedBy: FR3P281CA0192.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a4::16) To AS8P193MB1285.EURP193.PROD.OUTLOOK.COM (2603:10a6:20b:333::21) X-Microsoft-Original-Message-ID: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P193MB1285:EE_|GVXP193MB2526:EE_ X-MS-Office365-Filtering-Correlation-Id: c74ea5b8-39bf-4686-95bf-08dc62b0a237 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: SHeGOXVAVdoE8U09NvrKJLJSvPvjlAaD/d8HnOn1ECIA+UeXFbKTs7S4mQ5RMwNp4BXSHYBH4tlE/zkrwtrKmds4MQua3NZ/WBG0w4T/lDD2Y4q0Hjk6qidQB6if9sxegQ5N/+xykFLS57E42bp72G+TB2tYWh1enlZcjYzIHnykhcX/pjt8CVyWW5yRIhyHJ6oGnc5YCPe9SjUQUlvt0+HInVYSZxWr+N1493p9yH909JVjYwVjZ95G88zIZflsVF/exbJ8oGac4e2AJ/UqdBVJ807fC4rgeAh3goA2g0gMHXYHSyd+XB4ZkQAeD/OkIPLyZFHziQqeA0Fs3EHD7tX5vEjySyD7oo92LwuMpQ6gJrnra+W8Nv9zCrIAxWaaOBp8BuYexO4YWn1aRboEBrBnMCjuEqS6aOyKo0AKHoXmvMR4yd01MdrBGVctZ/AM150y6W9J1ogtBxBaN/RmBAngeRJcVBSNB39vVfrE+FOFD509mJxSJdYSYKjMyNzVBVr3OFaCmzrt8ZKCL8oXhJ4a+IgSrfk8tmyxoT+A4x8Ezjf0kxiQO9D8HJjc+VRr X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?FHT9QgiLH+aQXjnIKtI+NDCjDjZe?= =?utf-8?q?w6mtkzUoVHqgLSCrKOuC6ugd0dsmXG4sCE3zE6hNONYo4E//6ikc6A2g6zrEWthFs?= =?utf-8?q?8htDAm3Yiwfbt24xYFAV0S2vdMyP4yG9guULjVx2LM4HjwhpugQkFrNzV5qxUzCqf?= =?utf-8?q?/XYq0sFFlUXm2vsRuafUDNvjGijTOHyxvz4dnxv+NZIaSsCsGXpiB/Tjs8z3qTHJP?= =?utf-8?q?GfMUpFUwMARccofcG3GIrMIcob6rE6ICTix3nsEa0E3F5kjN4aj3M9PkLup6s9ZBL?= =?utf-8?q?MeeHr82wLGS3OsUEQxqJM6NyVUInGFrqSD4mW6y2eUF9+X5knaL8gKFUAOypGIgsc?= =?utf-8?q?AU4Th58fQlasOsprxaRKH/a1hgXQJMX167cto6rNm5jHvzZ6lglwbtgLb2N9O9P+V?= =?utf-8?q?/lZsn2NIiAj4qFxykL6jHykJ+L0fPMB1ww30A4hjEPoKY9eWa2O/VFL4jL/mdk4IF?= =?utf-8?q?LbS/AmCb09u/RqCacxAb0uygMqNnNt4PX+BIF1AzFWPkWazzuC4RcDTSl0Wvlbvpl?= =?utf-8?q?/tqVtmtFYMtmKgHu8XyUEFNPbt/DFvawo1ZIv4LxUgwhDqcXa3FrIyH5H4/Fa7Kkr?= =?utf-8?q?34nj7Lef11k/6aZiC9qLegYqnIPg7QQZJAZz/bosZEyhSpQBzdyphtm/GvW8s+Ci2?= =?utf-8?q?TQgdql7Sf9o9+vJLuYhXiORJYYNOVcowyZ5pTbfvA1P4G0lEJZfqiBduXA+6PnT1y?= =?utf-8?q?vwxqVAG24qANIYHFggKgomEgYmDL2UnO8OTQ8SwD2m3U1ZbdCg4oRAHwMAYipzS2V?= =?utf-8?q?CZ3/kpDucrNyIm08c+OnRI6+4o0CIWNTWmKH1B1EOQrd0L+PuPwi76CZBu78c8s6c?= =?utf-8?q?gQyR8SnYy27Ht/ovefEp6IXt9peALuNQbOtORsuJ06DgaB4FQnf9LYrEYTGc1PEQE?= =?utf-8?q?hHhcz3EgU8wmWx3fuMthlo6XQfYp0dU0jQYH8JhhLGSURpG+8XU8f4LRj/OaS4Rh4?= =?utf-8?q?6cffDpANkpxgjlcGkVvFSw5A2OgMnPaJF5JXXjV32Ob0BPxT+3eA3Wn7kJXmjNM8D?= =?utf-8?q?yut2KAisom8wyvxGZwFS9NBsyzQ4c7TF77dlYzD3TaTZwYXleI3BxpSwgW5RgHoa6?= =?utf-8?q?4wgLPf/6j1pxLWN0gr+c6aaDIqqrlmkB0dpbM+3Y3jWSndOGgqKZIL0Sonfr3vC2p?= =?utf-8?q?Si4eSx+MRBQ5GU3PAVJjsk9FKKAVgAZUQ1NP61ZV4t3654pprklbxuR2nsoBie6z0?= =?utf-8?q?634Pz7YWkTBu6oJTy5Cj52Jre6v7eCHX1oGKP+yRDE8JsJLoeBAy9m6gpSTm/7ENi?= =?utf-8?q?bRBKRnUKzbj8yzW4?= X-OriginatorOrg: sct-15-20-4755-11-msonline-outlook-80ceb.templateTenant X-MS-Exchange-CrossTenant-Network-Message-Id: c74ea5b8-39bf-4686-95bf-08dc62b0a237 X-MS-Exchange-CrossTenant-AuthSource: AS8P193MB1285.EURP193.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Apr 2024 09:43:15.8555 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: GVXP193MB2526 X-Spam-Status: No, score=-13.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, 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 This fixes some issues with atomic instruction handling. First the instructions may have AQ and/or RL bits set, but the emulator has no such concept, so we have to ignore those. According to the spec the memory must be naturally aligned, otherwise an exception shall be thrown, so do the sim_core read/write aligned. In the case of riscv64 target, there were the LR_D and SC_D 64bit load and store instructions missing, so add those. Also the AMOMIN/AMOMAX[U]_W instructions were not correct for riscv64 because the upper half word of the input registers were not ignored as they should, so use explicit type-casts to uint32_t and int32_t for those. And finally make the class-a instruction set only executable if a riscv cpu model with A extension is selected. --- sim/riscv/sim-main.c | 72 ++++++++++++++++++++++++++++++++------------ 1 file changed, 53 insertions(+), 19 deletions(-) diff --git a/sim/riscv/sim-main.c b/sim/riscv/sim-main.c index e4b15b533ba..be38baa2f93 100644 --- a/sim/riscv/sim-main.c +++ b/sim/riscv/sim-main.c @@ -841,6 +841,9 @@ execute_m (SIM_CPU *cpu, unsigned_word iw, const struct riscv_opcode *op) static sim_cia execute_a (SIM_CPU *cpu, unsigned_word iw, const struct riscv_opcode *op) { + unsigned_word mask_aq = OP_MASK_AQ << OP_SH_AQ; + unsigned_word mask_rl = OP_MASK_RL << OP_SH_RL; + unsigned_word mask_aqrl = mask_aq | mask_rl; struct riscv_sim_cpu *riscv_cpu = RISCV_SIM_CPU (cpu); SIM_DESC sd = CPU_STATE (cpu); struct riscv_sim_state *state = RISCV_SIM_STATE (sd); @@ -855,13 +858,18 @@ execute_a (SIM_CPU *cpu, unsigned_word iw, const struct riscv_opcode *op) sim_cia pc = riscv_cpu->pc + 4; /* Handle these two load/store operations specifically. */ - switch (op->match) + switch (op->match & ~mask_aqrl) { + case MATCH_LR_D: case MATCH_LR_W: TRACE_INSN (cpu, "%s %s, (%s);", op->name, rd_name, rs1_name); - store_rd (cpu, rd, - sim_core_read_unaligned_4 (cpu, riscv_cpu->pc, read_map, - riscv_cpu->regs[rs1])); + if (op->xlen_requirement == 64) + tmp = sim_core_read_aligned_8 (cpu, riscv_cpu->pc, read_map, + riscv_cpu->regs[rs1]); + else + tmp = EXTEND32 (sim_core_read_aligned_4 (cpu, riscv_cpu->pc, read_map, + riscv_cpu->regs[rs1])); + store_rd (cpu, rd, tmp); /* Walk the reservation list to find an existing match. */ amo_curr = state->amo_reserved_list; @@ -878,6 +886,7 @@ execute_a (SIM_CPU *cpu, unsigned_word iw, const struct riscv_opcode *op) amo_curr->next = state->amo_reserved_list; state->amo_reserved_list = amo_curr; goto done; + case MATCH_SC_D: case MATCH_SC_W: TRACE_INSN (cpu, "%s %s, %s, (%s);", op->name, rd_name, rs2_name, rs1_name); @@ -889,7 +898,12 @@ execute_a (SIM_CPU *cpu, unsigned_word iw, const struct riscv_opcode *op) if (amo_curr->addr == riscv_cpu->regs[rs1]) { /* We found a reservation, so operate it. */ - sim_core_write_unaligned_4 (cpu, riscv_cpu->pc, write_map, + if (op->xlen_requirement == 64) + sim_core_write_aligned_8 (cpu, riscv_cpu->pc, write_map, + riscv_cpu->regs[rs1], + riscv_cpu->regs[rs2]); + else + sim_core_write_aligned_4 (cpu, riscv_cpu->pc, write_map, riscv_cpu->regs[rs1], riscv_cpu->regs[rs2]); store_rd (cpu, rd, 0); @@ -913,14 +927,14 @@ execute_a (SIM_CPU *cpu, unsigned_word iw, const struct riscv_opcode *op) TRACE_INSN (cpu, "%s %s, %s, (%s);", op->name, rd_name, rs2_name, rs1_name); if (op->xlen_requirement == 64) - tmp = sim_core_read_unaligned_8 (cpu, riscv_cpu->pc, read_map, - riscv_cpu->regs[rs1]); + tmp = sim_core_read_aligned_8 (cpu, riscv_cpu->pc, read_map, + riscv_cpu->regs[rs1]); else - tmp = EXTEND32 (sim_core_read_unaligned_4 (cpu, riscv_cpu->pc, read_map, - riscv_cpu->regs[rs1])); + tmp = EXTEND32 (sim_core_read_aligned_4 (cpu, riscv_cpu->pc, read_map, + riscv_cpu->regs[rs1])); store_rd (cpu, rd, tmp); - switch (op->match) + switch (op->match & ~mask_aqrl) { case MATCH_AMOADD_D: case MATCH_AMOADD_W: @@ -931,25 +945,37 @@ execute_a (SIM_CPU *cpu, unsigned_word iw, const struct riscv_opcode *op) tmp = riscv_cpu->regs[rd] & riscv_cpu->regs[rs2]; break; case MATCH_AMOMAX_D: - case MATCH_AMOMAX_W: tmp = max ((signed_word) riscv_cpu->regs[rd], (signed_word) riscv_cpu->regs[rs2]); break; + case MATCH_AMOMAX_W: + tmp = max ((int32_t) riscv_cpu->regs[rd], + (int32_t) riscv_cpu->regs[rs2]); + break; case MATCH_AMOMAXU_D: - case MATCH_AMOMAXU_W: tmp = max ((unsigned_word) riscv_cpu->regs[rd], (unsigned_word) riscv_cpu->regs[rs2]); break; + case MATCH_AMOMAXU_W: + tmp = max ((uint32_t) riscv_cpu->regs[rd], + (uint32_t) riscv_cpu->regs[rs2]); + break; case MATCH_AMOMIN_D: - case MATCH_AMOMIN_W: tmp = min ((signed_word) riscv_cpu->regs[rd], (signed_word) riscv_cpu->regs[rs2]); break; + case MATCH_AMOMIN_W: + tmp = min ((int32_t) riscv_cpu->regs[rd], + (int32_t) riscv_cpu->regs[rs2]); + break; case MATCH_AMOMINU_D: - case MATCH_AMOMINU_W: tmp = min ((unsigned_word) riscv_cpu->regs[rd], (unsigned_word) riscv_cpu->regs[rs2]); break; + case MATCH_AMOMINU_W: + tmp = min ((uint32_t) riscv_cpu->regs[rd], + (uint32_t) riscv_cpu->regs[rs2]); + break; case MATCH_AMOOR_D: case MATCH_AMOOR_W: tmp = riscv_cpu->regs[rd] | riscv_cpu->regs[rs2]; @@ -968,11 +994,11 @@ execute_a (SIM_CPU *cpu, unsigned_word iw, const struct riscv_opcode *op) } if (op->xlen_requirement == 64) - sim_core_write_unaligned_8 (cpu, riscv_cpu->pc, write_map, - riscv_cpu->regs[rs1], tmp); + sim_core_write_aligned_8 (cpu, riscv_cpu->pc, write_map, + riscv_cpu->regs[rs1], tmp); else - sim_core_write_unaligned_4 (cpu, riscv_cpu->pc, write_map, - riscv_cpu->regs[rs1], tmp); + sim_core_write_aligned_4 (cpu, riscv_cpu->pc, write_map, + riscv_cpu->regs[rs1], tmp); done: return pc; @@ -1307,7 +1333,15 @@ execute_one (SIM_CPU *cpu, unsigned_word iw, const struct riscv_opcode *op) switch (op->insn_class) { case INSN_CLASS_A: - return execute_a (cpu, iw, op); + /* Check whether model with A extension is selected. */ + if (riscv_cpu->csr.misa & 1) + return execute_a (cpu, iw, op); + else + { + TRACE_INSN (cpu, "UNHANDLED EXTENSION: %d", op->insn_class); + sim_engine_halt (sd, cpu, NULL, riscv_cpu->pc, sim_signalled, + SIM_SIGILL); + } case INSN_CLASS_C: /* Check whether model with C extension is selected. */ if (riscv_cpu->csr.misa & 4)