aboutsummaryrefslogtreecommitdiff
path: root/model/riscv_types_ext.sail
blob: 515a7691390c30d4b667c8f153f77caf3f3bea0b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/*=======================================================================================*/
/*  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                                                */
/*=======================================================================================*/

/*
 * Types used in supporting extensions for page-table walks.
 *
 * There are three types involved:
 *
 * . An accumulator, passed down from the root to the leaves (ext_ptw)
 * . Metadata returned with failed permissions checks (ext_ptw_fail)
 * . Errors embedded within the PTW_Error union
 *
 * Information flow begins with init_ext_ptw (: ext_ptw) being routed,
 * via the translateNN functions and/or walkNN functions, to the
 * checkPTEPermission function, which is the intended point of
 * interaction with extensions.
 *
 * checkPTEPermission will be called repeatedly at each PTE, each call
 * seeing the accumulator state generated by a successful result of
 * the previous call.  On failure, this function is expected to
 * generate, instead, an ext_ptw_fail value as well as a new
 * accumulator value, both of which will be returned to the code
 * calling into translation.
 *
 * If translation ultimately succeeds, the final accumulator state is
 * captured and will be returned to the code calling into translation.
 *
 * If translation ultimately fails, the accumulator at the time of
 * failure and the ext_ptw_fail value are returned to the caller.  The
 * ext_ptw_fail value is used to generate a PTW_Error value by calling
 * ext_get_ptw_error; this allows the extension to generate both novel
 * (e.g., PTW_Ext_Error) and existing (e.g., PTW_Invalid_PTE) PTW_Error
 * values.
 */

type ext_ptw = unit
let init_ext_ptw : ext_ptw = ()

type ext_ptw_fail = unit

/* This type can be used for custom errors for page-table-walks,
 * and values in this type are typically generated from the final
 * result of the ext_ptw at the end of the walk.
 */
type ext_ptw_error = unit /* No extensions for page-table-walk errors */

/* This type supports extensions to the exceptions defined in the ISA. */
type ext_exc_type = unit /* No exception extensions */

/* Default translation of PTW errors into exception annotations */
function ext_translate_exception(e : ext_ptw_error) -> ext_exc_type =
  e /* type pun because both are unit; extensions may need to override this */

/* Default conversion of extension exceptions to bits */
val ext_exc_type_to_bits : ext_exc_type -> exc_code
function ext_exc_type_to_bits(e) = 0x18 /* First code for a custom extension */

/* Default conversion of extension exceptions to integers */
val num_of_ext_exc_type : ext_exc_type -> {'n, (0 <= 'n < xlen). int('n)}
function num_of_ext_exc_type(e) = 24 /* First code for a custom extension */

/* Default conversion of extension exceptions to strings */
val ext_exc_type_to_str : ext_exc_type -> string
function ext_exc_type_to_str(e) = "extension-exception"