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