]> git.proxmox.com Git - mirror_qemu.git/blame_incremental - target/riscv/cpu.c
Merge tag 'pull-maintainer-may24-160524-2' of https://gitlab.com/stsquad/qemu into...
[mirror_qemu.git] / target / riscv / cpu.c
... / ...
CommitLineData
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 "hw/core/qdev-prop-internal.h"
33#include "migration/vmstate.h"
34#include "fpu/softfloat-helpers.h"
35#include "sysemu/device_tree.h"
36#include "sysemu/kvm.h"
37#include "sysemu/tcg.h"
38#include "kvm/kvm_riscv.h"
39#include "tcg/tcg-cpu.h"
40#include "tcg/tcg.h"
41
42/* RISC-V CPU definitions */
43static const char riscv_single_letter_exts[] = "IEMAFDQCBPVH";
44const uint32_t misa_bits[] = {RVI, RVE, RVM, RVA, RVF, RVD, RVV,
45 RVC, RVS, RVU, RVH, RVJ, RVG, RVB, 0};
46
47/*
48 * From vector_helper.c
49 * Note that vector data is stored in host-endian 64-bit chunks,
50 * so addressing bytes needs a host-endian fixup.
51 */
52#if HOST_BIG_ENDIAN
53#define BYTE(x) ((x) ^ 7)
54#else
55#define BYTE(x) (x)
56#endif
57
58bool riscv_cpu_is_32bit(RISCVCPU *cpu)
59{
60 return riscv_cpu_mxl(&cpu->env) == MXL_RV32;
61}
62
63/* Hash that stores general user set numeric options */
64static GHashTable *general_user_opts;
65
66static void cpu_option_add_user_setting(const char *optname, uint32_t value)
67{
68 g_hash_table_insert(general_user_opts, (gpointer)optname,
69 GUINT_TO_POINTER(value));
70}
71
72bool riscv_cpu_option_set(const char *optname)
73{
74 return g_hash_table_contains(general_user_opts, optname);
75}
76
77#define ISA_EXT_DATA_ENTRY(_name, _min_ver, _prop) \
78 {#_name, _min_ver, CPU_CFG_OFFSET(_prop)}
79
80/*
81 * Here are the ordering rules of extension naming defined by RISC-V
82 * specification :
83 * 1. All extensions should be separated from other multi-letter extensions
84 * by an underscore.
85 * 2. The first letter following the 'Z' conventionally indicates the most
86 * closely related alphabetical extension category, IMAFDQLCBKJTPVH.
87 * If multiple 'Z' extensions are named, they should be ordered first
88 * by category, then alphabetically within a category.
89 * 3. Standard supervisor-level extensions (starts with 'S') should be
90 * listed after standard unprivileged extensions. If multiple
91 * supervisor-level extensions are listed, they should be ordered
92 * alphabetically.
93 * 4. Non-standard extensions (starts with 'X') must be listed after all
94 * standard extensions. They must be separated from other multi-letter
95 * extensions by an underscore.
96 *
97 * Single letter extensions are checked in riscv_cpu_validate_misa_priv()
98 * instead.
99 */
100const RISCVIsaExtData isa_edata_arr[] = {
101 ISA_EXT_DATA_ENTRY(zic64b, PRIV_VERSION_1_12_0, ext_zic64b),
102 ISA_EXT_DATA_ENTRY(zicbom, PRIV_VERSION_1_12_0, ext_zicbom),
103 ISA_EXT_DATA_ENTRY(zicbop, PRIV_VERSION_1_12_0, ext_zicbop),
104 ISA_EXT_DATA_ENTRY(zicboz, PRIV_VERSION_1_12_0, ext_zicboz),
105 ISA_EXT_DATA_ENTRY(ziccamoa, PRIV_VERSION_1_11_0, has_priv_1_11),
106 ISA_EXT_DATA_ENTRY(ziccif, PRIV_VERSION_1_11_0, has_priv_1_11),
107 ISA_EXT_DATA_ENTRY(zicclsm, PRIV_VERSION_1_11_0, has_priv_1_11),
108 ISA_EXT_DATA_ENTRY(ziccrse, PRIV_VERSION_1_11_0, has_priv_1_11),
109 ISA_EXT_DATA_ENTRY(zicond, PRIV_VERSION_1_12_0, ext_zicond),
110 ISA_EXT_DATA_ENTRY(zicntr, PRIV_VERSION_1_12_0, ext_zicntr),
111 ISA_EXT_DATA_ENTRY(zicsr, PRIV_VERSION_1_10_0, ext_zicsr),
112 ISA_EXT_DATA_ENTRY(zifencei, PRIV_VERSION_1_10_0, ext_zifencei),
113 ISA_EXT_DATA_ENTRY(zihintntl, PRIV_VERSION_1_10_0, ext_zihintntl),
114 ISA_EXT_DATA_ENTRY(zihintpause, PRIV_VERSION_1_10_0, ext_zihintpause),
115 ISA_EXT_DATA_ENTRY(zihpm, PRIV_VERSION_1_12_0, ext_zihpm),
116 ISA_EXT_DATA_ENTRY(zmmul, PRIV_VERSION_1_12_0, ext_zmmul),
117 ISA_EXT_DATA_ENTRY(za64rs, PRIV_VERSION_1_12_0, has_priv_1_11),
118 ISA_EXT_DATA_ENTRY(zaamo, PRIV_VERSION_1_12_0, ext_zaamo),
119 ISA_EXT_DATA_ENTRY(zacas, PRIV_VERSION_1_12_0, ext_zacas),
120 ISA_EXT_DATA_ENTRY(zalrsc, PRIV_VERSION_1_12_0, ext_zalrsc),
121 ISA_EXT_DATA_ENTRY(zawrs, PRIV_VERSION_1_12_0, ext_zawrs),
122 ISA_EXT_DATA_ENTRY(zfa, PRIV_VERSION_1_12_0, ext_zfa),
123 ISA_EXT_DATA_ENTRY(zfbfmin, PRIV_VERSION_1_12_0, ext_zfbfmin),
124 ISA_EXT_DATA_ENTRY(zfh, PRIV_VERSION_1_11_0, ext_zfh),
125 ISA_EXT_DATA_ENTRY(zfhmin, PRIV_VERSION_1_11_0, ext_zfhmin),
126 ISA_EXT_DATA_ENTRY(zfinx, PRIV_VERSION_1_12_0, ext_zfinx),
127 ISA_EXT_DATA_ENTRY(zdinx, PRIV_VERSION_1_12_0, ext_zdinx),
128 ISA_EXT_DATA_ENTRY(zca, PRIV_VERSION_1_12_0, ext_zca),
129 ISA_EXT_DATA_ENTRY(zcb, PRIV_VERSION_1_12_0, ext_zcb),
130 ISA_EXT_DATA_ENTRY(zcf, PRIV_VERSION_1_12_0, ext_zcf),
131 ISA_EXT_DATA_ENTRY(zcd, PRIV_VERSION_1_12_0, ext_zcd),
132 ISA_EXT_DATA_ENTRY(zce, PRIV_VERSION_1_12_0, ext_zce),
133 ISA_EXT_DATA_ENTRY(zcmp, PRIV_VERSION_1_12_0, ext_zcmp),
134 ISA_EXT_DATA_ENTRY(zcmt, PRIV_VERSION_1_12_0, ext_zcmt),
135 ISA_EXT_DATA_ENTRY(zba, PRIV_VERSION_1_12_0, ext_zba),
136 ISA_EXT_DATA_ENTRY(zbb, PRIV_VERSION_1_12_0, ext_zbb),
137 ISA_EXT_DATA_ENTRY(zbc, PRIV_VERSION_1_12_0, ext_zbc),
138 ISA_EXT_DATA_ENTRY(zbkb, PRIV_VERSION_1_12_0, ext_zbkb),
139 ISA_EXT_DATA_ENTRY(zbkc, PRIV_VERSION_1_12_0, ext_zbkc),
140 ISA_EXT_DATA_ENTRY(zbkx, PRIV_VERSION_1_12_0, ext_zbkx),
141 ISA_EXT_DATA_ENTRY(zbs, PRIV_VERSION_1_12_0, ext_zbs),
142 ISA_EXT_DATA_ENTRY(zk, PRIV_VERSION_1_12_0, ext_zk),
143 ISA_EXT_DATA_ENTRY(zkn, PRIV_VERSION_1_12_0, ext_zkn),
144 ISA_EXT_DATA_ENTRY(zknd, PRIV_VERSION_1_12_0, ext_zknd),
145 ISA_EXT_DATA_ENTRY(zkne, PRIV_VERSION_1_12_0, ext_zkne),
146 ISA_EXT_DATA_ENTRY(zknh, PRIV_VERSION_1_12_0, ext_zknh),
147 ISA_EXT_DATA_ENTRY(zkr, PRIV_VERSION_1_12_0, ext_zkr),
148 ISA_EXT_DATA_ENTRY(zks, PRIV_VERSION_1_12_0, ext_zks),
149 ISA_EXT_DATA_ENTRY(zksed, PRIV_VERSION_1_12_0, ext_zksed),
150 ISA_EXT_DATA_ENTRY(zksh, PRIV_VERSION_1_12_0, ext_zksh),
151 ISA_EXT_DATA_ENTRY(zkt, PRIV_VERSION_1_12_0, ext_zkt),
152 ISA_EXT_DATA_ENTRY(ztso, PRIV_VERSION_1_12_0, ext_ztso),
153 ISA_EXT_DATA_ENTRY(zvbb, PRIV_VERSION_1_12_0, ext_zvbb),
154 ISA_EXT_DATA_ENTRY(zvbc, PRIV_VERSION_1_12_0, ext_zvbc),
155 ISA_EXT_DATA_ENTRY(zve32f, PRIV_VERSION_1_10_0, ext_zve32f),
156 ISA_EXT_DATA_ENTRY(zve64f, PRIV_VERSION_1_10_0, ext_zve64f),
157 ISA_EXT_DATA_ENTRY(zve64d, PRIV_VERSION_1_10_0, ext_zve64d),
158 ISA_EXT_DATA_ENTRY(zvfbfmin, PRIV_VERSION_1_12_0, ext_zvfbfmin),
159 ISA_EXT_DATA_ENTRY(zvfbfwma, PRIV_VERSION_1_12_0, ext_zvfbfwma),
160 ISA_EXT_DATA_ENTRY(zvfh, PRIV_VERSION_1_12_0, ext_zvfh),
161 ISA_EXT_DATA_ENTRY(zvfhmin, PRIV_VERSION_1_12_0, ext_zvfhmin),
162 ISA_EXT_DATA_ENTRY(zvkb, PRIV_VERSION_1_12_0, ext_zvkb),
163 ISA_EXT_DATA_ENTRY(zvkg, PRIV_VERSION_1_12_0, ext_zvkg),
164 ISA_EXT_DATA_ENTRY(zvkn, PRIV_VERSION_1_12_0, ext_zvkn),
165 ISA_EXT_DATA_ENTRY(zvknc, PRIV_VERSION_1_12_0, ext_zvknc),
166 ISA_EXT_DATA_ENTRY(zvkned, PRIV_VERSION_1_12_0, ext_zvkned),
167 ISA_EXT_DATA_ENTRY(zvkng, PRIV_VERSION_1_12_0, ext_zvkng),
168 ISA_EXT_DATA_ENTRY(zvknha, PRIV_VERSION_1_12_0, ext_zvknha),
169 ISA_EXT_DATA_ENTRY(zvknhb, PRIV_VERSION_1_12_0, ext_zvknhb),
170 ISA_EXT_DATA_ENTRY(zvks, PRIV_VERSION_1_12_0, ext_zvks),
171 ISA_EXT_DATA_ENTRY(zvksc, PRIV_VERSION_1_12_0, ext_zvksc),
172 ISA_EXT_DATA_ENTRY(zvksed, PRIV_VERSION_1_12_0, ext_zvksed),
173 ISA_EXT_DATA_ENTRY(zvksg, PRIV_VERSION_1_12_0, ext_zvksg),
174 ISA_EXT_DATA_ENTRY(zvksh, PRIV_VERSION_1_12_0, ext_zvksh),
175 ISA_EXT_DATA_ENTRY(zvkt, PRIV_VERSION_1_12_0, ext_zvkt),
176 ISA_EXT_DATA_ENTRY(zhinx, PRIV_VERSION_1_12_0, ext_zhinx),
177 ISA_EXT_DATA_ENTRY(zhinxmin, PRIV_VERSION_1_12_0, ext_zhinxmin),
178 ISA_EXT_DATA_ENTRY(smaia, PRIV_VERSION_1_12_0, ext_smaia),
179 ISA_EXT_DATA_ENTRY(smepmp, PRIV_VERSION_1_12_0, ext_smepmp),
180 ISA_EXT_DATA_ENTRY(smstateen, PRIV_VERSION_1_12_0, ext_smstateen),
181 ISA_EXT_DATA_ENTRY(ssaia, PRIV_VERSION_1_12_0, ext_ssaia),
182 ISA_EXT_DATA_ENTRY(ssccptr, PRIV_VERSION_1_11_0, has_priv_1_11),
183 ISA_EXT_DATA_ENTRY(sscofpmf, PRIV_VERSION_1_12_0, ext_sscofpmf),
184 ISA_EXT_DATA_ENTRY(sscounterenw, PRIV_VERSION_1_12_0, has_priv_1_12),
185 ISA_EXT_DATA_ENTRY(sstc, PRIV_VERSION_1_12_0, ext_sstc),
186 ISA_EXT_DATA_ENTRY(sstvala, PRIV_VERSION_1_12_0, has_priv_1_12),
187 ISA_EXT_DATA_ENTRY(sstvecd, PRIV_VERSION_1_12_0, has_priv_1_12),
188 ISA_EXT_DATA_ENTRY(svade, PRIV_VERSION_1_11_0, ext_svade),
189 ISA_EXT_DATA_ENTRY(svadu, PRIV_VERSION_1_12_0, ext_svadu),
190 ISA_EXT_DATA_ENTRY(svinval, PRIV_VERSION_1_12_0, ext_svinval),
191 ISA_EXT_DATA_ENTRY(svnapot, PRIV_VERSION_1_12_0, ext_svnapot),
192 ISA_EXT_DATA_ENTRY(svpbmt, PRIV_VERSION_1_12_0, ext_svpbmt),
193 ISA_EXT_DATA_ENTRY(xtheadba, PRIV_VERSION_1_11_0, ext_xtheadba),
194 ISA_EXT_DATA_ENTRY(xtheadbb, PRIV_VERSION_1_11_0, ext_xtheadbb),
195 ISA_EXT_DATA_ENTRY(xtheadbs, PRIV_VERSION_1_11_0, ext_xtheadbs),
196 ISA_EXT_DATA_ENTRY(xtheadcmo, PRIV_VERSION_1_11_0, ext_xtheadcmo),
197 ISA_EXT_DATA_ENTRY(xtheadcondmov, PRIV_VERSION_1_11_0, ext_xtheadcondmov),
198 ISA_EXT_DATA_ENTRY(xtheadfmemidx, PRIV_VERSION_1_11_0, ext_xtheadfmemidx),
199 ISA_EXT_DATA_ENTRY(xtheadfmv, PRIV_VERSION_1_11_0, ext_xtheadfmv),
200 ISA_EXT_DATA_ENTRY(xtheadmac, PRIV_VERSION_1_11_0, ext_xtheadmac),
201 ISA_EXT_DATA_ENTRY(xtheadmemidx, PRIV_VERSION_1_11_0, ext_xtheadmemidx),
202 ISA_EXT_DATA_ENTRY(xtheadmempair, PRIV_VERSION_1_11_0, ext_xtheadmempair),
203 ISA_EXT_DATA_ENTRY(xtheadsync, PRIV_VERSION_1_11_0, ext_xtheadsync),
204 ISA_EXT_DATA_ENTRY(xventanacondops, PRIV_VERSION_1_12_0, ext_XVentanaCondOps),
205
206 DEFINE_PROP_END_OF_LIST(),
207};
208
209bool isa_ext_is_enabled(RISCVCPU *cpu, uint32_t ext_offset)
210{
211 bool *ext_enabled = (void *)&cpu->cfg + ext_offset;
212
213 return *ext_enabled;
214}
215
216void isa_ext_update_enabled(RISCVCPU *cpu, uint32_t ext_offset, bool en)
217{
218 bool *ext_enabled = (void *)&cpu->cfg + ext_offset;
219
220 *ext_enabled = en;
221}
222
223bool riscv_cpu_is_vendor(Object *cpu_obj)
224{
225 return object_dynamic_cast(cpu_obj, TYPE_RISCV_VENDOR_CPU) != NULL;
226}
227
228const char * const riscv_int_regnames[] = {
229 "x0/zero", "x1/ra", "x2/sp", "x3/gp", "x4/tp", "x5/t0", "x6/t1",
230 "x7/t2", "x8/s0", "x9/s1", "x10/a0", "x11/a1", "x12/a2", "x13/a3",
231 "x14/a4", "x15/a5", "x16/a6", "x17/a7", "x18/s2", "x19/s3", "x20/s4",
232 "x21/s5", "x22/s6", "x23/s7", "x24/s8", "x25/s9", "x26/s10", "x27/s11",
233 "x28/t3", "x29/t4", "x30/t5", "x31/t6"
234};
235
236const char * const riscv_int_regnamesh[] = {
237 "x0h/zeroh", "x1h/rah", "x2h/sph", "x3h/gph", "x4h/tph", "x5h/t0h",
238 "x6h/t1h", "x7h/t2h", "x8h/s0h", "x9h/s1h", "x10h/a0h", "x11h/a1h",
239 "x12h/a2h", "x13h/a3h", "x14h/a4h", "x15h/a5h", "x16h/a6h", "x17h/a7h",
240 "x18h/s2h", "x19h/s3h", "x20h/s4h", "x21h/s5h", "x22h/s6h", "x23h/s7h",
241 "x24h/s8h", "x25h/s9h", "x26h/s10h", "x27h/s11h", "x28h/t3h", "x29h/t4h",
242 "x30h/t5h", "x31h/t6h"
243};
244
245const char * const riscv_fpr_regnames[] = {
246 "f0/ft0", "f1/ft1", "f2/ft2", "f3/ft3", "f4/ft4", "f5/ft5",
247 "f6/ft6", "f7/ft7", "f8/fs0", "f9/fs1", "f10/fa0", "f11/fa1",
248 "f12/fa2", "f13/fa3", "f14/fa4", "f15/fa5", "f16/fa6", "f17/fa7",
249 "f18/fs2", "f19/fs3", "f20/fs4", "f21/fs5", "f22/fs6", "f23/fs7",
250 "f24/fs8", "f25/fs9", "f26/fs10", "f27/fs11", "f28/ft8", "f29/ft9",
251 "f30/ft10", "f31/ft11"
252};
253
254const char * const riscv_rvv_regnames[] = {
255 "v0", "v1", "v2", "v3", "v4", "v5", "v6",
256 "v7", "v8", "v9", "v10", "v11", "v12", "v13",
257 "v14", "v15", "v16", "v17", "v18", "v19", "v20",
258 "v21", "v22", "v23", "v24", "v25", "v26", "v27",
259 "v28", "v29", "v30", "v31"
260};
261
262static const char * const riscv_excp_names[] = {
263 "misaligned_fetch",
264 "fault_fetch",
265 "illegal_instruction",
266 "breakpoint",
267 "misaligned_load",
268 "fault_load",
269 "misaligned_store",
270 "fault_store",
271 "user_ecall",
272 "supervisor_ecall",
273 "hypervisor_ecall",
274 "machine_ecall",
275 "exec_page_fault",
276 "load_page_fault",
277 "reserved",
278 "store_page_fault",
279 "reserved",
280 "reserved",
281 "reserved",
282 "reserved",
283 "guest_exec_page_fault",
284 "guest_load_page_fault",
285 "reserved",
286 "guest_store_page_fault",
287};
288
289static const char * const riscv_intr_names[] = {
290 "u_software",
291 "s_software",
292 "vs_software",
293 "m_software",
294 "u_timer",
295 "s_timer",
296 "vs_timer",
297 "m_timer",
298 "u_external",
299 "s_external",
300 "vs_external",
301 "m_external",
302 "reserved",
303 "reserved",
304 "reserved",
305 "reserved"
306};
307
308const char *riscv_cpu_get_trap_name(target_ulong cause, bool async)
309{
310 if (async) {
311 return (cause < ARRAY_SIZE(riscv_intr_names)) ?
312 riscv_intr_names[cause] : "(unknown)";
313 } else {
314 return (cause < ARRAY_SIZE(riscv_excp_names)) ?
315 riscv_excp_names[cause] : "(unknown)";
316 }
317}
318
319void riscv_cpu_set_misa_ext(CPURISCVState *env, uint32_t ext)
320{
321 env->misa_ext_mask = env->misa_ext = ext;
322}
323
324int riscv_cpu_max_xlen(RISCVCPUClass *mcc)
325{
326 return 16 << mcc->misa_mxl_max;
327}
328
329#ifndef CONFIG_USER_ONLY
330static uint8_t satp_mode_from_str(const char *satp_mode_str)
331{
332 if (!strncmp(satp_mode_str, "mbare", 5)) {
333 return VM_1_10_MBARE;
334 }
335
336 if (!strncmp(satp_mode_str, "sv32", 4)) {
337 return VM_1_10_SV32;
338 }
339
340 if (!strncmp(satp_mode_str, "sv39", 4)) {
341 return VM_1_10_SV39;
342 }
343
344 if (!strncmp(satp_mode_str, "sv48", 4)) {
345 return VM_1_10_SV48;
346 }
347
348 if (!strncmp(satp_mode_str, "sv57", 4)) {
349 return VM_1_10_SV57;
350 }
351
352 if (!strncmp(satp_mode_str, "sv64", 4)) {
353 return VM_1_10_SV64;
354 }
355
356 g_assert_not_reached();
357}
358
359uint8_t satp_mode_max_from_map(uint32_t map)
360{
361 /*
362 * 'map = 0' will make us return (31 - 32), which C will
363 * happily overflow to UINT_MAX. There's no good result to
364 * return if 'map = 0' (e.g. returning 0 will be ambiguous
365 * with the result for 'map = 1').
366 *
367 * Assert out if map = 0. Callers will have to deal with
368 * it outside of this function.
369 */
370 g_assert(map > 0);
371
372 /* map here has at least one bit set, so no problem with clz */
373 return 31 - __builtin_clz(map);
374}
375
376const char *satp_mode_str(uint8_t satp_mode, bool is_32_bit)
377{
378 if (is_32_bit) {
379 switch (satp_mode) {
380 case VM_1_10_SV32:
381 return "sv32";
382 case VM_1_10_MBARE:
383 return "none";
384 }
385 } else {
386 switch (satp_mode) {
387 case VM_1_10_SV64:
388 return "sv64";
389 case VM_1_10_SV57:
390 return "sv57";
391 case VM_1_10_SV48:
392 return "sv48";
393 case VM_1_10_SV39:
394 return "sv39";
395 case VM_1_10_MBARE:
396 return "none";
397 }
398 }
399
400 g_assert_not_reached();
401}
402
403static void set_satp_mode_max_supported(RISCVCPU *cpu,
404 uint8_t satp_mode)
405{
406 bool rv32 = riscv_cpu_mxl(&cpu->env) == MXL_RV32;
407 const bool *valid_vm = rv32 ? valid_vm_1_10_32 : valid_vm_1_10_64;
408
409 for (int i = 0; i <= satp_mode; ++i) {
410 if (valid_vm[i]) {
411 cpu->cfg.satp_mode.supported |= (1 << i);
412 }
413 }
414}
415
416/* Set the satp mode to the max supported */
417static void set_satp_mode_default_map(RISCVCPU *cpu)
418{
419 /*
420 * Bare CPUs do not default to the max available.
421 * Users must set a valid satp_mode in the command
422 * line.
423 */
424 if (object_dynamic_cast(OBJECT(cpu), TYPE_RISCV_BARE_CPU) != NULL) {
425 warn_report("No satp mode set. Defaulting to 'bare'");
426 cpu->cfg.satp_mode.map = (1 << VM_1_10_MBARE);
427 return;
428 }
429
430 cpu->cfg.satp_mode.map = cpu->cfg.satp_mode.supported;
431}
432#endif
433
434static void riscv_any_cpu_init(Object *obj)
435{
436 RISCVCPU *cpu = RISCV_CPU(obj);
437 CPURISCVState *env = &cpu->env;
438 riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVF | RVD | RVC | RVU);
439
440#ifndef CONFIG_USER_ONLY
441 set_satp_mode_max_supported(RISCV_CPU(obj),
442 riscv_cpu_mxl(&RISCV_CPU(obj)->env) == MXL_RV32 ?
443 VM_1_10_SV32 : VM_1_10_SV57);
444#endif
445
446 env->priv_ver = PRIV_VERSION_LATEST;
447
448 /* inherited from parent obj via riscv_cpu_init() */
449 cpu->cfg.ext_zifencei = true;
450 cpu->cfg.ext_zicsr = true;
451 cpu->cfg.mmu = true;
452 cpu->cfg.pmp = true;
453}
454
455static void riscv_max_cpu_init(Object *obj)
456{
457 RISCVCPU *cpu = RISCV_CPU(obj);
458 CPURISCVState *env = &cpu->env;
459
460 cpu->cfg.mmu = true;
461 cpu->cfg.pmp = true;
462
463 env->priv_ver = PRIV_VERSION_LATEST;
464#ifndef CONFIG_USER_ONLY
465#ifdef TARGET_RISCV32
466 set_satp_mode_max_supported(cpu, VM_1_10_SV32);
467#else
468 set_satp_mode_max_supported(cpu, VM_1_10_SV57);
469#endif
470#endif
471}
472
473#if defined(TARGET_RISCV64)
474static void rv64_base_cpu_init(Object *obj)
475{
476 RISCVCPU *cpu = RISCV_CPU(obj);
477 CPURISCVState *env = &cpu->env;
478
479 cpu->cfg.mmu = true;
480 cpu->cfg.pmp = true;
481
482 /* Set latest version of privileged specification */
483 env->priv_ver = PRIV_VERSION_LATEST;
484#ifndef CONFIG_USER_ONLY
485 set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV57);
486#endif
487}
488
489static void rv64_sifive_u_cpu_init(Object *obj)
490{
491 RISCVCPU *cpu = RISCV_CPU(obj);
492 CPURISCVState *env = &cpu->env;
493 riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU);
494 env->priv_ver = PRIV_VERSION_1_10_0;
495#ifndef CONFIG_USER_ONLY
496 set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV39);
497#endif
498
499 /* inherited from parent obj via riscv_cpu_init() */
500 cpu->cfg.ext_zifencei = true;
501 cpu->cfg.ext_zicsr = true;
502 cpu->cfg.mmu = true;
503 cpu->cfg.pmp = true;
504}
505
506static void rv64_sifive_e_cpu_init(Object *obj)
507{
508 CPURISCVState *env = &RISCV_CPU(obj)->env;
509 RISCVCPU *cpu = RISCV_CPU(obj);
510
511 riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVC | RVU);
512 env->priv_ver = PRIV_VERSION_1_10_0;
513#ifndef CONFIG_USER_ONLY
514 set_satp_mode_max_supported(cpu, VM_1_10_MBARE);
515#endif
516
517 /* inherited from parent obj via riscv_cpu_init() */
518 cpu->cfg.ext_zifencei = true;
519 cpu->cfg.ext_zicsr = true;
520 cpu->cfg.pmp = true;
521}
522
523static void rv64_thead_c906_cpu_init(Object *obj)
524{
525 CPURISCVState *env = &RISCV_CPU(obj)->env;
526 RISCVCPU *cpu = RISCV_CPU(obj);
527
528 riscv_cpu_set_misa_ext(env, RVG | RVC | RVS | RVU);
529 env->priv_ver = PRIV_VERSION_1_11_0;
530
531 cpu->cfg.ext_zfa = true;
532 cpu->cfg.ext_zfh = true;
533 cpu->cfg.mmu = true;
534 cpu->cfg.ext_xtheadba = true;
535 cpu->cfg.ext_xtheadbb = true;
536 cpu->cfg.ext_xtheadbs = true;
537 cpu->cfg.ext_xtheadcmo = true;
538 cpu->cfg.ext_xtheadcondmov = true;
539 cpu->cfg.ext_xtheadfmemidx = true;
540 cpu->cfg.ext_xtheadmac = true;
541 cpu->cfg.ext_xtheadmemidx = true;
542 cpu->cfg.ext_xtheadmempair = true;
543 cpu->cfg.ext_xtheadsync = true;
544
545 cpu->cfg.mvendorid = THEAD_VENDOR_ID;
546#ifndef CONFIG_USER_ONLY
547 set_satp_mode_max_supported(cpu, VM_1_10_SV39);
548#endif
549
550 /* inherited from parent obj via riscv_cpu_init() */
551 cpu->cfg.pmp = true;
552}
553
554static void rv64_veyron_v1_cpu_init(Object *obj)
555{
556 CPURISCVState *env = &RISCV_CPU(obj)->env;
557 RISCVCPU *cpu = RISCV_CPU(obj);
558
559 riscv_cpu_set_misa_ext(env, RVG | RVC | RVS | RVU | RVH);
560 env->priv_ver = PRIV_VERSION_1_12_0;
561
562 /* Enable ISA extensions */
563 cpu->cfg.mmu = true;
564 cpu->cfg.ext_zifencei = true;
565 cpu->cfg.ext_zicsr = true;
566 cpu->cfg.pmp = true;
567 cpu->cfg.ext_zicbom = true;
568 cpu->cfg.cbom_blocksize = 64;
569 cpu->cfg.cboz_blocksize = 64;
570 cpu->cfg.ext_zicboz = true;
571 cpu->cfg.ext_smaia = true;
572 cpu->cfg.ext_ssaia = true;
573 cpu->cfg.ext_sscofpmf = true;
574 cpu->cfg.ext_sstc = true;
575 cpu->cfg.ext_svinval = true;
576 cpu->cfg.ext_svnapot = true;
577 cpu->cfg.ext_svpbmt = true;
578 cpu->cfg.ext_smstateen = true;
579 cpu->cfg.ext_zba = true;
580 cpu->cfg.ext_zbb = true;
581 cpu->cfg.ext_zbc = true;
582 cpu->cfg.ext_zbs = true;
583 cpu->cfg.ext_XVentanaCondOps = true;
584
585 cpu->cfg.mvendorid = VEYRON_V1_MVENDORID;
586 cpu->cfg.marchid = VEYRON_V1_MARCHID;
587 cpu->cfg.mimpid = VEYRON_V1_MIMPID;
588
589#ifndef CONFIG_USER_ONLY
590 set_satp_mode_max_supported(cpu, VM_1_10_SV48);
591#endif
592}
593
594static void rv128_base_cpu_init(Object *obj)
595{
596 RISCVCPU *cpu = RISCV_CPU(obj);
597 CPURISCVState *env = &cpu->env;
598
599 if (qemu_tcg_mttcg_enabled()) {
600 /* Missing 128-bit aligned atomics */
601 error_report("128-bit RISC-V currently does not work with Multi "
602 "Threaded TCG. Please use: -accel tcg,thread=single");
603 exit(EXIT_FAILURE);
604 }
605
606 cpu->cfg.mmu = true;
607 cpu->cfg.pmp = true;
608
609 /* Set latest version of privileged specification */
610 env->priv_ver = PRIV_VERSION_LATEST;
611#ifndef CONFIG_USER_ONLY
612 set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV57);
613#endif
614}
615
616static void rv64i_bare_cpu_init(Object *obj)
617{
618 CPURISCVState *env = &RISCV_CPU(obj)->env;
619 riscv_cpu_set_misa_ext(env, RVI);
620}
621
622static void rv64e_bare_cpu_init(Object *obj)
623{
624 CPURISCVState *env = &RISCV_CPU(obj)->env;
625 riscv_cpu_set_misa_ext(env, RVE);
626}
627#else
628static void rv32_base_cpu_init(Object *obj)
629{
630 RISCVCPU *cpu = RISCV_CPU(obj);
631 CPURISCVState *env = &cpu->env;
632
633 cpu->cfg.mmu = true;
634 cpu->cfg.pmp = true;
635
636 /* Set latest version of privileged specification */
637 env->priv_ver = PRIV_VERSION_LATEST;
638#ifndef CONFIG_USER_ONLY
639 set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV32);
640#endif
641}
642
643static void rv32_sifive_u_cpu_init(Object *obj)
644{
645 RISCVCPU *cpu = RISCV_CPU(obj);
646 CPURISCVState *env = &cpu->env;
647 riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU);
648 env->priv_ver = PRIV_VERSION_1_10_0;
649#ifndef CONFIG_USER_ONLY
650 set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV32);
651#endif
652
653 /* inherited from parent obj via riscv_cpu_init() */
654 cpu->cfg.ext_zifencei = true;
655 cpu->cfg.ext_zicsr = true;
656 cpu->cfg.mmu = true;
657 cpu->cfg.pmp = true;
658}
659
660static void rv32_sifive_e_cpu_init(Object *obj)
661{
662 CPURISCVState *env = &RISCV_CPU(obj)->env;
663 RISCVCPU *cpu = RISCV_CPU(obj);
664
665 riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVC | RVU);
666 env->priv_ver = PRIV_VERSION_1_10_0;
667#ifndef CONFIG_USER_ONLY
668 set_satp_mode_max_supported(cpu, VM_1_10_MBARE);
669#endif
670
671 /* inherited from parent obj via riscv_cpu_init() */
672 cpu->cfg.ext_zifencei = true;
673 cpu->cfg.ext_zicsr = true;
674 cpu->cfg.pmp = true;
675}
676
677static void rv32_ibex_cpu_init(Object *obj)
678{
679 CPURISCVState *env = &RISCV_CPU(obj)->env;
680 RISCVCPU *cpu = RISCV_CPU(obj);
681
682 riscv_cpu_set_misa_ext(env, RVI | RVM | RVC | RVU);
683 env->priv_ver = PRIV_VERSION_1_12_0;
684#ifndef CONFIG_USER_ONLY
685 set_satp_mode_max_supported(cpu, VM_1_10_MBARE);
686#endif
687 /* inherited from parent obj via riscv_cpu_init() */
688 cpu->cfg.ext_zifencei = true;
689 cpu->cfg.ext_zicsr = true;
690 cpu->cfg.pmp = true;
691 cpu->cfg.ext_smepmp = true;
692}
693
694static void rv32_imafcu_nommu_cpu_init(Object *obj)
695{
696 CPURISCVState *env = &RISCV_CPU(obj)->env;
697 RISCVCPU *cpu = RISCV_CPU(obj);
698
699 riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVF | RVC | RVU);
700 env->priv_ver = PRIV_VERSION_1_10_0;
701#ifndef CONFIG_USER_ONLY
702 set_satp_mode_max_supported(cpu, VM_1_10_MBARE);
703#endif
704
705 /* inherited from parent obj via riscv_cpu_init() */
706 cpu->cfg.ext_zifencei = true;
707 cpu->cfg.ext_zicsr = true;
708 cpu->cfg.pmp = true;
709}
710
711static void rv32i_bare_cpu_init(Object *obj)
712{
713 CPURISCVState *env = &RISCV_CPU(obj)->env;
714 riscv_cpu_set_misa_ext(env, RVI);
715}
716
717static void rv32e_bare_cpu_init(Object *obj)
718{
719 CPURISCVState *env = &RISCV_CPU(obj)->env;
720 riscv_cpu_set_misa_ext(env, RVE);
721}
722#endif
723
724static ObjectClass *riscv_cpu_class_by_name(const char *cpu_model)
725{
726 ObjectClass *oc;
727 char *typename;
728 char **cpuname;
729
730 cpuname = g_strsplit(cpu_model, ",", 1);
731 typename = g_strdup_printf(RISCV_CPU_TYPE_NAME("%s"), cpuname[0]);
732 oc = object_class_by_name(typename);
733 g_strfreev(cpuname);
734 g_free(typename);
735
736 return oc;
737}
738
739char *riscv_cpu_get_name(RISCVCPU *cpu)
740{
741 RISCVCPUClass *rcc = RISCV_CPU_GET_CLASS(cpu);
742 const char *typename = object_class_get_name(OBJECT_CLASS(rcc));
743
744 g_assert(g_str_has_suffix(typename, RISCV_CPU_TYPE_SUFFIX));
745
746 return cpu_model_from_type(typename);
747}
748
749static void riscv_cpu_dump_state(CPUState *cs, FILE *f, int flags)
750{
751 RISCVCPU *cpu = RISCV_CPU(cs);
752 CPURISCVState *env = &cpu->env;
753 int i, j;
754 uint8_t *p;
755
756#if !defined(CONFIG_USER_ONLY)
757 if (riscv_has_ext(env, RVH)) {
758 qemu_fprintf(f, " %s %d\n", "V = ", env->virt_enabled);
759 }
760#endif
761 qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "pc ", env->pc);
762#ifndef CONFIG_USER_ONLY
763 {
764 static const int dump_csrs[] = {
765 CSR_MHARTID,
766 CSR_MSTATUS,
767 CSR_MSTATUSH,
768 /*
769 * CSR_SSTATUS is intentionally omitted here as its value
770 * can be figured out by looking at CSR_MSTATUS
771 */
772 CSR_HSTATUS,
773 CSR_VSSTATUS,
774 CSR_MIP,
775 CSR_MIE,
776 CSR_MIDELEG,
777 CSR_HIDELEG,
778 CSR_MEDELEG,
779 CSR_HEDELEG,
780 CSR_MTVEC,
781 CSR_STVEC,
782 CSR_VSTVEC,
783 CSR_MEPC,
784 CSR_SEPC,
785 CSR_VSEPC,
786 CSR_MCAUSE,
787 CSR_SCAUSE,
788 CSR_VSCAUSE,
789 CSR_MTVAL,
790 CSR_STVAL,
791 CSR_HTVAL,
792 CSR_MTVAL2,
793 CSR_MSCRATCH,
794 CSR_SSCRATCH,
795 CSR_SATP,
796 CSR_MMTE,
797 CSR_UPMBASE,
798 CSR_UPMMASK,
799 CSR_SPMBASE,
800 CSR_SPMMASK,
801 CSR_MPMBASE,
802 CSR_MPMMASK,
803 };
804
805 for (i = 0; i < ARRAY_SIZE(dump_csrs); ++i) {
806 int csrno = dump_csrs[i];
807 target_ulong val = 0;
808 RISCVException res = riscv_csrrw_debug(env, csrno, &val, 0, 0);
809
810 /*
811 * Rely on the smode, hmode, etc, predicates within csr.c
812 * to do the filtering of the registers that are present.
813 */
814 if (res == RISCV_EXCP_NONE) {
815 qemu_fprintf(f, " %-8s " TARGET_FMT_lx "\n",
816 csr_ops[csrno].name, val);
817 }
818 }
819 }
820#endif
821
822 for (i = 0; i < 32; i++) {
823 qemu_fprintf(f, " %-8s " TARGET_FMT_lx,
824 riscv_int_regnames[i], env->gpr[i]);
825 if ((i & 3) == 3) {
826 qemu_fprintf(f, "\n");
827 }
828 }
829 if (flags & CPU_DUMP_FPU) {
830 for (i = 0; i < 32; i++) {
831 qemu_fprintf(f, " %-8s %016" PRIx64,
832 riscv_fpr_regnames[i], env->fpr[i]);
833 if ((i & 3) == 3) {
834 qemu_fprintf(f, "\n");
835 }
836 }
837 }
838 if (riscv_has_ext(env, RVV) && (flags & CPU_DUMP_VPU)) {
839 static const int dump_rvv_csrs[] = {
840 CSR_VSTART,
841 CSR_VXSAT,
842 CSR_VXRM,
843 CSR_VCSR,
844 CSR_VL,
845 CSR_VTYPE,
846 CSR_VLENB,
847 };
848 for (i = 0; i < ARRAY_SIZE(dump_rvv_csrs); ++i) {
849 int csrno = dump_rvv_csrs[i];
850 target_ulong val = 0;
851 RISCVException res = riscv_csrrw_debug(env, csrno, &val, 0, 0);
852
853 /*
854 * Rely on the smode, hmode, etc, predicates within csr.c
855 * to do the filtering of the registers that are present.
856 */
857 if (res == RISCV_EXCP_NONE) {
858 qemu_fprintf(f, " %-8s " TARGET_FMT_lx "\n",
859 csr_ops[csrno].name, val);
860 }
861 }
862 uint16_t vlenb = cpu->cfg.vlenb;
863
864 for (i = 0; i < 32; i++) {
865 qemu_fprintf(f, " %-8s ", riscv_rvv_regnames[i]);
866 p = (uint8_t *)env->vreg;
867 for (j = vlenb - 1 ; j >= 0; j--) {
868 qemu_fprintf(f, "%02x", *(p + i * vlenb + BYTE(j)));
869 }
870 qemu_fprintf(f, "\n");
871 }
872 }
873}
874
875static void riscv_cpu_set_pc(CPUState *cs, vaddr value)
876{
877 RISCVCPU *cpu = RISCV_CPU(cs);
878 CPURISCVState *env = &cpu->env;
879
880 if (env->xl == MXL_RV32) {
881 env->pc = (int32_t)value;
882 } else {
883 env->pc = value;
884 }
885}
886
887static vaddr riscv_cpu_get_pc(CPUState *cs)
888{
889 RISCVCPU *cpu = RISCV_CPU(cs);
890 CPURISCVState *env = &cpu->env;
891
892 /* Match cpu_get_tb_cpu_state. */
893 if (env->xl == MXL_RV32) {
894 return env->pc & UINT32_MAX;
895 }
896 return env->pc;
897}
898
899static bool riscv_cpu_has_work(CPUState *cs)
900{
901#ifndef CONFIG_USER_ONLY
902 RISCVCPU *cpu = RISCV_CPU(cs);
903 CPURISCVState *env = &cpu->env;
904 /*
905 * Definition of the WFI instruction requires it to ignore the privilege
906 * mode and delegation registers, but respect individual enables
907 */
908 return riscv_cpu_all_pending(env) != 0 ||
909 riscv_cpu_sirq_pending(env) != RISCV_EXCP_NONE ||
910 riscv_cpu_vsirq_pending(env) != RISCV_EXCP_NONE;
911#else
912 return true;
913#endif
914}
915
916static int riscv_cpu_mmu_index(CPUState *cs, bool ifetch)
917{
918 return riscv_env_mmu_index(cpu_env(cs), ifetch);
919}
920
921static void riscv_cpu_reset_hold(Object *obj, ResetType type)
922{
923#ifndef CONFIG_USER_ONLY
924 uint8_t iprio;
925 int i, irq, rdzero;
926#endif
927 CPUState *cs = CPU(obj);
928 RISCVCPU *cpu = RISCV_CPU(cs);
929 RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(obj);
930 CPURISCVState *env = &cpu->env;
931
932 if (mcc->parent_phases.hold) {
933 mcc->parent_phases.hold(obj, type);
934 }
935#ifndef CONFIG_USER_ONLY
936 env->misa_mxl = mcc->misa_mxl_max;
937 env->priv = PRV_M;
938 env->mstatus &= ~(MSTATUS_MIE | MSTATUS_MPRV);
939 if (env->misa_mxl > MXL_RV32) {
940 /*
941 * The reset status of SXL/UXL is undefined, but mstatus is WARL
942 * and we must ensure that the value after init is valid for read.
943 */
944 env->mstatus = set_field(env->mstatus, MSTATUS64_SXL, env->misa_mxl);
945 env->mstatus = set_field(env->mstatus, MSTATUS64_UXL, env->misa_mxl);
946 if (riscv_has_ext(env, RVH)) {
947 env->vsstatus = set_field(env->vsstatus,
948 MSTATUS64_SXL, env->misa_mxl);
949 env->vsstatus = set_field(env->vsstatus,
950 MSTATUS64_UXL, env->misa_mxl);
951 env->mstatus_hs = set_field(env->mstatus_hs,
952 MSTATUS64_SXL, env->misa_mxl);
953 env->mstatus_hs = set_field(env->mstatus_hs,
954 MSTATUS64_UXL, env->misa_mxl);
955 }
956 }
957 env->mcause = 0;
958 env->miclaim = MIP_SGEIP;
959 env->pc = env->resetvec;
960 env->bins = 0;
961 env->two_stage_lookup = false;
962
963 env->menvcfg = (cpu->cfg.ext_svpbmt ? MENVCFG_PBMTE : 0) |
964 (!cpu->cfg.ext_svade && cpu->cfg.ext_svadu ?
965 MENVCFG_ADUE : 0);
966 env->henvcfg = 0;
967
968 /* Initialized default priorities of local interrupts. */
969 for (i = 0; i < ARRAY_SIZE(env->miprio); i++) {
970 iprio = riscv_cpu_default_priority(i);
971 env->miprio[i] = (i == IRQ_M_EXT) ? 0 : iprio;
972 env->siprio[i] = (i == IRQ_S_EXT) ? 0 : iprio;
973 env->hviprio[i] = 0;
974 }
975 i = 0;
976 while (!riscv_cpu_hviprio_index2irq(i, &irq, &rdzero)) {
977 if (!rdzero) {
978 env->hviprio[irq] = env->miprio[irq];
979 }
980 i++;
981 }
982 /* mmte is supposed to have pm.current hardwired to 1 */
983 env->mmte |= (EXT_STATUS_INITIAL | MMTE_M_PM_CURRENT);
984
985 /*
986 * Bits 10, 6, 2 and 12 of mideleg are read only 1 when the Hypervisor
987 * extension is enabled.
988 */
989 if (riscv_has_ext(env, RVH)) {
990 env->mideleg |= HS_MODE_INTERRUPTS;
991 }
992
993 /*
994 * Clear mseccfg and unlock all the PMP entries upon reset.
995 * This is allowed as per the priv and smepmp specifications
996 * and is needed to clear stale entries across reboots.
997 */
998 if (riscv_cpu_cfg(env)->ext_smepmp) {
999 env->mseccfg = 0;
1000 }
1001
1002 pmp_unlock_entries(env);
1003#endif
1004 env->xl = riscv_cpu_mxl(env);
1005 riscv_cpu_update_mask(env);
1006 cs->exception_index = RISCV_EXCP_NONE;
1007 env->load_res = -1;
1008 set_default_nan_mode(1, &env->fp_status);
1009
1010#ifndef CONFIG_USER_ONLY
1011 if (cpu->cfg.debug) {
1012 riscv_trigger_reset_hold(env);
1013 }
1014
1015 if (kvm_enabled()) {
1016 kvm_riscv_reset_vcpu(cpu);
1017 }
1018#endif
1019}
1020
1021static void riscv_cpu_disas_set_info(CPUState *s, disassemble_info *info)
1022{
1023 RISCVCPU *cpu = RISCV_CPU(s);
1024 CPURISCVState *env = &cpu->env;
1025 info->target_info = &cpu->cfg;
1026
1027 switch (env->xl) {
1028 case MXL_RV32:
1029 info->print_insn = print_insn_riscv32;
1030 break;
1031 case MXL_RV64:
1032 info->print_insn = print_insn_riscv64;
1033 break;
1034 case MXL_RV128:
1035 info->print_insn = print_insn_riscv128;
1036 break;
1037 default:
1038 g_assert_not_reached();
1039 }
1040}
1041
1042#ifndef CONFIG_USER_ONLY
1043static void riscv_cpu_satp_mode_finalize(RISCVCPU *cpu, Error **errp)
1044{
1045 bool rv32 = riscv_cpu_is_32bit(cpu);
1046 uint8_t satp_mode_map_max, satp_mode_supported_max;
1047
1048 /* The CPU wants the OS to decide which satp mode to use */
1049 if (cpu->cfg.satp_mode.supported == 0) {
1050 return;
1051 }
1052
1053 satp_mode_supported_max =
1054 satp_mode_max_from_map(cpu->cfg.satp_mode.supported);
1055
1056 if (cpu->cfg.satp_mode.map == 0) {
1057 if (cpu->cfg.satp_mode.init == 0) {
1058 /* If unset by the user, we fallback to the default satp mode. */
1059 set_satp_mode_default_map(cpu);
1060 } else {
1061 /*
1062 * Find the lowest level that was disabled and then enable the
1063 * first valid level below which can be found in
1064 * valid_vm_1_10_32/64.
1065 */
1066 for (int i = 1; i < 16; ++i) {
1067 if ((cpu->cfg.satp_mode.init & (1 << i)) &&
1068 (cpu->cfg.satp_mode.supported & (1 << i))) {
1069 for (int j = i - 1; j >= 0; --j) {
1070 if (cpu->cfg.satp_mode.supported & (1 << j)) {
1071 cpu->cfg.satp_mode.map |= (1 << j);
1072 break;
1073 }
1074 }
1075 break;
1076 }
1077 }
1078 }
1079 }
1080
1081 satp_mode_map_max = satp_mode_max_from_map(cpu->cfg.satp_mode.map);
1082
1083 /* Make sure the user asked for a supported configuration (HW and qemu) */
1084 if (satp_mode_map_max > satp_mode_supported_max) {
1085 error_setg(errp, "satp_mode %s is higher than hw max capability %s",
1086 satp_mode_str(satp_mode_map_max, rv32),
1087 satp_mode_str(satp_mode_supported_max, rv32));
1088 return;
1089 }
1090
1091 /*
1092 * Make sure the user did not ask for an invalid configuration as per
1093 * the specification.
1094 */
1095 if (!rv32) {
1096 for (int i = satp_mode_map_max - 1; i >= 0; --i) {
1097 if (!(cpu->cfg.satp_mode.map & (1 << i)) &&
1098 (cpu->cfg.satp_mode.init & (1 << i)) &&
1099 (cpu->cfg.satp_mode.supported & (1 << i))) {
1100 error_setg(errp, "cannot disable %s satp mode if %s "
1101 "is enabled", satp_mode_str(i, false),
1102 satp_mode_str(satp_mode_map_max, false));
1103 return;
1104 }
1105 }
1106 }
1107
1108 /* Finally expand the map so that all valid modes are set */
1109 for (int i = satp_mode_map_max - 1; i >= 0; --i) {
1110 if (cpu->cfg.satp_mode.supported & (1 << i)) {
1111 cpu->cfg.satp_mode.map |= (1 << i);
1112 }
1113 }
1114}
1115#endif
1116
1117void riscv_cpu_finalize_features(RISCVCPU *cpu, Error **errp)
1118{
1119 Error *local_err = NULL;
1120
1121#ifndef CONFIG_USER_ONLY
1122 riscv_cpu_satp_mode_finalize(cpu, &local_err);
1123 if (local_err != NULL) {
1124 error_propagate(errp, local_err);
1125 return;
1126 }
1127#endif
1128
1129 if (tcg_enabled()) {
1130 riscv_tcg_cpu_finalize_features(cpu, &local_err);
1131 if (local_err != NULL) {
1132 error_propagate(errp, local_err);
1133 return;
1134 }
1135 } else if (kvm_enabled()) {
1136 riscv_kvm_cpu_finalize_features(cpu, &local_err);
1137 if (local_err != NULL) {
1138 error_propagate(errp, local_err);
1139 return;
1140 }
1141 }
1142}
1143
1144static void riscv_cpu_realize(DeviceState *dev, Error **errp)
1145{
1146 CPUState *cs = CPU(dev);
1147 RISCVCPU *cpu = RISCV_CPU(dev);
1148 RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(dev);
1149 Error *local_err = NULL;
1150
1151 if (object_dynamic_cast(OBJECT(dev), TYPE_RISCV_CPU_ANY) != NULL) {
1152 warn_report("The 'any' CPU is deprecated and will be "
1153 "removed in the future.");
1154 }
1155
1156 cpu_exec_realizefn(cs, &local_err);
1157 if (local_err != NULL) {
1158 error_propagate(errp, local_err);
1159 return;
1160 }
1161
1162 riscv_cpu_finalize_features(cpu, &local_err);
1163 if (local_err != NULL) {
1164 error_propagate(errp, local_err);
1165 return;
1166 }
1167
1168 riscv_cpu_register_gdb_regs_for_features(cs);
1169
1170#ifndef CONFIG_USER_ONLY
1171 if (cpu->cfg.debug) {
1172 riscv_trigger_realize(&cpu->env);
1173 }
1174#endif
1175
1176 qemu_init_vcpu(cs);
1177 cpu_reset(cs);
1178
1179 mcc->parent_realize(dev, errp);
1180}
1181
1182bool riscv_cpu_accelerator_compatible(RISCVCPU *cpu)
1183{
1184 if (tcg_enabled()) {
1185 return riscv_cpu_tcg_compatible(cpu);
1186 }
1187
1188 return true;
1189}
1190
1191#ifndef CONFIG_USER_ONLY
1192static void cpu_riscv_get_satp(Object *obj, Visitor *v, const char *name,
1193 void *opaque, Error **errp)
1194{
1195 RISCVSATPMap *satp_map = opaque;
1196 uint8_t satp = satp_mode_from_str(name);
1197 bool value;
1198
1199 value = satp_map->map & (1 << satp);
1200
1201 visit_type_bool(v, name, &value, errp);
1202}
1203
1204static void cpu_riscv_set_satp(Object *obj, Visitor *v, const char *name,
1205 void *opaque, Error **errp)
1206{
1207 RISCVSATPMap *satp_map = opaque;
1208 uint8_t satp = satp_mode_from_str(name);
1209 bool value;
1210
1211 if (!visit_type_bool(v, name, &value, errp)) {
1212 return;
1213 }
1214
1215 satp_map->map = deposit32(satp_map->map, satp, 1, value);
1216 satp_map->init |= 1 << satp;
1217}
1218
1219void riscv_add_satp_mode_properties(Object *obj)
1220{
1221 RISCVCPU *cpu = RISCV_CPU(obj);
1222
1223 if (cpu->env.misa_mxl == MXL_RV32) {
1224 object_property_add(obj, "sv32", "bool", cpu_riscv_get_satp,
1225 cpu_riscv_set_satp, NULL, &cpu->cfg.satp_mode);
1226 } else {
1227 object_property_add(obj, "sv39", "bool", cpu_riscv_get_satp,
1228 cpu_riscv_set_satp, NULL, &cpu->cfg.satp_mode);
1229 object_property_add(obj, "sv48", "bool", cpu_riscv_get_satp,
1230 cpu_riscv_set_satp, NULL, &cpu->cfg.satp_mode);
1231 object_property_add(obj, "sv57", "bool", cpu_riscv_get_satp,
1232 cpu_riscv_set_satp, NULL, &cpu->cfg.satp_mode);
1233 object_property_add(obj, "sv64", "bool", cpu_riscv_get_satp,
1234 cpu_riscv_set_satp, NULL, &cpu->cfg.satp_mode);
1235 }
1236}
1237
1238static void riscv_cpu_set_irq(void *opaque, int irq, int level)
1239{
1240 RISCVCPU *cpu = RISCV_CPU(opaque);
1241 CPURISCVState *env = &cpu->env;
1242
1243 if (irq < IRQ_LOCAL_MAX) {
1244 switch (irq) {
1245 case IRQ_U_SOFT:
1246 case IRQ_S_SOFT:
1247 case IRQ_VS_SOFT:
1248 case IRQ_M_SOFT:
1249 case IRQ_U_TIMER:
1250 case IRQ_S_TIMER:
1251 case IRQ_VS_TIMER:
1252 case IRQ_M_TIMER:
1253 case IRQ_U_EXT:
1254 case IRQ_VS_EXT:
1255 case IRQ_M_EXT:
1256 if (kvm_enabled()) {
1257 kvm_riscv_set_irq(cpu, irq, level);
1258 } else {
1259 riscv_cpu_update_mip(env, 1 << irq, BOOL_TO_MASK(level));
1260 }
1261 break;
1262 case IRQ_S_EXT:
1263 if (kvm_enabled()) {
1264 kvm_riscv_set_irq(cpu, irq, level);
1265 } else {
1266 env->external_seip = level;
1267 riscv_cpu_update_mip(env, 1 << irq,
1268 BOOL_TO_MASK(level | env->software_seip));
1269 }
1270 break;
1271 default:
1272 g_assert_not_reached();
1273 }
1274 } else if (irq < (IRQ_LOCAL_MAX + IRQ_LOCAL_GUEST_MAX)) {
1275 /* Require H-extension for handling guest local interrupts */
1276 if (!riscv_has_ext(env, RVH)) {
1277 g_assert_not_reached();
1278 }
1279
1280 /* Compute bit position in HGEIP CSR */
1281 irq = irq - IRQ_LOCAL_MAX + 1;
1282 if (env->geilen < irq) {
1283 g_assert_not_reached();
1284 }
1285
1286 /* Update HGEIP CSR */
1287 env->hgeip &= ~((target_ulong)1 << irq);
1288 if (level) {
1289 env->hgeip |= (target_ulong)1 << irq;
1290 }
1291
1292 /* Update mip.SGEIP bit */
1293 riscv_cpu_update_mip(env, MIP_SGEIP,
1294 BOOL_TO_MASK(!!(env->hgeie & env->hgeip)));
1295 } else {
1296 g_assert_not_reached();
1297 }
1298}
1299#endif /* CONFIG_USER_ONLY */
1300
1301static bool riscv_cpu_is_dynamic(Object *cpu_obj)
1302{
1303 return object_dynamic_cast(cpu_obj, TYPE_RISCV_DYNAMIC_CPU) != NULL;
1304}
1305
1306static void riscv_cpu_post_init(Object *obj)
1307{
1308 accel_cpu_instance_init(CPU(obj));
1309}
1310
1311static void riscv_cpu_init(Object *obj)
1312{
1313 RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(obj);
1314 RISCVCPU *cpu = RISCV_CPU(obj);
1315 CPURISCVState *env = &cpu->env;
1316
1317 env->misa_mxl = mcc->misa_mxl_max;
1318
1319#ifndef CONFIG_USER_ONLY
1320 qdev_init_gpio_in(DEVICE(obj), riscv_cpu_set_irq,
1321 IRQ_LOCAL_MAX + IRQ_LOCAL_GUEST_MAX);
1322#endif /* CONFIG_USER_ONLY */
1323
1324 general_user_opts = g_hash_table_new(g_str_hash, g_str_equal);
1325
1326 /*
1327 * The timer and performance counters extensions were supported
1328 * in QEMU before they were added as discrete extensions in the
1329 * ISA. To keep compatibility we'll always default them to 'true'
1330 * for all CPUs. Each accelerator will decide what to do when
1331 * users disable them.
1332 */
1333 RISCV_CPU(obj)->cfg.ext_zicntr = true;
1334 RISCV_CPU(obj)->cfg.ext_zihpm = true;
1335
1336 /* Default values for non-bool cpu properties */
1337 cpu->cfg.pmu_mask = MAKE_64BIT_MASK(3, 16);
1338 cpu->cfg.vlenb = 128 >> 3;
1339 cpu->cfg.elen = 64;
1340 cpu->cfg.cbom_blocksize = 64;
1341 cpu->cfg.cbop_blocksize = 64;
1342 cpu->cfg.cboz_blocksize = 64;
1343 cpu->env.vext_ver = VEXT_VERSION_1_00_0;
1344}
1345
1346static void riscv_bare_cpu_init(Object *obj)
1347{
1348 RISCVCPU *cpu = RISCV_CPU(obj);
1349
1350 /*
1351 * Bare CPUs do not inherit the timer and performance
1352 * counters from the parent class (see riscv_cpu_init()
1353 * for info on why the parent enables them).
1354 *
1355 * Users have to explicitly enable these counters for
1356 * bare CPUs.
1357 */
1358 cpu->cfg.ext_zicntr = false;
1359 cpu->cfg.ext_zihpm = false;
1360
1361 /* Set to QEMU's first supported priv version */
1362 cpu->env.priv_ver = PRIV_VERSION_1_10_0;
1363
1364 /*
1365 * Support all available satp_mode settings. The default
1366 * value will be set to MBARE if the user doesn't set
1367 * satp_mode manually (see set_satp_mode_default()).
1368 */
1369#ifndef CONFIG_USER_ONLY
1370 set_satp_mode_max_supported(cpu, VM_1_10_SV64);
1371#endif
1372}
1373
1374typedef struct misa_ext_info {
1375 const char *name;
1376 const char *description;
1377} MISAExtInfo;
1378
1379#define MISA_INFO_IDX(_bit) \
1380 __builtin_ctz(_bit)
1381
1382#define MISA_EXT_INFO(_bit, _propname, _descr) \
1383 [MISA_INFO_IDX(_bit)] = {.name = _propname, .description = _descr}
1384
1385static const MISAExtInfo misa_ext_info_arr[] = {
1386 MISA_EXT_INFO(RVA, "a", "Atomic instructions"),
1387 MISA_EXT_INFO(RVC, "c", "Compressed instructions"),
1388 MISA_EXT_INFO(RVD, "d", "Double-precision float point"),
1389 MISA_EXT_INFO(RVF, "f", "Single-precision float point"),
1390 MISA_EXT_INFO(RVI, "i", "Base integer instruction set"),
1391 MISA_EXT_INFO(RVE, "e", "Base integer instruction set (embedded)"),
1392 MISA_EXT_INFO(RVM, "m", "Integer multiplication and division"),
1393 MISA_EXT_INFO(RVS, "s", "Supervisor-level instructions"),
1394 MISA_EXT_INFO(RVU, "u", "User-level instructions"),
1395 MISA_EXT_INFO(RVH, "h", "Hypervisor"),
1396 MISA_EXT_INFO(RVJ, "x-j", "Dynamic translated languages"),
1397 MISA_EXT_INFO(RVV, "v", "Vector operations"),
1398 MISA_EXT_INFO(RVG, "g", "General purpose (IMAFD_Zicsr_Zifencei)"),
1399 MISA_EXT_INFO(RVB, "x-b", "Bit manipulation (Zba_Zbb_Zbs)")
1400};
1401
1402static void riscv_cpu_validate_misa_mxl(RISCVCPUClass *mcc)
1403{
1404 CPUClass *cc = CPU_CLASS(mcc);
1405
1406 /* Validate that MISA_MXL is set properly. */
1407 switch (mcc->misa_mxl_max) {
1408#ifdef TARGET_RISCV64
1409 case MXL_RV64:
1410 case MXL_RV128:
1411 cc->gdb_core_xml_file = "riscv-64bit-cpu.xml";
1412 break;
1413#endif
1414 case MXL_RV32:
1415 cc->gdb_core_xml_file = "riscv-32bit-cpu.xml";
1416 break;
1417 default:
1418 g_assert_not_reached();
1419 }
1420}
1421
1422static int riscv_validate_misa_info_idx(uint32_t bit)
1423{
1424 int idx;
1425
1426 /*
1427 * Our lowest valid input (RVA) is 1 and
1428 * __builtin_ctz() is UB with zero.
1429 */
1430 g_assert(bit != 0);
1431 idx = MISA_INFO_IDX(bit);
1432
1433 g_assert(idx < ARRAY_SIZE(misa_ext_info_arr));
1434 return idx;
1435}
1436
1437const char *riscv_get_misa_ext_name(uint32_t bit)
1438{
1439 int idx = riscv_validate_misa_info_idx(bit);
1440 const char *val = misa_ext_info_arr[idx].name;
1441
1442 g_assert(val != NULL);
1443 return val;
1444}
1445
1446const char *riscv_get_misa_ext_description(uint32_t bit)
1447{
1448 int idx = riscv_validate_misa_info_idx(bit);
1449 const char *val = misa_ext_info_arr[idx].description;
1450
1451 g_assert(val != NULL);
1452 return val;
1453}
1454
1455#define MULTI_EXT_CFG_BOOL(_name, _prop, _defval) \
1456 {.name = _name, .offset = CPU_CFG_OFFSET(_prop), \
1457 .enabled = _defval}
1458
1459const RISCVCPUMultiExtConfig riscv_cpu_extensions[] = {
1460 /* Defaults for standard extensions */
1461 MULTI_EXT_CFG_BOOL("sscofpmf", ext_sscofpmf, false),
1462 MULTI_EXT_CFG_BOOL("zifencei", ext_zifencei, true),
1463 MULTI_EXT_CFG_BOOL("zicsr", ext_zicsr, true),
1464 MULTI_EXT_CFG_BOOL("zihintntl", ext_zihintntl, true),
1465 MULTI_EXT_CFG_BOOL("zihintpause", ext_zihintpause, true),
1466 MULTI_EXT_CFG_BOOL("zacas", ext_zacas, false),
1467 MULTI_EXT_CFG_BOOL("zaamo", ext_zaamo, false),
1468 MULTI_EXT_CFG_BOOL("zalrsc", ext_zalrsc, false),
1469 MULTI_EXT_CFG_BOOL("zawrs", ext_zawrs, true),
1470 MULTI_EXT_CFG_BOOL("zfa", ext_zfa, true),
1471 MULTI_EXT_CFG_BOOL("zfbfmin", ext_zfbfmin, false),
1472 MULTI_EXT_CFG_BOOL("zfh", ext_zfh, false),
1473 MULTI_EXT_CFG_BOOL("zfhmin", ext_zfhmin, false),
1474 MULTI_EXT_CFG_BOOL("zve32f", ext_zve32f, false),
1475 MULTI_EXT_CFG_BOOL("zve64f", ext_zve64f, false),
1476 MULTI_EXT_CFG_BOOL("zve64d", ext_zve64d, false),
1477 MULTI_EXT_CFG_BOOL("zvfbfmin", ext_zvfbfmin, false),
1478 MULTI_EXT_CFG_BOOL("zvfbfwma", ext_zvfbfwma, false),
1479 MULTI_EXT_CFG_BOOL("zvfh", ext_zvfh, false),
1480 MULTI_EXT_CFG_BOOL("zvfhmin", ext_zvfhmin, false),
1481 MULTI_EXT_CFG_BOOL("sstc", ext_sstc, true),
1482
1483 MULTI_EXT_CFG_BOOL("smaia", ext_smaia, false),
1484 MULTI_EXT_CFG_BOOL("smepmp", ext_smepmp, false),
1485 MULTI_EXT_CFG_BOOL("smstateen", ext_smstateen, false),
1486 MULTI_EXT_CFG_BOOL("ssaia", ext_ssaia, false),
1487 MULTI_EXT_CFG_BOOL("svade", ext_svade, false),
1488 MULTI_EXT_CFG_BOOL("svadu", ext_svadu, true),
1489 MULTI_EXT_CFG_BOOL("svinval", ext_svinval, false),
1490 MULTI_EXT_CFG_BOOL("svnapot", ext_svnapot, false),
1491 MULTI_EXT_CFG_BOOL("svpbmt", ext_svpbmt, false),
1492
1493 MULTI_EXT_CFG_BOOL("zicntr", ext_zicntr, true),
1494 MULTI_EXT_CFG_BOOL("zihpm", ext_zihpm, true),
1495
1496 MULTI_EXT_CFG_BOOL("zba", ext_zba, true),
1497 MULTI_EXT_CFG_BOOL("zbb", ext_zbb, true),
1498 MULTI_EXT_CFG_BOOL("zbc", ext_zbc, true),
1499 MULTI_EXT_CFG_BOOL("zbkb", ext_zbkb, false),
1500 MULTI_EXT_CFG_BOOL("zbkc", ext_zbkc, false),
1501 MULTI_EXT_CFG_BOOL("zbkx", ext_zbkx, false),
1502 MULTI_EXT_CFG_BOOL("zbs", ext_zbs, true),
1503 MULTI_EXT_CFG_BOOL("zk", ext_zk, false),
1504 MULTI_EXT_CFG_BOOL("zkn", ext_zkn, false),
1505 MULTI_EXT_CFG_BOOL("zknd", ext_zknd, false),
1506 MULTI_EXT_CFG_BOOL("zkne", ext_zkne, false),
1507 MULTI_EXT_CFG_BOOL("zknh", ext_zknh, false),
1508 MULTI_EXT_CFG_BOOL("zkr", ext_zkr, false),
1509 MULTI_EXT_CFG_BOOL("zks", ext_zks, false),
1510 MULTI_EXT_CFG_BOOL("zksed", ext_zksed, false),
1511 MULTI_EXT_CFG_BOOL("zksh", ext_zksh, false),
1512 MULTI_EXT_CFG_BOOL("zkt", ext_zkt, false),
1513 MULTI_EXT_CFG_BOOL("ztso", ext_ztso, false),
1514
1515 MULTI_EXT_CFG_BOOL("zdinx", ext_zdinx, false),
1516 MULTI_EXT_CFG_BOOL("zfinx", ext_zfinx, false),
1517 MULTI_EXT_CFG_BOOL("zhinx", ext_zhinx, false),
1518 MULTI_EXT_CFG_BOOL("zhinxmin", ext_zhinxmin, false),
1519
1520 MULTI_EXT_CFG_BOOL("zicbom", ext_zicbom, true),
1521 MULTI_EXT_CFG_BOOL("zicbop", ext_zicbop, true),
1522 MULTI_EXT_CFG_BOOL("zicboz", ext_zicboz, true),
1523
1524 MULTI_EXT_CFG_BOOL("zmmul", ext_zmmul, false),
1525
1526 MULTI_EXT_CFG_BOOL("zca", ext_zca, false),
1527 MULTI_EXT_CFG_BOOL("zcb", ext_zcb, false),
1528 MULTI_EXT_CFG_BOOL("zcd", ext_zcd, false),
1529 MULTI_EXT_CFG_BOOL("zce", ext_zce, false),
1530 MULTI_EXT_CFG_BOOL("zcf", ext_zcf, false),
1531 MULTI_EXT_CFG_BOOL("zcmp", ext_zcmp, false),
1532 MULTI_EXT_CFG_BOOL("zcmt", ext_zcmt, false),
1533 MULTI_EXT_CFG_BOOL("zicond", ext_zicond, false),
1534
1535 /* Vector cryptography extensions */
1536 MULTI_EXT_CFG_BOOL("zvbb", ext_zvbb, false),
1537 MULTI_EXT_CFG_BOOL("zvbc", ext_zvbc, false),
1538 MULTI_EXT_CFG_BOOL("zvkb", ext_zvkg, false),
1539 MULTI_EXT_CFG_BOOL("zvkg", ext_zvkg, false),
1540 MULTI_EXT_CFG_BOOL("zvkned", ext_zvkned, false),
1541 MULTI_EXT_CFG_BOOL("zvknha", ext_zvknha, false),
1542 MULTI_EXT_CFG_BOOL("zvknhb", ext_zvknhb, false),
1543 MULTI_EXT_CFG_BOOL("zvksed", ext_zvksed, false),
1544 MULTI_EXT_CFG_BOOL("zvksh", ext_zvksh, false),
1545 MULTI_EXT_CFG_BOOL("zvkt", ext_zvkt, false),
1546 MULTI_EXT_CFG_BOOL("zvkn", ext_zvkn, false),
1547 MULTI_EXT_CFG_BOOL("zvknc", ext_zvknc, false),
1548 MULTI_EXT_CFG_BOOL("zvkng", ext_zvkng, false),
1549 MULTI_EXT_CFG_BOOL("zvks", ext_zvks, false),
1550 MULTI_EXT_CFG_BOOL("zvksc", ext_zvksc, false),
1551 MULTI_EXT_CFG_BOOL("zvksg", ext_zvksg, false),
1552
1553 DEFINE_PROP_END_OF_LIST(),
1554};
1555
1556const RISCVCPUMultiExtConfig riscv_cpu_vendor_exts[] = {
1557 MULTI_EXT_CFG_BOOL("xtheadba", ext_xtheadba, false),
1558 MULTI_EXT_CFG_BOOL("xtheadbb", ext_xtheadbb, false),
1559 MULTI_EXT_CFG_BOOL("xtheadbs", ext_xtheadbs, false),
1560 MULTI_EXT_CFG_BOOL("xtheadcmo", ext_xtheadcmo, false),
1561 MULTI_EXT_CFG_BOOL("xtheadcondmov", ext_xtheadcondmov, false),
1562 MULTI_EXT_CFG_BOOL("xtheadfmemidx", ext_xtheadfmemidx, false),
1563 MULTI_EXT_CFG_BOOL("xtheadfmv", ext_xtheadfmv, false),
1564 MULTI_EXT_CFG_BOOL("xtheadmac", ext_xtheadmac, false),
1565 MULTI_EXT_CFG_BOOL("xtheadmemidx", ext_xtheadmemidx, false),
1566 MULTI_EXT_CFG_BOOL("xtheadmempair", ext_xtheadmempair, false),
1567 MULTI_EXT_CFG_BOOL("xtheadsync", ext_xtheadsync, false),
1568 MULTI_EXT_CFG_BOOL("xventanacondops", ext_XVentanaCondOps, false),
1569
1570 DEFINE_PROP_END_OF_LIST(),
1571};
1572
1573/* These are experimental so mark with 'x-' */
1574const RISCVCPUMultiExtConfig riscv_cpu_experimental_exts[] = {
1575 DEFINE_PROP_END_OF_LIST(),
1576};
1577
1578/*
1579 * 'Named features' is the name we give to extensions that we
1580 * don't want to expose to users. They are either immutable
1581 * (always enabled/disable) or they'll vary depending on
1582 * the resulting CPU state. They have riscv,isa strings
1583 * and priv_ver like regular extensions.
1584 */
1585const RISCVCPUMultiExtConfig riscv_cpu_named_features[] = {
1586 MULTI_EXT_CFG_BOOL("zic64b", ext_zic64b, true),
1587
1588 DEFINE_PROP_END_OF_LIST(),
1589};
1590
1591/* Deprecated entries marked for future removal */
1592const RISCVCPUMultiExtConfig riscv_cpu_deprecated_exts[] = {
1593 MULTI_EXT_CFG_BOOL("Zifencei", ext_zifencei, true),
1594 MULTI_EXT_CFG_BOOL("Zicsr", ext_zicsr, true),
1595 MULTI_EXT_CFG_BOOL("Zihintntl", ext_zihintntl, true),
1596 MULTI_EXT_CFG_BOOL("Zihintpause", ext_zihintpause, true),
1597 MULTI_EXT_CFG_BOOL("Zawrs", ext_zawrs, true),
1598 MULTI_EXT_CFG_BOOL("Zfa", ext_zfa, true),
1599 MULTI_EXT_CFG_BOOL("Zfh", ext_zfh, false),
1600 MULTI_EXT_CFG_BOOL("Zfhmin", ext_zfhmin, false),
1601 MULTI_EXT_CFG_BOOL("Zve32f", ext_zve32f, false),
1602 MULTI_EXT_CFG_BOOL("Zve64f", ext_zve64f, false),
1603 MULTI_EXT_CFG_BOOL("Zve64d", ext_zve64d, false),
1604
1605 DEFINE_PROP_END_OF_LIST(),
1606};
1607
1608static void cpu_set_prop_err(RISCVCPU *cpu, const char *propname,
1609 Error **errp)
1610{
1611 g_autofree char *cpuname = riscv_cpu_get_name(cpu);
1612 error_setg(errp, "CPU '%s' does not allow changing the value of '%s'",
1613 cpuname, propname);
1614}
1615
1616static void prop_pmu_num_set(Object *obj, Visitor *v, const char *name,
1617 void *opaque, Error **errp)
1618{
1619 RISCVCPU *cpu = RISCV_CPU(obj);
1620 uint8_t pmu_num, curr_pmu_num;
1621 uint32_t pmu_mask;
1622
1623 visit_type_uint8(v, name, &pmu_num, errp);
1624
1625 curr_pmu_num = ctpop32(cpu->cfg.pmu_mask);
1626
1627 if (pmu_num != curr_pmu_num && riscv_cpu_is_vendor(obj)) {
1628 cpu_set_prop_err(cpu, name, errp);
1629 error_append_hint(errp, "Current '%s' val: %u\n",
1630 name, curr_pmu_num);
1631 return;
1632 }
1633
1634 if (pmu_num > (RV_MAX_MHPMCOUNTERS - 3)) {
1635 error_setg(errp, "Number of counters exceeds maximum available");
1636 return;
1637 }
1638
1639 if (pmu_num == 0) {
1640 pmu_mask = 0;
1641 } else {
1642 pmu_mask = MAKE_64BIT_MASK(3, pmu_num);
1643 }
1644
1645 warn_report("\"pmu-num\" property is deprecated; use \"pmu-mask\"");
1646 cpu->cfg.pmu_mask = pmu_mask;
1647 cpu_option_add_user_setting("pmu-mask", pmu_mask);
1648}
1649
1650static void prop_pmu_num_get(Object *obj, Visitor *v, const char *name,
1651 void *opaque, Error **errp)
1652{
1653 RISCVCPU *cpu = RISCV_CPU(obj);
1654 uint8_t pmu_num = ctpop32(cpu->cfg.pmu_mask);
1655
1656 visit_type_uint8(v, name, &pmu_num, errp);
1657}
1658
1659static const PropertyInfo prop_pmu_num = {
1660 .name = "pmu-num",
1661 .get = prop_pmu_num_get,
1662 .set = prop_pmu_num_set,
1663};
1664
1665static void prop_pmu_mask_set(Object *obj, Visitor *v, const char *name,
1666 void *opaque, Error **errp)
1667{
1668 RISCVCPU *cpu = RISCV_CPU(obj);
1669 uint32_t value;
1670 uint8_t pmu_num;
1671
1672 visit_type_uint32(v, name, &value, errp);
1673
1674 if (value != cpu->cfg.pmu_mask && riscv_cpu_is_vendor(obj)) {
1675 cpu_set_prop_err(cpu, name, errp);
1676 error_append_hint(errp, "Current '%s' val: %x\n",
1677 name, cpu->cfg.pmu_mask);
1678 return;
1679 }
1680
1681 pmu_num = ctpop32(value);
1682
1683 if (pmu_num > (RV_MAX_MHPMCOUNTERS - 3)) {
1684 error_setg(errp, "Number of counters exceeds maximum available");
1685 return;
1686 }
1687
1688 cpu_option_add_user_setting(name, value);
1689 cpu->cfg.pmu_mask = value;
1690}
1691
1692static void prop_pmu_mask_get(Object *obj, Visitor *v, const char *name,
1693 void *opaque, Error **errp)
1694{
1695 uint8_t pmu_mask = RISCV_CPU(obj)->cfg.pmu_mask;
1696
1697 visit_type_uint8(v, name, &pmu_mask, errp);
1698}
1699
1700static const PropertyInfo prop_pmu_mask = {
1701 .name = "pmu-mask",
1702 .get = prop_pmu_mask_get,
1703 .set = prop_pmu_mask_set,
1704};
1705
1706static void prop_mmu_set(Object *obj, Visitor *v, const char *name,
1707 void *opaque, Error **errp)
1708{
1709 RISCVCPU *cpu = RISCV_CPU(obj);
1710 bool value;
1711
1712 visit_type_bool(v, name, &value, errp);
1713
1714 if (cpu->cfg.mmu != value && riscv_cpu_is_vendor(obj)) {
1715 cpu_set_prop_err(cpu, "mmu", errp);
1716 return;
1717 }
1718
1719 cpu_option_add_user_setting(name, value);
1720 cpu->cfg.mmu = value;
1721}
1722
1723static void prop_mmu_get(Object *obj, Visitor *v, const char *name,
1724 void *opaque, Error **errp)
1725{
1726 bool value = RISCV_CPU(obj)->cfg.mmu;
1727
1728 visit_type_bool(v, name, &value, errp);
1729}
1730
1731static const PropertyInfo prop_mmu = {
1732 .name = "mmu",
1733 .get = prop_mmu_get,
1734 .set = prop_mmu_set,
1735};
1736
1737static void prop_pmp_set(Object *obj, Visitor *v, const char *name,
1738 void *opaque, Error **errp)
1739{
1740 RISCVCPU *cpu = RISCV_CPU(obj);
1741 bool value;
1742
1743 visit_type_bool(v, name, &value, errp);
1744
1745 if (cpu->cfg.pmp != value && riscv_cpu_is_vendor(obj)) {
1746 cpu_set_prop_err(cpu, name, errp);
1747 return;
1748 }
1749
1750 cpu_option_add_user_setting(name, value);
1751 cpu->cfg.pmp = value;
1752}
1753
1754static void prop_pmp_get(Object *obj, Visitor *v, const char *name,
1755 void *opaque, Error **errp)
1756{
1757 bool value = RISCV_CPU(obj)->cfg.pmp;
1758
1759 visit_type_bool(v, name, &value, errp);
1760}
1761
1762static const PropertyInfo prop_pmp = {
1763 .name = "pmp",
1764 .get = prop_pmp_get,
1765 .set = prop_pmp_set,
1766};
1767
1768static int priv_spec_from_str(const char *priv_spec_str)
1769{
1770 int priv_version = -1;
1771
1772 if (!g_strcmp0(priv_spec_str, PRIV_VER_1_12_0_STR)) {
1773 priv_version = PRIV_VERSION_1_12_0;
1774 } else if (!g_strcmp0(priv_spec_str, PRIV_VER_1_11_0_STR)) {
1775 priv_version = PRIV_VERSION_1_11_0;
1776 } else if (!g_strcmp0(priv_spec_str, PRIV_VER_1_10_0_STR)) {
1777 priv_version = PRIV_VERSION_1_10_0;
1778 }
1779
1780 return priv_version;
1781}
1782
1783static const char *priv_spec_to_str(int priv_version)
1784{
1785 switch (priv_version) {
1786 case PRIV_VERSION_1_10_0:
1787 return PRIV_VER_1_10_0_STR;
1788 case PRIV_VERSION_1_11_0:
1789 return PRIV_VER_1_11_0_STR;
1790 case PRIV_VERSION_1_12_0:
1791 return PRIV_VER_1_12_0_STR;
1792 default:
1793 return NULL;
1794 }
1795}
1796
1797static void prop_priv_spec_set(Object *obj, Visitor *v, const char *name,
1798 void *opaque, Error **errp)
1799{
1800 RISCVCPU *cpu = RISCV_CPU(obj);
1801 g_autofree char *value = NULL;
1802 int priv_version = -1;
1803
1804 visit_type_str(v, name, &value, errp);
1805
1806 priv_version = priv_spec_from_str(value);
1807 if (priv_version < 0) {
1808 error_setg(errp, "Unsupported privilege spec version '%s'", value);
1809 return;
1810 }
1811
1812 if (priv_version != cpu->env.priv_ver && riscv_cpu_is_vendor(obj)) {
1813 cpu_set_prop_err(cpu, name, errp);
1814 error_append_hint(errp, "Current '%s' val: %s\n", name,
1815 object_property_get_str(obj, name, NULL));
1816 return;
1817 }
1818
1819 cpu_option_add_user_setting(name, priv_version);
1820 cpu->env.priv_ver = priv_version;
1821}
1822
1823static void prop_priv_spec_get(Object *obj, Visitor *v, const char *name,
1824 void *opaque, Error **errp)
1825{
1826 RISCVCPU *cpu = RISCV_CPU(obj);
1827 const char *value = priv_spec_to_str(cpu->env.priv_ver);
1828
1829 visit_type_str(v, name, (char **)&value, errp);
1830}
1831
1832static const PropertyInfo prop_priv_spec = {
1833 .name = "priv_spec",
1834 .get = prop_priv_spec_get,
1835 .set = prop_priv_spec_set,
1836};
1837
1838static void prop_vext_spec_set(Object *obj, Visitor *v, const char *name,
1839 void *opaque, Error **errp)
1840{
1841 RISCVCPU *cpu = RISCV_CPU(obj);
1842 g_autofree char *value = NULL;
1843
1844 visit_type_str(v, name, &value, errp);
1845
1846 if (g_strcmp0(value, VEXT_VER_1_00_0_STR) != 0) {
1847 error_setg(errp, "Unsupported vector spec version '%s'", value);
1848 return;
1849 }
1850
1851 cpu_option_add_user_setting(name, VEXT_VERSION_1_00_0);
1852 cpu->env.vext_ver = VEXT_VERSION_1_00_0;
1853}
1854
1855static void prop_vext_spec_get(Object *obj, Visitor *v, const char *name,
1856 void *opaque, Error **errp)
1857{
1858 const char *value = VEXT_VER_1_00_0_STR;
1859
1860 visit_type_str(v, name, (char **)&value, errp);
1861}
1862
1863static const PropertyInfo prop_vext_spec = {
1864 .name = "vext_spec",
1865 .get = prop_vext_spec_get,
1866 .set = prop_vext_spec_set,
1867};
1868
1869static void prop_vlen_set(Object *obj, Visitor *v, const char *name,
1870 void *opaque, Error **errp)
1871{
1872 RISCVCPU *cpu = RISCV_CPU(obj);
1873 uint16_t value;
1874
1875 if (!visit_type_uint16(v, name, &value, errp)) {
1876 return;
1877 }
1878
1879 if (!is_power_of_2(value)) {
1880 error_setg(errp, "Vector extension VLEN must be power of 2");
1881 return;
1882 }
1883
1884 if (value != cpu->cfg.vlenb && riscv_cpu_is_vendor(obj)) {
1885 cpu_set_prop_err(cpu, name, errp);
1886 error_append_hint(errp, "Current '%s' val: %u\n",
1887 name, cpu->cfg.vlenb << 3);
1888 return;
1889 }
1890
1891 cpu_option_add_user_setting(name, value);
1892 cpu->cfg.vlenb = value >> 3;
1893}
1894
1895static void prop_vlen_get(Object *obj, Visitor *v, const char *name,
1896 void *opaque, Error **errp)
1897{
1898 uint16_t value = RISCV_CPU(obj)->cfg.vlenb << 3;
1899
1900 visit_type_uint16(v, name, &value, errp);
1901}
1902
1903static const PropertyInfo prop_vlen = {
1904 .name = "vlen",
1905 .get = prop_vlen_get,
1906 .set = prop_vlen_set,
1907};
1908
1909static void prop_elen_set(Object *obj, Visitor *v, const char *name,
1910 void *opaque, Error **errp)
1911{
1912 RISCVCPU *cpu = RISCV_CPU(obj);
1913 uint16_t value;
1914
1915 if (!visit_type_uint16(v, name, &value, errp)) {
1916 return;
1917 }
1918
1919 if (!is_power_of_2(value)) {
1920 error_setg(errp, "Vector extension ELEN must be power of 2");
1921 return;
1922 }
1923
1924 if (value != cpu->cfg.elen && riscv_cpu_is_vendor(obj)) {
1925 cpu_set_prop_err(cpu, name, errp);
1926 error_append_hint(errp, "Current '%s' val: %u\n",
1927 name, cpu->cfg.elen);
1928 return;
1929 }
1930
1931 cpu_option_add_user_setting(name, value);
1932 cpu->cfg.elen = value;
1933}
1934
1935static void prop_elen_get(Object *obj, Visitor *v, const char *name,
1936 void *opaque, Error **errp)
1937{
1938 uint16_t value = RISCV_CPU(obj)->cfg.elen;
1939
1940 visit_type_uint16(v, name, &value, errp);
1941}
1942
1943static const PropertyInfo prop_elen = {
1944 .name = "elen",
1945 .get = prop_elen_get,
1946 .set = prop_elen_set,
1947};
1948
1949static void prop_cbom_blksize_set(Object *obj, Visitor *v, const char *name,
1950 void *opaque, Error **errp)
1951{
1952 RISCVCPU *cpu = RISCV_CPU(obj);
1953 uint16_t value;
1954
1955 if (!visit_type_uint16(v, name, &value, errp)) {
1956 return;
1957 }
1958
1959 if (value != cpu->cfg.cbom_blocksize && riscv_cpu_is_vendor(obj)) {
1960 cpu_set_prop_err(cpu, name, errp);
1961 error_append_hint(errp, "Current '%s' val: %u\n",
1962 name, cpu->cfg.cbom_blocksize);
1963 return;
1964 }
1965
1966 cpu_option_add_user_setting(name, value);
1967 cpu->cfg.cbom_blocksize = value;
1968}
1969
1970static void prop_cbom_blksize_get(Object *obj, Visitor *v, const char *name,
1971 void *opaque, Error **errp)
1972{
1973 uint16_t value = RISCV_CPU(obj)->cfg.cbom_blocksize;
1974
1975 visit_type_uint16(v, name, &value, errp);
1976}
1977
1978static const PropertyInfo prop_cbom_blksize = {
1979 .name = "cbom_blocksize",
1980 .get = prop_cbom_blksize_get,
1981 .set = prop_cbom_blksize_set,
1982};
1983
1984static void prop_cbop_blksize_set(Object *obj, Visitor *v, const char *name,
1985 void *opaque, Error **errp)
1986{
1987 RISCVCPU *cpu = RISCV_CPU(obj);
1988 uint16_t value;
1989
1990 if (!visit_type_uint16(v, name, &value, errp)) {
1991 return;
1992 }
1993
1994 if (value != cpu->cfg.cbop_blocksize && riscv_cpu_is_vendor(obj)) {
1995 cpu_set_prop_err(cpu, name, errp);
1996 error_append_hint(errp, "Current '%s' val: %u\n",
1997 name, cpu->cfg.cbop_blocksize);
1998 return;
1999 }
2000
2001 cpu_option_add_user_setting(name, value);
2002 cpu->cfg.cbop_blocksize = value;
2003}
2004
2005static void prop_cbop_blksize_get(Object *obj, Visitor *v, const char *name,
2006 void *opaque, Error **errp)
2007{
2008 uint16_t value = RISCV_CPU(obj)->cfg.cbop_blocksize;
2009
2010 visit_type_uint16(v, name, &value, errp);
2011}
2012
2013static const PropertyInfo prop_cbop_blksize = {
2014 .name = "cbop_blocksize",
2015 .get = prop_cbop_blksize_get,
2016 .set = prop_cbop_blksize_set,
2017};
2018
2019static void prop_cboz_blksize_set(Object *obj, Visitor *v, const char *name,
2020 void *opaque, Error **errp)
2021{
2022 RISCVCPU *cpu = RISCV_CPU(obj);
2023 uint16_t value;
2024
2025 if (!visit_type_uint16(v, name, &value, errp)) {
2026 return;
2027 }
2028
2029 if (value != cpu->cfg.cboz_blocksize && riscv_cpu_is_vendor(obj)) {
2030 cpu_set_prop_err(cpu, name, errp);
2031 error_append_hint(errp, "Current '%s' val: %u\n",
2032 name, cpu->cfg.cboz_blocksize);
2033 return;
2034 }
2035
2036 cpu_option_add_user_setting(name, value);
2037 cpu->cfg.cboz_blocksize = value;
2038}
2039
2040static void prop_cboz_blksize_get(Object *obj, Visitor *v, const char *name,
2041 void *opaque, Error **errp)
2042{
2043 uint16_t value = RISCV_CPU(obj)->cfg.cboz_blocksize;
2044
2045 visit_type_uint16(v, name, &value, errp);
2046}
2047
2048static const PropertyInfo prop_cboz_blksize = {
2049 .name = "cboz_blocksize",
2050 .get = prop_cboz_blksize_get,
2051 .set = prop_cboz_blksize_set,
2052};
2053
2054static void prop_mvendorid_set(Object *obj, Visitor *v, const char *name,
2055 void *opaque, Error **errp)
2056{
2057 bool dynamic_cpu = riscv_cpu_is_dynamic(obj);
2058 RISCVCPU *cpu = RISCV_CPU(obj);
2059 uint32_t prev_val = cpu->cfg.mvendorid;
2060 uint32_t value;
2061
2062 if (!visit_type_uint32(v, name, &value, errp)) {
2063 return;
2064 }
2065
2066 if (!dynamic_cpu && prev_val != value) {
2067 error_setg(errp, "Unable to change %s mvendorid (0x%x)",
2068 object_get_typename(obj), prev_val);
2069 return;
2070 }
2071
2072 cpu->cfg.mvendorid = value;
2073}
2074
2075static void prop_mvendorid_get(Object *obj, Visitor *v, const char *name,
2076 void *opaque, Error **errp)
2077{
2078 uint32_t value = RISCV_CPU(obj)->cfg.mvendorid;
2079
2080 visit_type_uint32(v, name, &value, errp);
2081}
2082
2083static const PropertyInfo prop_mvendorid = {
2084 .name = "mvendorid",
2085 .get = prop_mvendorid_get,
2086 .set = prop_mvendorid_set,
2087};
2088
2089static void prop_mimpid_set(Object *obj, Visitor *v, const char *name,
2090 void *opaque, Error **errp)
2091{
2092 bool dynamic_cpu = riscv_cpu_is_dynamic(obj);
2093 RISCVCPU *cpu = RISCV_CPU(obj);
2094 uint64_t prev_val = cpu->cfg.mimpid;
2095 uint64_t value;
2096
2097 if (!visit_type_uint64(v, name, &value, errp)) {
2098 return;
2099 }
2100
2101 if (!dynamic_cpu && prev_val != value) {
2102 error_setg(errp, "Unable to change %s mimpid (0x%" PRIu64 ")",
2103 object_get_typename(obj), prev_val);
2104 return;
2105 }
2106
2107 cpu->cfg.mimpid = value;
2108}
2109
2110static void prop_mimpid_get(Object *obj, Visitor *v, const char *name,
2111 void *opaque, Error **errp)
2112{
2113 uint64_t value = RISCV_CPU(obj)->cfg.mimpid;
2114
2115 visit_type_uint64(v, name, &value, errp);
2116}
2117
2118static const PropertyInfo prop_mimpid = {
2119 .name = "mimpid",
2120 .get = prop_mimpid_get,
2121 .set = prop_mimpid_set,
2122};
2123
2124static void prop_marchid_set(Object *obj, Visitor *v, const char *name,
2125 void *opaque, Error **errp)
2126{
2127 bool dynamic_cpu = riscv_cpu_is_dynamic(obj);
2128 RISCVCPU *cpu = RISCV_CPU(obj);
2129 uint64_t prev_val = cpu->cfg.marchid;
2130 uint64_t value, invalid_val;
2131 uint32_t mxlen = 0;
2132
2133 if (!visit_type_uint64(v, name, &value, errp)) {
2134 return;
2135 }
2136
2137 if (!dynamic_cpu && prev_val != value) {
2138 error_setg(errp, "Unable to change %s marchid (0x%" PRIu64 ")",
2139 object_get_typename(obj), prev_val);
2140 return;
2141 }
2142
2143 switch (riscv_cpu_mxl(&cpu->env)) {
2144 case MXL_RV32:
2145 mxlen = 32;
2146 break;
2147 case MXL_RV64:
2148 case MXL_RV128:
2149 mxlen = 64;
2150 break;
2151 default:
2152 g_assert_not_reached();
2153 }
2154
2155 invalid_val = 1LL << (mxlen - 1);
2156
2157 if (value == invalid_val) {
2158 error_setg(errp, "Unable to set marchid with MSB (%u) bit set "
2159 "and the remaining bits zero", mxlen);
2160 return;
2161 }
2162
2163 cpu->cfg.marchid = value;
2164}
2165
2166static void prop_marchid_get(Object *obj, Visitor *v, const char *name,
2167 void *opaque, Error **errp)
2168{
2169 uint64_t value = RISCV_CPU(obj)->cfg.marchid;
2170
2171 visit_type_uint64(v, name, &value, errp);
2172}
2173
2174static const PropertyInfo prop_marchid = {
2175 .name = "marchid",
2176 .get = prop_marchid_get,
2177 .set = prop_marchid_set,
2178};
2179
2180/*
2181 * RVA22U64 defines some 'named features' that are cache
2182 * related: Za64rs, Zic64b, Ziccif, Ziccrse, Ziccamoa
2183 * and Zicclsm. They are always implemented in TCG and
2184 * doesn't need to be manually enabled by the profile.
2185 */
2186static RISCVCPUProfile RVA22U64 = {
2187 .parent = NULL,
2188 .name = "rva22u64",
2189 .misa_ext = RVI | RVM | RVA | RVF | RVD | RVC | RVU,
2190 .priv_spec = RISCV_PROFILE_ATTR_UNUSED,
2191 .satp_mode = RISCV_PROFILE_ATTR_UNUSED,
2192 .ext_offsets = {
2193 CPU_CFG_OFFSET(ext_zicsr), CPU_CFG_OFFSET(ext_zihintpause),
2194 CPU_CFG_OFFSET(ext_zba), CPU_CFG_OFFSET(ext_zbb),
2195 CPU_CFG_OFFSET(ext_zbs), CPU_CFG_OFFSET(ext_zfhmin),
2196 CPU_CFG_OFFSET(ext_zkt), CPU_CFG_OFFSET(ext_zicntr),
2197 CPU_CFG_OFFSET(ext_zihpm), CPU_CFG_OFFSET(ext_zicbom),
2198 CPU_CFG_OFFSET(ext_zicbop), CPU_CFG_OFFSET(ext_zicboz),
2199
2200 /* mandatory named features for this profile */
2201 CPU_CFG_OFFSET(ext_zic64b),
2202
2203 RISCV_PROFILE_EXT_LIST_END
2204 }
2205};
2206
2207/*
2208 * As with RVA22U64, RVA22S64 also defines 'named features'.
2209 *
2210 * Cache related features that we consider enabled since we don't
2211 * implement cache: Ssccptr
2212 *
2213 * Other named features that we already implement: Sstvecd, Sstvala,
2214 * Sscounterenw
2215 *
2216 * The remaining features/extensions comes from RVA22U64.
2217 */
2218static RISCVCPUProfile RVA22S64 = {
2219 .parent = &RVA22U64,
2220 .name = "rva22s64",
2221 .misa_ext = RVS,
2222 .priv_spec = PRIV_VERSION_1_12_0,
2223 .satp_mode = VM_1_10_SV39,
2224 .ext_offsets = {
2225 /* rva22s64 exts */
2226 CPU_CFG_OFFSET(ext_zifencei), CPU_CFG_OFFSET(ext_svpbmt),
2227 CPU_CFG_OFFSET(ext_svinval), CPU_CFG_OFFSET(ext_svade),
2228
2229 RISCV_PROFILE_EXT_LIST_END
2230 }
2231};
2232
2233RISCVCPUProfile *riscv_profiles[] = {
2234 &RVA22U64,
2235 &RVA22S64,
2236 NULL,
2237};
2238
2239static Property riscv_cpu_properties[] = {
2240 DEFINE_PROP_BOOL("debug", RISCVCPU, cfg.debug, true),
2241
2242 {.name = "pmu-mask", .info = &prop_pmu_mask},
2243 {.name = "pmu-num", .info = &prop_pmu_num}, /* Deprecated */
2244
2245 {.name = "mmu", .info = &prop_mmu},
2246 {.name = "pmp", .info = &prop_pmp},
2247
2248 {.name = "priv_spec", .info = &prop_priv_spec},
2249 {.name = "vext_spec", .info = &prop_vext_spec},
2250
2251 {.name = "vlen", .info = &prop_vlen},
2252 {.name = "elen", .info = &prop_elen},
2253
2254 {.name = "cbom_blocksize", .info = &prop_cbom_blksize},
2255 {.name = "cbop_blocksize", .info = &prop_cbop_blksize},
2256 {.name = "cboz_blocksize", .info = &prop_cboz_blksize},
2257
2258 {.name = "mvendorid", .info = &prop_mvendorid},
2259 {.name = "mimpid", .info = &prop_mimpid},
2260 {.name = "marchid", .info = &prop_marchid},
2261
2262#ifndef CONFIG_USER_ONLY
2263 DEFINE_PROP_UINT64("resetvec", RISCVCPU, env.resetvec, DEFAULT_RSTVEC),
2264#endif
2265
2266 DEFINE_PROP_BOOL("short-isa-string", RISCVCPU, cfg.short_isa_string, false),
2267
2268 DEFINE_PROP_BOOL("rvv_ta_all_1s", RISCVCPU, cfg.rvv_ta_all_1s, false),
2269 DEFINE_PROP_BOOL("rvv_ma_all_1s", RISCVCPU, cfg.rvv_ma_all_1s, false),
2270
2271 /*
2272 * write_misa() is marked as experimental for now so mark
2273 * it with -x and default to 'false'.
2274 */
2275 DEFINE_PROP_BOOL("x-misa-w", RISCVCPU, cfg.misa_w, false),
2276 DEFINE_PROP_END_OF_LIST(),
2277};
2278
2279#if defined(TARGET_RISCV64)
2280static void rva22u64_profile_cpu_init(Object *obj)
2281{
2282 rv64i_bare_cpu_init(obj);
2283
2284 RVA22U64.enabled = true;
2285}
2286
2287static void rva22s64_profile_cpu_init(Object *obj)
2288{
2289 rv64i_bare_cpu_init(obj);
2290
2291 RVA22S64.enabled = true;
2292}
2293#endif
2294
2295static const gchar *riscv_gdb_arch_name(CPUState *cs)
2296{
2297 RISCVCPU *cpu = RISCV_CPU(cs);
2298 CPURISCVState *env = &cpu->env;
2299
2300 switch (riscv_cpu_mxl(env)) {
2301 case MXL_RV32:
2302 return "riscv:rv32";
2303 case MXL_RV64:
2304 case MXL_RV128:
2305 return "riscv:rv64";
2306 default:
2307 g_assert_not_reached();
2308 }
2309}
2310
2311#ifndef CONFIG_USER_ONLY
2312static int64_t riscv_get_arch_id(CPUState *cs)
2313{
2314 RISCVCPU *cpu = RISCV_CPU(cs);
2315
2316 return cpu->env.mhartid;
2317}
2318
2319#include "hw/core/sysemu-cpu-ops.h"
2320
2321static const struct SysemuCPUOps riscv_sysemu_ops = {
2322 .get_phys_page_debug = riscv_cpu_get_phys_page_debug,
2323 .write_elf64_note = riscv_cpu_write_elf64_note,
2324 .write_elf32_note = riscv_cpu_write_elf32_note,
2325 .legacy_vmsd = &vmstate_riscv_cpu,
2326};
2327#endif
2328
2329static void riscv_cpu_common_class_init(ObjectClass *c, void *data)
2330{
2331 RISCVCPUClass *mcc = RISCV_CPU_CLASS(c);
2332 CPUClass *cc = CPU_CLASS(c);
2333 DeviceClass *dc = DEVICE_CLASS(c);
2334 ResettableClass *rc = RESETTABLE_CLASS(c);
2335
2336 device_class_set_parent_realize(dc, riscv_cpu_realize,
2337 &mcc->parent_realize);
2338
2339 resettable_class_set_parent_phases(rc, NULL, riscv_cpu_reset_hold, NULL,
2340 &mcc->parent_phases);
2341
2342 cc->class_by_name = riscv_cpu_class_by_name;
2343 cc->has_work = riscv_cpu_has_work;
2344 cc->mmu_index = riscv_cpu_mmu_index;
2345 cc->dump_state = riscv_cpu_dump_state;
2346 cc->set_pc = riscv_cpu_set_pc;
2347 cc->get_pc = riscv_cpu_get_pc;
2348 cc->gdb_read_register = riscv_cpu_gdb_read_register;
2349 cc->gdb_write_register = riscv_cpu_gdb_write_register;
2350 cc->gdb_stop_before_watchpoint = true;
2351 cc->disas_set_info = riscv_cpu_disas_set_info;
2352#ifndef CONFIG_USER_ONLY
2353 cc->sysemu_ops = &riscv_sysemu_ops;
2354 cc->get_arch_id = riscv_get_arch_id;
2355#endif
2356 cc->gdb_arch_name = riscv_gdb_arch_name;
2357
2358 device_class_set_props(dc, riscv_cpu_properties);
2359}
2360
2361static void riscv_cpu_class_init(ObjectClass *c, void *data)
2362{
2363 RISCVCPUClass *mcc = RISCV_CPU_CLASS(c);
2364
2365 mcc->misa_mxl_max = (uint32_t)(uintptr_t)data;
2366 riscv_cpu_validate_misa_mxl(mcc);
2367}
2368
2369static void riscv_isa_string_ext(RISCVCPU *cpu, char **isa_str,
2370 int max_str_len)
2371{
2372 const RISCVIsaExtData *edata;
2373 char *old = *isa_str;
2374 char *new = *isa_str;
2375
2376 for (edata = isa_edata_arr; edata && edata->name; edata++) {
2377 if (isa_ext_is_enabled(cpu, edata->ext_enable_offset)) {
2378 new = g_strconcat(old, "_", edata->name, NULL);
2379 g_free(old);
2380 old = new;
2381 }
2382 }
2383
2384 *isa_str = new;
2385}
2386
2387char *riscv_isa_string(RISCVCPU *cpu)
2388{
2389 RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cpu);
2390 int i;
2391 const size_t maxlen = sizeof("rv128") + sizeof(riscv_single_letter_exts);
2392 char *isa_str = g_new(char, maxlen);
2393 int xlen = riscv_cpu_max_xlen(mcc);
2394 char *p = isa_str + snprintf(isa_str, maxlen, "rv%d", xlen);
2395
2396 for (i = 0; i < sizeof(riscv_single_letter_exts) - 1; i++) {
2397 if (cpu->env.misa_ext & RV(riscv_single_letter_exts[i])) {
2398 *p++ = qemu_tolower(riscv_single_letter_exts[i]);
2399 }
2400 }
2401 *p = '\0';
2402 if (!cpu->cfg.short_isa_string) {
2403 riscv_isa_string_ext(cpu, &isa_str, maxlen);
2404 }
2405 return isa_str;
2406}
2407
2408#ifndef CONFIG_USER_ONLY
2409static char **riscv_isa_extensions_list(RISCVCPU *cpu, int *count)
2410{
2411 int maxlen = ARRAY_SIZE(riscv_single_letter_exts) + ARRAY_SIZE(isa_edata_arr);
2412 char **extensions = g_new(char *, maxlen);
2413
2414 for (int i = 0; i < sizeof(riscv_single_letter_exts) - 1; i++) {
2415 if (cpu->env.misa_ext & RV(riscv_single_letter_exts[i])) {
2416 extensions[*count] = g_new(char, 2);
2417 snprintf(extensions[*count], 2, "%c",
2418 qemu_tolower(riscv_single_letter_exts[i]));
2419 (*count)++;
2420 }
2421 }
2422
2423 for (const RISCVIsaExtData *edata = isa_edata_arr; edata->name; edata++) {
2424 if (isa_ext_is_enabled(cpu, edata->ext_enable_offset)) {
2425 extensions[*count] = g_strdup(edata->name);
2426 (*count)++;
2427 }
2428 }
2429
2430 return extensions;
2431}
2432
2433void riscv_isa_write_fdt(RISCVCPU *cpu, void *fdt, char *nodename)
2434{
2435 RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cpu);
2436 const size_t maxlen = sizeof("rv128i");
2437 g_autofree char *isa_base = g_new(char, maxlen);
2438 g_autofree char *riscv_isa;
2439 char **isa_extensions;
2440 int count = 0;
2441 int xlen = riscv_cpu_max_xlen(mcc);
2442
2443 riscv_isa = riscv_isa_string(cpu);
2444 qemu_fdt_setprop_string(fdt, nodename, "riscv,isa", riscv_isa);
2445
2446 snprintf(isa_base, maxlen, "rv%di", xlen);
2447 qemu_fdt_setprop_string(fdt, nodename, "riscv,isa-base", isa_base);
2448
2449 isa_extensions = riscv_isa_extensions_list(cpu, &count);
2450 qemu_fdt_setprop_string_array(fdt, nodename, "riscv,isa-extensions",
2451 isa_extensions, count);
2452
2453 for (int i = 0; i < count; i++) {
2454 g_free(isa_extensions[i]);
2455 }
2456
2457 g_free(isa_extensions);
2458}
2459#endif
2460
2461#define DEFINE_CPU(type_name, misa_mxl_max, initfn) \
2462 { \
2463 .name = (type_name), \
2464 .parent = TYPE_RISCV_CPU, \
2465 .instance_init = (initfn), \
2466 .class_init = riscv_cpu_class_init, \
2467 .class_data = (void *)(misa_mxl_max) \
2468 }
2469
2470#define DEFINE_DYNAMIC_CPU(type_name, misa_mxl_max, initfn) \
2471 { \
2472 .name = (type_name), \
2473 .parent = TYPE_RISCV_DYNAMIC_CPU, \
2474 .instance_init = (initfn), \
2475 .class_init = riscv_cpu_class_init, \
2476 .class_data = (void *)(misa_mxl_max) \
2477 }
2478
2479#define DEFINE_VENDOR_CPU(type_name, misa_mxl_max, initfn) \
2480 { \
2481 .name = (type_name), \
2482 .parent = TYPE_RISCV_VENDOR_CPU, \
2483 .instance_init = (initfn), \
2484 .class_init = riscv_cpu_class_init, \
2485 .class_data = (void *)(misa_mxl_max) \
2486 }
2487
2488#define DEFINE_BARE_CPU(type_name, misa_mxl_max, initfn) \
2489 { \
2490 .name = (type_name), \
2491 .parent = TYPE_RISCV_BARE_CPU, \
2492 .instance_init = (initfn), \
2493 .class_init = riscv_cpu_class_init, \
2494 .class_data = (void *)(misa_mxl_max) \
2495 }
2496
2497#define DEFINE_PROFILE_CPU(type_name, misa_mxl_max, initfn) \
2498 { \
2499 .name = (type_name), \
2500 .parent = TYPE_RISCV_BARE_CPU, \
2501 .instance_init = (initfn), \
2502 .class_init = riscv_cpu_class_init, \
2503 .class_data = (void *)(misa_mxl_max) \
2504 }
2505
2506static const TypeInfo riscv_cpu_type_infos[] = {
2507 {
2508 .name = TYPE_RISCV_CPU,
2509 .parent = TYPE_CPU,
2510 .instance_size = sizeof(RISCVCPU),
2511 .instance_align = __alignof(RISCVCPU),
2512 .instance_init = riscv_cpu_init,
2513 .instance_post_init = riscv_cpu_post_init,
2514 .abstract = true,
2515 .class_size = sizeof(RISCVCPUClass),
2516 .class_init = riscv_cpu_common_class_init,
2517 },
2518 {
2519 .name = TYPE_RISCV_DYNAMIC_CPU,
2520 .parent = TYPE_RISCV_CPU,
2521 .abstract = true,
2522 },
2523 {
2524 .name = TYPE_RISCV_VENDOR_CPU,
2525 .parent = TYPE_RISCV_CPU,
2526 .abstract = true,
2527 },
2528 {
2529 .name = TYPE_RISCV_BARE_CPU,
2530 .parent = TYPE_RISCV_CPU,
2531 .instance_init = riscv_bare_cpu_init,
2532 .abstract = true,
2533 },
2534#if defined(TARGET_RISCV32)
2535 DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_ANY, MXL_RV32, riscv_any_cpu_init),
2536 DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_MAX, MXL_RV32, riscv_max_cpu_init),
2537 DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE32, MXL_RV32, rv32_base_cpu_init),
2538 DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_IBEX, MXL_RV32, rv32_ibex_cpu_init),
2539 DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_SIFIVE_E31, MXL_RV32, rv32_sifive_e_cpu_init),
2540 DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_SIFIVE_E34, MXL_RV32, rv32_imafcu_nommu_cpu_init),
2541 DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_SIFIVE_U34, MXL_RV32, rv32_sifive_u_cpu_init),
2542 DEFINE_BARE_CPU(TYPE_RISCV_CPU_RV32I, MXL_RV32, rv32i_bare_cpu_init),
2543 DEFINE_BARE_CPU(TYPE_RISCV_CPU_RV32E, MXL_RV32, rv32e_bare_cpu_init),
2544#elif defined(TARGET_RISCV64)
2545 DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_ANY, MXL_RV64, riscv_any_cpu_init),
2546 DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_MAX, MXL_RV64, riscv_max_cpu_init),
2547 DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE64, MXL_RV64, rv64_base_cpu_init),
2548 DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_SIFIVE_E51, MXL_RV64, rv64_sifive_e_cpu_init),
2549 DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_SIFIVE_U54, MXL_RV64, rv64_sifive_u_cpu_init),
2550 DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_SHAKTI_C, MXL_RV64, rv64_sifive_u_cpu_init),
2551 DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_THEAD_C906, MXL_RV64, rv64_thead_c906_cpu_init),
2552 DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_VEYRON_V1, MXL_RV64, rv64_veyron_v1_cpu_init),
2553 DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE128, MXL_RV128, rv128_base_cpu_init),
2554 DEFINE_BARE_CPU(TYPE_RISCV_CPU_RV64I, MXL_RV64, rv64i_bare_cpu_init),
2555 DEFINE_BARE_CPU(TYPE_RISCV_CPU_RV64E, MXL_RV64, rv64e_bare_cpu_init),
2556 DEFINE_PROFILE_CPU(TYPE_RISCV_CPU_RVA22U64, MXL_RV64, rva22u64_profile_cpu_init),
2557 DEFINE_PROFILE_CPU(TYPE_RISCV_CPU_RVA22S64, MXL_RV64, rva22s64_profile_cpu_init),
2558#endif
2559};
2560
2561DEFINE_TYPES(riscv_cpu_type_infos)