From patchwork Fri Sep 13 14:34:00 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?Q2zDqW1lbnQgTMOpZ2Vy?= X-Patchwork-Id: 1985256 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; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=cnsFmtX5; dkim=fail reason="signature verification failed" (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=V+I1tUfZ; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org; envelope-from=opensbi-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=patchwork.ozlabs.org) Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:3::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4X4xgN2KZGz1y1y for ; Sat, 14 Sep 2024 00:35:44 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=V0dmXT6Sjv7LVuyPb6b7W4BW47BUW/c04vw16PPhk7A=; b=cnsFmtX5XoJYAP VxINm4sqELjoLK8kKdQy4/pZ8m8mnyxqpF7ZNC+m/GvEjEztb3K689+BEoT5jeeuNaMB4Nn96KKpx O34lZItDNBVRCAFRC/0ToZGCJ4ryex3cDvLk7rg7BzwIPNmF8+YFhsLauAKpyq7Vp7NKOPmj1UJHz A25HwmlE3gFuaM/USRV6rgAQcJq+Au0p5J4ScyGhworbDWwnk4+kfS19txCb3PTbyklCPACdY7tgQ P8w7n1Nuayzv9aNZKJ5ZeFMpehkLyxqmUYzhZD2P0+L1N4Sg32OcqXWegkH/XWqDjZtRltboiZrz+ K8sG/bQ7oO+QiRcEb1hA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sp7OY-0000000GCbs-0ZUr; Fri, 13 Sep 2024 14:35:34 +0000 Received: from mail-wr1-x42b.google.com ([2a00:1450:4864:20::42b]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sp7NV-0000000GCNN-1Rtb for opensbi@lists.infradead.org; Fri, 13 Sep 2024 14:34:30 +0000 Received: by mail-wr1-x42b.google.com with SMTP id ffacd0b85a97d-3787e067230so1574092f8f.1 for ; Fri, 13 Sep 2024 07:34:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1726238067; x=1726842867; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=JcxVk6/78QzuewaiSKcCWHKW72IAEyfSFFrdZtrv7/k=; b=V+I1tUfZViQ5UqoKSilJQwMpZGZaNjQ3MQg0APS4eJNDBWBXLgw+h+AMkdfOn1C7qz ET7EmF5t3ER6LBr57XkyUu6Podj3PERam2lNjI0ukB2618iVgIOsS9VbgjIO/Mhsr0V3 g21PxtNtROiOisPybsco15yZYQNKnhs6Alxw1bfa9HW2MNPr1N/BFEUtOqRb5bO9HwKw tY1ovqC5KnuRYYVqG4rzl6Vuc4HIbY1CvywL2bfEeOtVo4E5ngEIYVbsYGyxF/rm79db TqN/lXlSv62HEnBPHOWIrgon27BIu3jlYICXILNnRwyrP5BvHc/5SMKzWLtMhhLSqotP FNLw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1726238067; x=1726842867; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=JcxVk6/78QzuewaiSKcCWHKW72IAEyfSFFrdZtrv7/k=; b=abhm6nZZkcv2m+583mamw1R17SazKpk32+UmjuPMd6l/tLuSkW3JZcNl3WmKNJnOip mMUA/FdEoir7OvrTLOddE0fCWFJiZD9eziaD3p88ZT4PG4id1ehQu8ZkEWtvWV3DD+/T vtF4HPhrK155mpfgUGI934cBUwNHu1pOZ0bSWmk0XHRRZuL1jsx7JuIjEGxxNfDvyJsq QHwZmsuJm6oaExC+fwWZtPRXaFOBnv5LSpiTCMgbiC4JKqKBWzbfeFzG2yNnaW892+yb 0vqtdyuW9rAyXazVtdYcr4ftSbfYbqIlrE0Arr3GYQfy0qMZXshLyhlh8bDenj/6FPbE Pnzw== X-Gm-Message-State: AOJu0YwNkiIuiVH8W5D+UJea/SUcAsDJDMkRUouPoPzj/3mDco+d32oT nq6k5ecJJzEdLhyPDtFmHM8Nb8k/PGSAyuZFgL+Eeqm/IlCkgcTu1v5PlZO1wOkfZjNwADQVSWh 5Zj8= X-Google-Smtp-Source: AGHT+IH0y0fCrc+1gGyzDgKURB/pIgupwwkMiZSkkM82R3Egwk/Z5uPrV40fNbDOMJswWejpowLJ7A== X-Received: by 2002:adf:e342:0:b0:374:c671:2324 with SMTP id ffacd0b85a97d-378c2d699e3mr3684833f8f.44.1726238066384; Fri, 13 Sep 2024 07:34:26 -0700 (PDT) Received: from carbon-x1.. ([2a01:e0a:e17:9700:16d2:7456:6634:9626]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-378956d35dasm17084361f8f.67.2024.09.13.07.34.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Sep 2024 07:34:24 -0700 (PDT) From: =?utf-8?b?Q2zDqW1lbnQgTMOpZ2Vy?= To: opensbi@lists.infradead.org Subject: [PATCH v2 2/6] lib: sbi: add Ssdbltrp ISA extension support Date: Fri, 13 Sep 2024 16:34:00 +0200 Message-ID: <20240913143419.3258868-3-cleger@rivosinc.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240913143419.3258868-1-cleger@rivosinc.com> References: <20240913143419.3258868-1-cleger@rivosinc.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240913_073429_409218_1ECEBDDF X-CRM114-Status: GOOD ( 17.00 ) X-Spam-Score: -1.9 (-) X-Spam-Report: Spam detection software, running on the system "bombadil.infradead.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: Add Ssdbltrp trap handler support for S-mode double trap handling. If the trap is received while in VS-mode, then the trap is redirected to S-mode. If caught while in HS-mode, then an error is returne [...] Content analysis details: (-1.9 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2a00:1450:4864:20:0:0:0:42b listed in] [list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] X-BeenThere: opensbi@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Anup Patel , =?utf-8?b?Q2zDqW1lbnQgTMOpZ2Vy?= , Atish Patra , Ved Shanbhogue Sender: "opensbi" Errors-To: opensbi-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Add Ssdbltrp trap handler support for S-mode double trap handling. If the trap is received while in VS-mode, then the trap is redirected to S-mode. If caught while in HS-mode, then an error is returned to the top trap handler which will panic. Signed-off-by: Clément Léger Reviewed-by: Samuel Holland --- include/sbi/riscv_encoding.h | 2 ++ include/sbi/sbi_hart.h | 3 ++- include/sbi/sbi_trap_ldst.h | 2 ++ lib/sbi/objects.mk | 1 + lib/sbi/sbi_double_trap.c | 27 +++++++++++++++++++++++++++ lib/sbi/sbi_hart.c | 4 ++++ lib/sbi/sbi_trap.c | 4 ++++ 7 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 lib/sbi/sbi_double_trap.c diff --git a/include/sbi/riscv_encoding.h b/include/sbi/riscv_encoding.h index 2e4391f..4728c63 100644 --- a/include/sbi/riscv_encoding.h +++ b/include/sbi/riscv_encoding.h @@ -213,6 +213,7 @@ #define ENVCFG_PBMTE (_ULL(1) << 62) #define ENVCFG_ADUE (_ULL(1) << 61) #define ENVCFG_CDE (_ULL(1) << 60) +#define ENVCFG_DTE (_ULL(1) << 59) #define ENVCFG_CBZE (_UL(1) << 7) #define ENVCFG_CBCFE (_UL(1) << 6) #define ENVCFG_CBIE_SHIFT 4 @@ -763,6 +764,7 @@ #define CAUSE_FETCH_PAGE_FAULT 0xc #define CAUSE_LOAD_PAGE_FAULT 0xd #define CAUSE_STORE_PAGE_FAULT 0xf +#define CAUSE_DOUBLE_TRAP 0x10 #define CAUSE_FETCH_GUEST_PAGE_FAULT 0x14 #define CAUSE_LOAD_GUEST_PAGE_FAULT 0x15 #define CAUSE_VIRTUAL_INST_FAULT 0x16 diff --git a/include/sbi/sbi_hart.h b/include/sbi/sbi_hart.h index 81ec061..8aef2a1 100644 --- a/include/sbi/sbi_hart.h +++ b/include/sbi/sbi_hart.h @@ -67,7 +67,8 @@ enum sbi_hart_extensions { SBI_HART_EXT_SVADE, /** Hart has Svadu extension */ SBI_HART_EXT_SVADU, - + /** Hart has Ssdbltrp extension */ + SBI_HART_EXT_SSDBLTRP, /** Maximum index of Hart extension */ SBI_HART_EXT_MAX, }; diff --git a/include/sbi/sbi_trap_ldst.h b/include/sbi/sbi_trap_ldst.h index 8aee316..4c5cc37 100644 --- a/include/sbi/sbi_trap_ldst.h +++ b/include/sbi/sbi_trap_ldst.h @@ -28,4 +28,6 @@ int sbi_load_access_handler(struct sbi_trap_context *tcntx); int sbi_store_access_handler(struct sbi_trap_context *tcntx); +int sbi_double_trap_handler(struct sbi_trap_context *tcntx); + #endif diff --git a/lib/sbi/objects.mk b/lib/sbi/objects.mk index 535aa70..7be943f 100644 --- a/lib/sbi/objects.mk +++ b/lib/sbi/objects.mk @@ -66,6 +66,7 @@ libsbi-objs-y += sbi_bitops.o libsbi-objs-y += sbi_console.o libsbi-objs-y += sbi_domain_context.o libsbi-objs-y += sbi_domain.o +libsbi-objs-y += sbi_double_trap.o libsbi-objs-y += sbi_emulate_csr.o libsbi-objs-y += sbi_fifo.o libsbi-objs-y += sbi_fwft.o diff --git a/lib/sbi/sbi_double_trap.c b/lib/sbi/sbi_double_trap.c new file mode 100644 index 0000000..b961645 --- /dev/null +++ b/lib/sbi/sbi_double_trap.c @@ -0,0 +1,27 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2024 Rivos Inc. + * + * Authors: + * Clément Léger + */ + +#include +#include +#include +#include +#include + +int sbi_double_trap_handler(struct sbi_trap_context *tcntx) +{ + struct sbi_trap_regs *regs = &tcntx->regs; + const struct sbi_trap_info *trap = &tcntx->trap; + bool prev_virt = sbi_regs_from_virt(regs); + + /* Exception was taken in VS-mode, redirect it to S-mode */ + if (prev_virt) + return sbi_trap_redirect(regs, trap); + + return SBI_ENOTSUPP; +} diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c index cc364fa..d6b9a0a 100644 --- a/lib/sbi/sbi_hart.c +++ b/lib/sbi/sbi_hart.c @@ -117,6 +117,9 @@ static void mstatus_init(struct sbi_scratch *scratch) menvcfg_val |= ((uint64_t)csr_read(CSR_MENVCFGH)) << 32; #endif + /* Disable double trap by default */ + menvcfg_val &= ~ENVCFG_DTE; + #define __set_menvcfg_ext(__ext, __bits) \ if (sbi_hart_has_extension(scratch, __ext)) \ menvcfg_val |= __bits; @@ -680,6 +683,7 @@ const struct sbi_hart_ext_data sbi_hart_ext[] = { __SBI_HART_EXT_DATA(ssccfg, SBI_HART_EXT_SSCCFG), __SBI_HART_EXT_DATA(svade, SBI_HART_EXT_SVADE), __SBI_HART_EXT_DATA(svadu, SBI_HART_EXT_SVADU), + __SBI_HART_EXT_DATA(ssdbltrp, SBI_HART_EXT_SSDBLTRP), }; _Static_assert(SBI_HART_EXT_MAX == array_size(sbi_hart_ext), diff --git a/lib/sbi/sbi_trap.c b/lib/sbi/sbi_trap.c index 8bd2183..188f2a5 100644 --- a/lib/sbi/sbi_trap.c +++ b/lib/sbi/sbi_trap.c @@ -330,6 +330,10 @@ struct sbi_trap_context *sbi_trap_handler(struct sbi_trap_context *tcntx) rc = sbi_store_access_handler(tcntx); msg = "store fault handler failed"; break; + case CAUSE_DOUBLE_TRAP: + rc = sbi_double_trap_handler(tcntx); + msg = "double trap handler failed"; + break; default: /* If the trap came from S or U mode, redirect it there */ msg = "trap redirect failed";