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
union PTW_Error = {
PTW_Invalid_Addr :
unit,
PTW_Access :
unit,
PTW_Invalid_PTE :
unit,
PTW_No_Permission :
unit,
PTW_Misaligned :
unit,
PTW_PTE_Update :
unit,
PTW_Ext_Error :
ext_ptw_error }
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"
}
}
overload to_str = {
ptw_error_to_str}
function ext_get_ptw_error(
eptwf :
ext_ptw_fail) ->
PTW_Error =
PTW_No_Permission()
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(),
(
InstructionFetch(),
PTW_Access()) =>
E_Fetch_Access_Fault(),
(
InstructionFetch(), _) =>
E_Fetch_Page_Fault()
}
}