udb 0.1.13 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.data/cfgs/example_rv64_with_overlay.yaml +15 -18
- data/.data/cfgs/qc_iu.yaml +5 -1
- data/.data/cfgs/rv32-riscv-tests.yaml +4 -1
- data/.data/cfgs/rv32-vector.yaml +4 -1
- data/.data/cfgs/rv64-riscv-tests.yaml +4 -1
- data/.data/cfgs/rv64-vector.yaml +4 -1
- data/.data/spec/custom/isa/qc_iu/ext/Xqccmi.yaml +107 -36
- data/.data/spec/custom/isa/qc_iu/inst/Xqccmi/qc.cm.ilut.yaml +52 -69
- data/.data/spec/custom/isa/qc_iu/isa/globals.isa +27 -5
- data/.data/spec/schemas/config_schema.json +1 -1
- data/.data/spec/schemas/mmr_schema.json +3 -3
- data/.data/spec/schemas/schema_defs.json +5 -0
- data/.data/spec/std/isa/csr/H/henvcfg.yaml +25 -0
- data/.data/spec/std/isa/csr/I/pmpaddr0.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr1.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr10.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr11.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr12.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr13.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr14.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr15.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr16.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr17.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr18.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr19.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr2.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr20.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr21.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr22.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr23.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr24.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr25.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr26.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr27.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr28.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr29.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr3.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr30.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr31.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr32.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr33.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr34.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr35.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr36.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr37.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr38.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr39.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr4.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr40.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr41.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr42.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr43.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr44.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr45.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr46.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr47.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr48.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr49.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr5.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr50.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr51.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr52.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr53.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr54.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr55.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr56.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr57.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr58.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr59.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr6.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr60.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr61.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr62.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr63.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr7.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr8.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddr9.yaml +6 -4
- data/.data/spec/std/isa/csr/I/pmpaddrN.layout +6 -4
- data/.data/spec/std/isa/csr/I/pmpcfg0.yaml +120 -144
- data/.data/spec/std/isa/csr/I/pmpcfg1.yaml +60 -72
- data/.data/spec/std/isa/csr/I/pmpcfg10.yaml +120 -144
- data/.data/spec/std/isa/csr/I/pmpcfg11.yaml +60 -72
- data/.data/spec/std/isa/csr/I/pmpcfg12.yaml +120 -144
- data/.data/spec/std/isa/csr/I/pmpcfg13.yaml +60 -72
- data/.data/spec/std/isa/csr/I/pmpcfg14.yaml +120 -144
- data/.data/spec/std/isa/csr/I/pmpcfg15.yaml +60 -72
- data/.data/spec/std/isa/csr/I/pmpcfg2.yaml +120 -144
- data/.data/spec/std/isa/csr/I/pmpcfg3.yaml +60 -72
- data/.data/spec/std/isa/csr/I/pmpcfg4.yaml +120 -144
- data/.data/spec/std/isa/csr/I/pmpcfg5.yaml +60 -72
- data/.data/spec/std/isa/csr/I/pmpcfg6.yaml +120 -144
- data/.data/spec/std/isa/csr/I/pmpcfg7.yaml +60 -72
- data/.data/spec/std/isa/csr/I/pmpcfg8.yaml +120 -144
- data/.data/spec/std/isa/csr/I/pmpcfg9.yaml +60 -72
- data/.data/spec/std/isa/csr/I/pmpcfgN.layout +15 -18
- data/.data/spec/std/isa/csr/jvt.yaml +1 -0
- data/.data/spec/std/isa/csr/menvcfg.yaml +20 -0
- data/.data/spec/std/isa/csr/mstatus.yaml +8 -6
- data/.data/spec/std/isa/csr/senvcfg.yaml +26 -0
- data/.data/spec/std/isa/inst/B/andn.yaml +10 -12
- data/.data/spec/std/isa/inst/B/clmul.yaml +9 -11
- data/.data/spec/std/isa/inst/B/clmulh.yaml +9 -11
- data/.data/spec/std/isa/inst/B/orn.yaml +9 -11
- data/.data/spec/std/isa/inst/B/rev8.yaml +1 -1
- data/.data/spec/std/isa/inst/B/rol.yaml +9 -11
- data/.data/spec/std/isa/inst/B/rolw.yaml +9 -11
- data/.data/spec/std/isa/inst/B/ror.yaml +9 -11
- data/.data/spec/std/isa/inst/B/rorw.yaml +9 -11
- data/.data/spec/std/isa/inst/B/xnor.yaml +9 -11
- data/.data/spec/std/isa/inst/C/c.ldsp.yaml +3 -3
- data/.data/spec/std/isa/inst/I/addi.yaml +1 -0
- data/.data/spec/std/isa/inst/I/addiw.yaml +1 -0
- data/.data/spec/std/isa/inst/I/andi.yaml +1 -0
- data/.data/spec/std/isa/inst/I/auipc.yaml +1 -0
- data/.data/spec/std/isa/inst/I/lb.yaml +1 -0
- data/.data/spec/std/isa/inst/I/lbu.yaml +1 -0
- data/.data/spec/std/isa/inst/I/ld.yaml +2 -0
- data/.data/spec/std/isa/inst/I/lh.yaml +1 -0
- data/.data/spec/std/isa/inst/I/lhu.yaml +1 -0
- data/.data/spec/std/isa/inst/I/lui.yaml +1 -0
- data/.data/spec/std/isa/inst/I/lw.yaml +1 -0
- data/.data/spec/std/isa/inst/I/lwu.yaml +1 -0
- data/.data/spec/std/isa/inst/I/ori.yaml +1 -0
- data/.data/spec/std/isa/inst/I/sb.yaml +1 -0
- data/.data/spec/std/isa/inst/I/sd.yaml +1 -0
- data/.data/spec/std/isa/inst/I/sh.yaml +1 -0
- data/.data/spec/std/isa/inst/I/slti.yaml +1 -0
- data/.data/spec/std/isa/inst/I/sltiu.yaml +1 -0
- data/.data/spec/std/isa/inst/I/sw.yaml +1 -0
- data/.data/spec/std/isa/inst/I/xori.yaml +1 -0
- data/.data/spec/std/isa/inst/V/vadc.vim.yaml +1 -0
- data/.data/spec/std/isa/inst/V/vadd.vi.yaml +1 -0
- data/.data/spec/std/isa/inst/V/vand.vi.yaml +1 -0
- data/.data/spec/std/isa/inst/V/vle8.v.yaml +1 -0
- data/.data/spec/std/isa/inst/V/vmadc.vi.yaml +1 -0
- data/.data/spec/std/isa/inst/V/vmadc.vim.yaml +1 -0
- data/.data/spec/std/isa/inst/V/vmerge.vim.yaml +1 -0
- data/.data/spec/std/isa/inst/V/vmseq.vi.yaml +1 -0
- data/.data/spec/std/isa/inst/V/vmsgt.vi.yaml +1 -0
- data/.data/spec/std/isa/inst/V/vmsgtu.vi.yaml +1 -0
- data/.data/spec/std/isa/inst/V/vmsle.vi.yaml +1 -0
- data/.data/spec/std/isa/inst/V/vmsleu.vi.yaml +1 -0
- data/.data/spec/std/isa/inst/V/vmsne.vi.yaml +1 -0
- data/.data/spec/std/isa/inst/V/vor.vi.yaml +1 -0
- data/.data/spec/std/isa/inst/V/vrsub.vi.yaml +1 -0
- data/.data/spec/std/isa/inst/V/vsadd.vi.yaml +1 -0
- data/.data/spec/std/isa/inst/V/vsaddu.vi.yaml +1 -0
- data/.data/spec/std/isa/inst/V/vse8.v.yaml +1 -0
- data/.data/spec/std/isa/inst/Zawrs/wrs.nto.yaml +4 -2
- data/.data/spec/std/isa/inst/Zba/add.uw.yaml +9 -11
- data/.data/spec/std/isa/inst/Zbb/orc.b.yaml +1 -1
- data/.data/spec/std/isa/inst/Zbkb/brev8.yaml +3 -3
- data/.data/spec/std/isa/inst/Zbkb/unzip.yaml +2 -2
- data/.data/spec/std/isa/inst/Zbkb/zip.yaml +2 -2
- data/.data/spec/std/isa/inst/Zbkx/xperm4.yaml +2 -2
- data/.data/spec/std/isa/inst/Zbkx/xperm8.yaml +2 -2
- data/.data/spec/std/isa/inst/Zicbop/prefetch.i.yaml +2 -0
- data/.data/spec/std/isa/inst/Zicbop/prefetch.r.yaml +2 -0
- data/.data/spec/std/isa/inst/Zicbop/prefetch.w.yaml +2 -0
- data/.data/spec/std/isa/inst/Zks/sm3p0.yaml +1 -1
- data/.data/spec/std/isa/inst/Zks/sm3p1.yaml +1 -1
- data/.data/spec/std/isa/inst/Zks/sm4ed.yaml +1 -1
- data/.data/spec/std/isa/inst/Zks/sm4ks.yaml +1 -1
- data/.data/spec/std/isa/isa/builtin_functions.idl +1 -0
- data/.data/spec/std/isa/isa/globals.isa +27 -7
- data/.data/spec/std/isa/isa/interrupts.idl +1 -0
- data/.data/spec/std/isa/param/HSTATEEN_CONTEXT_TYPE.yaml +1 -0
- data/.data/spec/std/isa/param/MSTATEEN_CONTEXT_TYPE.yaml +1 -0
- data/.data/spec/std/isa/param/MTVEC_BASE_ALIGNMENT_DIRECT.yaml +1 -0
- data/.data/spec/std/isa/param/MTVEC_BASE_ALIGNMENT_VECTORED.yaml +1 -0
- data/.data/spec/std/isa/param/NUM_PMP_ENTRIES.yaml +11 -22
- data/.data/spec/std/isa/param/NUM_USABLE_PMP_ENTRIES.yaml +35 -0
- data/.data/spec/std/isa/param/PMP_NA4_SUPPORTED.yaml +23 -0
- data/.data/spec/std/isa/param/PMP_NAPOT_SUPPORTED.yaml +19 -0
- data/.data/spec/std/isa/param/{MSTATUS_TVM_IMPLEMENTED.yaml → PMP_TOR_SUPPORTED.yaml} +6 -6
- data/.data/spec/std/isa/param/PRECISE_SYNCHRONOUS_EXCEPTIONS.yaml +1 -0
- data/.data/spec/std/isa/param/TRAP_ON_EBREAK.yaml +1 -0
- data/.data/spec/std/isa/param/TRAP_ON_ECALL_FROM_M.yaml +1 -0
- data/.data/spec/std/isa/param/TRAP_ON_SFENCE_VMA_WHEN_SATP_MODE_IS_READ_ONLY.yaml +1 -0
- data/.data/spec/std/isa/param/ZAWRS_NTO_IS_NOP.yaml +19 -0
- data/lib/udb/ESPRESSO_VERSION +1 -1
- data/lib/udb/config.rb +14 -2
- data/lib/udb/doc_link.rb +3 -4
- data/lib/udb/obj/instruction.rb +1 -1
- data/lib/udb/obj/non_isa_specification.rb +22 -100
- data/lib/udb/version.rb +1 -1
- data/lib/udb/z3.rb +2 -2
- metadata +7 -3
|
@@ -38,21 +38,13 @@ fields:
|
|
|
38
38
|
h! L ! 7 ! Locks the entry from further modification. Additionally, when set, PMP checks also apply to M-mode for the entry.
|
|
39
39
|
h! MT ! 6:5 ! When the `Smpmpmt` extension is implemented, MT (Memory Type) is a WARL field that overrides the memory type for accesses that match this PMP entry. See the `Smpmpmt` extension definition for encodings. When the `Smpmpmt` extension is not implemented, MT is _Reserved_ Writes shall be ignored.
|
|
40
40
|
h! A ! 4:3
|
|
41
|
-
a! Address matching mode.
|
|
41
|
+
a! Address matching mode. Encodings:
|
|
42
42
|
|
|
43
|
-
[when="PMP_GRANULARITY < 2"]
|
|
44
43
|
* *OFF* (0) - Null region (disabled)
|
|
45
44
|
* *TOR* (1) - Top of range
|
|
46
45
|
* *NA4* (2) - Naturally aligned four-byte region
|
|
47
46
|
* *NAPOT* (3) - Naturally aligned power of two
|
|
48
47
|
|
|
49
|
-
[when="PMP_GRANULARITY >= 2"]
|
|
50
|
-
* *OFF* (0) - Null region (disabled)
|
|
51
|
-
* *TOR* (1) - Top of range
|
|
52
|
-
* *NAPOT* (3) - Naturally aligned power of two
|
|
53
|
-
|
|
54
|
-
[when="PMP_GRANULARITY >= 2"]
|
|
55
|
-
Naturally aligned four-byte region, *NA4* (2), is not valid (not needed when the PMP granularity is larger than 4 bytes).
|
|
56
48
|
|
|
57
49
|
h! X ! 2 ! When clear, instruction fetches cause an `Access Fault` for the matching region and privilege mode.
|
|
58
50
|
h! W ! 1 ! When clear, stores and AMOs cause an `Access Fault` for the matching region and privilege mode.
|
|
@@ -61,23 +53,28 @@ fields:
|
|
|
61
53
|
|
|
62
54
|
The combination of R = 0, W = 1 is reserved.
|
|
63
55
|
type(): |
|
|
64
|
-
if (
|
|
56
|
+
if (NUM_USABLE_PMP_ENTRIES > 4) {
|
|
65
57
|
return CsrFieldType::RWR;
|
|
66
58
|
} else {
|
|
59
|
+
# entry is either not implemented or implemented as read-only zero
|
|
67
60
|
return CsrFieldType::RO;
|
|
68
61
|
}
|
|
69
62
|
reset_value(): |
|
|
70
63
|
return 0;
|
|
71
64
|
sw_write(csr_value): |
|
|
72
|
-
if ((CSR[pmpcfg1].pmp4cfg & 0x80) == 0) {
|
|
73
|
-
# entry is not locked
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
65
|
+
if (NUM_USABLE_PMP_ENTRIES > 4 && (CSR[pmpcfg1].pmp4cfg & 0x80) == 0) {
|
|
66
|
+
# entry is usable and not locked
|
|
67
|
+
Bits<8> new_cfg = csr_value.pmp4cfg;
|
|
68
|
+
Bits<2> a_mode = (new_cfg & 0x18) >> 3;
|
|
69
|
+
if (!(((new_cfg & 0x1) == 0) && ((new_cfg & 0x2) == 0x2))) {
|
|
70
|
+
# not R = 0, W = 1, which is reserved
|
|
71
|
+
if (((a_mode == 0x1) && !PMP_TOR_SUPPORTED) ||
|
|
72
|
+
((a_mode == 0x2) && !PMP_NA4_SUPPORTED) ||
|
|
73
|
+
((a_mode == 0x3) && !PMP_NAPOT_SUPPORTED)) {
|
|
74
|
+
# unsupported address matching mode; keep old value
|
|
75
|
+
return CSR[pmpcfg1].pmp4cfg;
|
|
80
76
|
}
|
|
77
|
+
return new_cfg;
|
|
81
78
|
}
|
|
82
79
|
}
|
|
83
80
|
# fall through: keep old value
|
|
@@ -96,21 +93,13 @@ fields:
|
|
|
96
93
|
h! L ! 15 ! Locks the entry from further modification. Additionally, when set, PMP checks also apply to M-mode for the entry.
|
|
97
94
|
h! MT ! 14:13 ! When the `Smpmpmt` extension is implemented, MT (Memory Type) is a WARL field that overrides the memory type for accesses that match this PMP entry. See the `Smpmpmt` extension definition for encodings. When the `Smpmpmt` extension is not implemented, MT is _Reserved_ Writes shall be ignored.
|
|
98
95
|
h! A ! 12:11
|
|
99
|
-
a! Address matching mode.
|
|
96
|
+
a! Address matching mode. Encodings:
|
|
100
97
|
|
|
101
|
-
[when="PMP_GRANULARITY < 2"]
|
|
102
98
|
* *OFF* (0) - Null region (disabled)
|
|
103
99
|
* *TOR* (1) - Top of range
|
|
104
100
|
* *NA4* (2) - Naturally aligned four-byte region
|
|
105
101
|
* *NAPOT* (3) - Naturally aligned power of two
|
|
106
102
|
|
|
107
|
-
[when="PMP_GRANULARITY >= 2"]
|
|
108
|
-
* *OFF* (0) - Null region (disabled)
|
|
109
|
-
* *TOR* (1) - Top of range
|
|
110
|
-
* *NAPOT* (3) - Naturally aligned power of two
|
|
111
|
-
|
|
112
|
-
[when="PMP_GRANULARITY >= 2"]
|
|
113
|
-
Naturally aligned four-byte region, *NA4* (2), is not valid (not needed when the PMP granularity is larger than 4 bytes).
|
|
114
103
|
|
|
115
104
|
h! X ! 10 ! When clear, instruction fetches cause an `Access Fault` for the matching region and privilege mode.
|
|
116
105
|
h! W ! 9 ! When clear, stores and AMOs cause an `Access Fault` for the matching region and privilege mode.
|
|
@@ -119,23 +108,28 @@ fields:
|
|
|
119
108
|
|
|
120
109
|
The combination of R = 0, W = 1 is reserved.
|
|
121
110
|
type(): |
|
|
122
|
-
if (
|
|
111
|
+
if (NUM_USABLE_PMP_ENTRIES > 5) {
|
|
123
112
|
return CsrFieldType::RWR;
|
|
124
113
|
} else {
|
|
114
|
+
# entry is either not implemented or implemented as read-only zero
|
|
125
115
|
return CsrFieldType::RO;
|
|
126
116
|
}
|
|
127
117
|
reset_value(): |
|
|
128
118
|
return 0;
|
|
129
119
|
sw_write(csr_value): |
|
|
130
|
-
if ((CSR[pmpcfg1].pmp5cfg & 0x80) == 0) {
|
|
131
|
-
# entry is not locked
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
120
|
+
if (NUM_USABLE_PMP_ENTRIES > 5 && (CSR[pmpcfg1].pmp5cfg & 0x80) == 0) {
|
|
121
|
+
# entry is usable and not locked
|
|
122
|
+
Bits<8> new_cfg = csr_value.pmp5cfg;
|
|
123
|
+
Bits<2> a_mode = (new_cfg & 0x18) >> 3;
|
|
124
|
+
if (!(((new_cfg & 0x1) == 0) && ((new_cfg & 0x2) == 0x2))) {
|
|
125
|
+
# not R = 0, W = 1, which is reserved
|
|
126
|
+
if (((a_mode == 0x1) && !PMP_TOR_SUPPORTED) ||
|
|
127
|
+
((a_mode == 0x2) && !PMP_NA4_SUPPORTED) ||
|
|
128
|
+
((a_mode == 0x3) && !PMP_NAPOT_SUPPORTED)) {
|
|
129
|
+
# unsupported address matching mode; keep old value
|
|
130
|
+
return CSR[pmpcfg1].pmp5cfg;
|
|
138
131
|
}
|
|
132
|
+
return new_cfg;
|
|
139
133
|
}
|
|
140
134
|
}
|
|
141
135
|
# fall through: keep old value
|
|
@@ -154,21 +148,13 @@ fields:
|
|
|
154
148
|
h! L ! 23 ! Locks the entry from further modification. Additionally, when set, PMP checks also apply to M-mode for the entry.
|
|
155
149
|
h! MT ! 22:21 ! When the `Smpmpmt` extension is implemented, MT (Memory Type) is a WARL field that overrides the memory type for accesses that match this PMP entry. See the `Smpmpmt` extension definition for encodings. When the `Smpmpmt` extension is not implemented, MT is _Reserved_ Writes shall be ignored.
|
|
156
150
|
h! A ! 20:19
|
|
157
|
-
a! Address matching mode.
|
|
151
|
+
a! Address matching mode. Encodings:
|
|
158
152
|
|
|
159
|
-
[when="PMP_GRANULARITY < 2"]
|
|
160
153
|
* *OFF* (0) - Null region (disabled)
|
|
161
154
|
* *TOR* (1) - Top of range
|
|
162
155
|
* *NA4* (2) - Naturally aligned four-byte region
|
|
163
156
|
* *NAPOT* (3) - Naturally aligned power of two
|
|
164
157
|
|
|
165
|
-
[when="PMP_GRANULARITY >= 2"]
|
|
166
|
-
* *OFF* (0) - Null region (disabled)
|
|
167
|
-
* *TOR* (1) - Top of range
|
|
168
|
-
* *NAPOT* (3) - Naturally aligned power of two
|
|
169
|
-
|
|
170
|
-
[when="PMP_GRANULARITY >= 2"]
|
|
171
|
-
Naturally aligned four-byte region, *NA4* (2), is not valid (not needed when the PMP granularity is larger than 4 bytes).
|
|
172
158
|
|
|
173
159
|
h! X ! 18 ! When clear, instruction fetches cause an `Access Fault` for the matching region and privilege mode.
|
|
174
160
|
h! W ! 17 ! When clear, stores and AMOs cause an `Access Fault` for the matching region and privilege mode.
|
|
@@ -177,23 +163,28 @@ fields:
|
|
|
177
163
|
|
|
178
164
|
The combination of R = 0, W = 1 is reserved.
|
|
179
165
|
type(): |
|
|
180
|
-
if (
|
|
166
|
+
if (NUM_USABLE_PMP_ENTRIES > 6) {
|
|
181
167
|
return CsrFieldType::RWR;
|
|
182
168
|
} else {
|
|
169
|
+
# entry is either not implemented or implemented as read-only zero
|
|
183
170
|
return CsrFieldType::RO;
|
|
184
171
|
}
|
|
185
172
|
reset_value(): |
|
|
186
173
|
return 0;
|
|
187
174
|
sw_write(csr_value): |
|
|
188
|
-
if ((CSR[pmpcfg1].pmp6cfg & 0x80) == 0) {
|
|
189
|
-
# entry is not locked
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
175
|
+
if (NUM_USABLE_PMP_ENTRIES > 6 && (CSR[pmpcfg1].pmp6cfg & 0x80) == 0) {
|
|
176
|
+
# entry is usable and not locked
|
|
177
|
+
Bits<8> new_cfg = csr_value.pmp6cfg;
|
|
178
|
+
Bits<2> a_mode = (new_cfg & 0x18) >> 3;
|
|
179
|
+
if (!(((new_cfg & 0x1) == 0) && ((new_cfg & 0x2) == 0x2))) {
|
|
180
|
+
# not R = 0, W = 1, which is reserved
|
|
181
|
+
if (((a_mode == 0x1) && !PMP_TOR_SUPPORTED) ||
|
|
182
|
+
((a_mode == 0x2) && !PMP_NA4_SUPPORTED) ||
|
|
183
|
+
((a_mode == 0x3) && !PMP_NAPOT_SUPPORTED)) {
|
|
184
|
+
# unsupported address matching mode; keep old value
|
|
185
|
+
return CSR[pmpcfg1].pmp6cfg;
|
|
196
186
|
}
|
|
187
|
+
return new_cfg;
|
|
197
188
|
}
|
|
198
189
|
}
|
|
199
190
|
# fall through: keep old value
|
|
@@ -212,21 +203,13 @@ fields:
|
|
|
212
203
|
h! L ! 31 ! Locks the entry from further modification. Additionally, when set, PMP checks also apply to M-mode for the entry.
|
|
213
204
|
h! MT ! 30:29 ! When the `Smpmpmt` extension is implemented, MT (Memory Type) is a WARL field that overrides the memory type for accesses that match this PMP entry. See the `Smpmpmt` extension definition for encodings. When the `Smpmpmt` extension is not implemented, MT is _Reserved_ Writes shall be ignored.
|
|
214
205
|
h! A ! 28:27
|
|
215
|
-
a! Address matching mode.
|
|
206
|
+
a! Address matching mode. Encodings:
|
|
216
207
|
|
|
217
|
-
[when="PMP_GRANULARITY < 2"]
|
|
218
208
|
* *OFF* (0) - Null region (disabled)
|
|
219
209
|
* *TOR* (1) - Top of range
|
|
220
210
|
* *NA4* (2) - Naturally aligned four-byte region
|
|
221
211
|
* *NAPOT* (3) - Naturally aligned power of two
|
|
222
212
|
|
|
223
|
-
[when="PMP_GRANULARITY >= 2"]
|
|
224
|
-
* *OFF* (0) - Null region (disabled)
|
|
225
|
-
* *TOR* (1) - Top of range
|
|
226
|
-
* *NAPOT* (3) - Naturally aligned power of two
|
|
227
|
-
|
|
228
|
-
[when="PMP_GRANULARITY >= 2"]
|
|
229
|
-
Naturally aligned four-byte region, *NA4* (2), is not valid (not needed when the PMP granularity is larger than 4 bytes).
|
|
230
213
|
|
|
231
214
|
h! X ! 26 ! When clear, instruction fetches cause an `Access Fault` for the matching region and privilege mode.
|
|
232
215
|
h! W ! 25 ! When clear, stores and AMOs cause an `Access Fault` for the matching region and privilege mode.
|
|
@@ -235,23 +218,28 @@ fields:
|
|
|
235
218
|
|
|
236
219
|
The combination of R = 0, W = 1 is reserved.
|
|
237
220
|
type(): |
|
|
238
|
-
if (
|
|
221
|
+
if (NUM_USABLE_PMP_ENTRIES > 7) {
|
|
239
222
|
return CsrFieldType::RWR;
|
|
240
223
|
} else {
|
|
224
|
+
# entry is either not implemented or implemented as read-only zero
|
|
241
225
|
return CsrFieldType::RO;
|
|
242
226
|
}
|
|
243
227
|
reset_value(): |
|
|
244
228
|
return 0;
|
|
245
229
|
sw_write(csr_value): |
|
|
246
|
-
if ((CSR[pmpcfg1].pmp7cfg & 0x80) == 0) {
|
|
247
|
-
# entry is not locked
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
230
|
+
if (NUM_USABLE_PMP_ENTRIES > 7 && (CSR[pmpcfg1].pmp7cfg & 0x80) == 0) {
|
|
231
|
+
# entry is usable and not locked
|
|
232
|
+
Bits<8> new_cfg = csr_value.pmp7cfg;
|
|
233
|
+
Bits<2> a_mode = (new_cfg & 0x18) >> 3;
|
|
234
|
+
if (!(((new_cfg & 0x1) == 0) && ((new_cfg & 0x2) == 0x2))) {
|
|
235
|
+
# not R = 0, W = 1, which is reserved
|
|
236
|
+
if (((a_mode == 0x1) && !PMP_TOR_SUPPORTED) ||
|
|
237
|
+
((a_mode == 0x2) && !PMP_NA4_SUPPORTED) ||
|
|
238
|
+
((a_mode == 0x3) && !PMP_NAPOT_SUPPORTED)) {
|
|
239
|
+
# unsupported address matching mode; keep old value
|
|
240
|
+
return CSR[pmpcfg1].pmp7cfg;
|
|
254
241
|
}
|
|
242
|
+
return new_cfg;
|
|
255
243
|
}
|
|
256
244
|
}
|
|
257
245
|
# fall through: keep old value
|