aboutsummaryrefslogtreecommitdiff
path: root/model/riscv_vmem_ptw.sail
diff options
context:
space:
mode:
authorRishiyur S. Nikhil <nikhil@acm.org>2024-04-01 11:07:57 -0400
committerGitHub <noreply@github.com>2024-04-01 10:07:57 -0500
commitf601c866153c79a7ae8404f939dc2d66aa2e41f9 (patch)
tree276b3e032c8455d415ccf2265d5288f1f316bc82 /model/riscv_vmem_ptw.sail
parentd564b93310dd43f519325a418da056f78b1daef2 (diff)
downloadsail-riscv-f601c866153c79a7ae8404f939dc2d66aa2e41f9.zip
sail-riscv-f601c866153c79a7ae8404f939dc2d66aa2e41f9.tar.gz
sail-riscv-f601c866153c79a7ae8404f939dc2d66aa2e41f9.tar.bz2
Unify VM code
Old vmem code had much 'cut-and-paste' replication for RV32 (Sv32) and (#408) RV64 (Sv39, Sv48), and was scattered over several files. New code unifies them into single set of parameterized functions that works for RV32/RV64 and Sv32/Sv39/Sv48 (and is ready for Sv57). Deleted old files: riscv_vmem_rv32.sail riscv_vmem_rv64.sail riscv_vmem_sv32.sail riscv_vmem_sv39.sail riscv_vmem_sv48.sail riscv_pte.sail riscv_ptw.sail Current files: all named riscv_vmem_* riscv_vmem.sail (root file for vmem) riscv_vmem_common.sail riscv_vmem_pte.sail riscv_vmem_ptw.sail riscv_vmem_tlb.sail riscv_vmem_types.sail Modified top-level Makefile accordingly. Added documentation on new vmem code: doc/notes_Virtual_Memory.adoc
Diffstat (limited to 'model/riscv_vmem_ptw.sail')
-rw-r--r--model/riscv_vmem_ptw.sail66
1 files changed, 66 insertions, 0 deletions
diff --git a/model/riscv_vmem_ptw.sail b/model/riscv_vmem_ptw.sail
new file mode 100644
index 0000000..ab73b19
--- /dev/null
+++ b/model/riscv_vmem_ptw.sail
@@ -0,0 +1,66 @@
+/*=======================================================================================*/
+/* This Sail RISC-V architecture model, comprising all files and */
+/* directories except where otherwise noted is subject the BSD */
+/* two-clause license in the LICENSE file. */
+/* */
+/* SPDX-License-Identifier: BSD-2-Clause */
+/*=======================================================================================*/
+
+// ****************************************************************
+// PTW exceptions
+
+// 'ext_ptw' supports (non-standard) extensions to the default addr-translation and PTW.
+// See riscv_types_ext.sail for definitions.
+
+// Failure modes for address-translation/page-table-walks
+// PRIVATE
+union PTW_Error = {
+ PTW_Invalid_Addr : unit, // invalid source address
+ PTW_Access : unit, // physical memory access error for a PTE
+ PTW_Invalid_PTE : unit,
+ PTW_No_Permission : unit,
+ PTW_Misaligned : unit, // misaligned superpage
+ PTW_PTE_Update : unit, // PTE update needed but not enabled
+ PTW_Ext_Error : ext_ptw_error // parameterized for errors from extensions
+}
+
+// PRIVATE: only 'to_str' overload is public
+function ptw_error_to_str(e : PTW_Error) -> string = {
+ match e {
+ PTW_Invalid_Addr() => "invalid-source-addr",
+ PTW_Access() => "mem-access-error",
+ PTW_Invalid_PTE() => "invalid-pte",
+ PTW_No_Permission() => "no-permission",
+ PTW_Misaligned() => "misaligned-superpage",
+ PTW_PTE_Update() => "pte-update-needed",
+ PTW_Ext_Error(e) => "extension-error"
+ }
+}
+
+// PUBLIC
+overload to_str = {ptw_error_to_str}
+
+// hook for (non-standard) extensions to customize errors reported by page-table
+// walks during address translation; it typically works in conjunction
+// with any customization to check_PTE_permission().
+
+// PRIVATE
+function ext_get_ptw_error(eptwf : ext_ptw_fail) -> PTW_Error =
+ PTW_No_Permission()
+
+// Convert translation/PTW failures into architectural exceptions
+function translationException(a : AccessType(ext_access_type),
+ f : PTW_Error)
+ -> ExceptionType = {
+ match (a, f) {
+ (_, PTW_Ext_Error(e)) => E_Extension(ext_translate_exception(e)),
+ (ReadWrite(_), PTW_Access()) => E_SAMO_Access_Fault(),
+ (ReadWrite(_), _) => E_SAMO_Page_Fault(),
+ (Read(_), PTW_Access()) => E_Load_Access_Fault(),
+ (Read(_), _) => E_Load_Page_Fault(),
+ (Write(_), PTW_Access()) => E_SAMO_Access_Fault(),
+ (Write(_), _) => E_SAMO_Page_Fault(),
+ (Execute(), PTW_Access()) => E_Fetch_Access_Fault(),
+ (Execute(), _) => E_Fetch_Page_Fault()
+ }
+}