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
// ======================================================================================= // 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 mapping ext_exc_type_bits : ext_exc_type <-> exc_code = { // First code for a custom extension () <-> 0b011000, // 24 } // 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"