From patchwork Mon Nov 20 12:06:08 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ivan Klokov X-Patchwork-Id: 1865961 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=syntacore.com header.i=@syntacore.com header.a=rsa-sha256 header.s=mta-04 header.b=RBT7k5y0; dkim=pass (2048-bit key; unprotected) header.d=syntacore.com header.i=@syntacore.com header.a=rsa-sha256 header.s=mta-03 header.b=g2ynY5EE; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=patchwork.ozlabs.org) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4SYmW86nMMz1yRl for ; Mon, 20 Nov 2023 23:08:36 +1100 (AEDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1r532s-0006RK-0G; Mon, 20 Nov 2023 07:06:30 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1r532q-0006Ph-5z; Mon, 20 Nov 2023 07:06:28 -0500 Received: from mta-04.yadro.com ([89.207.88.248]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1r532o-0004px-33; Mon, 20 Nov 2023 07:06:27 -0500 DKIM-Filter: OpenDKIM Filter v2.11.0 mta-04.yadro.com 841A1C0002 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=syntacore.com; s=mta-04; t=1700481982; bh=WYPOfCv1L3H90LB4jZVlsUVoHv2MYYSum6jrNzaBbj0=; h=From:To:Subject:Date:Message-ID:MIME-Version:Content-Type:From; b=RBT7k5y0wPPwXpotvzOb9IbPU6O79t4geMqPCYdifNVQCnH+5fWCY3UZWsQZNEidB lh8iMsN/HQcrW4J3ytHgmI1xuWhAA9wTE3/k/DE0yl9kOHZ1gz1gP6N+t3iy5llRN4 fmbxEzAFY11nCjHQ5a35CG+8XHbWPVaxgxoBVQaIdRD6yO9N92SCTk0fKj5qzyPdqS wN+anYu5c5mFUpJv8vW37y0WGWN67bwEAwqrzbWOrnIAGP9Y3DwFOsKgj6tYG7hg0l 6VDYz44na9tGZOXShGDFZ+1yjSTU7owpNn1ZA8V+XfiCJbBQvOKPC03X7ozQkkLbt1 Qn4sK5NkuzL/w== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=syntacore.com; s=mta-03; t=1700481982; bh=WYPOfCv1L3H90LB4jZVlsUVoHv2MYYSum6jrNzaBbj0=; h=From:To:Subject:Date:Message-ID:MIME-Version:Content-Type:From; b=g2ynY5EEftayrhgTSJykFPfMTxiH5vqp0+E17n3J8+/7UK0kb8rJeKbpkhm4Obg39 8ZcOEjnCM3HhF0z5zmxB3TrZHWUPNQKKYxHSwPH58gEcC61NyuKTyxSJowoU5PzYwD U89Dgg4zhBV5yFKYCvIlBVs7Gnk8USyf4RxKRGPykckVXfl3xSurK8xkOCdFk8CSZA cI9WT+Tg1gWRX+62itnpJolvfH/Ha67lOLDe/DleOy/3mBjTK9SgVZwGfdF9UCSTw7 jqAlkp5yEt2c7ovY86InaQrzVw6vdKJVWd0s1bb/2mNHVGafQeUUqIDrspMspWIa7v NCS963z9RBRxg== From: Ivan Klokov To: CC: , , , , , , , Ivan Klokov Subject: [PATCH 1/2] target/riscv/cpu_helper.c: Invalid exception on MMU translation stage Date: Mon, 20 Nov 2023 15:06:08 +0300 Message-ID: <20231120120609.37960-2-ivan.klokov@syntacore.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231120120609.37960-1-ivan.klokov@syntacore.com> References: <20231120120609.37960-1-ivan.klokov@syntacore.com> MIME-Version: 1.0 X-ClientProxiedBy: T-Exch-05.corp.yadro.com (172.17.10.109) To S-Exch-01.corp.yadro.com (10.78.5.241) Received-SPF: permerror client-ip=89.207.88.248; envelope-from=ivan.klokov@syntacore.com; helo=mta-04.yadro.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, T_SCC_BODY_TEXT_LINE=-0.01, T_SPF_PERMERROR=0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org According to RISCV priveleged spec sect. 5.3.2 Virtual Address Translation Process access-fault exceptions may raise only after PMA/PMP check. Current implementation generates an acces-fault for mbare mode even if there were no PMA/PMP errors. This patch removes the erroneous MMU mode check and generates an access-fault exception based on the pmp_violation flag only. Signed-off-by: Ivan Klokov Reviewed-by: Daniel Henrique Barboza Reviewed-by: Alistair Francis --- target/riscv/cpu_helper.c | 30 +++++++----------------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c index b7af69de53..9ff0952e46 100644 --- a/target/riscv/cpu_helper.c +++ b/target/riscv/cpu_helper.c @@ -1143,47 +1143,31 @@ static void raise_mmu_exception(CPURISCVState *env, target_ulong address, bool two_stage_indirect) { CPUState *cs = env_cpu(env); - int page_fault_exceptions, vm; - uint64_t stap_mode; - - if (riscv_cpu_mxl(env) == MXL_RV32) { - stap_mode = SATP32_MODE; - } else { - stap_mode = SATP64_MODE; - } - - if (first_stage) { - vm = get_field(env->satp, stap_mode); - } else { - vm = get_field(env->hgatp, stap_mode); - } - - page_fault_exceptions = vm != VM_1_10_MBARE && !pmp_violation; switch (access_type) { case MMU_INST_FETCH: if (env->virt_enabled && !first_stage) { cs->exception_index = RISCV_EXCP_INST_GUEST_PAGE_FAULT; } else { - cs->exception_index = page_fault_exceptions ? - RISCV_EXCP_INST_PAGE_FAULT : RISCV_EXCP_INST_ACCESS_FAULT; + cs->exception_index = pmp_violation ? + RISCV_EXCP_INST_ACCESS_FAULT : RISCV_EXCP_INST_PAGE_FAULT; } break; case MMU_DATA_LOAD: if (two_stage && !first_stage) { cs->exception_index = RISCV_EXCP_LOAD_GUEST_ACCESS_FAULT; } else { - cs->exception_index = page_fault_exceptions ? - RISCV_EXCP_LOAD_PAGE_FAULT : RISCV_EXCP_LOAD_ACCESS_FAULT; + cs->exception_index = pmp_violation ? + RISCV_EXCP_LOAD_ACCESS_FAULT : RISCV_EXCP_LOAD_PAGE_FAULT; } break; case MMU_DATA_STORE: if (two_stage && !first_stage) { cs->exception_index = RISCV_EXCP_STORE_GUEST_AMO_ACCESS_FAULT; } else { - cs->exception_index = page_fault_exceptions ? - RISCV_EXCP_STORE_PAGE_FAULT : - RISCV_EXCP_STORE_AMO_ACCESS_FAULT; + cs->exception_index = pmp_violation ? + RISCV_EXCP_STORE_AMO_ACCESS_FAULT : + RISCV_EXCP_STORE_PAGE_FAULT; } break; default: From patchwork Mon Nov 20 12:06:09 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ivan Klokov X-Patchwork-Id: 1865958 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=syntacore.com header.i=@syntacore.com header.a=rsa-sha256 header.s=mta-04 header.b=EMuVZWgf; dkim=pass (2048-bit key; unprotected) header.d=syntacore.com header.i=@syntacore.com header.a=rsa-sha256 header.s=mta-03 header.b=r4G72Bas; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=patchwork.ozlabs.org) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4SYmV06VLBz1yRl for ; Mon, 20 Nov 2023 23:07:36 +1100 (AEDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1r532t-0006Rz-54; Mon, 20 Nov 2023 07:06:31 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1r532r-0006QZ-AC; Mon, 20 Nov 2023 07:06:29 -0500 Received: from mta-04.yadro.com ([89.207.88.248]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1r532o-0004qX-Cc; Mon, 20 Nov 2023 07:06:29 -0500 DKIM-Filter: OpenDKIM Filter v2.11.0 mta-04.yadro.com BFF6EC0002 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=syntacore.com; s=mta-04; t=1700481984; bh=SXSNj1W7Kz+aSldUPo1hOHeLKsnFtMZxHNHcTs0zYJ4=; h=From:To:Subject:Date:Message-ID:MIME-Version:Content-Type:From; b=EMuVZWgfL8+IDTeK2LhmAiNV0Q4vRRAOXJ2f26AySZVm+ak98XH44KK/Qrm+3AlZl 04Zx5bFQXI5Ge6sa6gekAJooHlQ7j1JgE5qSok4uBhBq1MruPZmVRiulq9rYc+Uhvw uUpYoAUMezwYgD0crlkMiCw2jjd0b7kBCgsEnldoLJ6uMRyqu3SypthLZm3+FAfDWp 7yD32mv5nJ6kR/FtZCSI1wrALj8N3SqiRjsO1K+xXPP94VG7fjYWgB6vNlLlzymvXF x9npiqtngysunASwxMsbDY5QGgWlURTlHsy+By59BW9WwEEoapwUXrazKh1cveKJmf Ao++G8jOt+8wg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=syntacore.com; s=mta-03; t=1700481984; bh=SXSNj1W7Kz+aSldUPo1hOHeLKsnFtMZxHNHcTs0zYJ4=; h=From:To:Subject:Date:Message-ID:MIME-Version:Content-Type:From; b=r4G72BasqC83k2h+9Hv25MwotdVrGXQ8y7Ae/3cMwF4ZCEHl46xiO9cxWHCiqPL6O cEUd6gQOTYPZV8SM8gTq/woLaNBRYdrNxfPqnpQPpBXc73bt5BmghxgtIWwmjYWouw LsGUteXtK8eoU1ZMTdygif/iPxyDJ5IAE07CxVR1ZzbKUmIce09XmxufqE2MPdSJFJ CJsLS88iJfFyAx16II8eqPK77nPiypqAeDx0nW3W1diUpH05lV8ffTs+N9FZIuze/6 qV8U+q+jHqxnfmeePkYlnoW+NmUnXcpE61C9q8CJVgk3XeJ55FgB8lNXwZJwmhv6SJ bR+LhslCAZxGg== From: Ivan Klokov To: CC: , , , , , , , Ivan Klokov Subject: [PATCH 2/2] target/riscv/cpu_helper.c: Fix mxr bit behavior Date: Mon, 20 Nov 2023 15:06:09 +0300 Message-ID: <20231120120609.37960-3-ivan.klokov@syntacore.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231120120609.37960-1-ivan.klokov@syntacore.com> References: <20231120120609.37960-1-ivan.klokov@syntacore.com> MIME-Version: 1.0 X-ClientProxiedBy: T-Exch-05.corp.yadro.com (172.17.10.109) To S-Exch-01.corp.yadro.com (10.78.5.241) Received-SPF: permerror client-ip=89.207.88.248; envelope-from=ivan.klokov@syntacore.com; helo=mta-04.yadro.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, T_SCC_BODY_TEXT_LINE=-0.01, T_SPF_PERMERROR=0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org According to RISCV Specification sect 9.5 on two stage translation when V=1 the vsstatus(mstatus in QEMU's terms) field MXR, which makes execute-only pages readable, only overrides VS-stage page protection. Setting MXR at HS-level(mstatus_hs), however, overrides both VS-stage and G-stage execute-only permissions. The hypervisor extension changes the behavior of MXR\MPV\MPRV bits. Due to RISCV Specification sect. 9.4.1 when MPRV=1, explicit memory accesses are translated and protected, and endianness is applied, as though the current virtualization mode were set to MPV and the current nominal privilege mode were set to MPP. vsstatus.MXR makes readable those pages marked executable at the VS translation stage. Signed-off-by: Ivan Klokov Reviewed-by: Daniel Henrique Barboza --- target/riscv/cpu_helper.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c index 9ff0952e46..e7e23b34f4 100644 --- a/target/riscv/cpu_helper.c +++ b/target/riscv/cpu_helper.c @@ -1032,13 +1032,29 @@ restart: prot |= PAGE_WRITE; } if (pte & PTE_X) { - bool mxr; + bool mxr = false; - if (first_stage == true) { + /* + * Use mstatus for first stage or for the second stage without + * virt_enabled (MPRV+MPV) + */ + if (first_stage || !env->virt_enabled) { mxr = get_field(env->mstatus, MSTATUS_MXR); - } else { - mxr = get_field(env->vsstatus, MSTATUS_MXR); } + + /* MPRV+MPV case, check VSSTATUS */ + if (first_stage && two_stage && !env->virt_enabled) { + mxr |= get_field(env->vsstatus, MSTATUS_MXR); + } + + /* + * Setting MXR at HS-level overrides both VS-stage and G-stage + * execute-only permissions + */ + if (env->virt_enabled) { + mxr |= get_field(env->mstatus_hs, MSTATUS_MXR); + } + if (mxr) { prot |= PAGE_READ; }