1 /* 2 * RISC-V Control and Status Registers. 3 * 4 * Copyright (c) 2016-2017 Sagar Karandikar, sagark@eecs.berkeley.edu 5 * Copyright (c) 2017-2018 SiFive, Inc. 6 * 7 * This program is free software; you can redistribute it and/or modify it 8 * under the terms and conditions of the GNU General Public License, 9 * version 2 or later, as published by the Free Software Foundation. 10 * 11 * This program is distributed in the hope it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 14 * more details. 15 * 16 * You should have received a copy of the GNU General Public License along with 17 * this program. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 #include "qemu/osdep.h" 21 #include "qemu/log.h" 22 #include "cpu.h" 23 #include "qemu/main-loop.h" 24 #include "exec/exec-all.h" 25 26 /* CSR function table public API */ 27 void riscv_get_csr_ops(int csrno, riscv_csr_operations *ops) 28 { 29 *ops = csr_ops[csrno & (CSR_TABLE_SIZE - 1)]; 30 } 31 32 void riscv_set_csr_ops(int csrno, riscv_csr_operations *ops) 33 { 34 csr_ops[csrno & (CSR_TABLE_SIZE - 1)] = *ops; 35 } 36 37 /* Predicates */ 38 static RISCVException fs(CPURISCVState *env, int csrno) 39 { 40 #if !defined(CONFIG_USER_ONLY) 41 if (!env->debugger && !riscv_cpu_fp_enabled(env)) { 42 return RISCV_EXCP_ILLEGAL_INST; 43 } 44 #endif 45 return RISCV_EXCP_NONE; 46 } 47 48 static RISCVException vs(CPURISCVState *env, int csrno) 49 { 50 if (env->misa_ext & RVV) { 51 #if !defined(CONFIG_USER_ONLY) 52 if (!env->debugger && !riscv_cpu_vector_enabled(env)) { 53 return RISCV_EXCP_ILLEGAL_INST; 54 } 55 #endif 56 return RISCV_EXCP_NONE; 57 } 58 return RISCV_EXCP_ILLEGAL_INST; 59 } 60 61 static RISCVException ctr(CPURISCVState *env, int csrno) 62 { 63 #if !defined(CONFIG_USER_ONLY) 64 CPUState *cs = env_cpu(env); 65 RISCVCPU *cpu = RISCV_CPU(cs); 66 67 if (!cpu->cfg.ext_counters) { 68 /* The Counters extensions is not enabled */ 69 return RISCV_EXCP_ILLEGAL_INST; 70 } 71 72 if (riscv_cpu_virt_enabled(env)) { 73 switch (csrno) { 74 case CSR_CYCLE: 75 if (!get_field(env->hcounteren, COUNTEREN_CY) && 76 get_field(env->mcounteren, COUNTEREN_CY)) { 77 return RISCV_EXCP_VIRT_INSTRUCTION_FAULT; 78 } 79 break; 80 case CSR_TIME: 81 if (!get_field(env->hcounteren, COUNTEREN_TM) && 82 get_field(env->mcounteren, COUNTEREN_TM)) { 83 return RISCV_EXCP_VIRT_INSTRUCTION_FAULT; 84 } 85 break; 86 case CSR_INSTRET: 87 if (!get_field(env->hcounteren, COUNTEREN_IR) && 88 get_field(env->mcounteren, COUNTEREN_IR)) { 89 return RISCV_EXCP_VIRT_INSTRUCTION_FAULT; 90 } 91 break; 92 case CSR_HPMCOUNTER3...CSR_HPMCOUNTER31: 93 if (!get_field(env->hcounteren, 1 << (csrno - CSR_HPMCOUNTER3)) && 94 get_field(env->mcounteren, 1 << (csrno - CSR_HPMCOUNTER3))) { 95 return RISCV_EXCP_VIRT_INSTRUCTION_FAULT; 96 } 97 break; 98 } 99 if (riscv_cpu_mxl(env) == MXL_RV32) { 100 switch (csrno) { 101 case CSR_CYCLEH: 102 if (!get_field(env->hcounteren, COUNTEREN_CY) && 103 get_field(env->mcounteren, COUNTEREN_CY)) { 104 return RISCV_EXCP_VIRT_INSTRUCTION_FAULT; 105 } 106 break; 107 case CSR_TIMEH: 108 if (!get_field(env->hcounteren, COUNTEREN_TM) && 109 get_field(env->mcounteren, COUNTEREN_TM)) { 110 return RISCV_EXCP_VIRT_INSTRUCTION_FAULT; 111 } 112 break; 113 case CSR_INSTRETH: 114 if (!get_field(env->hcounteren, COUNTEREN_IR) && 115 get_field(env->mcounteren, COUNTEREN_IR)) { 116 return RISCV_EXCP_VIRT_INSTRUCTION_FAULT; 117 } 118 break; 119 case CSR_HPMCOUNTER3H...CSR_HPMCOUNTER31H: 120 if (!get_field(env->hcounteren, 1 << (csrno - CSR_HPMCOUNTER3H)) && 121 get_field(env->mcounteren, 1 << (csrno - CSR_HPMCOUNTER3H))) { 122 return RISCV_EXCP_VIRT_INSTRUCTION_FAULT; 123 } 124 break; 125 } 126 } 127 } 128 #endif 129 return RISCV_EXCP_NONE; 130 } 131 132 static RISCVException ctr32(CPURISCVState *env, int csrno) 133 { 134 if (riscv_cpu_mxl(env) != MXL_RV32) { 135 return RISCV_EXCP_ILLEGAL_INST; 136 } 137 138 return ctr(env, csrno); 139 } 140 141 #if !defined(CONFIG_USER_ONLY) 142 static RISCVException any(CPURISCVState *env, int csrno) 143 { 144 return RISCV_EXCP_NONE; 145 } 146 147 static RISCVException any32(CPURISCVState *env, int csrno) 148 { 149 if (riscv_cpu_mxl(env) != MXL_RV32) { 150 return RISCV_EXCP_ILLEGAL_INST; 151 } 152 153 return any(env, csrno); 154 155 } 156 157 static RISCVException smode(CPURISCVState *env, int csrno) 158 { 159 if (riscv_has_ext(env, RVS)) { 160 return RISCV_EXCP_NONE; 161 } 162 163 return RISCV_EXCP_ILLEGAL_INST; 164 } 165 166 static RISCVException hmode(CPURISCVState *env, int csrno) 167 { 168 if (riscv_has_ext(env, RVS) && 169 riscv_has_ext(env, RVH)) { 170 /* Hypervisor extension is supported */ 171 if ((env->priv == PRV_S && !riscv_cpu_virt_enabled(env)) || 172 env->priv == PRV_M) { 173 return RISCV_EXCP_NONE; 174 } else { 175 return RISCV_EXCP_VIRT_INSTRUCTION_FAULT; 176 } 177 } 178 179 return RISCV_EXCP_ILLEGAL_INST; 180 } 181 182 static RISCVException hmode32(CPURISCVState *env, int csrno) 183 { 184 if (riscv_cpu_mxl(env) != MXL_RV32) { 185 if (riscv_cpu_virt_enabled(env)) { 186 return RISCV_EXCP_ILLEGAL_INST; 187 } else { 188 return RISCV_EXCP_VIRT_INSTRUCTION_FAULT; 189 } 190 } 191 192 return hmode(env, csrno); 193 194 } 195 196 /* Checks if PointerMasking registers could be accessed */ 197 static RISCVException pointer_masking(CPURISCVState *env, int csrno) 198 { 199 /* Check if j-ext is present */ 200 if (riscv_has_ext(env, RVJ)) { 201 return RISCV_EXCP_NONE; 202 } 203 return RISCV_EXCP_ILLEGAL_INST; 204 } 205 206 static RISCVException pmp(CPURISCVState *env, int csrno) 207 { 208 if (riscv_feature(env, RISCV_FEATURE_PMP)) { 209 return RISCV_EXCP_NONE; 210 } 211 212 return RISCV_EXCP_ILLEGAL_INST; 213 } 214 215 static RISCVException epmp(CPURISCVState *env, int csrno) 216 { 217 if (env->priv == PRV_M && riscv_feature(env, RISCV_FEATURE_EPMP)) { 218 return RISCV_EXCP_NONE; 219 } 220 221 return RISCV_EXCP_ILLEGAL_INST; 222 } 223 #endif 224 225 /* User Floating-Point CSRs */ 226 static RISCVException read_fflags(CPURISCVState *env, int csrno, 227 target_ulong *val) 228 { 229 *val = riscv_cpu_get_fflags(env); 230 return RISCV_EXCP_NONE; 231 } 232 233 static RISCVException write_fflags(CPURISCVState *env, int csrno, 234 target_ulong val) 235 { 236 #if !defined(CONFIG_USER_ONLY) 237 env->mstatus |= MSTATUS_FS; 238 #endif 239 riscv_cpu_set_fflags(env, val & (FSR_AEXC >> FSR_AEXC_SHIFT)); 240 return RISCV_EXCP_NONE; 241 } 242 243 static RISCVException read_frm(CPURISCVState *env, int csrno, 244 target_ulong *val) 245 { 246 *val = env->frm; 247 return RISCV_EXCP_NONE; 248 } 249 250 static RISCVException write_frm(CPURISCVState *env, int csrno, 251 target_ulong val) 252 { 253 #if !defined(CONFIG_USER_ONLY) 254 env->mstatus |= MSTATUS_FS; 255 #endif 256 env->frm = val & (FSR_RD >> FSR_RD_SHIFT); 257 return RISCV_EXCP_NONE; 258 } 259 260 static RISCVException read_fcsr(CPURISCVState *env, int csrno, 261 target_ulong *val) 262 { 263 *val = (riscv_cpu_get_fflags(env) << FSR_AEXC_SHIFT) 264 | (env->frm << FSR_RD_SHIFT); 265 return RISCV_EXCP_NONE; 266 } 267 268 static RISCVException write_fcsr(CPURISCVState *env, int csrno, 269 target_ulong val) 270 { 271 #if !defined(CONFIG_USER_ONLY) 272 env->mstatus |= MSTATUS_FS; 273 #endif 274 env->frm = (val & FSR_RD) >> FSR_RD_SHIFT; 275 riscv_cpu_set_fflags(env, (val & FSR_AEXC) >> FSR_AEXC_SHIFT); 276 return RISCV_EXCP_NONE; 277 } 278 279 static RISCVException read_vtype(CPURISCVState *env, int csrno, 280 target_ulong *val) 281 { 282 *val = env->vtype; 283 return RISCV_EXCP_NONE; 284 } 285 286 static RISCVException read_vl(CPURISCVState *env, int csrno, 287 target_ulong *val) 288 { 289 *val = env->vl; 290 return RISCV_EXCP_NONE; 291 } 292 293 static int read_vlenb(CPURISCVState *env, int csrno, target_ulong *val) 294 { 295 *val = env_archcpu(env)->cfg.vlen >> 3; 296 return RISCV_EXCP_NONE; 297 } 298 299 static RISCVException read_vxrm(CPURISCVState *env, int csrno, 300 target_ulong *val) 301 { 302 *val = env->vxrm; 303 return RISCV_EXCP_NONE; 304 } 305 306 static RISCVException write_vxrm(CPURISCVState *env, int csrno, 307 target_ulong val) 308 { 309 #if !defined(CONFIG_USER_ONLY) 310 env->mstatus |= MSTATUS_VS; 311 #endif 312 env->vxrm = val; 313 return RISCV_EXCP_NONE; 314 } 315 316 static RISCVException read_vxsat(CPURISCVState *env, int csrno, 317 target_ulong *val) 318 { 319 *val = env->vxsat; 320 return RISCV_EXCP_NONE; 321 } 322 323 static RISCVException write_vxsat(CPURISCVState *env, int csrno, 324 target_ulong val) 325 { 326 #if !defined(CONFIG_USER_ONLY) 327 env->mstatus |= MSTATUS_VS; 328 #endif 329 env->vxsat = val; 330 return RISCV_EXCP_NONE; 331 } 332 333 static RISCVException read_vstart(CPURISCVState *env, int csrno, 334 target_ulong *val) 335 { 336 *val = env->vstart; 337 return RISCV_EXCP_NONE; 338 } 339 340 static RISCVException write_vstart(CPURISCVState *env, int csrno, 341 target_ulong val) 342 { 343 #if !defined(CONFIG_USER_ONLY) 344 env->mstatus |= MSTATUS_VS; 345 #endif 346 /* 347 * The vstart CSR is defined to have only enough writable bits 348 * to hold the largest element index, i.e. lg2(VLEN) bits. 349 */ 350 env->vstart = val & ~(~0ULL << ctzl(env_archcpu(env)->cfg.vlen)); 351 return RISCV_EXCP_NONE; 352 } 353 354 static int read_vcsr(CPURISCVState *env, int csrno, target_ulong *val) 355 { 356 *val = (env->vxrm << VCSR_VXRM_SHIFT) | (env->vxsat << VCSR_VXSAT_SHIFT); 357 return RISCV_EXCP_NONE; 358 } 359 360 static int write_vcsr(CPURISCVState *env, int csrno, target_ulong val) 361 { 362 #if !defined(CONFIG_USER_ONLY) 363 env->mstatus |= MSTATUS_VS; 364 #endif 365 env->vxrm = (val & VCSR_VXRM) >> VCSR_VXRM_SHIFT; 366 env->vxsat = (val & VCSR_VXSAT) >> VCSR_VXSAT_SHIFT; 367 return RISCV_EXCP_NONE; 368 } 369 370 /* User Timers and Counters */ 371 static RISCVException read_instret(CPURISCVState *env, int csrno, 372 target_ulong *val) 373 { 374 #if !defined(CONFIG_USER_ONLY) 375 if (icount_enabled()) { 376 *val = icount_get(); 377 } else { 378 *val = cpu_get_host_ticks(); 379 } 380 #else 381 *val = cpu_get_host_ticks(); 382 #endif 383 return RISCV_EXCP_NONE; 384 } 385 386 static RISCVException read_instreth(CPURISCVState *env, int csrno, 387 target_ulong *val) 388 { 389 #if !defined(CONFIG_USER_ONLY) 390 if (icount_enabled()) { 391 *val = icount_get() >> 32; 392 } else { 393 *val = cpu_get_host_ticks() >> 32; 394 } 395 #else 396 *val = cpu_get_host_ticks() >> 32; 397 #endif 398 return RISCV_EXCP_NONE; 399 } 400 401 #if defined(CONFIG_USER_ONLY) 402 static RISCVException read_time(CPURISCVState *env, int csrno, 403 target_ulong *val) 404 { 405 *val = cpu_get_host_ticks(); 406 return RISCV_EXCP_NONE; 407 } 408 409 static RISCVException read_timeh(CPURISCVState *env, int csrno, 410 target_ulong *val) 411 { 412 *val = cpu_get_host_ticks() >> 32; 413 return RISCV_EXCP_NONE; 414 } 415 416 #else /* CONFIG_USER_ONLY */ 417 418 static RISCVException read_time(CPURISCVState *env, int csrno, 419 target_ulong *val) 420 { 421 uint64_t delta = riscv_cpu_virt_enabled(env) ? env->htimedelta : 0; 422 423 if (!env->rdtime_fn) { 424 return RISCV_EXCP_ILLEGAL_INST; 425 } 426 427 *val = env->rdtime_fn(env->rdtime_fn_arg) + delta; 428 return RISCV_EXCP_NONE; 429 } 430 431 static RISCVException read_timeh(CPURISCVState *env, int csrno, 432 target_ulong *val) 433 { 434 uint64_t delta = riscv_cpu_virt_enabled(env) ? env->htimedelta : 0; 435 436 if (!env->rdtime_fn) { 437 return RISCV_EXCP_ILLEGAL_INST; 438 } 439 440 *val = (env->rdtime_fn(env->rdtime_fn_arg) + delta) >> 32; 441 return RISCV_EXCP_NONE; 442 } 443 444 /* Machine constants */ 445 446 #define M_MODE_INTERRUPTS (MIP_MSIP | MIP_MTIP | MIP_MEIP) 447 #define S_MODE_INTERRUPTS (MIP_SSIP | MIP_STIP | MIP_SEIP) 448 #define VS_MODE_INTERRUPTS (MIP_VSSIP | MIP_VSTIP | MIP_VSEIP) 449 450 static const target_ulong delegable_ints = S_MODE_INTERRUPTS | 451 VS_MODE_INTERRUPTS; 452 static const target_ulong vs_delegable_ints = VS_MODE_INTERRUPTS; 453 static const target_ulong all_ints = M_MODE_INTERRUPTS | S_MODE_INTERRUPTS | 454 VS_MODE_INTERRUPTS; 455 #define DELEGABLE_EXCPS ((1ULL << (RISCV_EXCP_INST_ADDR_MIS)) | \ 456 (1ULL << (RISCV_EXCP_INST_ACCESS_FAULT)) | \ 457 (1ULL << (RISCV_EXCP_ILLEGAL_INST)) | \ 458 (1ULL << (RISCV_EXCP_BREAKPOINT)) | \ 459 (1ULL << (RISCV_EXCP_LOAD_ADDR_MIS)) | \ 460 (1ULL << (RISCV_EXCP_LOAD_ACCESS_FAULT)) | \ 461 (1ULL << (RISCV_EXCP_STORE_AMO_ADDR_MIS)) | \ 462 (1ULL << (RISCV_EXCP_STORE_AMO_ACCESS_FAULT)) | \ 463 (1ULL << (RISCV_EXCP_U_ECALL)) | \ 464 (1ULL << (RISCV_EXCP_S_ECALL)) | \ 465 (1ULL << (RISCV_EXCP_VS_ECALL)) | \ 466 (1ULL << (RISCV_EXCP_M_ECALL)) | \ 467 (1ULL << (RISCV_EXCP_INST_PAGE_FAULT)) | \ 468 (1ULL << (RISCV_EXCP_LOAD_PAGE_FAULT)) | \ 469 (1ULL << (RISCV_EXCP_STORE_PAGE_FAULT)) | \ 470 (1ULL << (RISCV_EXCP_INST_GUEST_PAGE_FAULT)) | \ 471 (1ULL << (RISCV_EXCP_LOAD_GUEST_ACCESS_FAULT)) | \ 472 (1ULL << (RISCV_EXCP_VIRT_INSTRUCTION_FAULT)) | \ 473 (1ULL << (RISCV_EXCP_STORE_GUEST_AMO_ACCESS_FAULT))) 474 static const target_ulong vs_delegable_excps = DELEGABLE_EXCPS & 475 ~((1ULL << (RISCV_EXCP_S_ECALL)) | 476 (1ULL << (RISCV_EXCP_VS_ECALL)) | 477 (1ULL << (RISCV_EXCP_M_ECALL)) | 478 (1ULL << (RISCV_EXCP_INST_GUEST_PAGE_FAULT)) | 479 (1ULL << (RISCV_EXCP_LOAD_GUEST_ACCESS_FAULT)) | 480 (1ULL << (RISCV_EXCP_VIRT_INSTRUCTION_FAULT)) | 481 (1ULL << (RISCV_EXCP_STORE_GUEST_AMO_ACCESS_FAULT))); 482 static const target_ulong sstatus_v1_10_mask = SSTATUS_SIE | SSTATUS_SPIE | 483 SSTATUS_UIE | SSTATUS_UPIE | SSTATUS_SPP | SSTATUS_FS | SSTATUS_XS | 484 SSTATUS_SUM | SSTATUS_MXR | SSTATUS_VS; 485 static const target_ulong sip_writable_mask = SIP_SSIP | MIP_USIP | MIP_UEIP; 486 static const target_ulong hip_writable_mask = MIP_VSSIP; 487 static const target_ulong hvip_writable_mask = MIP_VSSIP | MIP_VSTIP | MIP_VSEIP; 488 static const target_ulong vsip_writable_mask = MIP_VSSIP; 489 490 static const char valid_vm_1_10_32[16] = { 491 [VM_1_10_MBARE] = 1, 492 [VM_1_10_SV32] = 1 493 }; 494 495 static const char valid_vm_1_10_64[16] = { 496 [VM_1_10_MBARE] = 1, 497 [VM_1_10_SV39] = 1, 498 [VM_1_10_SV48] = 1, 499 [VM_1_10_SV57] = 1 500 }; 501 502 /* Machine Information Registers */ 503 static RISCVException read_zero(CPURISCVState *env, int csrno, 504 target_ulong *val) 505 { 506 *val = 0; 507 return RISCV_EXCP_NONE; 508 } 509 510 static RISCVException read_mhartid(CPURISCVState *env, int csrno, 511 target_ulong *val) 512 { 513 *val = env->mhartid; 514 return RISCV_EXCP_NONE; 515 } 516 517 /* Machine Trap Setup */ 518 519 /* We do not store SD explicitly, only compute it on demand. */ 520 static uint64_t add_status_sd(RISCVMXL xl, uint64_t status) 521 { 522 if ((status & MSTATUS_FS) == MSTATUS_FS || 523 (status & MSTATUS_VS) == MSTATUS_VS || 524 (status & MSTATUS_XS) == MSTATUS_XS) { 525 switch (xl) { 526 case MXL_RV32: 527 return status | MSTATUS32_SD; 528 case MXL_RV64: 529 return status | MSTATUS64_SD; 530 default: 531 g_assert_not_reached(); 532 } 533 } 534 return status; 535 } 536 537 static RISCVException read_mstatus(CPURISCVState *env, int csrno, 538 target_ulong *val) 539 { 540 *val = add_status_sd(riscv_cpu_mxl(env), env->mstatus); 541 return RISCV_EXCP_NONE; 542 } 543 544 static int validate_vm(CPURISCVState *env, target_ulong vm) 545 { 546 if (riscv_cpu_mxl(env) == MXL_RV32) { 547 return valid_vm_1_10_32[vm & 0xf]; 548 } else { 549 return valid_vm_1_10_64[vm & 0xf]; 550 } 551 } 552 553 static RISCVException write_mstatus(CPURISCVState *env, int csrno, 554 target_ulong val) 555 { 556 uint64_t mstatus = env->mstatus; 557 uint64_t mask = 0; 558 559 /* flush tlb on mstatus fields that affect VM */ 560 if ((val ^ mstatus) & (MSTATUS_MXR | MSTATUS_MPP | MSTATUS_MPV | 561 MSTATUS_MPRV | MSTATUS_SUM)) { 562 tlb_flush(env_cpu(env)); 563 } 564 mask = MSTATUS_SIE | MSTATUS_SPIE | MSTATUS_MIE | MSTATUS_MPIE | 565 MSTATUS_SPP | MSTATUS_FS | MSTATUS_MPRV | MSTATUS_SUM | 566 MSTATUS_MPP | MSTATUS_MXR | MSTATUS_TVM | MSTATUS_TSR | 567 MSTATUS_TW | MSTATUS_VS; 568 569 if (riscv_cpu_mxl(env) != MXL_RV32) { 570 /* 571 * RV32: MPV and GVA are not in mstatus. The current plan is to 572 * add them to mstatush. For now, we just don't support it. 573 */ 574 mask |= MSTATUS_MPV | MSTATUS_GVA; 575 } 576 577 mstatus = (mstatus & ~mask) | (val & mask); 578 579 if (riscv_cpu_mxl(env) == MXL_RV64) { 580 /* SXL and UXL fields are for now read only */ 581 mstatus = set_field(mstatus, MSTATUS64_SXL, MXL_RV64); 582 mstatus = set_field(mstatus, MSTATUS64_UXL, MXL_RV64); 583 } 584 env->mstatus = mstatus; 585 586 return RISCV_EXCP_NONE; 587 } 588 589 static RISCVException read_mstatush(CPURISCVState *env, int csrno, 590 target_ulong *val) 591 { 592 *val = env->mstatus >> 32; 593 return RISCV_EXCP_NONE; 594 } 595 596 static RISCVException write_mstatush(CPURISCVState *env, int csrno, 597 target_ulong val) 598 { 599 uint64_t valh = (uint64_t)val << 32; 600 uint64_t mask = MSTATUS_MPV | MSTATUS_GVA; 601 602 if ((valh ^ env->mstatus) & (MSTATUS_MPV)) { 603 tlb_flush(env_cpu(env)); 604 } 605 606 env->mstatus = (env->mstatus & ~mask) | (valh & mask); 607 608 return RISCV_EXCP_NONE; 609 } 610 611 static RISCVException read_misa(CPURISCVState *env, int csrno, 612 target_ulong *val) 613 { 614 target_ulong misa; 615 616 switch (env->misa_mxl) { 617 case MXL_RV32: 618 misa = (target_ulong)MXL_RV32 << 30; 619 break; 620 #ifdef TARGET_RISCV64 621 case MXL_RV64: 622 misa = (target_ulong)MXL_RV64 << 62; 623 break; 624 #endif 625 default: 626 g_assert_not_reached(); 627 } 628 629 *val = misa | env->misa_ext; 630 return RISCV_EXCP_NONE; 631 } 632 633 static RISCVException write_misa(CPURISCVState *env, int csrno, 634 target_ulong val) 635 { 636 if (!riscv_feature(env, RISCV_FEATURE_MISA)) { 637 /* drop write to misa */ 638 return RISCV_EXCP_NONE; 639 } 640 641 /* 'I' or 'E' must be present */ 642 if (!(val & (RVI | RVE))) { 643 /* It is not, drop write to misa */ 644 return RISCV_EXCP_NONE; 645 } 646 647 /* 'E' excludes all other extensions */ 648 if (val & RVE) { 649 /* when we support 'E' we can do "val = RVE;" however 650 * for now we just drop writes if 'E' is present. 651 */ 652 return RISCV_EXCP_NONE; 653 } 654 655 /* 656 * misa.MXL writes are not supported by QEMU. 657 * Drop writes to those bits. 658 */ 659 660 /* Mask extensions that are not supported by this hart */ 661 val &= env->misa_ext_mask; 662 663 /* Mask extensions that are not supported by QEMU */ 664 val &= (RVI | RVE | RVM | RVA | RVF | RVD | RVC | RVS | RVU | RVV); 665 666 /* 'D' depends on 'F', so clear 'D' if 'F' is not present */ 667 if ((val & RVD) && !(val & RVF)) { 668 val &= ~RVD; 669 } 670 671 /* Suppress 'C' if next instruction is not aligned 672 * TODO: this should check next_pc 673 */ 674 if ((val & RVC) && (GETPC() & ~3) != 0) { 675 val &= ~RVC; 676 } 677 678 /* If nothing changed, do nothing. */ 679 if (val == env->misa_ext) { 680 return RISCV_EXCP_NONE; 681 } 682 683 /* flush translation cache */ 684 tb_flush(env_cpu(env)); 685 env->misa_ext = val; 686 return RISCV_EXCP_NONE; 687 } 688 689 static RISCVException read_medeleg(CPURISCVState *env, int csrno, 690 target_ulong *val) 691 { 692 *val = env->medeleg; 693 return RISCV_EXCP_NONE; 694 } 695 696 static RISCVException write_medeleg(CPURISCVState *env, int csrno, 697 target_ulong val) 698 { 699 env->medeleg = (env->medeleg & ~DELEGABLE_EXCPS) | (val & DELEGABLE_EXCPS); 700 return RISCV_EXCP_NONE; 701 } 702 703 static RISCVException read_mideleg(CPURISCVState *env, int csrno, 704 target_ulong *val) 705 { 706 *val = env->mideleg; 707 return RISCV_EXCP_NONE; 708 } 709 710 static RISCVException write_mideleg(CPURISCVState *env, int csrno, 711 target_ulong val) 712 { 713 env->mideleg = (env->mideleg & ~delegable_ints) | (val & delegable_ints); 714 if (riscv_has_ext(env, RVH)) { 715 env->mideleg |= VS_MODE_INTERRUPTS; 716 } 717 return RISCV_EXCP_NONE; 718 } 719 720 static RISCVException read_mie(CPURISCVState *env, int csrno, 721 target_ulong *val) 722 { 723 *val = env->mie; 724 return RISCV_EXCP_NONE; 725 } 726 727 static RISCVException write_mie(CPURISCVState *env, int csrno, 728 target_ulong val) 729 { 730 env->mie = (env->mie & ~all_ints) | (val & all_ints); 731 return RISCV_EXCP_NONE; 732 } 733 734 static RISCVException read_mtvec(CPURISCVState *env, int csrno, 735 target_ulong *val) 736 { 737 *val = env->mtvec; 738 return RISCV_EXCP_NONE; 739 } 740 741 static RISCVException write_mtvec(CPURISCVState *env, int csrno, 742 target_ulong val) 743 { 744 /* bits [1:0] encode mode; 0 = direct, 1 = vectored, 2 >= reserved */ 745 if ((val & 3) < 2) { 746 env->mtvec = val; 747 } else { 748 qemu_log_mask(LOG_UNIMP, "CSR_MTVEC: reserved mode not supported\n"); 749 } 750 return RISCV_EXCP_NONE; 751 } 752 753 static RISCVException read_mcounteren(CPURISCVState *env, int csrno, 754 target_ulong *val) 755 { 756 *val = env->mcounteren; 757 return RISCV_EXCP_NONE; 758 } 759 760 static RISCVException write_mcounteren(CPURISCVState *env, int csrno, 761 target_ulong val) 762 { 763 env->mcounteren = val; 764 return RISCV_EXCP_NONE; 765 } 766 767 /* Machine Trap Handling */ 768 static RISCVException read_mscratch(CPURISCVState *env, int csrno, 769 target_ulong *val) 770 { 771 *val = env->mscratch; 772 return RISCV_EXCP_NONE; 773 } 774 775 static RISCVException write_mscratch(CPURISCVState *env, int csrno, 776 target_ulong val) 777 { 778 env->mscratch = val; 779 return RISCV_EXCP_NONE; 780 } 781 782 static RISCVException read_mepc(CPURISCVState *env, int csrno, 783 target_ulong *val) 784 { 785 *val = env->mepc; 786 return RISCV_EXCP_NONE; 787 } 788 789 static RISCVException write_mepc(CPURISCVState *env, int csrno, 790 target_ulong val) 791 { 792 env->mepc = val; 793 return RISCV_EXCP_NONE; 794 } 795 796 static RISCVException read_mcause(CPURISCVState *env, int csrno, 797 target_ulong *val) 798 { 799 *val = env->mcause; 800 return RISCV_EXCP_NONE; 801 } 802 803 static RISCVException write_mcause(CPURISCVState *env, int csrno, 804 target_ulong val) 805 { 806 env->mcause = val; 807 return RISCV_EXCP_NONE; 808 } 809 810 static RISCVException read_mtval(CPURISCVState *env, int csrno, 811 target_ulong *val) 812 { 813 *val = env->mtval; 814 return RISCV_EXCP_NONE; 815 } 816 817 static RISCVException write_mtval(CPURISCVState *env, int csrno, 818 target_ulong val) 819 { 820 env->mtval = val; 821 return RISCV_EXCP_NONE; 822 } 823 824 static RISCVException rmw_mip(CPURISCVState *env, int csrno, 825 target_ulong *ret_value, 826 target_ulong new_value, target_ulong write_mask) 827 { 828 RISCVCPU *cpu = env_archcpu(env); 829 /* Allow software control of delegable interrupts not claimed by hardware */ 830 target_ulong mask = write_mask & delegable_ints & ~env->miclaim; 831 uint32_t old_mip; 832 833 if (mask) { 834 old_mip = riscv_cpu_update_mip(cpu, mask, (new_value & mask)); 835 } else { 836 old_mip = env->mip; 837 } 838 839 if (ret_value) { 840 *ret_value = old_mip; 841 } 842 843 return RISCV_EXCP_NONE; 844 } 845 846 /* Supervisor Trap Setup */ 847 static RISCVException read_sstatus(CPURISCVState *env, int csrno, 848 target_ulong *val) 849 { 850 target_ulong mask = (sstatus_v1_10_mask); 851 852 /* TODO: Use SXL not MXL. */ 853 *val = add_status_sd(riscv_cpu_mxl(env), env->mstatus & mask); 854 return RISCV_EXCP_NONE; 855 } 856 857 static RISCVException write_sstatus(CPURISCVState *env, int csrno, 858 target_ulong val) 859 { 860 target_ulong mask = (sstatus_v1_10_mask); 861 target_ulong newval = (env->mstatus & ~mask) | (val & mask); 862 return write_mstatus(env, CSR_MSTATUS, newval); 863 } 864 865 static RISCVException read_vsie(CPURISCVState *env, int csrno, 866 target_ulong *val) 867 { 868 /* Shift the VS bits to their S bit location in vsie */ 869 *val = (env->mie & env->hideleg & VS_MODE_INTERRUPTS) >> 1; 870 return RISCV_EXCP_NONE; 871 } 872 873 static RISCVException read_sie(CPURISCVState *env, int csrno, 874 target_ulong *val) 875 { 876 if (riscv_cpu_virt_enabled(env)) { 877 read_vsie(env, CSR_VSIE, val); 878 } else { 879 *val = env->mie & env->mideleg; 880 } 881 return RISCV_EXCP_NONE; 882 } 883 884 static RISCVException write_vsie(CPURISCVState *env, int csrno, 885 target_ulong val) 886 { 887 /* Shift the S bits to their VS bit location in mie */ 888 target_ulong newval = (env->mie & ~VS_MODE_INTERRUPTS) | 889 ((val << 1) & env->hideleg & VS_MODE_INTERRUPTS); 890 return write_mie(env, CSR_MIE, newval); 891 } 892 893 static int write_sie(CPURISCVState *env, int csrno, target_ulong val) 894 { 895 if (riscv_cpu_virt_enabled(env)) { 896 write_vsie(env, CSR_VSIE, val); 897 } else { 898 target_ulong newval = (env->mie & ~S_MODE_INTERRUPTS) | 899 (val & S_MODE_INTERRUPTS); 900 write_mie(env, CSR_MIE, newval); 901 } 902 903 return RISCV_EXCP_NONE; 904 } 905 906 static RISCVException read_stvec(CPURISCVState *env, int csrno, 907 target_ulong *val) 908 { 909 *val = env->stvec; 910 return RISCV_EXCP_NONE; 911 } 912 913 static RISCVException write_stvec(CPURISCVState *env, int csrno, 914 target_ulong val) 915 { 916 /* bits [1:0] encode mode; 0 = direct, 1 = vectored, 2 >= reserved */ 917 if ((val & 3) < 2) { 918 env->stvec = val; 919 } else { 920 qemu_log_mask(LOG_UNIMP, "CSR_STVEC: reserved mode not supported\n"); 921 } 922 return RISCV_EXCP_NONE; 923 } 924 925 static RISCVException read_scounteren(CPURISCVState *env, int csrno, 926 target_ulong *val) 927 { 928 *val = env->scounteren; 929 return RISCV_EXCP_NONE; 930 } 931 932 static RISCVException write_scounteren(CPURISCVState *env, int csrno, 933 target_ulong val) 934 { 935 env->scounteren = val; 936 return RISCV_EXCP_NONE; 937 } 938 939 /* Supervisor Trap Handling */ 940 static RISCVException read_sscratch(CPURISCVState *env, int csrno, 941 target_ulong *val) 942 { 943 *val = env->sscratch; 944 return RISCV_EXCP_NONE; 945 } 946 947 static RISCVException write_sscratch(CPURISCVState *env, int csrno, 948 target_ulong val) 949 { 950 env->sscratch = val; 951 return RISCV_EXCP_NONE; 952 } 953 954 static RISCVException read_sepc(CPURISCVState *env, int csrno, 955 target_ulong *val) 956 { 957 *val = env->sepc; 958 return RISCV_EXCP_NONE; 959 } 960 961 static RISCVException write_sepc(CPURISCVState *env, int csrno, 962 target_ulong val) 963 { 964 env->sepc = val; 965 return RISCV_EXCP_NONE; 966 } 967 968 static RISCVException read_scause(CPURISCVState *env, int csrno, 969 target_ulong *val) 970 { 971 *val = env->scause; 972 return RISCV_EXCP_NONE; 973 } 974 975 static RISCVException write_scause(CPURISCVState *env, int csrno, 976 target_ulong val) 977 { 978 env->scause = val; 979 return RISCV_EXCP_NONE; 980 } 981 982 static RISCVException read_stval(CPURISCVState *env, int csrno, 983 target_ulong *val) 984 { 985 *val = env->stval; 986 return RISCV_EXCP_NONE; 987 } 988 989 static RISCVException write_stval(CPURISCVState *env, int csrno, 990 target_ulong val) 991 { 992 env->stval = val; 993 return RISCV_EXCP_NONE; 994 } 995 996 static RISCVException rmw_vsip(CPURISCVState *env, int csrno, 997 target_ulong *ret_value, 998 target_ulong new_value, target_ulong write_mask) 999 { 1000 /* Shift the S bits to their VS bit location in mip */ 1001 int ret = rmw_mip(env, 0, ret_value, new_value << 1, 1002 (write_mask << 1) & vsip_writable_mask & env->hideleg); 1003 1004 if (ret_value) { 1005 *ret_value &= VS_MODE_INTERRUPTS; 1006 /* Shift the VS bits to their S bit location in vsip */ 1007 *ret_value >>= 1; 1008 } 1009 return ret; 1010 } 1011 1012 static RISCVException rmw_sip(CPURISCVState *env, int csrno, 1013 target_ulong *ret_value, 1014 target_ulong new_value, target_ulong write_mask) 1015 { 1016 int ret; 1017 1018 if (riscv_cpu_virt_enabled(env)) { 1019 ret = rmw_vsip(env, CSR_VSIP, ret_value, new_value, write_mask); 1020 } else { 1021 ret = rmw_mip(env, CSR_MSTATUS, ret_value, new_value, 1022 write_mask & env->mideleg & sip_writable_mask); 1023 } 1024 1025 if (ret_value) { 1026 *ret_value &= env->mideleg; 1027 } 1028 return ret; 1029 } 1030 1031 /* Supervisor Protection and Translation */ 1032 static RISCVException read_satp(CPURISCVState *env, int csrno, 1033 target_ulong *val) 1034 { 1035 if (!riscv_feature(env, RISCV_FEATURE_MMU)) { 1036 *val = 0; 1037 return RISCV_EXCP_NONE; 1038 } 1039 1040 if (env->priv == PRV_S && get_field(env->mstatus, MSTATUS_TVM)) { 1041 return RISCV_EXCP_ILLEGAL_INST; 1042 } else { 1043 *val = env->satp; 1044 } 1045 1046 return RISCV_EXCP_NONE; 1047 } 1048 1049 static RISCVException write_satp(CPURISCVState *env, int csrno, 1050 target_ulong val) 1051 { 1052 target_ulong vm, mask, asid; 1053 1054 if (!riscv_feature(env, RISCV_FEATURE_MMU)) { 1055 return RISCV_EXCP_NONE; 1056 } 1057 1058 if (riscv_cpu_mxl(env) == MXL_RV32) { 1059 vm = validate_vm(env, get_field(val, SATP32_MODE)); 1060 mask = (val ^ env->satp) & (SATP32_MODE | SATP32_ASID | SATP32_PPN); 1061 asid = (val ^ env->satp) & SATP32_ASID; 1062 } else { 1063 vm = validate_vm(env, get_field(val, SATP64_MODE)); 1064 mask = (val ^ env->satp) & (SATP64_MODE | SATP64_ASID | SATP64_PPN); 1065 asid = (val ^ env->satp) & SATP64_ASID; 1066 } 1067 1068 if (vm && mask) { 1069 if (env->priv == PRV_S && get_field(env->mstatus, MSTATUS_TVM)) { 1070 return RISCV_EXCP_ILLEGAL_INST; 1071 } else { 1072 if (asid) { 1073 tlb_flush(env_cpu(env)); 1074 } 1075 env->satp = val; 1076 } 1077 } 1078 return RISCV_EXCP_NONE; 1079 } 1080 1081 /* Hypervisor Extensions */ 1082 static RISCVException read_hstatus(CPURISCVState *env, int csrno, 1083 target_ulong *val) 1084 { 1085 *val = env->hstatus; 1086 if (riscv_cpu_mxl(env) != MXL_RV32) { 1087 /* We only support 64-bit VSXL */ 1088 *val = set_field(*val, HSTATUS_VSXL, 2); 1089 } 1090 /* We only support little endian */ 1091 *val = set_field(*val, HSTATUS_VSBE, 0); 1092 return RISCV_EXCP_NONE; 1093 } 1094 1095 static RISCVException write_hstatus(CPURISCVState *env, int csrno, 1096 target_ulong val) 1097 { 1098 env->hstatus = val; 1099 if (riscv_cpu_mxl(env) != MXL_RV32 && get_field(val, HSTATUS_VSXL) != 2) { 1100 qemu_log_mask(LOG_UNIMP, "QEMU does not support mixed HSXLEN options."); 1101 } 1102 if (get_field(val, HSTATUS_VSBE) != 0) { 1103 qemu_log_mask(LOG_UNIMP, "QEMU does not support big endian guests."); 1104 } 1105 return RISCV_EXCP_NONE; 1106 } 1107 1108 static RISCVException read_hedeleg(CPURISCVState *env, int csrno, 1109 target_ulong *val) 1110 { 1111 *val = env->hedeleg; 1112 return RISCV_EXCP_NONE; 1113 } 1114 1115 static RISCVException write_hedeleg(CPURISCVState *env, int csrno, 1116 target_ulong val) 1117 { 1118 env->hedeleg = val & vs_delegable_excps; 1119 return RISCV_EXCP_NONE; 1120 } 1121 1122 static RISCVException read_hideleg(CPURISCVState *env, int csrno, 1123 target_ulong *val) 1124 { 1125 *val = env->hideleg; 1126 return RISCV_EXCP_NONE; 1127 } 1128 1129 static RISCVException write_hideleg(CPURISCVState *env, int csrno, 1130 target_ulong val) 1131 { 1132 env->hideleg = val & vs_delegable_ints; 1133 return RISCV_EXCP_NONE; 1134 } 1135 1136 static RISCVException rmw_hvip(CPURISCVState *env, int csrno, 1137 target_ulong *ret_value, 1138 target_ulong new_value, target_ulong write_mask) 1139 { 1140 int ret = rmw_mip(env, 0, ret_value, new_value, 1141 write_mask & hvip_writable_mask); 1142 1143 if (ret_value) { 1144 *ret_value &= hvip_writable_mask; 1145 } 1146 return ret; 1147 } 1148 1149 static RISCVException rmw_hip(CPURISCVState *env, int csrno, 1150 target_ulong *ret_value, 1151 target_ulong new_value, target_ulong write_mask) 1152 { 1153 int ret = rmw_mip(env, 0, ret_value, new_value, 1154 write_mask & hip_writable_mask); 1155 1156 if (ret_value) { 1157 *ret_value &= hip_writable_mask; 1158 } 1159 return ret; 1160 } 1161 1162 static RISCVException read_hie(CPURISCVState *env, int csrno, 1163 target_ulong *val) 1164 { 1165 *val = env->mie & VS_MODE_INTERRUPTS; 1166 return RISCV_EXCP_NONE; 1167 } 1168 1169 static RISCVException write_hie(CPURISCVState *env, int csrno, 1170 target_ulong val) 1171 { 1172 target_ulong newval = (env->mie & ~VS_MODE_INTERRUPTS) | (val & VS_MODE_INTERRUPTS); 1173 return write_mie(env, CSR_MIE, newval); 1174 } 1175 1176 static RISCVException read_hcounteren(CPURISCVState *env, int csrno, 1177 target_ulong *val) 1178 { 1179 *val = env->hcounteren; 1180 return RISCV_EXCP_NONE; 1181 } 1182 1183 static RISCVException write_hcounteren(CPURISCVState *env, int csrno, 1184 target_ulong val) 1185 { 1186 env->hcounteren = val; 1187 return RISCV_EXCP_NONE; 1188 } 1189 1190 static RISCVException write_hgeie(CPURISCVState *env, int csrno, 1191 target_ulong val) 1192 { 1193 if (val) { 1194 qemu_log_mask(LOG_UNIMP, "No support for a non-zero GEILEN."); 1195 } 1196 return RISCV_EXCP_NONE; 1197 } 1198 1199 static RISCVException read_htval(CPURISCVState *env, int csrno, 1200 target_ulong *val) 1201 { 1202 *val = env->htval; 1203 return RISCV_EXCP_NONE; 1204 } 1205 1206 static RISCVException write_htval(CPURISCVState *env, int csrno, 1207 target_ulong val) 1208 { 1209 env->htval = val; 1210 return RISCV_EXCP_NONE; 1211 } 1212 1213 static RISCVException read_htinst(CPURISCVState *env, int csrno, 1214 target_ulong *val) 1215 { 1216 *val = env->htinst; 1217 return RISCV_EXCP_NONE; 1218 } 1219 1220 static RISCVException write_htinst(CPURISCVState *env, int csrno, 1221 target_ulong val) 1222 { 1223 return RISCV_EXCP_NONE; 1224 } 1225 1226 static RISCVException write_hgeip(CPURISCVState *env, int csrno, 1227 target_ulong val) 1228 { 1229 if (val) { 1230 qemu_log_mask(LOG_UNIMP, "No support for a non-zero GEILEN."); 1231 } 1232 return RISCV_EXCP_NONE; 1233 } 1234 1235 static RISCVException read_hgatp(CPURISCVState *env, int csrno, 1236 target_ulong *val) 1237 { 1238 *val = env->hgatp; 1239 return RISCV_EXCP_NONE; 1240 } 1241 1242 static RISCVException write_hgatp(CPURISCVState *env, int csrno, 1243 target_ulong val) 1244 { 1245 env->hgatp = val; 1246 return RISCV_EXCP_NONE; 1247 } 1248 1249 static RISCVException read_htimedelta(CPURISCVState *env, int csrno, 1250 target_ulong *val) 1251 { 1252 if (!env->rdtime_fn) { 1253 return RISCV_EXCP_ILLEGAL_INST; 1254 } 1255 1256 *val = env->htimedelta; 1257 return RISCV_EXCP_NONE; 1258 } 1259 1260 static RISCVException write_htimedelta(CPURISCVState *env, int csrno, 1261 target_ulong val) 1262 { 1263 if (!env->rdtime_fn) { 1264 return RISCV_EXCP_ILLEGAL_INST; 1265 } 1266 1267 if (riscv_cpu_mxl(env) == MXL_RV32) { 1268 env->htimedelta = deposit64(env->htimedelta, 0, 32, (uint64_t)val); 1269 } else { 1270 env->htimedelta = val; 1271 } 1272 return RISCV_EXCP_NONE; 1273 } 1274 1275 static RISCVException read_htimedeltah(CPURISCVState *env, int csrno, 1276 target_ulong *val) 1277 { 1278 if (!env->rdtime_fn) { 1279 return RISCV_EXCP_ILLEGAL_INST; 1280 } 1281 1282 *val = env->htimedelta >> 32; 1283 return RISCV_EXCP_NONE; 1284 } 1285 1286 static RISCVException write_htimedeltah(CPURISCVState *env, int csrno, 1287 target_ulong val) 1288 { 1289 if (!env->rdtime_fn) { 1290 return RISCV_EXCP_ILLEGAL_INST; 1291 } 1292 1293 env->htimedelta = deposit64(env->htimedelta, 32, 32, (uint64_t)val); 1294 return RISCV_EXCP_NONE; 1295 } 1296 1297 /* Virtual CSR Registers */ 1298 static RISCVException read_vsstatus(CPURISCVState *env, int csrno, 1299 target_ulong *val) 1300 { 1301 *val = env->vsstatus; 1302 return RISCV_EXCP_NONE; 1303 } 1304 1305 static RISCVException write_vsstatus(CPURISCVState *env, int csrno, 1306 target_ulong val) 1307 { 1308 uint64_t mask = (target_ulong)-1; 1309 env->vsstatus = (env->vsstatus & ~mask) | (uint64_t)val; 1310 return RISCV_EXCP_NONE; 1311 } 1312 1313 static int read_vstvec(CPURISCVState *env, int csrno, target_ulong *val) 1314 { 1315 *val = env->vstvec; 1316 return RISCV_EXCP_NONE; 1317 } 1318 1319 static RISCVException write_vstvec(CPURISCVState *env, int csrno, 1320 target_ulong val) 1321 { 1322 env->vstvec = val; 1323 return RISCV_EXCP_NONE; 1324 } 1325 1326 static RISCVException read_vsscratch(CPURISCVState *env, int csrno, 1327 target_ulong *val) 1328 { 1329 *val = env->vsscratch; 1330 return RISCV_EXCP_NONE; 1331 } 1332 1333 static RISCVException write_vsscratch(CPURISCVState *env, int csrno, 1334 target_ulong val) 1335 { 1336 env->vsscratch = val; 1337 return RISCV_EXCP_NONE; 1338 } 1339 1340 static RISCVException read_vsepc(CPURISCVState *env, int csrno, 1341 target_ulong *val) 1342 { 1343 *val = env->vsepc; 1344 return RISCV_EXCP_NONE; 1345 } 1346 1347 static RISCVException write_vsepc(CPURISCVState *env, int csrno, 1348 target_ulong val) 1349 { 1350 env->vsepc = val; 1351 return RISCV_EXCP_NONE; 1352 } 1353 1354 static RISCVException read_vscause(CPURISCVState *env, int csrno, 1355 target_ulong *val) 1356 { 1357 *val = env->vscause; 1358 return RISCV_EXCP_NONE; 1359 } 1360 1361 static RISCVException write_vscause(CPURISCVState *env, int csrno, 1362 target_ulong val) 1363 { 1364 env->vscause = val; 1365 return RISCV_EXCP_NONE; 1366 } 1367 1368 static RISCVException read_vstval(CPURISCVState *env, int csrno, 1369 target_ulong *val) 1370 { 1371 *val = env->vstval; 1372 return RISCV_EXCP_NONE; 1373 } 1374 1375 static RISCVException write_vstval(CPURISCVState *env, int csrno, 1376 target_ulong val) 1377 { 1378 env->vstval = val; 1379 return RISCV_EXCP_NONE; 1380 } 1381 1382 static RISCVException read_vsatp(CPURISCVState *env, int csrno, 1383 target_ulong *val) 1384 { 1385 *val = env->vsatp; 1386 return RISCV_EXCP_NONE; 1387 } 1388 1389 static RISCVException write_vsatp(CPURISCVState *env, int csrno, 1390 target_ulong val) 1391 { 1392 env->vsatp = val; 1393 return RISCV_EXCP_NONE; 1394 } 1395 1396 static RISCVException read_mtval2(CPURISCVState *env, int csrno, 1397 target_ulong *val) 1398 { 1399 *val = env->mtval2; 1400 return RISCV_EXCP_NONE; 1401 } 1402 1403 static RISCVException write_mtval2(CPURISCVState *env, int csrno, 1404 target_ulong val) 1405 { 1406 env->mtval2 = val; 1407 return RISCV_EXCP_NONE; 1408 } 1409 1410 static RISCVException read_mtinst(CPURISCVState *env, int csrno, 1411 target_ulong *val) 1412 { 1413 *val = env->mtinst; 1414 return RISCV_EXCP_NONE; 1415 } 1416 1417 static RISCVException write_mtinst(CPURISCVState *env, int csrno, 1418 target_ulong val) 1419 { 1420 env->mtinst = val; 1421 return RISCV_EXCP_NONE; 1422 } 1423 1424 /* Physical Memory Protection */ 1425 static RISCVException read_mseccfg(CPURISCVState *env, int csrno, 1426 target_ulong *val) 1427 { 1428 *val = mseccfg_csr_read(env); 1429 return RISCV_EXCP_NONE; 1430 } 1431 1432 static RISCVException write_mseccfg(CPURISCVState *env, int csrno, 1433 target_ulong val) 1434 { 1435 mseccfg_csr_write(env, val); 1436 return RISCV_EXCP_NONE; 1437 } 1438 1439 static RISCVException read_pmpcfg(CPURISCVState *env, int csrno, 1440 target_ulong *val) 1441 { 1442 *val = pmpcfg_csr_read(env, csrno - CSR_PMPCFG0); 1443 return RISCV_EXCP_NONE; 1444 } 1445 1446 static RISCVException write_pmpcfg(CPURISCVState *env, int csrno, 1447 target_ulong val) 1448 { 1449 pmpcfg_csr_write(env, csrno - CSR_PMPCFG0, val); 1450 return RISCV_EXCP_NONE; 1451 } 1452 1453 static RISCVException read_pmpaddr(CPURISCVState *env, int csrno, 1454 target_ulong *val) 1455 { 1456 *val = pmpaddr_csr_read(env, csrno - CSR_PMPADDR0); 1457 return RISCV_EXCP_NONE; 1458 } 1459 1460 static RISCVException write_pmpaddr(CPURISCVState *env, int csrno, 1461 target_ulong val) 1462 { 1463 pmpaddr_csr_write(env, csrno - CSR_PMPADDR0, val); 1464 return RISCV_EXCP_NONE; 1465 } 1466 1467 /* 1468 * Functions to access Pointer Masking feature registers 1469 * We have to check if current priv lvl could modify 1470 * csr in given mode 1471 */ 1472 static bool check_pm_current_disabled(CPURISCVState *env, int csrno) 1473 { 1474 int csr_priv = get_field(csrno, 0x300); 1475 int pm_current; 1476 1477 /* 1478 * If priv lvls differ that means we're accessing csr from higher priv lvl, 1479 * so allow the access 1480 */ 1481 if (env->priv != csr_priv) { 1482 return false; 1483 } 1484 switch (env->priv) { 1485 case PRV_M: 1486 pm_current = get_field(env->mmte, M_PM_CURRENT); 1487 break; 1488 case PRV_S: 1489 pm_current = get_field(env->mmte, S_PM_CURRENT); 1490 break; 1491 case PRV_U: 1492 pm_current = get_field(env->mmte, U_PM_CURRENT); 1493 break; 1494 default: 1495 g_assert_not_reached(); 1496 } 1497 /* It's same priv lvl, so we allow to modify csr only if pm.current==1 */ 1498 return !pm_current; 1499 } 1500 1501 static RISCVException read_mmte(CPURISCVState *env, int csrno, 1502 target_ulong *val) 1503 { 1504 *val = env->mmte & MMTE_MASK; 1505 return RISCV_EXCP_NONE; 1506 } 1507 1508 static RISCVException write_mmte(CPURISCVState *env, int csrno, 1509 target_ulong val) 1510 { 1511 uint64_t mstatus; 1512 target_ulong wpri_val = val & MMTE_MASK; 1513 1514 if (val != wpri_val) { 1515 qemu_log_mask(LOG_GUEST_ERROR, "%s" TARGET_FMT_lx " %s" TARGET_FMT_lx "\n", 1516 "MMTE: WPRI violation written 0x", val, 1517 "vs expected 0x", wpri_val); 1518 } 1519 /* for machine mode pm.current is hardwired to 1 */ 1520 wpri_val |= MMTE_M_PM_CURRENT; 1521 1522 /* hardwiring pm.instruction bit to 0, since it's not supported yet */ 1523 wpri_val &= ~(MMTE_M_PM_INSN | MMTE_S_PM_INSN | MMTE_U_PM_INSN); 1524 env->mmte = wpri_val | PM_EXT_DIRTY; 1525 1526 /* Set XS and SD bits, since PM CSRs are dirty */ 1527 mstatus = env->mstatus | MSTATUS_XS; 1528 write_mstatus(env, csrno, mstatus); 1529 return RISCV_EXCP_NONE; 1530 } 1531 1532 static RISCVException read_smte(CPURISCVState *env, int csrno, 1533 target_ulong *val) 1534 { 1535 *val = env->mmte & SMTE_MASK; 1536 return RISCV_EXCP_NONE; 1537 } 1538 1539 static RISCVException write_smte(CPURISCVState *env, int csrno, 1540 target_ulong val) 1541 { 1542 target_ulong wpri_val = val & SMTE_MASK; 1543 1544 if (val != wpri_val) { 1545 qemu_log_mask(LOG_GUEST_ERROR, "%s" TARGET_FMT_lx " %s" TARGET_FMT_lx "\n", 1546 "SMTE: WPRI violation written 0x", val, 1547 "vs expected 0x", wpri_val); 1548 } 1549 1550 /* if pm.current==0 we can't modify current PM CSRs */ 1551 if (check_pm_current_disabled(env, csrno)) { 1552 return RISCV_EXCP_NONE; 1553 } 1554 1555 wpri_val |= (env->mmte & ~SMTE_MASK); 1556 write_mmte(env, csrno, wpri_val); 1557 return RISCV_EXCP_NONE; 1558 } 1559 1560 static RISCVException read_umte(CPURISCVState *env, int csrno, 1561 target_ulong *val) 1562 { 1563 *val = env->mmte & UMTE_MASK; 1564 return RISCV_EXCP_NONE; 1565 } 1566 1567 static RISCVException write_umte(CPURISCVState *env, int csrno, 1568 target_ulong val) 1569 { 1570 target_ulong wpri_val = val & UMTE_MASK; 1571 1572 if (val != wpri_val) { 1573 qemu_log_mask(LOG_GUEST_ERROR, "%s" TARGET_FMT_lx " %s" TARGET_FMT_lx "\n", 1574 "UMTE: WPRI violation written 0x", val, 1575 "vs expected 0x", wpri_val); 1576 } 1577 1578 if (check_pm_current_disabled(env, csrno)) { 1579 return RISCV_EXCP_NONE; 1580 } 1581 1582 wpri_val |= (env->mmte & ~UMTE_MASK); 1583 write_mmte(env, csrno, wpri_val); 1584 return RISCV_EXCP_NONE; 1585 } 1586 1587 static RISCVException read_mpmmask(CPURISCVState *env, int csrno, 1588 target_ulong *val) 1589 { 1590 *val = env->mpmmask; 1591 return RISCV_EXCP_NONE; 1592 } 1593 1594 static RISCVException write_mpmmask(CPURISCVState *env, int csrno, 1595 target_ulong val) 1596 { 1597 uint64_t mstatus; 1598 1599 env->mpmmask = val; 1600 env->mmte |= PM_EXT_DIRTY; 1601 1602 /* Set XS and SD bits, since PM CSRs are dirty */ 1603 mstatus = env->mstatus | MSTATUS_XS; 1604 write_mstatus(env, csrno, mstatus); 1605 return RISCV_EXCP_NONE; 1606 } 1607 1608 static RISCVException read_spmmask(CPURISCVState *env, int csrno, 1609 target_ulong *val) 1610 { 1611 *val = env->spmmask; 1612 return RISCV_EXCP_NONE; 1613 } 1614 1615 static RISCVException write_spmmask(CPURISCVState *env, int csrno, 1616 target_ulong val) 1617 { 1618 uint64_t mstatus; 1619 1620 /* if pm.current==0 we can't modify current PM CSRs */ 1621 if (check_pm_current_disabled(env, csrno)) { 1622 return RISCV_EXCP_NONE; 1623 } 1624 env->spmmask = val; 1625 env->mmte |= PM_EXT_DIRTY; 1626 1627 /* Set XS and SD bits, since PM CSRs are dirty */ 1628 mstatus = env->mstatus | MSTATUS_XS; 1629 write_mstatus(env, csrno, mstatus); 1630 return RISCV_EXCP_NONE; 1631 } 1632 1633 static RISCVException read_upmmask(CPURISCVState *env, int csrno, 1634 target_ulong *val) 1635 { 1636 *val = env->upmmask; 1637 return RISCV_EXCP_NONE; 1638 } 1639 1640 static RISCVException write_upmmask(CPURISCVState *env, int csrno, 1641 target_ulong val) 1642 { 1643 uint64_t mstatus; 1644 1645 /* if pm.current==0 we can't modify current PM CSRs */ 1646 if (check_pm_current_disabled(env, csrno)) { 1647 return RISCV_EXCP_NONE; 1648 } 1649 env->upmmask = val; 1650 env->mmte |= PM_EXT_DIRTY; 1651 1652 /* Set XS and SD bits, since PM CSRs are dirty */ 1653 mstatus = env->mstatus | MSTATUS_XS; 1654 write_mstatus(env, csrno, mstatus); 1655 return RISCV_EXCP_NONE; 1656 } 1657 1658 static RISCVException read_mpmbase(CPURISCVState *env, int csrno, 1659 target_ulong *val) 1660 { 1661 *val = env->mpmbase; 1662 return RISCV_EXCP_NONE; 1663 } 1664 1665 static RISCVException write_mpmbase(CPURISCVState *env, int csrno, 1666 target_ulong val) 1667 { 1668 uint64_t mstatus; 1669 1670 env->mpmbase = val; 1671 env->mmte |= PM_EXT_DIRTY; 1672 1673 /* Set XS and SD bits, since PM CSRs are dirty */ 1674 mstatus = env->mstatus | MSTATUS_XS; 1675 write_mstatus(env, csrno, mstatus); 1676 return RISCV_EXCP_NONE; 1677 } 1678 1679 static RISCVException read_spmbase(CPURISCVState *env, int csrno, 1680 target_ulong *val) 1681 { 1682 *val = env->spmbase; 1683 return RISCV_EXCP_NONE; 1684 } 1685 1686 static RISCVException write_spmbase(CPURISCVState *env, int csrno, 1687 target_ulong val) 1688 { 1689 uint64_t mstatus; 1690 1691 /* if pm.current==0 we can't modify current PM CSRs */ 1692 if (check_pm_current_disabled(env, csrno)) { 1693 return RISCV_EXCP_NONE; 1694 } 1695 env->spmbase = val; 1696 env->mmte |= PM_EXT_DIRTY; 1697 1698 /* Set XS and SD bits, since PM CSRs are dirty */ 1699 mstatus = env->mstatus | MSTATUS_XS; 1700 write_mstatus(env, csrno, mstatus); 1701 return RISCV_EXCP_NONE; 1702 } 1703 1704 static RISCVException read_upmbase(CPURISCVState *env, int csrno, 1705 target_ulong *val) 1706 { 1707 *val = env->upmbase; 1708 return RISCV_EXCP_NONE; 1709 } 1710 1711 static RISCVException write_upmbase(CPURISCVState *env, int csrno, 1712 target_ulong val) 1713 { 1714 uint64_t mstatus; 1715 1716 /* if pm.current==0 we can't modify current PM CSRs */ 1717 if (check_pm_current_disabled(env, csrno)) { 1718 return RISCV_EXCP_NONE; 1719 } 1720 env->upmbase = val; 1721 env->mmte |= PM_EXT_DIRTY; 1722 1723 /* Set XS and SD bits, since PM CSRs are dirty */ 1724 mstatus = env->mstatus | MSTATUS_XS; 1725 write_mstatus(env, csrno, mstatus); 1726 return RISCV_EXCP_NONE; 1727 } 1728 1729 #endif 1730 1731 /* 1732 * riscv_csrrw - read and/or update control and status register 1733 * 1734 * csrr <-> riscv_csrrw(env, csrno, ret_value, 0, 0); 1735 * csrrw <-> riscv_csrrw(env, csrno, ret_value, value, -1); 1736 * csrrs <-> riscv_csrrw(env, csrno, ret_value, -1, value); 1737 * csrrc <-> riscv_csrrw(env, csrno, ret_value, 0, value); 1738 */ 1739 1740 RISCVException riscv_csrrw(CPURISCVState *env, int csrno, 1741 target_ulong *ret_value, 1742 target_ulong new_value, target_ulong write_mask) 1743 { 1744 RISCVException ret; 1745 target_ulong old_value; 1746 RISCVCPU *cpu = env_archcpu(env); 1747 int read_only = get_field(csrno, 0xC00) == 3; 1748 1749 /* check privileges and return RISCV_EXCP_ILLEGAL_INST if check fails */ 1750 #if !defined(CONFIG_USER_ONLY) 1751 int effective_priv = env->priv; 1752 1753 if (riscv_has_ext(env, RVH) && 1754 env->priv == PRV_S && 1755 !riscv_cpu_virt_enabled(env)) { 1756 /* 1757 * We are in S mode without virtualisation, therefore we are in HS Mode. 1758 * Add 1 to the effective privledge level to allow us to access the 1759 * Hypervisor CSRs. 1760 */ 1761 effective_priv++; 1762 } 1763 1764 if (!env->debugger && (effective_priv < get_field(csrno, 0x300))) { 1765 return RISCV_EXCP_ILLEGAL_INST; 1766 } 1767 #endif 1768 if (write_mask && read_only) { 1769 return RISCV_EXCP_ILLEGAL_INST; 1770 } 1771 1772 /* ensure the CSR extension is enabled. */ 1773 if (!cpu->cfg.ext_icsr) { 1774 return RISCV_EXCP_ILLEGAL_INST; 1775 } 1776 1777 /* check predicate */ 1778 if (!csr_ops[csrno].predicate) { 1779 return RISCV_EXCP_ILLEGAL_INST; 1780 } 1781 ret = csr_ops[csrno].predicate(env, csrno); 1782 if (ret != RISCV_EXCP_NONE) { 1783 return ret; 1784 } 1785 1786 /* execute combined read/write operation if it exists */ 1787 if (csr_ops[csrno].op) { 1788 return csr_ops[csrno].op(env, csrno, ret_value, new_value, write_mask); 1789 } 1790 1791 /* if no accessor exists then return failure */ 1792 if (!csr_ops[csrno].read) { 1793 return RISCV_EXCP_ILLEGAL_INST; 1794 } 1795 /* read old value */ 1796 ret = csr_ops[csrno].read(env, csrno, &old_value); 1797 if (ret != RISCV_EXCP_NONE) { 1798 return ret; 1799 } 1800 1801 /* write value if writable and write mask set, otherwise drop writes */ 1802 if (write_mask) { 1803 new_value = (old_value & ~write_mask) | (new_value & write_mask); 1804 if (csr_ops[csrno].write) { 1805 ret = csr_ops[csrno].write(env, csrno, new_value); 1806 if (ret != RISCV_EXCP_NONE) { 1807 return ret; 1808 } 1809 } 1810 } 1811 1812 /* return old value */ 1813 if (ret_value) { 1814 *ret_value = old_value; 1815 } 1816 1817 return RISCV_EXCP_NONE; 1818 } 1819 1820 RISCVException riscv_csrrw_i128(CPURISCVState *env, int csrno, 1821 Int128 *ret_value, 1822 Int128 new_value, Int128 write_mask) 1823 { 1824 /* fall back to 64-bit version for now */ 1825 target_ulong ret_64; 1826 RISCVException ret = riscv_csrrw(env, csrno, &ret_64, 1827 int128_getlo(new_value), 1828 int128_getlo(write_mask)); 1829 1830 if (ret_value) { 1831 *ret_value = int128_make64(ret_64); 1832 } 1833 1834 return ret; 1835 } 1836 1837 /* 1838 * Debugger support. If not in user mode, set env->debugger before the 1839 * riscv_csrrw call and clear it after the call. 1840 */ 1841 RISCVException riscv_csrrw_debug(CPURISCVState *env, int csrno, 1842 target_ulong *ret_value, 1843 target_ulong new_value, 1844 target_ulong write_mask) 1845 { 1846 RISCVException ret; 1847 #if !defined(CONFIG_USER_ONLY) 1848 env->debugger = true; 1849 #endif 1850 ret = riscv_csrrw(env, csrno, ret_value, new_value, write_mask); 1851 #if !defined(CONFIG_USER_ONLY) 1852 env->debugger = false; 1853 #endif 1854 return ret; 1855 } 1856 1857 /* Control and Status Register function table */ 1858 riscv_csr_operations csr_ops[CSR_TABLE_SIZE] = { 1859 /* User Floating-Point CSRs */ 1860 [CSR_FFLAGS] = { "fflags", fs, read_fflags, write_fflags }, 1861 [CSR_FRM] = { "frm", fs, read_frm, write_frm }, 1862 [CSR_FCSR] = { "fcsr", fs, read_fcsr, write_fcsr }, 1863 /* Vector CSRs */ 1864 [CSR_VSTART] = { "vstart", vs, read_vstart, write_vstart }, 1865 [CSR_VXSAT] = { "vxsat", vs, read_vxsat, write_vxsat }, 1866 [CSR_VXRM] = { "vxrm", vs, read_vxrm, write_vxrm }, 1867 [CSR_VCSR] = { "vcsr", vs, read_vcsr, write_vcsr }, 1868 [CSR_VL] = { "vl", vs, read_vl }, 1869 [CSR_VTYPE] = { "vtype", vs, read_vtype }, 1870 [CSR_VLENB] = { "vlenb", vs, read_vlenb }, 1871 /* User Timers and Counters */ 1872 [CSR_CYCLE] = { "cycle", ctr, read_instret }, 1873 [CSR_INSTRET] = { "instret", ctr, read_instret }, 1874 [CSR_CYCLEH] = { "cycleh", ctr32, read_instreth }, 1875 [CSR_INSTRETH] = { "instreth", ctr32, read_instreth }, 1876 1877 /* 1878 * In privileged mode, the monitor will have to emulate TIME CSRs only if 1879 * rdtime callback is not provided by machine/platform emulation. 1880 */ 1881 [CSR_TIME] = { "time", ctr, read_time }, 1882 [CSR_TIMEH] = { "timeh", ctr32, read_timeh }, 1883 1884 #if !defined(CONFIG_USER_ONLY) 1885 /* Machine Timers and Counters */ 1886 [CSR_MCYCLE] = { "mcycle", any, read_instret }, 1887 [CSR_MINSTRET] = { "minstret", any, read_instret }, 1888 [CSR_MCYCLEH] = { "mcycleh", any32, read_instreth }, 1889 [CSR_MINSTRETH] = { "minstreth", any32, read_instreth }, 1890 1891 /* Machine Information Registers */ 1892 [CSR_MVENDORID] = { "mvendorid", any, read_zero }, 1893 [CSR_MARCHID] = { "marchid", any, read_zero }, 1894 [CSR_MIMPID] = { "mimpid", any, read_zero }, 1895 [CSR_MHARTID] = { "mhartid", any, read_mhartid }, 1896 1897 /* Machine Trap Setup */ 1898 [CSR_MSTATUS] = { "mstatus", any, read_mstatus, write_mstatus }, 1899 [CSR_MISA] = { "misa", any, read_misa, write_misa }, 1900 [CSR_MIDELEG] = { "mideleg", any, read_mideleg, write_mideleg }, 1901 [CSR_MEDELEG] = { "medeleg", any, read_medeleg, write_medeleg }, 1902 [CSR_MIE] = { "mie", any, read_mie, write_mie }, 1903 [CSR_MTVEC] = { "mtvec", any, read_mtvec, write_mtvec }, 1904 [CSR_MCOUNTEREN] = { "mcounteren", any, read_mcounteren, write_mcounteren }, 1905 1906 [CSR_MSTATUSH] = { "mstatush", any32, read_mstatush, write_mstatush }, 1907 1908 /* Machine Trap Handling */ 1909 [CSR_MSCRATCH] = { "mscratch", any, read_mscratch, write_mscratch }, 1910 [CSR_MEPC] = { "mepc", any, read_mepc, write_mepc }, 1911 [CSR_MCAUSE] = { "mcause", any, read_mcause, write_mcause }, 1912 [CSR_MTVAL] = { "mtval", any, read_mtval, write_mtval }, 1913 [CSR_MIP] = { "mip", any, NULL, NULL, rmw_mip }, 1914 1915 /* Supervisor Trap Setup */ 1916 [CSR_SSTATUS] = { "sstatus", smode, read_sstatus, write_sstatus }, 1917 [CSR_SIE] = { "sie", smode, read_sie, write_sie }, 1918 [CSR_STVEC] = { "stvec", smode, read_stvec, write_stvec }, 1919 [CSR_SCOUNTEREN] = { "scounteren", smode, read_scounteren, write_scounteren }, 1920 1921 /* Supervisor Trap Handling */ 1922 [CSR_SSCRATCH] = { "sscratch", smode, read_sscratch, write_sscratch }, 1923 [CSR_SEPC] = { "sepc", smode, read_sepc, write_sepc }, 1924 [CSR_SCAUSE] = { "scause", smode, read_scause, write_scause }, 1925 [CSR_STVAL] = { "stval", smode, read_stval, write_stval }, 1926 [CSR_SIP] = { "sip", smode, NULL, NULL, rmw_sip }, 1927 1928 /* Supervisor Protection and Translation */ 1929 [CSR_SATP] = { "satp", smode, read_satp, write_satp }, 1930 1931 [CSR_HSTATUS] = { "hstatus", hmode, read_hstatus, write_hstatus }, 1932 [CSR_HEDELEG] = { "hedeleg", hmode, read_hedeleg, write_hedeleg }, 1933 [CSR_HIDELEG] = { "hideleg", hmode, read_hideleg, write_hideleg }, 1934 [CSR_HVIP] = { "hvip", hmode, NULL, NULL, rmw_hvip }, 1935 [CSR_HIP] = { "hip", hmode, NULL, NULL, rmw_hip }, 1936 [CSR_HIE] = { "hie", hmode, read_hie, write_hie }, 1937 [CSR_HCOUNTEREN] = { "hcounteren", hmode, read_hcounteren, write_hcounteren }, 1938 [CSR_HGEIE] = { "hgeie", hmode, read_zero, write_hgeie }, 1939 [CSR_HTVAL] = { "htval", hmode, read_htval, write_htval }, 1940 [CSR_HTINST] = { "htinst", hmode, read_htinst, write_htinst }, 1941 [CSR_HGEIP] = { "hgeip", hmode, read_zero, write_hgeip }, 1942 [CSR_HGATP] = { "hgatp", hmode, read_hgatp, write_hgatp }, 1943 [CSR_HTIMEDELTA] = { "htimedelta", hmode, read_htimedelta, write_htimedelta }, 1944 [CSR_HTIMEDELTAH] = { "htimedeltah", hmode32, read_htimedeltah, write_htimedeltah }, 1945 1946 [CSR_VSSTATUS] = { "vsstatus", hmode, read_vsstatus, write_vsstatus }, 1947 [CSR_VSIP] = { "vsip", hmode, NULL, NULL, rmw_vsip }, 1948 [CSR_VSIE] = { "vsie", hmode, read_vsie, write_vsie }, 1949 [CSR_VSTVEC] = { "vstvec", hmode, read_vstvec, write_vstvec }, 1950 [CSR_VSSCRATCH] = { "vsscratch", hmode, read_vsscratch, write_vsscratch }, 1951 [CSR_VSEPC] = { "vsepc", hmode, read_vsepc, write_vsepc }, 1952 [CSR_VSCAUSE] = { "vscause", hmode, read_vscause, write_vscause }, 1953 [CSR_VSTVAL] = { "vstval", hmode, read_vstval, write_vstval }, 1954 [CSR_VSATP] = { "vsatp", hmode, read_vsatp, write_vsatp }, 1955 1956 [CSR_MTVAL2] = { "mtval2", hmode, read_mtval2, write_mtval2 }, 1957 [CSR_MTINST] = { "mtinst", hmode, read_mtinst, write_mtinst }, 1958 1959 /* Physical Memory Protection */ 1960 [CSR_MSECCFG] = { "mseccfg", epmp, read_mseccfg, write_mseccfg }, 1961 [CSR_PMPCFG0] = { "pmpcfg0", pmp, read_pmpcfg, write_pmpcfg }, 1962 [CSR_PMPCFG1] = { "pmpcfg1", pmp, read_pmpcfg, write_pmpcfg }, 1963 [CSR_PMPCFG2] = { "pmpcfg2", pmp, read_pmpcfg, write_pmpcfg }, 1964 [CSR_PMPCFG3] = { "pmpcfg3", pmp, read_pmpcfg, write_pmpcfg }, 1965 [CSR_PMPADDR0] = { "pmpaddr0", pmp, read_pmpaddr, write_pmpaddr }, 1966 [CSR_PMPADDR1] = { "pmpaddr1", pmp, read_pmpaddr, write_pmpaddr }, 1967 [CSR_PMPADDR2] = { "pmpaddr2", pmp, read_pmpaddr, write_pmpaddr }, 1968 [CSR_PMPADDR3] = { "pmpaddr3", pmp, read_pmpaddr, write_pmpaddr }, 1969 [CSR_PMPADDR4] = { "pmpaddr4", pmp, read_pmpaddr, write_pmpaddr }, 1970 [CSR_PMPADDR5] = { "pmpaddr5", pmp, read_pmpaddr, write_pmpaddr }, 1971 [CSR_PMPADDR6] = { "pmpaddr6", pmp, read_pmpaddr, write_pmpaddr }, 1972 [CSR_PMPADDR7] = { "pmpaddr7", pmp, read_pmpaddr, write_pmpaddr }, 1973 [CSR_PMPADDR8] = { "pmpaddr8", pmp, read_pmpaddr, write_pmpaddr }, 1974 [CSR_PMPADDR9] = { "pmpaddr9", pmp, read_pmpaddr, write_pmpaddr }, 1975 [CSR_PMPADDR10] = { "pmpaddr10", pmp, read_pmpaddr, write_pmpaddr }, 1976 [CSR_PMPADDR11] = { "pmpaddr11", pmp, read_pmpaddr, write_pmpaddr }, 1977 [CSR_PMPADDR12] = { "pmpaddr12", pmp, read_pmpaddr, write_pmpaddr }, 1978 [CSR_PMPADDR13] = { "pmpaddr13", pmp, read_pmpaddr, write_pmpaddr }, 1979 [CSR_PMPADDR14] = { "pmpaddr14", pmp, read_pmpaddr, write_pmpaddr }, 1980 [CSR_PMPADDR15] = { "pmpaddr15", pmp, read_pmpaddr, write_pmpaddr }, 1981 1982 /* User Pointer Masking */ 1983 [CSR_UMTE] = { "umte", pointer_masking, read_umte, write_umte }, 1984 [CSR_UPMMASK] = { "upmmask", pointer_masking, read_upmmask, write_upmmask }, 1985 [CSR_UPMBASE] = { "upmbase", pointer_masking, read_upmbase, write_upmbase }, 1986 /* Machine Pointer Masking */ 1987 [CSR_MMTE] = { "mmte", pointer_masking, read_mmte, write_mmte }, 1988 [CSR_MPMMASK] = { "mpmmask", pointer_masking, read_mpmmask, write_mpmmask }, 1989 [CSR_MPMBASE] = { "mpmbase", pointer_masking, read_mpmbase, write_mpmbase }, 1990 /* Supervisor Pointer Masking */ 1991 [CSR_SMTE] = { "smte", pointer_masking, read_smte, write_smte }, 1992 [CSR_SPMMASK] = { "spmmask", pointer_masking, read_spmmask, write_spmmask }, 1993 [CSR_SPMBASE] = { "spmbase", pointer_masking, read_spmbase, write_spmbase }, 1994 1995 /* Performance Counters */ 1996 [CSR_HPMCOUNTER3] = { "hpmcounter3", ctr, read_zero }, 1997 [CSR_HPMCOUNTER4] = { "hpmcounter4", ctr, read_zero }, 1998 [CSR_HPMCOUNTER5] = { "hpmcounter5", ctr, read_zero }, 1999 [CSR_HPMCOUNTER6] = { "hpmcounter6", ctr, read_zero }, 2000 [CSR_HPMCOUNTER7] = { "hpmcounter7", ctr, read_zero }, 2001 [CSR_HPMCOUNTER8] = { "hpmcounter8", ctr, read_zero }, 2002 [CSR_HPMCOUNTER9] = { "hpmcounter9", ctr, read_zero }, 2003 [CSR_HPMCOUNTER10] = { "hpmcounter10", ctr, read_zero }, 2004 [CSR_HPMCOUNTER11] = { "hpmcounter11", ctr, read_zero }, 2005 [CSR_HPMCOUNTER12] = { "hpmcounter12", ctr, read_zero }, 2006 [CSR_HPMCOUNTER13] = { "hpmcounter13", ctr, read_zero }, 2007 [CSR_HPMCOUNTER14] = { "hpmcounter14", ctr, read_zero }, 2008 [CSR_HPMCOUNTER15] = { "hpmcounter15", ctr, read_zero }, 2009 [CSR_HPMCOUNTER16] = { "hpmcounter16", ctr, read_zero }, 2010 [CSR_HPMCOUNTER17] = { "hpmcounter17", ctr, read_zero }, 2011 [CSR_HPMCOUNTER18] = { "hpmcounter18", ctr, read_zero }, 2012 [CSR_HPMCOUNTER19] = { "hpmcounter19", ctr, read_zero }, 2013 [CSR_HPMCOUNTER20] = { "hpmcounter20", ctr, read_zero }, 2014 [CSR_HPMCOUNTER21] = { "hpmcounter21", ctr, read_zero }, 2015 [CSR_HPMCOUNTER22] = { "hpmcounter22", ctr, read_zero }, 2016 [CSR_HPMCOUNTER23] = { "hpmcounter23", ctr, read_zero }, 2017 [CSR_HPMCOUNTER24] = { "hpmcounter24", ctr, read_zero }, 2018 [CSR_HPMCOUNTER25] = { "hpmcounter25", ctr, read_zero }, 2019 [CSR_HPMCOUNTER26] = { "hpmcounter26", ctr, read_zero }, 2020 [CSR_HPMCOUNTER27] = { "hpmcounter27", ctr, read_zero }, 2021 [CSR_HPMCOUNTER28] = { "hpmcounter28", ctr, read_zero }, 2022 [CSR_HPMCOUNTER29] = { "hpmcounter29", ctr, read_zero }, 2023 [CSR_HPMCOUNTER30] = { "hpmcounter30", ctr, read_zero }, 2024 [CSR_HPMCOUNTER31] = { "hpmcounter31", ctr, read_zero }, 2025 2026 [CSR_MHPMCOUNTER3] = { "mhpmcounter3", any, read_zero }, 2027 [CSR_MHPMCOUNTER4] = { "mhpmcounter4", any, read_zero }, 2028 [CSR_MHPMCOUNTER5] = { "mhpmcounter5", any, read_zero }, 2029 [CSR_MHPMCOUNTER6] = { "mhpmcounter6", any, read_zero }, 2030 [CSR_MHPMCOUNTER7] = { "mhpmcounter7", any, read_zero }, 2031 [CSR_MHPMCOUNTER8] = { "mhpmcounter8", any, read_zero }, 2032 [CSR_MHPMCOUNTER9] = { "mhpmcounter9", any, read_zero }, 2033 [CSR_MHPMCOUNTER10] = { "mhpmcounter10", any, read_zero }, 2034 [CSR_MHPMCOUNTER11] = { "mhpmcounter11", any, read_zero }, 2035 [CSR_MHPMCOUNTER12] = { "mhpmcounter12", any, read_zero }, 2036 [CSR_MHPMCOUNTER13] = { "mhpmcounter13", any, read_zero }, 2037 [CSR_MHPMCOUNTER14] = { "mhpmcounter14", any, read_zero }, 2038 [CSR_MHPMCOUNTER15] = { "mhpmcounter15", any, read_zero }, 2039 [CSR_MHPMCOUNTER16] = { "mhpmcounter16", any, read_zero }, 2040 [CSR_MHPMCOUNTER17] = { "mhpmcounter17", any, read_zero }, 2041 [CSR_MHPMCOUNTER18] = { "mhpmcounter18", any, read_zero }, 2042 [CSR_MHPMCOUNTER19] = { "mhpmcounter19", any, read_zero }, 2043 [CSR_MHPMCOUNTER20] = { "mhpmcounter20", any, read_zero }, 2044 [CSR_MHPMCOUNTER21] = { "mhpmcounter21", any, read_zero }, 2045 [CSR_MHPMCOUNTER22] = { "mhpmcounter22", any, read_zero }, 2046 [CSR_MHPMCOUNTER23] = { "mhpmcounter23", any, read_zero }, 2047 [CSR_MHPMCOUNTER24] = { "mhpmcounter24", any, read_zero }, 2048 [CSR_MHPMCOUNTER25] = { "mhpmcounter25", any, read_zero }, 2049 [CSR_MHPMCOUNTER26] = { "mhpmcounter26", any, read_zero }, 2050 [CSR_MHPMCOUNTER27] = { "mhpmcounter27", any, read_zero }, 2051 [CSR_MHPMCOUNTER28] = { "mhpmcounter28", any, read_zero }, 2052 [CSR_MHPMCOUNTER29] = { "mhpmcounter29", any, read_zero }, 2053 [CSR_MHPMCOUNTER30] = { "mhpmcounter30", any, read_zero }, 2054 [CSR_MHPMCOUNTER31] = { "mhpmcounter31", any, read_zero }, 2055 2056 [CSR_MHPMEVENT3] = { "mhpmevent3", any, read_zero }, 2057 [CSR_MHPMEVENT4] = { "mhpmevent4", any, read_zero }, 2058 [CSR_MHPMEVENT5] = { "mhpmevent5", any, read_zero }, 2059 [CSR_MHPMEVENT6] = { "mhpmevent6", any, read_zero }, 2060 [CSR_MHPMEVENT7] = { "mhpmevent7", any, read_zero }, 2061 [CSR_MHPMEVENT8] = { "mhpmevent8", any, read_zero }, 2062 [CSR_MHPMEVENT9] = { "mhpmevent9", any, read_zero }, 2063 [CSR_MHPMEVENT10] = { "mhpmevent10", any, read_zero }, 2064 [CSR_MHPMEVENT11] = { "mhpmevent11", any, read_zero }, 2065 [CSR_MHPMEVENT12] = { "mhpmevent12", any, read_zero }, 2066 [CSR_MHPMEVENT13] = { "mhpmevent13", any, read_zero }, 2067 [CSR_MHPMEVENT14] = { "mhpmevent14", any, read_zero }, 2068 [CSR_MHPMEVENT15] = { "mhpmevent15", any, read_zero }, 2069 [CSR_MHPMEVENT16] = { "mhpmevent16", any, read_zero }, 2070 [CSR_MHPMEVENT17] = { "mhpmevent17", any, read_zero }, 2071 [CSR_MHPMEVENT18] = { "mhpmevent18", any, read_zero }, 2072 [CSR_MHPMEVENT19] = { "mhpmevent19", any, read_zero }, 2073 [CSR_MHPMEVENT20] = { "mhpmevent20", any, read_zero }, 2074 [CSR_MHPMEVENT21] = { "mhpmevent21", any, read_zero }, 2075 [CSR_MHPMEVENT22] = { "mhpmevent22", any, read_zero }, 2076 [CSR_MHPMEVENT23] = { "mhpmevent23", any, read_zero }, 2077 [CSR_MHPMEVENT24] = { "mhpmevent24", any, read_zero }, 2078 [CSR_MHPMEVENT25] = { "mhpmevent25", any, read_zero }, 2079 [CSR_MHPMEVENT26] = { "mhpmevent26", any, read_zero }, 2080 [CSR_MHPMEVENT27] = { "mhpmevent27", any, read_zero }, 2081 [CSR_MHPMEVENT28] = { "mhpmevent28", any, read_zero }, 2082 [CSR_MHPMEVENT29] = { "mhpmevent29", any, read_zero }, 2083 [CSR_MHPMEVENT30] = { "mhpmevent30", any, read_zero }, 2084 [CSR_MHPMEVENT31] = { "mhpmevent31", any, read_zero }, 2085 2086 [CSR_HPMCOUNTER3H] = { "hpmcounter3h", ctr32, read_zero }, 2087 [CSR_HPMCOUNTER4H] = { "hpmcounter4h", ctr32, read_zero }, 2088 [CSR_HPMCOUNTER5H] = { "hpmcounter5h", ctr32, read_zero }, 2089 [CSR_HPMCOUNTER6H] = { "hpmcounter6h", ctr32, read_zero }, 2090 [CSR_HPMCOUNTER7H] = { "hpmcounter7h", ctr32, read_zero }, 2091 [CSR_HPMCOUNTER8H] = { "hpmcounter8h", ctr32, read_zero }, 2092 [CSR_HPMCOUNTER9H] = { "hpmcounter9h", ctr32, read_zero }, 2093 [CSR_HPMCOUNTER10H] = { "hpmcounter10h", ctr32, read_zero }, 2094 [CSR_HPMCOUNTER11H] = { "hpmcounter11h", ctr32, read_zero }, 2095 [CSR_HPMCOUNTER12H] = { "hpmcounter12h", ctr32, read_zero }, 2096 [CSR_HPMCOUNTER13H] = { "hpmcounter13h", ctr32, read_zero }, 2097 [CSR_HPMCOUNTER14H] = { "hpmcounter14h", ctr32, read_zero }, 2098 [CSR_HPMCOUNTER15H] = { "hpmcounter15h", ctr32, read_zero }, 2099 [CSR_HPMCOUNTER16H] = { "hpmcounter16h", ctr32, read_zero }, 2100 [CSR_HPMCOUNTER17H] = { "hpmcounter17h", ctr32, read_zero }, 2101 [CSR_HPMCOUNTER18H] = { "hpmcounter18h", ctr32, read_zero }, 2102 [CSR_HPMCOUNTER19H] = { "hpmcounter19h", ctr32, read_zero }, 2103 [CSR_HPMCOUNTER20H] = { "hpmcounter20h", ctr32, read_zero }, 2104 [CSR_HPMCOUNTER21H] = { "hpmcounter21h", ctr32, read_zero }, 2105 [CSR_HPMCOUNTER22H] = { "hpmcounter22h", ctr32, read_zero }, 2106 [CSR_HPMCOUNTER23H] = { "hpmcounter23h", ctr32, read_zero }, 2107 [CSR_HPMCOUNTER24H] = { "hpmcounter24h", ctr32, read_zero }, 2108 [CSR_HPMCOUNTER25H] = { "hpmcounter25h", ctr32, read_zero }, 2109 [CSR_HPMCOUNTER26H] = { "hpmcounter26h", ctr32, read_zero }, 2110 [CSR_HPMCOUNTER27H] = { "hpmcounter27h", ctr32, read_zero }, 2111 [CSR_HPMCOUNTER28H] = { "hpmcounter28h", ctr32, read_zero }, 2112 [CSR_HPMCOUNTER29H] = { "hpmcounter29h", ctr32, read_zero }, 2113 [CSR_HPMCOUNTER30H] = { "hpmcounter30h", ctr32, read_zero }, 2114 [CSR_HPMCOUNTER31H] = { "hpmcounter31h", ctr32, read_zero }, 2115 2116 [CSR_MHPMCOUNTER3H] = { "mhpmcounter3h", any32, read_zero }, 2117 [CSR_MHPMCOUNTER4H] = { "mhpmcounter4h", any32, read_zero }, 2118 [CSR_MHPMCOUNTER5H] = { "mhpmcounter5h", any32, read_zero }, 2119 [CSR_MHPMCOUNTER6H] = { "mhpmcounter6h", any32, read_zero }, 2120 [CSR_MHPMCOUNTER7H] = { "mhpmcounter7h", any32, read_zero }, 2121 [CSR_MHPMCOUNTER8H] = { "mhpmcounter8h", any32, read_zero }, 2122 [CSR_MHPMCOUNTER9H] = { "mhpmcounter9h", any32, read_zero }, 2123 [CSR_MHPMCOUNTER10H] = { "mhpmcounter10h", any32, read_zero }, 2124 [CSR_MHPMCOUNTER11H] = { "mhpmcounter11h", any32, read_zero }, 2125 [CSR_MHPMCOUNTER12H] = { "mhpmcounter12h", any32, read_zero }, 2126 [CSR_MHPMCOUNTER13H] = { "mhpmcounter13h", any32, read_zero }, 2127 [CSR_MHPMCOUNTER14H] = { "mhpmcounter14h", any32, read_zero }, 2128 [CSR_MHPMCOUNTER15H] = { "mhpmcounter15h", any32, read_zero }, 2129 [CSR_MHPMCOUNTER16H] = { "mhpmcounter16h", any32, read_zero }, 2130 [CSR_MHPMCOUNTER17H] = { "mhpmcounter17h", any32, read_zero }, 2131 [CSR_MHPMCOUNTER18H] = { "mhpmcounter18h", any32, read_zero }, 2132 [CSR_MHPMCOUNTER19H] = { "mhpmcounter19h", any32, read_zero }, 2133 [CSR_MHPMCOUNTER20H] = { "mhpmcounter20h", any32, read_zero }, 2134 [CSR_MHPMCOUNTER21H] = { "mhpmcounter21h", any32, read_zero }, 2135 [CSR_MHPMCOUNTER22H] = { "mhpmcounter22h", any32, read_zero }, 2136 [CSR_MHPMCOUNTER23H] = { "mhpmcounter23h", any32, read_zero }, 2137 [CSR_MHPMCOUNTER24H] = { "mhpmcounter24h", any32, read_zero }, 2138 [CSR_MHPMCOUNTER25H] = { "mhpmcounter25h", any32, read_zero }, 2139 [CSR_MHPMCOUNTER26H] = { "mhpmcounter26h", any32, read_zero }, 2140 [CSR_MHPMCOUNTER27H] = { "mhpmcounter27h", any32, read_zero }, 2141 [CSR_MHPMCOUNTER28H] = { "mhpmcounter28h", any32, read_zero }, 2142 [CSR_MHPMCOUNTER29H] = { "mhpmcounter29h", any32, read_zero }, 2143 [CSR_MHPMCOUNTER30H] = { "mhpmcounter30h", any32, read_zero }, 2144 [CSR_MHPMCOUNTER31H] = { "mhpmcounter31h", any32, read_zero }, 2145 #endif /* !CONFIG_USER_ONLY */ 2146 }; 2147