1 /* 2 * QEMU RISC-V CPU 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/qemu-print.h" 22 #include "qemu/ctype.h" 23 #include "qemu/log.h" 24 #include "cpu.h" 25 #include "cpu_vendorid.h" 26 #include "internals.h" 27 #include "exec/exec-all.h" 28 #include "qapi/error.h" 29 #include "qapi/visitor.h" 30 #include "qemu/error-report.h" 31 #include "hw/qdev-properties.h" 32 #include "migration/vmstate.h" 33 #include "fpu/softfloat-helpers.h" 34 #include "sysemu/kvm.h" 35 #include "sysemu/tcg.h" 36 #include "kvm/kvm_riscv.h" 37 #include "tcg/tcg-cpu.h" 38 #include "tcg/tcg.h" 39 40 /* RISC-V CPU definitions */ 41 static const char riscv_single_letter_exts[] = "IEMAFDQCPVH"; 42 const uint32_t misa_bits[] = {RVI, RVE, RVM, RVA, RVF, RVD, RVV, 43 RVC, RVS, RVU, RVH, RVJ, RVG, 0}; 44 45 /* 46 * From vector_helper.c 47 * Note that vector data is stored in host-endian 64-bit chunks, 48 * so addressing bytes needs a host-endian fixup. 49 */ 50 #if HOST_BIG_ENDIAN 51 #define BYTE(x) ((x) ^ 7) 52 #else 53 #define BYTE(x) (x) 54 #endif 55 56 #define ISA_EXT_DATA_ENTRY(_name, _min_ver, _prop) \ 57 {#_name, _min_ver, CPU_CFG_OFFSET(_prop)} 58 59 /* 60 * Here are the ordering rules of extension naming defined by RISC-V 61 * specification : 62 * 1. All extensions should be separated from other multi-letter extensions 63 * by an underscore. 64 * 2. The first letter following the 'Z' conventionally indicates the most 65 * closely related alphabetical extension category, IMAFDQLCBKJTPVH. 66 * If multiple 'Z' extensions are named, they should be ordered first 67 * by category, then alphabetically within a category. 68 * 3. Standard supervisor-level extensions (starts with 'S') should be 69 * listed after standard unprivileged extensions. If multiple 70 * supervisor-level extensions are listed, they should be ordered 71 * alphabetically. 72 * 4. Non-standard extensions (starts with 'X') must be listed after all 73 * standard extensions. They must be separated from other multi-letter 74 * extensions by an underscore. 75 * 76 * Single letter extensions are checked in riscv_cpu_validate_misa_priv() 77 * instead. 78 */ 79 const RISCVIsaExtData isa_edata_arr[] = { 80 ISA_EXT_DATA_ENTRY(zicbom, PRIV_VERSION_1_12_0, ext_zicbom), 81 ISA_EXT_DATA_ENTRY(zicboz, PRIV_VERSION_1_12_0, ext_zicboz), 82 ISA_EXT_DATA_ENTRY(zicond, PRIV_VERSION_1_12_0, ext_zicond), 83 ISA_EXT_DATA_ENTRY(zicntr, PRIV_VERSION_1_12_0, ext_zicntr), 84 ISA_EXT_DATA_ENTRY(zicsr, PRIV_VERSION_1_10_0, ext_zicsr), 85 ISA_EXT_DATA_ENTRY(zifencei, PRIV_VERSION_1_10_0, ext_zifencei), 86 ISA_EXT_DATA_ENTRY(zihintntl, PRIV_VERSION_1_10_0, ext_zihintntl), 87 ISA_EXT_DATA_ENTRY(zihintpause, PRIV_VERSION_1_10_0, ext_zihintpause), 88 ISA_EXT_DATA_ENTRY(zihpm, PRIV_VERSION_1_12_0, ext_zihpm), 89 ISA_EXT_DATA_ENTRY(zmmul, PRIV_VERSION_1_12_0, ext_zmmul), 90 ISA_EXT_DATA_ENTRY(zawrs, PRIV_VERSION_1_12_0, ext_zawrs), 91 ISA_EXT_DATA_ENTRY(zfa, PRIV_VERSION_1_12_0, ext_zfa), 92 ISA_EXT_DATA_ENTRY(zfbfmin, PRIV_VERSION_1_12_0, ext_zfbfmin), 93 ISA_EXT_DATA_ENTRY(zfh, PRIV_VERSION_1_11_0, ext_zfh), 94 ISA_EXT_DATA_ENTRY(zfhmin, PRIV_VERSION_1_11_0, ext_zfhmin), 95 ISA_EXT_DATA_ENTRY(zfinx, PRIV_VERSION_1_12_0, ext_zfinx), 96 ISA_EXT_DATA_ENTRY(zdinx, PRIV_VERSION_1_12_0, ext_zdinx), 97 ISA_EXT_DATA_ENTRY(zca, PRIV_VERSION_1_12_0, ext_zca), 98 ISA_EXT_DATA_ENTRY(zcb, PRIV_VERSION_1_12_0, ext_zcb), 99 ISA_EXT_DATA_ENTRY(zcf, PRIV_VERSION_1_12_0, ext_zcf), 100 ISA_EXT_DATA_ENTRY(zcd, PRIV_VERSION_1_12_0, ext_zcd), 101 ISA_EXT_DATA_ENTRY(zce, PRIV_VERSION_1_12_0, ext_zce), 102 ISA_EXT_DATA_ENTRY(zcmp, PRIV_VERSION_1_12_0, ext_zcmp), 103 ISA_EXT_DATA_ENTRY(zcmt, PRIV_VERSION_1_12_0, ext_zcmt), 104 ISA_EXT_DATA_ENTRY(zba, PRIV_VERSION_1_12_0, ext_zba), 105 ISA_EXT_DATA_ENTRY(zbb, PRIV_VERSION_1_12_0, ext_zbb), 106 ISA_EXT_DATA_ENTRY(zbc, PRIV_VERSION_1_12_0, ext_zbc), 107 ISA_EXT_DATA_ENTRY(zbkb, PRIV_VERSION_1_12_0, ext_zbkb), 108 ISA_EXT_DATA_ENTRY(zbkc, PRIV_VERSION_1_12_0, ext_zbkc), 109 ISA_EXT_DATA_ENTRY(zbkx, PRIV_VERSION_1_12_0, ext_zbkx), 110 ISA_EXT_DATA_ENTRY(zbs, PRIV_VERSION_1_12_0, ext_zbs), 111 ISA_EXT_DATA_ENTRY(zk, PRIV_VERSION_1_12_0, ext_zk), 112 ISA_EXT_DATA_ENTRY(zkn, PRIV_VERSION_1_12_0, ext_zkn), 113 ISA_EXT_DATA_ENTRY(zknd, PRIV_VERSION_1_12_0, ext_zknd), 114 ISA_EXT_DATA_ENTRY(zkne, PRIV_VERSION_1_12_0, ext_zkne), 115 ISA_EXT_DATA_ENTRY(zknh, PRIV_VERSION_1_12_0, ext_zknh), 116 ISA_EXT_DATA_ENTRY(zkr, PRIV_VERSION_1_12_0, ext_zkr), 117 ISA_EXT_DATA_ENTRY(zks, PRIV_VERSION_1_12_0, ext_zks), 118 ISA_EXT_DATA_ENTRY(zksed, PRIV_VERSION_1_12_0, ext_zksed), 119 ISA_EXT_DATA_ENTRY(zksh, PRIV_VERSION_1_12_0, ext_zksh), 120 ISA_EXT_DATA_ENTRY(zkt, PRIV_VERSION_1_12_0, ext_zkt), 121 ISA_EXT_DATA_ENTRY(zvbb, PRIV_VERSION_1_12_0, ext_zvbb), 122 ISA_EXT_DATA_ENTRY(zvbc, PRIV_VERSION_1_12_0, ext_zvbc), 123 ISA_EXT_DATA_ENTRY(zve32f, PRIV_VERSION_1_10_0, ext_zve32f), 124 ISA_EXT_DATA_ENTRY(zve64f, PRIV_VERSION_1_10_0, ext_zve64f), 125 ISA_EXT_DATA_ENTRY(zve64d, PRIV_VERSION_1_10_0, ext_zve64d), 126 ISA_EXT_DATA_ENTRY(zvfbfmin, PRIV_VERSION_1_12_0, ext_zvfbfmin), 127 ISA_EXT_DATA_ENTRY(zvfbfwma, PRIV_VERSION_1_12_0, ext_zvfbfwma), 128 ISA_EXT_DATA_ENTRY(zvfh, PRIV_VERSION_1_12_0, ext_zvfh), 129 ISA_EXT_DATA_ENTRY(zvfhmin, PRIV_VERSION_1_12_0, ext_zvfhmin), 130 ISA_EXT_DATA_ENTRY(zvkb, PRIV_VERSION_1_12_0, ext_zvkb), 131 ISA_EXT_DATA_ENTRY(zvkg, PRIV_VERSION_1_12_0, ext_zvkg), 132 ISA_EXT_DATA_ENTRY(zvkn, PRIV_VERSION_1_12_0, ext_zvkn), 133 ISA_EXT_DATA_ENTRY(zvknc, PRIV_VERSION_1_12_0, ext_zvknc), 134 ISA_EXT_DATA_ENTRY(zvkned, PRIV_VERSION_1_12_0, ext_zvkned), 135 ISA_EXT_DATA_ENTRY(zvkng, PRIV_VERSION_1_12_0, ext_zvkng), 136 ISA_EXT_DATA_ENTRY(zvknha, PRIV_VERSION_1_12_0, ext_zvknha), 137 ISA_EXT_DATA_ENTRY(zvknhb, PRIV_VERSION_1_12_0, ext_zvknhb), 138 ISA_EXT_DATA_ENTRY(zvks, PRIV_VERSION_1_12_0, ext_zvks), 139 ISA_EXT_DATA_ENTRY(zvksc, PRIV_VERSION_1_12_0, ext_zvksc), 140 ISA_EXT_DATA_ENTRY(zvksed, PRIV_VERSION_1_12_0, ext_zvksed), 141 ISA_EXT_DATA_ENTRY(zvksg, PRIV_VERSION_1_12_0, ext_zvksg), 142 ISA_EXT_DATA_ENTRY(zvksh, PRIV_VERSION_1_12_0, ext_zvksh), 143 ISA_EXT_DATA_ENTRY(zvkt, PRIV_VERSION_1_12_0, ext_zvkt), 144 ISA_EXT_DATA_ENTRY(zhinx, PRIV_VERSION_1_12_0, ext_zhinx), 145 ISA_EXT_DATA_ENTRY(zhinxmin, PRIV_VERSION_1_12_0, ext_zhinxmin), 146 ISA_EXT_DATA_ENTRY(smaia, PRIV_VERSION_1_12_0, ext_smaia), 147 ISA_EXT_DATA_ENTRY(smepmp, PRIV_VERSION_1_12_0, ext_smepmp), 148 ISA_EXT_DATA_ENTRY(smstateen, PRIV_VERSION_1_12_0, ext_smstateen), 149 ISA_EXT_DATA_ENTRY(ssaia, PRIV_VERSION_1_12_0, ext_ssaia), 150 ISA_EXT_DATA_ENTRY(sscofpmf, PRIV_VERSION_1_12_0, ext_sscofpmf), 151 ISA_EXT_DATA_ENTRY(sstc, PRIV_VERSION_1_12_0, ext_sstc), 152 ISA_EXT_DATA_ENTRY(svadu, PRIV_VERSION_1_12_0, ext_svadu), 153 ISA_EXT_DATA_ENTRY(svinval, PRIV_VERSION_1_12_0, ext_svinval), 154 ISA_EXT_DATA_ENTRY(svnapot, PRIV_VERSION_1_12_0, ext_svnapot), 155 ISA_EXT_DATA_ENTRY(svpbmt, PRIV_VERSION_1_12_0, ext_svpbmt), 156 ISA_EXT_DATA_ENTRY(xtheadba, PRIV_VERSION_1_11_0, ext_xtheadba), 157 ISA_EXT_DATA_ENTRY(xtheadbb, PRIV_VERSION_1_11_0, ext_xtheadbb), 158 ISA_EXT_DATA_ENTRY(xtheadbs, PRIV_VERSION_1_11_0, ext_xtheadbs), 159 ISA_EXT_DATA_ENTRY(xtheadcmo, PRIV_VERSION_1_11_0, ext_xtheadcmo), 160 ISA_EXT_DATA_ENTRY(xtheadcondmov, PRIV_VERSION_1_11_0, ext_xtheadcondmov), 161 ISA_EXT_DATA_ENTRY(xtheadfmemidx, PRIV_VERSION_1_11_0, ext_xtheadfmemidx), 162 ISA_EXT_DATA_ENTRY(xtheadfmv, PRIV_VERSION_1_11_0, ext_xtheadfmv), 163 ISA_EXT_DATA_ENTRY(xtheadmac, PRIV_VERSION_1_11_0, ext_xtheadmac), 164 ISA_EXT_DATA_ENTRY(xtheadmemidx, PRIV_VERSION_1_11_0, ext_xtheadmemidx), 165 ISA_EXT_DATA_ENTRY(xtheadmempair, PRIV_VERSION_1_11_0, ext_xtheadmempair), 166 ISA_EXT_DATA_ENTRY(xtheadsync, PRIV_VERSION_1_11_0, ext_xtheadsync), 167 ISA_EXT_DATA_ENTRY(xventanacondops, PRIV_VERSION_1_12_0, ext_XVentanaCondOps), 168 169 DEFINE_PROP_END_OF_LIST(), 170 }; 171 172 bool isa_ext_is_enabled(RISCVCPU *cpu, uint32_t ext_offset) 173 { 174 bool *ext_enabled = (void *)&cpu->cfg + ext_offset; 175 176 return *ext_enabled; 177 } 178 179 void isa_ext_update_enabled(RISCVCPU *cpu, uint32_t ext_offset, bool en) 180 { 181 bool *ext_enabled = (void *)&cpu->cfg + ext_offset; 182 183 *ext_enabled = en; 184 } 185 186 const char * const riscv_int_regnames[] = { 187 "x0/zero", "x1/ra", "x2/sp", "x3/gp", "x4/tp", "x5/t0", "x6/t1", 188 "x7/t2", "x8/s0", "x9/s1", "x10/a0", "x11/a1", "x12/a2", "x13/a3", 189 "x14/a4", "x15/a5", "x16/a6", "x17/a7", "x18/s2", "x19/s3", "x20/s4", 190 "x21/s5", "x22/s6", "x23/s7", "x24/s8", "x25/s9", "x26/s10", "x27/s11", 191 "x28/t3", "x29/t4", "x30/t5", "x31/t6" 192 }; 193 194 const char * const riscv_int_regnamesh[] = { 195 "x0h/zeroh", "x1h/rah", "x2h/sph", "x3h/gph", "x4h/tph", "x5h/t0h", 196 "x6h/t1h", "x7h/t2h", "x8h/s0h", "x9h/s1h", "x10h/a0h", "x11h/a1h", 197 "x12h/a2h", "x13h/a3h", "x14h/a4h", "x15h/a5h", "x16h/a6h", "x17h/a7h", 198 "x18h/s2h", "x19h/s3h", "x20h/s4h", "x21h/s5h", "x22h/s6h", "x23h/s7h", 199 "x24h/s8h", "x25h/s9h", "x26h/s10h", "x27h/s11h", "x28h/t3h", "x29h/t4h", 200 "x30h/t5h", "x31h/t6h" 201 }; 202 203 const char * const riscv_fpr_regnames[] = { 204 "f0/ft0", "f1/ft1", "f2/ft2", "f3/ft3", "f4/ft4", "f5/ft5", 205 "f6/ft6", "f7/ft7", "f8/fs0", "f9/fs1", "f10/fa0", "f11/fa1", 206 "f12/fa2", "f13/fa3", "f14/fa4", "f15/fa5", "f16/fa6", "f17/fa7", 207 "f18/fs2", "f19/fs3", "f20/fs4", "f21/fs5", "f22/fs6", "f23/fs7", 208 "f24/fs8", "f25/fs9", "f26/fs10", "f27/fs11", "f28/ft8", "f29/ft9", 209 "f30/ft10", "f31/ft11" 210 }; 211 212 const char * const riscv_rvv_regnames[] = { 213 "v0", "v1", "v2", "v3", "v4", "v5", "v6", 214 "v7", "v8", "v9", "v10", "v11", "v12", "v13", 215 "v14", "v15", "v16", "v17", "v18", "v19", "v20", 216 "v21", "v22", "v23", "v24", "v25", "v26", "v27", 217 "v28", "v29", "v30", "v31" 218 }; 219 220 static const char * const riscv_excp_names[] = { 221 "misaligned_fetch", 222 "fault_fetch", 223 "illegal_instruction", 224 "breakpoint", 225 "misaligned_load", 226 "fault_load", 227 "misaligned_store", 228 "fault_store", 229 "user_ecall", 230 "supervisor_ecall", 231 "hypervisor_ecall", 232 "machine_ecall", 233 "exec_page_fault", 234 "load_page_fault", 235 "reserved", 236 "store_page_fault", 237 "reserved", 238 "reserved", 239 "reserved", 240 "reserved", 241 "guest_exec_page_fault", 242 "guest_load_page_fault", 243 "reserved", 244 "guest_store_page_fault", 245 }; 246 247 static const char * const riscv_intr_names[] = { 248 "u_software", 249 "s_software", 250 "vs_software", 251 "m_software", 252 "u_timer", 253 "s_timer", 254 "vs_timer", 255 "m_timer", 256 "u_external", 257 "s_external", 258 "vs_external", 259 "m_external", 260 "reserved", 261 "reserved", 262 "reserved", 263 "reserved" 264 }; 265 266 const char *riscv_cpu_get_trap_name(target_ulong cause, bool async) 267 { 268 if (async) { 269 return (cause < ARRAY_SIZE(riscv_intr_names)) ? 270 riscv_intr_names[cause] : "(unknown)"; 271 } else { 272 return (cause < ARRAY_SIZE(riscv_excp_names)) ? 273 riscv_excp_names[cause] : "(unknown)"; 274 } 275 } 276 277 void riscv_cpu_set_misa(CPURISCVState *env, RISCVMXL mxl, uint32_t ext) 278 { 279 env->misa_mxl_max = env->misa_mxl = mxl; 280 env->misa_ext_mask = env->misa_ext = ext; 281 } 282 283 #ifndef CONFIG_USER_ONLY 284 static uint8_t satp_mode_from_str(const char *satp_mode_str) 285 { 286 if (!strncmp(satp_mode_str, "mbare", 5)) { 287 return VM_1_10_MBARE; 288 } 289 290 if (!strncmp(satp_mode_str, "sv32", 4)) { 291 return VM_1_10_SV32; 292 } 293 294 if (!strncmp(satp_mode_str, "sv39", 4)) { 295 return VM_1_10_SV39; 296 } 297 298 if (!strncmp(satp_mode_str, "sv48", 4)) { 299 return VM_1_10_SV48; 300 } 301 302 if (!strncmp(satp_mode_str, "sv57", 4)) { 303 return VM_1_10_SV57; 304 } 305 306 if (!strncmp(satp_mode_str, "sv64", 4)) { 307 return VM_1_10_SV64; 308 } 309 310 g_assert_not_reached(); 311 } 312 313 uint8_t satp_mode_max_from_map(uint32_t map) 314 { 315 /* 316 * 'map = 0' will make us return (31 - 32), which C will 317 * happily overflow to UINT_MAX. There's no good result to 318 * return if 'map = 0' (e.g. returning 0 will be ambiguous 319 * with the result for 'map = 1'). 320 * 321 * Assert out if map = 0. Callers will have to deal with 322 * it outside of this function. 323 */ 324 g_assert(map > 0); 325 326 /* map here has at least one bit set, so no problem with clz */ 327 return 31 - __builtin_clz(map); 328 } 329 330 const char *satp_mode_str(uint8_t satp_mode, bool is_32_bit) 331 { 332 if (is_32_bit) { 333 switch (satp_mode) { 334 case VM_1_10_SV32: 335 return "sv32"; 336 case VM_1_10_MBARE: 337 return "none"; 338 } 339 } else { 340 switch (satp_mode) { 341 case VM_1_10_SV64: 342 return "sv64"; 343 case VM_1_10_SV57: 344 return "sv57"; 345 case VM_1_10_SV48: 346 return "sv48"; 347 case VM_1_10_SV39: 348 return "sv39"; 349 case VM_1_10_MBARE: 350 return "none"; 351 } 352 } 353 354 g_assert_not_reached(); 355 } 356 357 static void set_satp_mode_max_supported(RISCVCPU *cpu, 358 uint8_t satp_mode) 359 { 360 bool rv32 = riscv_cpu_mxl(&cpu->env) == MXL_RV32; 361 const bool *valid_vm = rv32 ? valid_vm_1_10_32 : valid_vm_1_10_64; 362 363 for (int i = 0; i <= satp_mode; ++i) { 364 if (valid_vm[i]) { 365 cpu->cfg.satp_mode.supported |= (1 << i); 366 } 367 } 368 } 369 370 /* Set the satp mode to the max supported */ 371 static void set_satp_mode_default_map(RISCVCPU *cpu) 372 { 373 cpu->cfg.satp_mode.map = cpu->cfg.satp_mode.supported; 374 } 375 #endif 376 377 static void riscv_any_cpu_init(Object *obj) 378 { 379 RISCVCPU *cpu = RISCV_CPU(obj); 380 CPURISCVState *env = &cpu->env; 381 #if defined(TARGET_RISCV32) 382 riscv_cpu_set_misa(env, MXL_RV32, RVI | RVM | RVA | RVF | RVD | RVC | RVU); 383 #elif defined(TARGET_RISCV64) 384 riscv_cpu_set_misa(env, MXL_RV64, RVI | RVM | RVA | RVF | RVD | RVC | RVU); 385 #endif 386 387 #ifndef CONFIG_USER_ONLY 388 set_satp_mode_max_supported(RISCV_CPU(obj), 389 riscv_cpu_mxl(&RISCV_CPU(obj)->env) == MXL_RV32 ? 390 VM_1_10_SV32 : VM_1_10_SV57); 391 #endif 392 393 env->priv_ver = PRIV_VERSION_LATEST; 394 395 /* inherited from parent obj via riscv_cpu_init() */ 396 cpu->cfg.ext_zifencei = true; 397 cpu->cfg.ext_zicsr = true; 398 cpu->cfg.mmu = true; 399 cpu->cfg.pmp = true; 400 } 401 402 static void riscv_max_cpu_init(Object *obj) 403 { 404 RISCVCPU *cpu = RISCV_CPU(obj); 405 CPURISCVState *env = &cpu->env; 406 RISCVMXL mlx = MXL_RV64; 407 408 #ifdef TARGET_RISCV32 409 mlx = MXL_RV32; 410 #endif 411 riscv_cpu_set_misa(env, mlx, 0); 412 env->priv_ver = PRIV_VERSION_LATEST; 413 #ifndef CONFIG_USER_ONLY 414 set_satp_mode_max_supported(RISCV_CPU(obj), mlx == MXL_RV32 ? 415 VM_1_10_SV32 : VM_1_10_SV57); 416 #endif 417 } 418 419 #if defined(TARGET_RISCV64) 420 static void rv64_base_cpu_init(Object *obj) 421 { 422 CPURISCVState *env = &RISCV_CPU(obj)->env; 423 /* We set this in the realise function */ 424 riscv_cpu_set_misa(env, MXL_RV64, 0); 425 /* Set latest version of privileged specification */ 426 env->priv_ver = PRIV_VERSION_LATEST; 427 #ifndef CONFIG_USER_ONLY 428 set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV57); 429 #endif 430 } 431 432 static void rv64_sifive_u_cpu_init(Object *obj) 433 { 434 RISCVCPU *cpu = RISCV_CPU(obj); 435 CPURISCVState *env = &cpu->env; 436 riscv_cpu_set_misa(env, MXL_RV64, 437 RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU); 438 env->priv_ver = PRIV_VERSION_1_10_0; 439 #ifndef CONFIG_USER_ONLY 440 set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV39); 441 #endif 442 443 /* inherited from parent obj via riscv_cpu_init() */ 444 cpu->cfg.ext_zifencei = true; 445 cpu->cfg.ext_zicsr = true; 446 cpu->cfg.mmu = true; 447 cpu->cfg.pmp = true; 448 } 449 450 static void rv64_sifive_e_cpu_init(Object *obj) 451 { 452 CPURISCVState *env = &RISCV_CPU(obj)->env; 453 RISCVCPU *cpu = RISCV_CPU(obj); 454 455 riscv_cpu_set_misa(env, MXL_RV64, RVI | RVM | RVA | RVC | RVU); 456 env->priv_ver = PRIV_VERSION_1_10_0; 457 #ifndef CONFIG_USER_ONLY 458 set_satp_mode_max_supported(cpu, VM_1_10_MBARE); 459 #endif 460 461 /* inherited from parent obj via riscv_cpu_init() */ 462 cpu->cfg.ext_zifencei = true; 463 cpu->cfg.ext_zicsr = true; 464 cpu->cfg.pmp = true; 465 } 466 467 static void rv64_thead_c906_cpu_init(Object *obj) 468 { 469 CPURISCVState *env = &RISCV_CPU(obj)->env; 470 RISCVCPU *cpu = RISCV_CPU(obj); 471 472 riscv_cpu_set_misa(env, MXL_RV64, RVG | RVC | RVS | RVU); 473 env->priv_ver = PRIV_VERSION_1_11_0; 474 475 cpu->cfg.ext_zfa = true; 476 cpu->cfg.ext_zfh = true; 477 cpu->cfg.mmu = true; 478 cpu->cfg.ext_xtheadba = true; 479 cpu->cfg.ext_xtheadbb = true; 480 cpu->cfg.ext_xtheadbs = true; 481 cpu->cfg.ext_xtheadcmo = true; 482 cpu->cfg.ext_xtheadcondmov = true; 483 cpu->cfg.ext_xtheadfmemidx = true; 484 cpu->cfg.ext_xtheadmac = true; 485 cpu->cfg.ext_xtheadmemidx = true; 486 cpu->cfg.ext_xtheadmempair = true; 487 cpu->cfg.ext_xtheadsync = true; 488 489 cpu->cfg.mvendorid = THEAD_VENDOR_ID; 490 #ifndef CONFIG_USER_ONLY 491 set_satp_mode_max_supported(cpu, VM_1_10_SV39); 492 #endif 493 494 /* inherited from parent obj via riscv_cpu_init() */ 495 cpu->cfg.pmp = true; 496 } 497 498 static void rv64_veyron_v1_cpu_init(Object *obj) 499 { 500 CPURISCVState *env = &RISCV_CPU(obj)->env; 501 RISCVCPU *cpu = RISCV_CPU(obj); 502 503 riscv_cpu_set_misa(env, MXL_RV64, RVG | RVC | RVS | RVU | RVH); 504 env->priv_ver = PRIV_VERSION_1_12_0; 505 506 /* Enable ISA extensions */ 507 cpu->cfg.mmu = true; 508 cpu->cfg.ext_zifencei = true; 509 cpu->cfg.ext_zicsr = true; 510 cpu->cfg.pmp = true; 511 cpu->cfg.ext_zicbom = true; 512 cpu->cfg.cbom_blocksize = 64; 513 cpu->cfg.cboz_blocksize = 64; 514 cpu->cfg.ext_zicboz = true; 515 cpu->cfg.ext_smaia = true; 516 cpu->cfg.ext_ssaia = true; 517 cpu->cfg.ext_sscofpmf = true; 518 cpu->cfg.ext_sstc = true; 519 cpu->cfg.ext_svinval = true; 520 cpu->cfg.ext_svnapot = true; 521 cpu->cfg.ext_svpbmt = true; 522 cpu->cfg.ext_smstateen = true; 523 cpu->cfg.ext_zba = true; 524 cpu->cfg.ext_zbb = true; 525 cpu->cfg.ext_zbc = true; 526 cpu->cfg.ext_zbs = true; 527 cpu->cfg.ext_XVentanaCondOps = true; 528 529 cpu->cfg.mvendorid = VEYRON_V1_MVENDORID; 530 cpu->cfg.marchid = VEYRON_V1_MARCHID; 531 cpu->cfg.mimpid = VEYRON_V1_MIMPID; 532 533 #ifndef CONFIG_USER_ONLY 534 set_satp_mode_max_supported(cpu, VM_1_10_SV48); 535 #endif 536 } 537 538 static void rv128_base_cpu_init(Object *obj) 539 { 540 if (qemu_tcg_mttcg_enabled()) { 541 /* Missing 128-bit aligned atomics */ 542 error_report("128-bit RISC-V currently does not work with Multi " 543 "Threaded TCG. Please use: -accel tcg,thread=single"); 544 exit(EXIT_FAILURE); 545 } 546 CPURISCVState *env = &RISCV_CPU(obj)->env; 547 /* We set this in the realise function */ 548 riscv_cpu_set_misa(env, MXL_RV128, 0); 549 /* Set latest version of privileged specification */ 550 env->priv_ver = PRIV_VERSION_LATEST; 551 #ifndef CONFIG_USER_ONLY 552 set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV57); 553 #endif 554 } 555 #else 556 static void rv32_base_cpu_init(Object *obj) 557 { 558 CPURISCVState *env = &RISCV_CPU(obj)->env; 559 /* We set this in the realise function */ 560 riscv_cpu_set_misa(env, MXL_RV32, 0); 561 /* Set latest version of privileged specification */ 562 env->priv_ver = PRIV_VERSION_LATEST; 563 #ifndef CONFIG_USER_ONLY 564 set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV32); 565 #endif 566 } 567 568 static void rv32_sifive_u_cpu_init(Object *obj) 569 { 570 RISCVCPU *cpu = RISCV_CPU(obj); 571 CPURISCVState *env = &cpu->env; 572 riscv_cpu_set_misa(env, MXL_RV32, 573 RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU); 574 env->priv_ver = PRIV_VERSION_1_10_0; 575 #ifndef CONFIG_USER_ONLY 576 set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV32); 577 #endif 578 579 /* inherited from parent obj via riscv_cpu_init() */ 580 cpu->cfg.ext_zifencei = true; 581 cpu->cfg.ext_zicsr = true; 582 cpu->cfg.mmu = true; 583 cpu->cfg.pmp = true; 584 } 585 586 static void rv32_sifive_e_cpu_init(Object *obj) 587 { 588 CPURISCVState *env = &RISCV_CPU(obj)->env; 589 RISCVCPU *cpu = RISCV_CPU(obj); 590 591 riscv_cpu_set_misa(env, MXL_RV32, RVI | RVM | RVA | RVC | RVU); 592 env->priv_ver = PRIV_VERSION_1_10_0; 593 #ifndef CONFIG_USER_ONLY 594 set_satp_mode_max_supported(cpu, VM_1_10_MBARE); 595 #endif 596 597 /* inherited from parent obj via riscv_cpu_init() */ 598 cpu->cfg.ext_zifencei = true; 599 cpu->cfg.ext_zicsr = true; 600 cpu->cfg.pmp = true; 601 } 602 603 static void rv32_ibex_cpu_init(Object *obj) 604 { 605 CPURISCVState *env = &RISCV_CPU(obj)->env; 606 RISCVCPU *cpu = RISCV_CPU(obj); 607 608 riscv_cpu_set_misa(env, MXL_RV32, RVI | RVM | RVC | RVU); 609 env->priv_ver = PRIV_VERSION_1_11_0; 610 #ifndef CONFIG_USER_ONLY 611 set_satp_mode_max_supported(cpu, VM_1_10_MBARE); 612 #endif 613 /* inherited from parent obj via riscv_cpu_init() */ 614 cpu->cfg.ext_zifencei = true; 615 cpu->cfg.ext_zicsr = true; 616 cpu->cfg.pmp = true; 617 cpu->cfg.ext_smepmp = true; 618 } 619 620 static void rv32_imafcu_nommu_cpu_init(Object *obj) 621 { 622 CPURISCVState *env = &RISCV_CPU(obj)->env; 623 RISCVCPU *cpu = RISCV_CPU(obj); 624 625 riscv_cpu_set_misa(env, MXL_RV32, RVI | RVM | RVA | RVF | RVC | RVU); 626 env->priv_ver = PRIV_VERSION_1_10_0; 627 #ifndef CONFIG_USER_ONLY 628 set_satp_mode_max_supported(cpu, VM_1_10_MBARE); 629 #endif 630 631 /* inherited from parent obj via riscv_cpu_init() */ 632 cpu->cfg.ext_zifencei = true; 633 cpu->cfg.ext_zicsr = true; 634 cpu->cfg.pmp = true; 635 } 636 #endif 637 638 static ObjectClass *riscv_cpu_class_by_name(const char *cpu_model) 639 { 640 ObjectClass *oc; 641 char *typename; 642 char **cpuname; 643 644 cpuname = g_strsplit(cpu_model, ",", 1); 645 typename = g_strdup_printf(RISCV_CPU_TYPE_NAME("%s"), cpuname[0]); 646 oc = object_class_by_name(typename); 647 g_strfreev(cpuname); 648 g_free(typename); 649 if (!oc || !object_class_dynamic_cast(oc, TYPE_RISCV_CPU) || 650 object_class_is_abstract(oc)) { 651 return NULL; 652 } 653 return oc; 654 } 655 656 char *riscv_cpu_get_name(RISCVCPU *cpu) 657 { 658 RISCVCPUClass *rcc = RISCV_CPU_GET_CLASS(cpu); 659 const char *typename = object_class_get_name(OBJECT_CLASS(rcc)); 660 661 g_assert(g_str_has_suffix(typename, RISCV_CPU_TYPE_SUFFIX)); 662 663 return g_strndup(typename, 664 strlen(typename) - strlen(RISCV_CPU_TYPE_SUFFIX)); 665 } 666 667 static void riscv_cpu_dump_state(CPUState *cs, FILE *f, int flags) 668 { 669 RISCVCPU *cpu = RISCV_CPU(cs); 670 CPURISCVState *env = &cpu->env; 671 int i, j; 672 uint8_t *p; 673 674 #if !defined(CONFIG_USER_ONLY) 675 if (riscv_has_ext(env, RVH)) { 676 qemu_fprintf(f, " %s %d\n", "V = ", env->virt_enabled); 677 } 678 #endif 679 qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "pc ", env->pc); 680 #ifndef CONFIG_USER_ONLY 681 { 682 static const int dump_csrs[] = { 683 CSR_MHARTID, 684 CSR_MSTATUS, 685 CSR_MSTATUSH, 686 /* 687 * CSR_SSTATUS is intentionally omitted here as its value 688 * can be figured out by looking at CSR_MSTATUS 689 */ 690 CSR_HSTATUS, 691 CSR_VSSTATUS, 692 CSR_MIP, 693 CSR_MIE, 694 CSR_MIDELEG, 695 CSR_HIDELEG, 696 CSR_MEDELEG, 697 CSR_HEDELEG, 698 CSR_MTVEC, 699 CSR_STVEC, 700 CSR_VSTVEC, 701 CSR_MEPC, 702 CSR_SEPC, 703 CSR_VSEPC, 704 CSR_MCAUSE, 705 CSR_SCAUSE, 706 CSR_VSCAUSE, 707 CSR_MTVAL, 708 CSR_STVAL, 709 CSR_HTVAL, 710 CSR_MTVAL2, 711 CSR_MSCRATCH, 712 CSR_SSCRATCH, 713 CSR_SATP, 714 CSR_MMTE, 715 CSR_UPMBASE, 716 CSR_UPMMASK, 717 CSR_SPMBASE, 718 CSR_SPMMASK, 719 CSR_MPMBASE, 720 CSR_MPMMASK, 721 }; 722 723 for (i = 0; i < ARRAY_SIZE(dump_csrs); ++i) { 724 int csrno = dump_csrs[i]; 725 target_ulong val = 0; 726 RISCVException res = riscv_csrrw_debug(env, csrno, &val, 0, 0); 727 728 /* 729 * Rely on the smode, hmode, etc, predicates within csr.c 730 * to do the filtering of the registers that are present. 731 */ 732 if (res == RISCV_EXCP_NONE) { 733 qemu_fprintf(f, " %-8s " TARGET_FMT_lx "\n", 734 csr_ops[csrno].name, val); 735 } 736 } 737 } 738 #endif 739 740 for (i = 0; i < 32; i++) { 741 qemu_fprintf(f, " %-8s " TARGET_FMT_lx, 742 riscv_int_regnames[i], env->gpr[i]); 743 if ((i & 3) == 3) { 744 qemu_fprintf(f, "\n"); 745 } 746 } 747 if (flags & CPU_DUMP_FPU) { 748 for (i = 0; i < 32; i++) { 749 qemu_fprintf(f, " %-8s %016" PRIx64, 750 riscv_fpr_regnames[i], env->fpr[i]); 751 if ((i & 3) == 3) { 752 qemu_fprintf(f, "\n"); 753 } 754 } 755 } 756 if (riscv_has_ext(env, RVV) && (flags & CPU_DUMP_VPU)) { 757 static const int dump_rvv_csrs[] = { 758 CSR_VSTART, 759 CSR_VXSAT, 760 CSR_VXRM, 761 CSR_VCSR, 762 CSR_VL, 763 CSR_VTYPE, 764 CSR_VLENB, 765 }; 766 for (i = 0; i < ARRAY_SIZE(dump_rvv_csrs); ++i) { 767 int csrno = dump_rvv_csrs[i]; 768 target_ulong val = 0; 769 RISCVException res = riscv_csrrw_debug(env, csrno, &val, 0, 0); 770 771 /* 772 * Rely on the smode, hmode, etc, predicates within csr.c 773 * to do the filtering of the registers that are present. 774 */ 775 if (res == RISCV_EXCP_NONE) { 776 qemu_fprintf(f, " %-8s " TARGET_FMT_lx "\n", 777 csr_ops[csrno].name, val); 778 } 779 } 780 uint16_t vlenb = cpu->cfg.vlen >> 3; 781 782 for (i = 0; i < 32; i++) { 783 qemu_fprintf(f, " %-8s ", riscv_rvv_regnames[i]); 784 p = (uint8_t *)env->vreg; 785 for (j = vlenb - 1 ; j >= 0; j--) { 786 qemu_fprintf(f, "%02x", *(p + i * vlenb + BYTE(j))); 787 } 788 qemu_fprintf(f, "\n"); 789 } 790 } 791 } 792 793 static void riscv_cpu_set_pc(CPUState *cs, vaddr value) 794 { 795 RISCVCPU *cpu = RISCV_CPU(cs); 796 CPURISCVState *env = &cpu->env; 797 798 if (env->xl == MXL_RV32) { 799 env->pc = (int32_t)value; 800 } else { 801 env->pc = value; 802 } 803 } 804 805 static vaddr riscv_cpu_get_pc(CPUState *cs) 806 { 807 RISCVCPU *cpu = RISCV_CPU(cs); 808 CPURISCVState *env = &cpu->env; 809 810 /* Match cpu_get_tb_cpu_state. */ 811 if (env->xl == MXL_RV32) { 812 return env->pc & UINT32_MAX; 813 } 814 return env->pc; 815 } 816 817 static bool riscv_cpu_has_work(CPUState *cs) 818 { 819 #ifndef CONFIG_USER_ONLY 820 RISCVCPU *cpu = RISCV_CPU(cs); 821 CPURISCVState *env = &cpu->env; 822 /* 823 * Definition of the WFI instruction requires it to ignore the privilege 824 * mode and delegation registers, but respect individual enables 825 */ 826 return riscv_cpu_all_pending(env) != 0 || 827 riscv_cpu_sirq_pending(env) != RISCV_EXCP_NONE || 828 riscv_cpu_vsirq_pending(env) != RISCV_EXCP_NONE; 829 #else 830 return true; 831 #endif 832 } 833 834 static void riscv_cpu_reset_hold(Object *obj) 835 { 836 #ifndef CONFIG_USER_ONLY 837 uint8_t iprio; 838 int i, irq, rdzero; 839 #endif 840 CPUState *cs = CPU(obj); 841 RISCVCPU *cpu = RISCV_CPU(cs); 842 RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cpu); 843 CPURISCVState *env = &cpu->env; 844 845 if (mcc->parent_phases.hold) { 846 mcc->parent_phases.hold(obj); 847 } 848 #ifndef CONFIG_USER_ONLY 849 env->misa_mxl = env->misa_mxl_max; 850 env->priv = PRV_M; 851 env->mstatus &= ~(MSTATUS_MIE | MSTATUS_MPRV); 852 if (env->misa_mxl > MXL_RV32) { 853 /* 854 * The reset status of SXL/UXL is undefined, but mstatus is WARL 855 * and we must ensure that the value after init is valid for read. 856 */ 857 env->mstatus = set_field(env->mstatus, MSTATUS64_SXL, env->misa_mxl); 858 env->mstatus = set_field(env->mstatus, MSTATUS64_UXL, env->misa_mxl); 859 if (riscv_has_ext(env, RVH)) { 860 env->vsstatus = set_field(env->vsstatus, 861 MSTATUS64_SXL, env->misa_mxl); 862 env->vsstatus = set_field(env->vsstatus, 863 MSTATUS64_UXL, env->misa_mxl); 864 env->mstatus_hs = set_field(env->mstatus_hs, 865 MSTATUS64_SXL, env->misa_mxl); 866 env->mstatus_hs = set_field(env->mstatus_hs, 867 MSTATUS64_UXL, env->misa_mxl); 868 } 869 } 870 env->mcause = 0; 871 env->miclaim = MIP_SGEIP; 872 env->pc = env->resetvec; 873 env->bins = 0; 874 env->two_stage_lookup = false; 875 876 env->menvcfg = (cpu->cfg.ext_svpbmt ? MENVCFG_PBMTE : 0) | 877 (cpu->cfg.ext_svadu ? MENVCFG_ADUE : 0); 878 env->henvcfg = (cpu->cfg.ext_svpbmt ? HENVCFG_PBMTE : 0) | 879 (cpu->cfg.ext_svadu ? HENVCFG_ADUE : 0); 880 881 /* Initialized default priorities of local interrupts. */ 882 for (i = 0; i < ARRAY_SIZE(env->miprio); i++) { 883 iprio = riscv_cpu_default_priority(i); 884 env->miprio[i] = (i == IRQ_M_EXT) ? 0 : iprio; 885 env->siprio[i] = (i == IRQ_S_EXT) ? 0 : iprio; 886 env->hviprio[i] = 0; 887 } 888 i = 0; 889 while (!riscv_cpu_hviprio_index2irq(i, &irq, &rdzero)) { 890 if (!rdzero) { 891 env->hviprio[irq] = env->miprio[irq]; 892 } 893 i++; 894 } 895 /* mmte is supposed to have pm.current hardwired to 1 */ 896 env->mmte |= (EXT_STATUS_INITIAL | MMTE_M_PM_CURRENT); 897 898 /* 899 * Clear mseccfg and unlock all the PMP entries upon reset. 900 * This is allowed as per the priv and smepmp specifications 901 * and is needed to clear stale entries across reboots. 902 */ 903 if (riscv_cpu_cfg(env)->ext_smepmp) { 904 env->mseccfg = 0; 905 } 906 907 pmp_unlock_entries(env); 908 #endif 909 env->xl = riscv_cpu_mxl(env); 910 riscv_cpu_update_mask(env); 911 cs->exception_index = RISCV_EXCP_NONE; 912 env->load_res = -1; 913 set_default_nan_mode(1, &env->fp_status); 914 915 #ifndef CONFIG_USER_ONLY 916 if (cpu->cfg.debug) { 917 riscv_trigger_reset_hold(env); 918 } 919 920 if (kvm_enabled()) { 921 kvm_riscv_reset_vcpu(cpu); 922 } 923 #endif 924 } 925 926 static void riscv_cpu_disas_set_info(CPUState *s, disassemble_info *info) 927 { 928 RISCVCPU *cpu = RISCV_CPU(s); 929 CPURISCVState *env = &cpu->env; 930 info->target_info = &cpu->cfg; 931 932 switch (env->xl) { 933 case MXL_RV32: 934 info->print_insn = print_insn_riscv32; 935 break; 936 case MXL_RV64: 937 info->print_insn = print_insn_riscv64; 938 break; 939 case MXL_RV128: 940 info->print_insn = print_insn_riscv128; 941 break; 942 default: 943 g_assert_not_reached(); 944 } 945 } 946 947 #ifndef CONFIG_USER_ONLY 948 static void riscv_cpu_satp_mode_finalize(RISCVCPU *cpu, Error **errp) 949 { 950 bool rv32 = riscv_cpu_mxl(&cpu->env) == MXL_RV32; 951 uint8_t satp_mode_map_max, satp_mode_supported_max; 952 953 /* The CPU wants the OS to decide which satp mode to use */ 954 if (cpu->cfg.satp_mode.supported == 0) { 955 return; 956 } 957 958 satp_mode_supported_max = 959 satp_mode_max_from_map(cpu->cfg.satp_mode.supported); 960 961 if (cpu->cfg.satp_mode.map == 0) { 962 if (cpu->cfg.satp_mode.init == 0) { 963 /* If unset by the user, we fallback to the default satp mode. */ 964 set_satp_mode_default_map(cpu); 965 } else { 966 /* 967 * Find the lowest level that was disabled and then enable the 968 * first valid level below which can be found in 969 * valid_vm_1_10_32/64. 970 */ 971 for (int i = 1; i < 16; ++i) { 972 if ((cpu->cfg.satp_mode.init & (1 << i)) && 973 (cpu->cfg.satp_mode.supported & (1 << i))) { 974 for (int j = i - 1; j >= 0; --j) { 975 if (cpu->cfg.satp_mode.supported & (1 << j)) { 976 cpu->cfg.satp_mode.map |= (1 << j); 977 break; 978 } 979 } 980 break; 981 } 982 } 983 } 984 } 985 986 satp_mode_map_max = satp_mode_max_from_map(cpu->cfg.satp_mode.map); 987 988 /* Make sure the user asked for a supported configuration (HW and qemu) */ 989 if (satp_mode_map_max > satp_mode_supported_max) { 990 error_setg(errp, "satp_mode %s is higher than hw max capability %s", 991 satp_mode_str(satp_mode_map_max, rv32), 992 satp_mode_str(satp_mode_supported_max, rv32)); 993 return; 994 } 995 996 /* 997 * Make sure the user did not ask for an invalid configuration as per 998 * the specification. 999 */ 1000 if (!rv32) { 1001 for (int i = satp_mode_map_max - 1; i >= 0; --i) { 1002 if (!(cpu->cfg.satp_mode.map & (1 << i)) && 1003 (cpu->cfg.satp_mode.init & (1 << i)) && 1004 (cpu->cfg.satp_mode.supported & (1 << i))) { 1005 error_setg(errp, "cannot disable %s satp mode if %s " 1006 "is enabled", satp_mode_str(i, false), 1007 satp_mode_str(satp_mode_map_max, false)); 1008 return; 1009 } 1010 } 1011 } 1012 1013 /* Finally expand the map so that all valid modes are set */ 1014 for (int i = satp_mode_map_max - 1; i >= 0; --i) { 1015 if (cpu->cfg.satp_mode.supported & (1 << i)) { 1016 cpu->cfg.satp_mode.map |= (1 << i); 1017 } 1018 } 1019 } 1020 #endif 1021 1022 void riscv_cpu_finalize_features(RISCVCPU *cpu, Error **errp) 1023 { 1024 Error *local_err = NULL; 1025 1026 /* 1027 * KVM accel does not have a specialized finalize() 1028 * callback because its extensions are validated 1029 * in the get()/set() callbacks of each property. 1030 */ 1031 if (tcg_enabled()) { 1032 riscv_tcg_cpu_finalize_features(cpu, &local_err); 1033 if (local_err != NULL) { 1034 error_propagate(errp, local_err); 1035 return; 1036 } 1037 } 1038 1039 #ifndef CONFIG_USER_ONLY 1040 riscv_cpu_satp_mode_finalize(cpu, &local_err); 1041 if (local_err != NULL) { 1042 error_propagate(errp, local_err); 1043 return; 1044 } 1045 #endif 1046 } 1047 1048 static void riscv_cpu_realize(DeviceState *dev, Error **errp) 1049 { 1050 CPUState *cs = CPU(dev); 1051 RISCVCPU *cpu = RISCV_CPU(dev); 1052 RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(dev); 1053 Error *local_err = NULL; 1054 1055 if (object_dynamic_cast(OBJECT(dev), TYPE_RISCV_CPU_ANY) != NULL) { 1056 warn_report("The 'any' CPU is deprecated and will be " 1057 "removed in the future."); 1058 } 1059 1060 cpu_exec_realizefn(cs, &local_err); 1061 if (local_err != NULL) { 1062 error_propagate(errp, local_err); 1063 return; 1064 } 1065 1066 riscv_cpu_finalize_features(cpu, &local_err); 1067 if (local_err != NULL) { 1068 error_propagate(errp, local_err); 1069 return; 1070 } 1071 1072 riscv_cpu_register_gdb_regs_for_features(cs); 1073 1074 #ifndef CONFIG_USER_ONLY 1075 if (cpu->cfg.debug) { 1076 riscv_trigger_realize(&cpu->env); 1077 } 1078 #endif 1079 1080 qemu_init_vcpu(cs); 1081 cpu_reset(cs); 1082 1083 mcc->parent_realize(dev, errp); 1084 } 1085 1086 bool riscv_cpu_accelerator_compatible(RISCVCPU *cpu) 1087 { 1088 if (tcg_enabled()) { 1089 return riscv_cpu_tcg_compatible(cpu); 1090 } 1091 1092 return true; 1093 } 1094 1095 #ifndef CONFIG_USER_ONLY 1096 static void cpu_riscv_get_satp(Object *obj, Visitor *v, const char *name, 1097 void *opaque, Error **errp) 1098 { 1099 RISCVSATPMap *satp_map = opaque; 1100 uint8_t satp = satp_mode_from_str(name); 1101 bool value; 1102 1103 value = satp_map->map & (1 << satp); 1104 1105 visit_type_bool(v, name, &value, errp); 1106 } 1107 1108 static void cpu_riscv_set_satp(Object *obj, Visitor *v, const char *name, 1109 void *opaque, Error **errp) 1110 { 1111 RISCVSATPMap *satp_map = opaque; 1112 uint8_t satp = satp_mode_from_str(name); 1113 bool value; 1114 1115 if (!visit_type_bool(v, name, &value, errp)) { 1116 return; 1117 } 1118 1119 satp_map->map = deposit32(satp_map->map, satp, 1, value); 1120 satp_map->init |= 1 << satp; 1121 } 1122 1123 void riscv_add_satp_mode_properties(Object *obj) 1124 { 1125 RISCVCPU *cpu = RISCV_CPU(obj); 1126 1127 if (cpu->env.misa_mxl == MXL_RV32) { 1128 object_property_add(obj, "sv32", "bool", cpu_riscv_get_satp, 1129 cpu_riscv_set_satp, NULL, &cpu->cfg.satp_mode); 1130 } else { 1131 object_property_add(obj, "sv39", "bool", cpu_riscv_get_satp, 1132 cpu_riscv_set_satp, NULL, &cpu->cfg.satp_mode); 1133 object_property_add(obj, "sv48", "bool", cpu_riscv_get_satp, 1134 cpu_riscv_set_satp, NULL, &cpu->cfg.satp_mode); 1135 object_property_add(obj, "sv57", "bool", cpu_riscv_get_satp, 1136 cpu_riscv_set_satp, NULL, &cpu->cfg.satp_mode); 1137 object_property_add(obj, "sv64", "bool", cpu_riscv_get_satp, 1138 cpu_riscv_set_satp, NULL, &cpu->cfg.satp_mode); 1139 } 1140 } 1141 1142 static void riscv_cpu_set_irq(void *opaque, int irq, int level) 1143 { 1144 RISCVCPU *cpu = RISCV_CPU(opaque); 1145 CPURISCVState *env = &cpu->env; 1146 1147 if (irq < IRQ_LOCAL_MAX) { 1148 switch (irq) { 1149 case IRQ_U_SOFT: 1150 case IRQ_S_SOFT: 1151 case IRQ_VS_SOFT: 1152 case IRQ_M_SOFT: 1153 case IRQ_U_TIMER: 1154 case IRQ_S_TIMER: 1155 case IRQ_VS_TIMER: 1156 case IRQ_M_TIMER: 1157 case IRQ_U_EXT: 1158 case IRQ_VS_EXT: 1159 case IRQ_M_EXT: 1160 if (kvm_enabled()) { 1161 kvm_riscv_set_irq(cpu, irq, level); 1162 } else { 1163 riscv_cpu_update_mip(env, 1 << irq, BOOL_TO_MASK(level)); 1164 } 1165 break; 1166 case IRQ_S_EXT: 1167 if (kvm_enabled()) { 1168 kvm_riscv_set_irq(cpu, irq, level); 1169 } else { 1170 env->external_seip = level; 1171 riscv_cpu_update_mip(env, 1 << irq, 1172 BOOL_TO_MASK(level | env->software_seip)); 1173 } 1174 break; 1175 default: 1176 g_assert_not_reached(); 1177 } 1178 } else if (irq < (IRQ_LOCAL_MAX + IRQ_LOCAL_GUEST_MAX)) { 1179 /* Require H-extension for handling guest local interrupts */ 1180 if (!riscv_has_ext(env, RVH)) { 1181 g_assert_not_reached(); 1182 } 1183 1184 /* Compute bit position in HGEIP CSR */ 1185 irq = irq - IRQ_LOCAL_MAX + 1; 1186 if (env->geilen < irq) { 1187 g_assert_not_reached(); 1188 } 1189 1190 /* Update HGEIP CSR */ 1191 env->hgeip &= ~((target_ulong)1 << irq); 1192 if (level) { 1193 env->hgeip |= (target_ulong)1 << irq; 1194 } 1195 1196 /* Update mip.SGEIP bit */ 1197 riscv_cpu_update_mip(env, MIP_SGEIP, 1198 BOOL_TO_MASK(!!(env->hgeie & env->hgeip))); 1199 } else { 1200 g_assert_not_reached(); 1201 } 1202 } 1203 #endif /* CONFIG_USER_ONLY */ 1204 1205 static bool riscv_cpu_is_dynamic(Object *cpu_obj) 1206 { 1207 return object_dynamic_cast(cpu_obj, TYPE_RISCV_DYNAMIC_CPU) != NULL; 1208 } 1209 1210 static void riscv_cpu_post_init(Object *obj) 1211 { 1212 accel_cpu_instance_init(CPU(obj)); 1213 } 1214 1215 static void riscv_cpu_init(Object *obj) 1216 { 1217 #ifndef CONFIG_USER_ONLY 1218 qdev_init_gpio_in(DEVICE(obj), riscv_cpu_set_irq, 1219 IRQ_LOCAL_MAX + IRQ_LOCAL_GUEST_MAX); 1220 #endif /* CONFIG_USER_ONLY */ 1221 1222 /* 1223 * The timer and performance counters extensions were supported 1224 * in QEMU before they were added as discrete extensions in the 1225 * ISA. To keep compatibility we'll always default them to 'true' 1226 * for all CPUs. Each accelerator will decide what to do when 1227 * users disable them. 1228 */ 1229 RISCV_CPU(obj)->cfg.ext_zicntr = true; 1230 RISCV_CPU(obj)->cfg.ext_zihpm = true; 1231 } 1232 1233 typedef struct misa_ext_info { 1234 const char *name; 1235 const char *description; 1236 } MISAExtInfo; 1237 1238 #define MISA_INFO_IDX(_bit) \ 1239 __builtin_ctz(_bit) 1240 1241 #define MISA_EXT_INFO(_bit, _propname, _descr) \ 1242 [MISA_INFO_IDX(_bit)] = {.name = _propname, .description = _descr} 1243 1244 static const MISAExtInfo misa_ext_info_arr[] = { 1245 MISA_EXT_INFO(RVA, "a", "Atomic instructions"), 1246 MISA_EXT_INFO(RVC, "c", "Compressed instructions"), 1247 MISA_EXT_INFO(RVD, "d", "Double-precision float point"), 1248 MISA_EXT_INFO(RVF, "f", "Single-precision float point"), 1249 MISA_EXT_INFO(RVI, "i", "Base integer instruction set"), 1250 MISA_EXT_INFO(RVE, "e", "Base integer instruction set (embedded)"), 1251 MISA_EXT_INFO(RVM, "m", "Integer multiplication and division"), 1252 MISA_EXT_INFO(RVS, "s", "Supervisor-level instructions"), 1253 MISA_EXT_INFO(RVU, "u", "User-level instructions"), 1254 MISA_EXT_INFO(RVH, "h", "Hypervisor"), 1255 MISA_EXT_INFO(RVJ, "x-j", "Dynamic translated languages"), 1256 MISA_EXT_INFO(RVV, "v", "Vector operations"), 1257 MISA_EXT_INFO(RVG, "g", "General purpose (IMAFD_Zicsr_Zifencei)"), 1258 }; 1259 1260 static int riscv_validate_misa_info_idx(uint32_t bit) 1261 { 1262 int idx; 1263 1264 /* 1265 * Our lowest valid input (RVA) is 1 and 1266 * __builtin_ctz() is UB with zero. 1267 */ 1268 g_assert(bit != 0); 1269 idx = MISA_INFO_IDX(bit); 1270 1271 g_assert(idx < ARRAY_SIZE(misa_ext_info_arr)); 1272 return idx; 1273 } 1274 1275 const char *riscv_get_misa_ext_name(uint32_t bit) 1276 { 1277 int idx = riscv_validate_misa_info_idx(bit); 1278 const char *val = misa_ext_info_arr[idx].name; 1279 1280 g_assert(val != NULL); 1281 return val; 1282 } 1283 1284 const char *riscv_get_misa_ext_description(uint32_t bit) 1285 { 1286 int idx = riscv_validate_misa_info_idx(bit); 1287 const char *val = misa_ext_info_arr[idx].description; 1288 1289 g_assert(val != NULL); 1290 return val; 1291 } 1292 1293 #define MULTI_EXT_CFG_BOOL(_name, _prop, _defval) \ 1294 {.name = _name, .offset = CPU_CFG_OFFSET(_prop), \ 1295 .enabled = _defval} 1296 1297 const RISCVCPUMultiExtConfig riscv_cpu_extensions[] = { 1298 /* Defaults for standard extensions */ 1299 MULTI_EXT_CFG_BOOL("sscofpmf", ext_sscofpmf, false), 1300 MULTI_EXT_CFG_BOOL("zifencei", ext_zifencei, true), 1301 MULTI_EXT_CFG_BOOL("zicsr", ext_zicsr, true), 1302 MULTI_EXT_CFG_BOOL("zihintntl", ext_zihintntl, true), 1303 MULTI_EXT_CFG_BOOL("zihintpause", ext_zihintpause, true), 1304 MULTI_EXT_CFG_BOOL("zawrs", ext_zawrs, true), 1305 MULTI_EXT_CFG_BOOL("zfa", ext_zfa, true), 1306 MULTI_EXT_CFG_BOOL("zfh", ext_zfh, false), 1307 MULTI_EXT_CFG_BOOL("zfhmin", ext_zfhmin, false), 1308 MULTI_EXT_CFG_BOOL("zve32f", ext_zve32f, false), 1309 MULTI_EXT_CFG_BOOL("zve64f", ext_zve64f, false), 1310 MULTI_EXT_CFG_BOOL("zve64d", ext_zve64d, false), 1311 MULTI_EXT_CFG_BOOL("sstc", ext_sstc, true), 1312 1313 MULTI_EXT_CFG_BOOL("smepmp", ext_smepmp, false), 1314 MULTI_EXT_CFG_BOOL("smstateen", ext_smstateen, false), 1315 MULTI_EXT_CFG_BOOL("svadu", ext_svadu, true), 1316 MULTI_EXT_CFG_BOOL("svinval", ext_svinval, false), 1317 MULTI_EXT_CFG_BOOL("svnapot", ext_svnapot, false), 1318 MULTI_EXT_CFG_BOOL("svpbmt", ext_svpbmt, false), 1319 1320 MULTI_EXT_CFG_BOOL("zicntr", ext_zicntr, true), 1321 MULTI_EXT_CFG_BOOL("zihpm", ext_zihpm, true), 1322 1323 MULTI_EXT_CFG_BOOL("zba", ext_zba, true), 1324 MULTI_EXT_CFG_BOOL("zbb", ext_zbb, true), 1325 MULTI_EXT_CFG_BOOL("zbc", ext_zbc, true), 1326 MULTI_EXT_CFG_BOOL("zbkb", ext_zbkb, false), 1327 MULTI_EXT_CFG_BOOL("zbkc", ext_zbkc, false), 1328 MULTI_EXT_CFG_BOOL("zbkx", ext_zbkx, false), 1329 MULTI_EXT_CFG_BOOL("zbs", ext_zbs, true), 1330 MULTI_EXT_CFG_BOOL("zk", ext_zk, false), 1331 MULTI_EXT_CFG_BOOL("zkn", ext_zkn, false), 1332 MULTI_EXT_CFG_BOOL("zknd", ext_zknd, false), 1333 MULTI_EXT_CFG_BOOL("zkne", ext_zkne, false), 1334 MULTI_EXT_CFG_BOOL("zknh", ext_zknh, false), 1335 MULTI_EXT_CFG_BOOL("zkr", ext_zkr, false), 1336 MULTI_EXT_CFG_BOOL("zks", ext_zks, false), 1337 MULTI_EXT_CFG_BOOL("zksed", ext_zksed, false), 1338 MULTI_EXT_CFG_BOOL("zksh", ext_zksh, false), 1339 MULTI_EXT_CFG_BOOL("zkt", ext_zkt, false), 1340 1341 MULTI_EXT_CFG_BOOL("zdinx", ext_zdinx, false), 1342 MULTI_EXT_CFG_BOOL("zfinx", ext_zfinx, false), 1343 MULTI_EXT_CFG_BOOL("zhinx", ext_zhinx, false), 1344 MULTI_EXT_CFG_BOOL("zhinxmin", ext_zhinxmin, false), 1345 1346 MULTI_EXT_CFG_BOOL("zicbom", ext_zicbom, true), 1347 MULTI_EXT_CFG_BOOL("zicboz", ext_zicboz, true), 1348 1349 MULTI_EXT_CFG_BOOL("zmmul", ext_zmmul, false), 1350 1351 MULTI_EXT_CFG_BOOL("zca", ext_zca, false), 1352 MULTI_EXT_CFG_BOOL("zcb", ext_zcb, false), 1353 MULTI_EXT_CFG_BOOL("zcd", ext_zcd, false), 1354 MULTI_EXT_CFG_BOOL("zce", ext_zce, false), 1355 MULTI_EXT_CFG_BOOL("zcf", ext_zcf, false), 1356 MULTI_EXT_CFG_BOOL("zcmp", ext_zcmp, false), 1357 MULTI_EXT_CFG_BOOL("zcmt", ext_zcmt, false), 1358 MULTI_EXT_CFG_BOOL("zicond", ext_zicond, false), 1359 1360 /* Vector cryptography extensions */ 1361 MULTI_EXT_CFG_BOOL("zvbb", ext_zvbb, false), 1362 MULTI_EXT_CFG_BOOL("zvbc", ext_zvbc, false), 1363 MULTI_EXT_CFG_BOOL("zvkb", ext_zvkg, false), 1364 MULTI_EXT_CFG_BOOL("zvkg", ext_zvkg, false), 1365 MULTI_EXT_CFG_BOOL("zvkned", ext_zvkned, false), 1366 MULTI_EXT_CFG_BOOL("zvknha", ext_zvknha, false), 1367 MULTI_EXT_CFG_BOOL("zvknhb", ext_zvknhb, false), 1368 MULTI_EXT_CFG_BOOL("zvksed", ext_zvksed, false), 1369 MULTI_EXT_CFG_BOOL("zvksh", ext_zvksh, false), 1370 MULTI_EXT_CFG_BOOL("zvkt", ext_zvkt, false), 1371 MULTI_EXT_CFG_BOOL("zvkn", ext_zvkn, false), 1372 MULTI_EXT_CFG_BOOL("zvknc", ext_zvknc, false), 1373 MULTI_EXT_CFG_BOOL("zvkng", ext_zvkng, false), 1374 MULTI_EXT_CFG_BOOL("zvks", ext_zvks, false), 1375 MULTI_EXT_CFG_BOOL("zvksc", ext_zvksc, false), 1376 MULTI_EXT_CFG_BOOL("zvksg", ext_zvksg, false), 1377 1378 DEFINE_PROP_END_OF_LIST(), 1379 }; 1380 1381 const RISCVCPUMultiExtConfig riscv_cpu_vendor_exts[] = { 1382 MULTI_EXT_CFG_BOOL("xtheadba", ext_xtheadba, false), 1383 MULTI_EXT_CFG_BOOL("xtheadbb", ext_xtheadbb, false), 1384 MULTI_EXT_CFG_BOOL("xtheadbs", ext_xtheadbs, false), 1385 MULTI_EXT_CFG_BOOL("xtheadcmo", ext_xtheadcmo, false), 1386 MULTI_EXT_CFG_BOOL("xtheadcondmov", ext_xtheadcondmov, false), 1387 MULTI_EXT_CFG_BOOL("xtheadfmemidx", ext_xtheadfmemidx, false), 1388 MULTI_EXT_CFG_BOOL("xtheadfmv", ext_xtheadfmv, false), 1389 MULTI_EXT_CFG_BOOL("xtheadmac", ext_xtheadmac, false), 1390 MULTI_EXT_CFG_BOOL("xtheadmemidx", ext_xtheadmemidx, false), 1391 MULTI_EXT_CFG_BOOL("xtheadmempair", ext_xtheadmempair, false), 1392 MULTI_EXT_CFG_BOOL("xtheadsync", ext_xtheadsync, false), 1393 MULTI_EXT_CFG_BOOL("xventanacondops", ext_XVentanaCondOps, false), 1394 1395 DEFINE_PROP_END_OF_LIST(), 1396 }; 1397 1398 /* These are experimental so mark with 'x-' */ 1399 const RISCVCPUMultiExtConfig riscv_cpu_experimental_exts[] = { 1400 MULTI_EXT_CFG_BOOL("x-smaia", ext_smaia, false), 1401 MULTI_EXT_CFG_BOOL("x-ssaia", ext_ssaia, false), 1402 1403 MULTI_EXT_CFG_BOOL("x-zvfh", ext_zvfh, false), 1404 MULTI_EXT_CFG_BOOL("x-zvfhmin", ext_zvfhmin, false), 1405 1406 MULTI_EXT_CFG_BOOL("x-zfbfmin", ext_zfbfmin, false), 1407 MULTI_EXT_CFG_BOOL("x-zvfbfmin", ext_zvfbfmin, false), 1408 MULTI_EXT_CFG_BOOL("x-zvfbfwma", ext_zvfbfwma, false), 1409 1410 DEFINE_PROP_END_OF_LIST(), 1411 }; 1412 1413 /* Deprecated entries marked for future removal */ 1414 const RISCVCPUMultiExtConfig riscv_cpu_deprecated_exts[] = { 1415 MULTI_EXT_CFG_BOOL("Zifencei", ext_zifencei, true), 1416 MULTI_EXT_CFG_BOOL("Zicsr", ext_zicsr, true), 1417 MULTI_EXT_CFG_BOOL("Zihintntl", ext_zihintntl, true), 1418 MULTI_EXT_CFG_BOOL("Zihintpause", ext_zihintpause, true), 1419 MULTI_EXT_CFG_BOOL("Zawrs", ext_zawrs, true), 1420 MULTI_EXT_CFG_BOOL("Zfa", ext_zfa, true), 1421 MULTI_EXT_CFG_BOOL("Zfh", ext_zfh, false), 1422 MULTI_EXT_CFG_BOOL("Zfhmin", ext_zfhmin, false), 1423 MULTI_EXT_CFG_BOOL("Zve32f", ext_zve32f, false), 1424 MULTI_EXT_CFG_BOOL("Zve64f", ext_zve64f, false), 1425 MULTI_EXT_CFG_BOOL("Zve64d", ext_zve64d, false), 1426 1427 DEFINE_PROP_END_OF_LIST(), 1428 }; 1429 1430 Property riscv_cpu_options[] = { 1431 DEFINE_PROP_UINT8("pmu-num", RISCVCPU, cfg.pmu_num, 16), 1432 1433 DEFINE_PROP_BOOL("mmu", RISCVCPU, cfg.mmu, true), 1434 DEFINE_PROP_BOOL("pmp", RISCVCPU, cfg.pmp, true), 1435 1436 DEFINE_PROP_STRING("priv_spec", RISCVCPU, cfg.priv_spec), 1437 DEFINE_PROP_STRING("vext_spec", RISCVCPU, cfg.vext_spec), 1438 1439 DEFINE_PROP_UINT16("vlen", RISCVCPU, cfg.vlen, 128), 1440 DEFINE_PROP_UINT16("elen", RISCVCPU, cfg.elen, 64), 1441 1442 DEFINE_PROP_UINT16("cbom_blocksize", RISCVCPU, cfg.cbom_blocksize, 64), 1443 DEFINE_PROP_UINT16("cboz_blocksize", RISCVCPU, cfg.cboz_blocksize, 64), 1444 1445 DEFINE_PROP_END_OF_LIST(), 1446 }; 1447 1448 static Property riscv_cpu_properties[] = { 1449 DEFINE_PROP_BOOL("debug", RISCVCPU, cfg.debug, true), 1450 1451 #ifndef CONFIG_USER_ONLY 1452 DEFINE_PROP_UINT64("resetvec", RISCVCPU, env.resetvec, DEFAULT_RSTVEC), 1453 #endif 1454 1455 DEFINE_PROP_BOOL("short-isa-string", RISCVCPU, cfg.short_isa_string, false), 1456 1457 DEFINE_PROP_BOOL("rvv_ta_all_1s", RISCVCPU, cfg.rvv_ta_all_1s, false), 1458 DEFINE_PROP_BOOL("rvv_ma_all_1s", RISCVCPU, cfg.rvv_ma_all_1s, false), 1459 1460 /* 1461 * write_misa() is marked as experimental for now so mark 1462 * it with -x and default to 'false'. 1463 */ 1464 DEFINE_PROP_BOOL("x-misa-w", RISCVCPU, cfg.misa_w, false), 1465 DEFINE_PROP_END_OF_LIST(), 1466 }; 1467 1468 static const gchar *riscv_gdb_arch_name(CPUState *cs) 1469 { 1470 RISCVCPU *cpu = RISCV_CPU(cs); 1471 CPURISCVState *env = &cpu->env; 1472 1473 switch (riscv_cpu_mxl(env)) { 1474 case MXL_RV32: 1475 return "riscv:rv32"; 1476 case MXL_RV64: 1477 case MXL_RV128: 1478 return "riscv:rv64"; 1479 default: 1480 g_assert_not_reached(); 1481 } 1482 } 1483 1484 static const char *riscv_gdb_get_dynamic_xml(CPUState *cs, const char *xmlname) 1485 { 1486 RISCVCPU *cpu = RISCV_CPU(cs); 1487 1488 if (strcmp(xmlname, "riscv-csr.xml") == 0) { 1489 return cpu->dyn_csr_xml; 1490 } else if (strcmp(xmlname, "riscv-vector.xml") == 0) { 1491 return cpu->dyn_vreg_xml; 1492 } 1493 1494 return NULL; 1495 } 1496 1497 #ifndef CONFIG_USER_ONLY 1498 static int64_t riscv_get_arch_id(CPUState *cs) 1499 { 1500 RISCVCPU *cpu = RISCV_CPU(cs); 1501 1502 return cpu->env.mhartid; 1503 } 1504 1505 #include "hw/core/sysemu-cpu-ops.h" 1506 1507 static const struct SysemuCPUOps riscv_sysemu_ops = { 1508 .get_phys_page_debug = riscv_cpu_get_phys_page_debug, 1509 .write_elf64_note = riscv_cpu_write_elf64_note, 1510 .write_elf32_note = riscv_cpu_write_elf32_note, 1511 .legacy_vmsd = &vmstate_riscv_cpu, 1512 }; 1513 #endif 1514 1515 static void cpu_set_mvendorid(Object *obj, Visitor *v, const char *name, 1516 void *opaque, Error **errp) 1517 { 1518 bool dynamic_cpu = riscv_cpu_is_dynamic(obj); 1519 RISCVCPU *cpu = RISCV_CPU(obj); 1520 uint32_t prev_val = cpu->cfg.mvendorid; 1521 uint32_t value; 1522 1523 if (!visit_type_uint32(v, name, &value, errp)) { 1524 return; 1525 } 1526 1527 if (!dynamic_cpu && prev_val != value) { 1528 error_setg(errp, "Unable to change %s mvendorid (0x%x)", 1529 object_get_typename(obj), prev_val); 1530 return; 1531 } 1532 1533 cpu->cfg.mvendorid = value; 1534 } 1535 1536 static void cpu_get_mvendorid(Object *obj, Visitor *v, const char *name, 1537 void *opaque, Error **errp) 1538 { 1539 bool value = RISCV_CPU(obj)->cfg.mvendorid; 1540 1541 visit_type_bool(v, name, &value, errp); 1542 } 1543 1544 static void cpu_set_mimpid(Object *obj, Visitor *v, const char *name, 1545 void *opaque, Error **errp) 1546 { 1547 bool dynamic_cpu = riscv_cpu_is_dynamic(obj); 1548 RISCVCPU *cpu = RISCV_CPU(obj); 1549 uint64_t prev_val = cpu->cfg.mimpid; 1550 uint64_t value; 1551 1552 if (!visit_type_uint64(v, name, &value, errp)) { 1553 return; 1554 } 1555 1556 if (!dynamic_cpu && prev_val != value) { 1557 error_setg(errp, "Unable to change %s mimpid (0x%" PRIu64 ")", 1558 object_get_typename(obj), prev_val); 1559 return; 1560 } 1561 1562 cpu->cfg.mimpid = value; 1563 } 1564 1565 static void cpu_get_mimpid(Object *obj, Visitor *v, const char *name, 1566 void *opaque, Error **errp) 1567 { 1568 bool value = RISCV_CPU(obj)->cfg.mimpid; 1569 1570 visit_type_bool(v, name, &value, errp); 1571 } 1572 1573 static void cpu_set_marchid(Object *obj, Visitor *v, const char *name, 1574 void *opaque, Error **errp) 1575 { 1576 bool dynamic_cpu = riscv_cpu_is_dynamic(obj); 1577 RISCVCPU *cpu = RISCV_CPU(obj); 1578 uint64_t prev_val = cpu->cfg.marchid; 1579 uint64_t value, invalid_val; 1580 uint32_t mxlen = 0; 1581 1582 if (!visit_type_uint64(v, name, &value, errp)) { 1583 return; 1584 } 1585 1586 if (!dynamic_cpu && prev_val != value) { 1587 error_setg(errp, "Unable to change %s marchid (0x%" PRIu64 ")", 1588 object_get_typename(obj), prev_val); 1589 return; 1590 } 1591 1592 switch (riscv_cpu_mxl(&cpu->env)) { 1593 case MXL_RV32: 1594 mxlen = 32; 1595 break; 1596 case MXL_RV64: 1597 case MXL_RV128: 1598 mxlen = 64; 1599 break; 1600 default: 1601 g_assert_not_reached(); 1602 } 1603 1604 invalid_val = 1LL << (mxlen - 1); 1605 1606 if (value == invalid_val) { 1607 error_setg(errp, "Unable to set marchid with MSB (%u) bit set " 1608 "and the remaining bits zero", mxlen); 1609 return; 1610 } 1611 1612 cpu->cfg.marchid = value; 1613 } 1614 1615 static void cpu_get_marchid(Object *obj, Visitor *v, const char *name, 1616 void *opaque, Error **errp) 1617 { 1618 bool value = RISCV_CPU(obj)->cfg.marchid; 1619 1620 visit_type_bool(v, name, &value, errp); 1621 } 1622 1623 static void riscv_cpu_class_init(ObjectClass *c, void *data) 1624 { 1625 RISCVCPUClass *mcc = RISCV_CPU_CLASS(c); 1626 CPUClass *cc = CPU_CLASS(c); 1627 DeviceClass *dc = DEVICE_CLASS(c); 1628 ResettableClass *rc = RESETTABLE_CLASS(c); 1629 1630 device_class_set_parent_realize(dc, riscv_cpu_realize, 1631 &mcc->parent_realize); 1632 1633 resettable_class_set_parent_phases(rc, NULL, riscv_cpu_reset_hold, NULL, 1634 &mcc->parent_phases); 1635 1636 cc->class_by_name = riscv_cpu_class_by_name; 1637 cc->has_work = riscv_cpu_has_work; 1638 cc->dump_state = riscv_cpu_dump_state; 1639 cc->set_pc = riscv_cpu_set_pc; 1640 cc->get_pc = riscv_cpu_get_pc; 1641 cc->gdb_read_register = riscv_cpu_gdb_read_register; 1642 cc->gdb_write_register = riscv_cpu_gdb_write_register; 1643 cc->gdb_num_core_regs = 33; 1644 cc->gdb_stop_before_watchpoint = true; 1645 cc->disas_set_info = riscv_cpu_disas_set_info; 1646 #ifndef CONFIG_USER_ONLY 1647 cc->sysemu_ops = &riscv_sysemu_ops; 1648 cc->get_arch_id = riscv_get_arch_id; 1649 #endif 1650 cc->gdb_arch_name = riscv_gdb_arch_name; 1651 cc->gdb_get_dynamic_xml = riscv_gdb_get_dynamic_xml; 1652 1653 object_class_property_add(c, "mvendorid", "uint32", cpu_get_mvendorid, 1654 cpu_set_mvendorid, NULL, NULL); 1655 1656 object_class_property_add(c, "mimpid", "uint64", cpu_get_mimpid, 1657 cpu_set_mimpid, NULL, NULL); 1658 1659 object_class_property_add(c, "marchid", "uint64", cpu_get_marchid, 1660 cpu_set_marchid, NULL, NULL); 1661 1662 device_class_set_props(dc, riscv_cpu_properties); 1663 } 1664 1665 static void riscv_isa_string_ext(RISCVCPU *cpu, char **isa_str, 1666 int max_str_len) 1667 { 1668 const RISCVIsaExtData *edata; 1669 char *old = *isa_str; 1670 char *new = *isa_str; 1671 1672 for (edata = isa_edata_arr; edata && edata->name; edata++) { 1673 if (isa_ext_is_enabled(cpu, edata->ext_enable_offset)) { 1674 new = g_strconcat(old, "_", edata->name, NULL); 1675 g_free(old); 1676 old = new; 1677 } 1678 } 1679 1680 *isa_str = new; 1681 } 1682 1683 char *riscv_isa_string(RISCVCPU *cpu) 1684 { 1685 int i; 1686 const size_t maxlen = sizeof("rv128") + sizeof(riscv_single_letter_exts); 1687 char *isa_str = g_new(char, maxlen); 1688 char *p = isa_str + snprintf(isa_str, maxlen, "rv%d", TARGET_LONG_BITS); 1689 for (i = 0; i < sizeof(riscv_single_letter_exts) - 1; i++) { 1690 if (cpu->env.misa_ext & RV(riscv_single_letter_exts[i])) { 1691 *p++ = qemu_tolower(riscv_single_letter_exts[i]); 1692 } 1693 } 1694 *p = '\0'; 1695 if (!cpu->cfg.short_isa_string) { 1696 riscv_isa_string_ext(cpu, &isa_str, maxlen); 1697 } 1698 return isa_str; 1699 } 1700 1701 static gint riscv_cpu_list_compare(gconstpointer a, gconstpointer b) 1702 { 1703 ObjectClass *class_a = (ObjectClass *)a; 1704 ObjectClass *class_b = (ObjectClass *)b; 1705 const char *name_a, *name_b; 1706 1707 name_a = object_class_get_name(class_a); 1708 name_b = object_class_get_name(class_b); 1709 return strcmp(name_a, name_b); 1710 } 1711 1712 static void riscv_cpu_list_entry(gpointer data, gpointer user_data) 1713 { 1714 const char *typename = object_class_get_name(OBJECT_CLASS(data)); 1715 int len = strlen(typename) - strlen(RISCV_CPU_TYPE_SUFFIX); 1716 1717 qemu_printf("%.*s\n", len, typename); 1718 } 1719 1720 void riscv_cpu_list(void) 1721 { 1722 GSList *list; 1723 1724 list = object_class_get_list(TYPE_RISCV_CPU, false); 1725 list = g_slist_sort(list, riscv_cpu_list_compare); 1726 g_slist_foreach(list, riscv_cpu_list_entry, NULL); 1727 g_slist_free(list); 1728 } 1729 1730 #define DEFINE_CPU(type_name, initfn) \ 1731 { \ 1732 .name = type_name, \ 1733 .parent = TYPE_RISCV_CPU, \ 1734 .instance_init = initfn \ 1735 } 1736 1737 #define DEFINE_DYNAMIC_CPU(type_name, initfn) \ 1738 { \ 1739 .name = type_name, \ 1740 .parent = TYPE_RISCV_DYNAMIC_CPU, \ 1741 .instance_init = initfn \ 1742 } 1743 1744 static const TypeInfo riscv_cpu_type_infos[] = { 1745 { 1746 .name = TYPE_RISCV_CPU, 1747 .parent = TYPE_CPU, 1748 .instance_size = sizeof(RISCVCPU), 1749 .instance_align = __alignof(RISCVCPU), 1750 .instance_init = riscv_cpu_init, 1751 .instance_post_init = riscv_cpu_post_init, 1752 .abstract = true, 1753 .class_size = sizeof(RISCVCPUClass), 1754 .class_init = riscv_cpu_class_init, 1755 }, 1756 { 1757 .name = TYPE_RISCV_DYNAMIC_CPU, 1758 .parent = TYPE_RISCV_CPU, 1759 .abstract = true, 1760 }, 1761 DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_ANY, riscv_any_cpu_init), 1762 DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_MAX, riscv_max_cpu_init), 1763 #if defined(TARGET_RISCV32) 1764 DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE32, rv32_base_cpu_init), 1765 DEFINE_CPU(TYPE_RISCV_CPU_IBEX, rv32_ibex_cpu_init), 1766 DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E31, rv32_sifive_e_cpu_init), 1767 DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E34, rv32_imafcu_nommu_cpu_init), 1768 DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_U34, rv32_sifive_u_cpu_init), 1769 #elif defined(TARGET_RISCV64) 1770 DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE64, rv64_base_cpu_init), 1771 DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E51, rv64_sifive_e_cpu_init), 1772 DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_U54, rv64_sifive_u_cpu_init), 1773 DEFINE_CPU(TYPE_RISCV_CPU_SHAKTI_C, rv64_sifive_u_cpu_init), 1774 DEFINE_CPU(TYPE_RISCV_CPU_THEAD_C906, rv64_thead_c906_cpu_init), 1775 DEFINE_CPU(TYPE_RISCV_CPU_VEYRON_V1, rv64_veyron_v1_cpu_init), 1776 DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE128, rv128_base_cpu_init), 1777 #endif 1778 }; 1779 1780 DEFINE_TYPES(riscv_cpu_type_infos) 1781