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