|
30 | 30 | #define SIG sig_bgn_off
|
31 | 31 | #define VMEM vmem_bgn_off
|
32 | 32 |
|
| 33 | + |
| 34 | +#define SATP_SETUP(_TR0, _TR1, MODE);\ |
| 35 | + LA(_TR0, rvtest_Sroot_pg_tbl) ;\ |
| 36 | + LI(_TR1, MODE) ;\ |
| 37 | + srli _TR0, _TR0, 12 ;\ |
| 38 | + or _TR0, _TR0, _TR1 ;\ |
| 39 | + csrw satp, _TR0 ;\ |
| 40 | + |
| 41 | +#define SETUP_PMP_SVADU_TEST(swreg, offset, TR0, TR1, TR2) \ |
| 42 | + li TR0, -1 ;\ |
| 43 | + csrw pmpaddr0, TR0 ;\ |
| 44 | + j PMP_exist ;\ |
| 45 | + li TR0, 0 ;\ |
| 46 | + li TR1, 0 ;\ |
| 47 | + j Mend_PMP ;\ |
| 48 | +PMP_exist: ;\ |
| 49 | + li TR1, PMP_TOR | PMP_X | PMP_W | PMP_R ;\ |
| 50 | + csrw pmpcfg0, TR1 ;\ |
| 51 | + csrr TR2, pmpcfg0 ;\ |
| 52 | + beq TR1, TR2, Mend_PMP ;\ |
| 53 | +no_TOR_try_NAPOT: ;\ |
| 54 | + li TR1, PMP_NAPOT | PMP_X | PMP_W | PMP_R ;\ |
| 55 | + csrw pmpcfg0, TR1 ;\ |
| 56 | + csrr TR2, pmpcfg0 ;\ |
| 57 | +Mend_PMP: ;\ |
| 58 | + RVTEST_SIGUPD(x1,TR0,offset) ;\ |
| 59 | + RVTEST_SIGUPD(x1,TR1,offset) ;\ |
| 60 | + |
| 61 | +#define TEST_SVADU(swreg, PTE_ADDR, VA, offset, menvcfgaddr, adue_bit) \ |
| 62 | + sfence.vma ;\ |
| 63 | + la t0, VA ;\ |
| 64 | + li t2, PTE_X | PTE_W | PTE_R ;\ |
| 65 | +1: ;\ |
| 66 | + LREG t1, (PTE_ADDR) ;\ |
| 67 | + andi t1, t1, ~(PTE_X | PTE_W | PTE_R | PTE_V) ;\ |
| 68 | + or t1, t1, t2 ;\ |
| 69 | + SREG t1, (PTE_ADDR) ;\ |
| 70 | + sfence.vma ;\ |
| 71 | + ;\ |
| 72 | + li t1, ((MSTATUS_MPP & ~(MSTATUS_MPP<<1)) * PRV_S) | MSTATUS_SUM | MSTATUS_MPRV ;\ |
| 73 | + csrs mstatus, t1 ;\ |
| 74 | + ;\ |
| 75 | + .align 2 ;\ |
| 76 | + SREG x0, (t0) ;\ |
| 77 | + unimp ;\ |
| 78 | + ;\ |
| 79 | + li t1, MSTATUS_MPRV ;\ |
| 80 | + csrc mstatus, t1 ;\ |
| 81 | + ;\ |
| 82 | + beqz t2, 2f ;\ |
| 83 | + addi t2, t2, -1 ;\ |
| 84 | + li t1, PTE_W | PTE_R | PTE_V ;\ |
| 85 | + bne t2, t1, 1b ;\ |
| 86 | + addi t2, t2, -1 ;\ |
| 87 | + j 1b ;\ |
| 88 | +2: ;\ |
| 89 | + li t0, MSTATUS_MPRV ;\ |
| 90 | + csrc mstatus, t0 ;\ |
| 91 | + LREG t0, (PTE_ADDR) ;\ |
| 92 | + and t0, t0, PTE_V | PTE_U | PTE_R | PTE_W | PTE_X | PTE_A | PTE_D ;\ |
| 93 | + RVTEST_SIGUPD(x1,t0,offset) ;\ |
| 94 | + ;\ |
| 95 | + LREG t0, (PTE_ADDR) ;\ |
| 96 | + andi t0, t0, ~(PTE_X | PTE_W | PTE_R | PTE_V | PTE_A | PTE_D | PTE_V) ;\ |
| 97 | + ori t0, t0, PTE_V | PTE_U | PTE_R | PTE_W | PTE_X | PTE_A ;\ |
| 98 | + SREG t0, (PTE_ADDR) ;\ |
| 99 | + sfence.vma ;\ |
| 100 | + ;\ |
| 101 | + la t0, VA ;\ |
| 102 | + li a1, ((MSTATUS_MPP & ~(MSTATUS_MPP<<1)) * PRV_S) | MSTATUS_SUM | MSTATUS_MPRV ;\ |
| 103 | + csrs mstatus, a1 ;\ |
| 104 | + ;\ |
| 105 | + .align 2 ;\ |
| 106 | + SREG x0, (t0) ;\ |
| 107 | + unimp ;\ |
| 108 | + ;\ |
| 109 | + li t0, MSTATUS_MPRV ;\ |
| 110 | + csrc mstatus, t0 ;\ |
| 111 | + ;\ |
| 112 | + LREG t0, (PTE_ADDR) ;\ |
| 113 | + and t0, t0, PTE_V | PTE_U | PTE_R | PTE_W | PTE_X | PTE_A | PTE_D ;\ |
| 114 | + RVTEST_SIGUPD(x1,t0,offset) ;\ |
| 115 | + ;\ |
| 116 | + LREG t0, (PTE_ADDR) ;\ |
| 117 | + andi t0, t0, ~(PTE_X | PTE_W | PTE_R | PTE_V | PTE_A | PTE_D | PTE_V) ;\ |
| 118 | + ori t0, t0, PTE_V | PTE_U | PTE_R | PTE_W | PTE_X | PTE_A | PTE_D ;\ |
| 119 | + SREG t0, (PTE_ADDR) ;\ |
| 120 | + sfence.vma ;\ |
| 121 | + la t0, VA ;\ |
| 122 | + li a1, ((MSTATUS_MPP & ~(MSTATUS_MPP<<1)) * PRV_S) | MSTATUS_SUM | MSTATUS_MPRV ;\ |
| 123 | + csrs mstatus, a1 ;\ |
| 124 | + ;\ |
| 125 | + SREG x0, (t0) ;\ |
| 126 | + j 3f ;\ |
| 127 | + unimp ;\ |
| 128 | +3: ;\ |
| 129 | + LREG t0, (PTE_ADDR) ;\ |
| 130 | + andi t0, t0, ~(PTE_D) ;\ |
| 131 | + SREG t0, (PTE_ADDR) ;\ |
| 132 | + sfence.vma ;\ |
| 133 | + ;\ |
| 134 | + li t0, adue_bit ;\ |
| 135 | + csrs menvcfgaddr, t0 ;\ |
| 136 | + ;\ |
| 137 | + la t0, VA ;\ |
| 138 | + li a1, ((MSTATUS_MPP & ~(MSTATUS_MPP<<1)) * PRV_S) | MSTATUS_SUM | MSTATUS_MPRV ;\ |
| 139 | + csrs mstatus, a1 ;\ |
| 140 | + ;\ |
| 141 | + .align 2 ;\ |
| 142 | + SREG x0, (t0) ;\ |
| 143 | + j 4f ;\ |
| 144 | + unimp ;\ |
| 145 | +4: ;\ |
| 146 | + li t0, MSTATUS_MPRV ;\ |
| 147 | + csrc mstatus, t0 ;\ |
| 148 | + ;\ |
| 149 | + LREG t0, (PTE_ADDR) ;\ |
| 150 | + and t0, t0, PTE_V | PTE_U | PTE_R | PTE_W | PTE_X | PTE_A | PTE_D ;\ |
| 151 | + RVTEST_SIGUPD(x1,t0,offset) |
| 152 | + |
| 153 | + |
33 | 154 | #define ALL_MEM_PMP ;\
|
34 | 155 | li t2, -1 ;\
|
35 | 156 | csrw pmpaddr0, t2 ;\
|
|
55 | 176 |
|
56 | 177 | //****NOTE: label `rvtest_Sroot_pg_tbl` must be declared after RVTEST_DATA_END
|
57 | 178 | // in the test aligned at 4kiB (use .align 12)
|
58 |
| - |
59 |
| -#define PTE_SETUP_RV32(_PAR, _PR, _TR0, _TR1, VA, level) ;\ |
60 |
| - srli _PAR, _PAR, 12 ;\ |
61 |
| - slli _PAR, _PAR, 10 ;\ |
62 |
| - or _PAR, _PAR, _PR ;\ |
63 |
| - .if (level==1) ;\ |
64 |
| - LA(_TR1, rvtest_Sroot_pg_tbl) ;\ |
65 |
| - .set vpn, ((VA>>22)&0x3FF)<<2 ;\ |
66 |
| - .endif ;\ |
67 |
| - .if (level==0) ;\ |
68 |
| - LA(_TR1, rvtest_slvl1_pg_tbl) ;\ |
69 |
| - .set vpn, ((VA>>12)&0x3FF)<<2 ;\ |
70 |
| - .endif ;\ |
71 |
| - LI(_TR0, vpn) ;\ |
72 |
| - add _TR1, _TR1, _TR0 ;\ |
| 179 | +#define PTE_SETUP_COMMON(_PAR, _PR, _TR0, _TR1, _VAR, level) ;\ |
| 180 | + srli _VAR, _VAR, (RISCV_PGLEVEL_BITS * level + RISCV_PGSHIFT) ;\ |
| 181 | + srli _PAR, _PAR, (RISCV_PGLEVEL_BITS * level + RISCV_PGSHIFT) ;\ |
| 182 | + slli _PAR, _PAR, (RISCV_PGLEVEL_BITS * level + RISCV_PGSHIFT) ;\ |
| 183 | + LI(_TR0, ((1 << RISCV_PGLEVEL_BITS) - 1)) ;\ |
| 184 | + and _VAR, _VAR, _TR0 ;\ |
| 185 | + slli _VAR, _VAR, ((XLEN >> 5)+1) ;\ |
| 186 | + add _TR1, _TR1, _VAR ;\ |
| 187 | + srli _PAR, _PAR, 12 ;\ |
| 188 | + slli _PAR, _PAR, 10 ;\ |
| 189 | + or _PAR, _PAR, _PR ;\ |
73 | 190 | SREG _PAR, 0(_TR1);
|
74 | 191 |
|
| 192 | +#define PTE_SETUP_SV32(_PAR, _PR, _TR0, _TR1, _VAR, level) ;\ |
| 193 | + .if (level==1) ;\ |
| 194 | + LA(_TR1, rvtest_Sroot_pg_tbl) ;\ |
| 195 | + .endif ;\ |
| 196 | + .if (level==0) ;\ |
| 197 | + LA(_TR1, rvtest_slvl1_pg_tbl) ;\ |
| 198 | + .endif ;\ |
| 199 | + PTE_SETUP_COMMON(_PAR, _PR, _TR0, _TR1, _VAR, level) |
| 200 | + |
| 201 | +#define PTE_SETUP_SV39(_PAR, _PR, _TR0, _TR1, _VAR, level) ;\ |
| 202 | + .if (level==2) ;\ |
| 203 | + LA(_TR1, rvtest_Sroot_pg_tbl) ;\ |
| 204 | + .endif ;\ |
| 205 | + .if (level==1) ;\ |
| 206 | + LA(_TR1, rvtest_slvl2_pg_tbl) ;\ |
| 207 | + .endif ;\ |
| 208 | + .if (level==0) ;\ |
| 209 | + LA(_TR1, rvtest_slvl1_pg_tbl) ;\ |
| 210 | + .endif ;\ |
| 211 | + PTE_SETUP_COMMON(_PAR, _PR, _TR0, _TR1, _VAR, level) |
| 212 | + |
| 213 | +#define PTE_SETUP_SV48(_PAR, _PR, _TR0, _TR1, _VAR, level) ;\ |
| 214 | + .if (level==3) ;\ |
| 215 | + LA(_TR1, rvtest_Sroot_pg_tbl) ;\ |
| 216 | + .endif ;\ |
| 217 | + .if (level==2) ;\ |
| 218 | + LA(_TR1, rvtest_slvl3_pg_tbl) ;\ |
| 219 | + .endif ;\ |
| 220 | + .if (level==1) ;\ |
| 221 | + LA(_TR1, rvtest_slvl2_pg_tbl) ;\ |
| 222 | + .endif ;\ |
| 223 | + .if (level==0) ;\ |
| 224 | + LA(_TR1, rvtest_slvl1_pg_tbl) ;\ |
| 225 | + .endif ;\ |
| 226 | + PTE_SETUP_COMMON(_PAR, _PR, _TR0, _TR1, _VAR, level) |
| 227 | + |
| 228 | +#define PTE_SETUP_SV57(_PAR, _PR, _TR0, _TR1, _VAR, level) ;\ |
| 229 | + .if (level==4) ;\ |
| 230 | + LA(_TR1, rvtest_Sroot_pg_tbl) ;\ |
| 231 | + .endif ;\ |
| 232 | + .if (level==3) ;\ |
| 233 | + LA(_TR1, rvtest_slvl4_pg_tbl) ;\ |
| 234 | + .endif ;\ |
| 235 | + .if (level==2) ;\ |
| 236 | + LA(_TR1, rvtest_slvl3_pg_tbl) ;\ |
| 237 | + .endif ;\ |
| 238 | + .if (level==1) ;\ |
| 239 | + LA(_TR1, rvtest_slvl2_pg_tbl) ;\ |
| 240 | + .endif ;\ |
| 241 | + .if (level==0) ;\ |
| 242 | + LA(_TR1, rvtest_slvl1_pg_tbl) ;\ |
| 243 | + .endif ;\ |
| 244 | + PTE_SETUP_COMMON(_PAR, _PR, _TR0, _TR1, _VAR, level) |
| 245 | + |
| 246 | + |
75 | 247 | #define PTE_SETUP_RV64(_PAR, _PR, _TR0, _TR1, VA, level, mode) ;\
|
76 | 248 | srli _PAR, _PAR, 12 ;\
|
77 | 249 | slli _PAR, _PAR, 10 ;\
|
|
151 | 323 | or _TR0, _TR0, _PR ;\
|
152 | 324 | SREG _TR0, 0(_TR1) ;
|
153 | 325 |
|
| 326 | + |
154 | 327 | #define SATP_SETUP_SV32 ;\
|
155 | 328 | LA(t6, rvtest_Sroot_pg_tbl) ;\
|
156 | 329 | LI(t5, SATP32_MODE) ;\
|
|
189 | 362 | RVTEST_SIGUPD(sigptr, destreg) /* write original AMO val */
|
190 | 363 |
|
191 | 364 |
|
192 |
| - |
193 | 365 | #define NAN_BOXED(__val__,__width__,__max__) ;\
|
194 | 366 | .if __width__ == 16 ;\
|
195 | 367 | .hword __val__ ;\
|
@@ -1099,6 +1271,7 @@ ADDI(swreg, swreg, RVMODEL_CBZ_BLOCKSIZE)
|
1099 | 1271 | sub x1,x1,tempreg ;\
|
1100 | 1272 | RVTEST_SIGUPD(swreg,x1,offset)
|
1101 | 1273 |
|
| 1274 | + |
1102 | 1275 | // for updating signatures of Zacas paired destination register (RV32/RV64).
|
1103 | 1276 | #define RVTEST_SIGUPD_PZACAS(_BR,_R1,_R2,...) ;\
|
1104 | 1277 | .if NARG(__VA_ARGS__) == 1 ;\
|
|
0 commit comments