]> Git Repo - qemu.git/blame - target/riscv/cpu.h
target/riscv: Split out the vill from vtype
[qemu.git] / target / riscv / cpu.h
CommitLineData
dc5bd18f
MC
1/*
2 * QEMU RISC-V CPU
3 *
4 * Copyright (c) 2016-2017 Sagar Karandikar, [email protected]
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#ifndef RISCV_CPU_H
21#define RISCV_CPU_H
22
2e5b09fd 23#include "hw/core/cpu.h"
2b7168fc 24#include "hw/registerfields.h"
dc5bd18f 25#include "exec/cpu-defs.h"
135b03cb 26#include "fpu/softfloat-types.h"
db1015e9 27#include "qom/object.h"
961738ff 28#include "qemu/int128.h"
e91a7227 29#include "cpu_bits.h"
dc5bd18f 30
74433bf0
RH
31#define TCG_GUEST_DEFAULT_MO 0
32
dc5bd18f
MC
33#define TYPE_RISCV_CPU "riscv-cpu"
34
35#define RISCV_CPU_TYPE_SUFFIX "-" TYPE_RISCV_CPU
36#define RISCV_CPU_TYPE_NAME(name) (name RISCV_CPU_TYPE_SUFFIX)
0dacec87 37#define CPU_RESOLVING_TYPE TYPE_RISCV_CPU
dc5bd18f
MC
38
39#define TYPE_RISCV_CPU_ANY RISCV_CPU_TYPE_NAME("any")
8903bf6e
AF
40#define TYPE_RISCV_CPU_BASE32 RISCV_CPU_TYPE_NAME("rv32")
41#define TYPE_RISCV_CPU_BASE64 RISCV_CPU_TYPE_NAME("rv64")
332dab68 42#define TYPE_RISCV_CPU_BASE128 RISCV_CPU_TYPE_NAME("x-rv128")
36b80ad9 43#define TYPE_RISCV_CPU_IBEX RISCV_CPU_TYPE_NAME("lowrisc-ibex")
6ddc7069 44#define TYPE_RISCV_CPU_SHAKTI_C RISCV_CPU_TYPE_NAME("shakti-c")
dc5bd18f 45#define TYPE_RISCV_CPU_SIFIVE_E31 RISCV_CPU_TYPE_NAME("sifive-e31")
d784733b 46#define TYPE_RISCV_CPU_SIFIVE_E34 RISCV_CPU_TYPE_NAME("sifive-e34")
dc5bd18f
MC
47#define TYPE_RISCV_CPU_SIFIVE_E51 RISCV_CPU_TYPE_NAME("sifive-e51")
48#define TYPE_RISCV_CPU_SIFIVE_U34 RISCV_CPU_TYPE_NAME("sifive-u34")
49#define TYPE_RISCV_CPU_SIFIVE_U54 RISCV_CPU_TYPE_NAME("sifive-u54")
10f1ca27 50#define TYPE_RISCV_CPU_HOST RISCV_CPU_TYPE_NAME("host")
dc5bd18f 51
c0a635f3
AF
52#if defined(TARGET_RISCV32)
53# define TYPE_RISCV_CPU_BASE TYPE_RISCV_CPU_BASE32
54#elif defined(TARGET_RISCV64)
55# define TYPE_RISCV_CPU_BASE TYPE_RISCV_CPU_BASE64
56#endif
57
dc5bd18f
MC
58#define RV(x) ((target_ulong)1 << (x - 'A'))
59
60#define RVI RV('I')
79f86934 61#define RVE RV('E') /* E and I are mutually exclusive */
dc5bd18f
MC
62#define RVM RV('M')
63#define RVA RV('A')
64#define RVF RV('F')
65#define RVD RV('D')
ad9e5aa2 66#define RVV RV('V')
dc5bd18f
MC
67#define RVC RV('C')
68#define RVS RV('S')
69#define RVU RV('U')
af1fa003 70#define RVH RV('H')
53dcea58 71#define RVJ RV('J')
dc5bd18f
MC
72
73/* S extension denotes that Supervisor mode exists, however it is possible
74 to have a core that support S mode but does not have an MMU and there
75 is currently no bit in misa to indicate whether an MMU exists or not
a88365c1 76 so a cpu features bitfield is required, likewise for optional PMP support */
dc5bd18f 77enum {
a88365c1 78 RISCV_FEATURE_MMU,
f18637cd 79 RISCV_FEATURE_PMP,
4a345b2a 80 RISCV_FEATURE_EPMP,
f18637cd 81 RISCV_FEATURE_MISA
dc5bd18f
MC
82};
83
dc5bd18f 84#define PRIV_VERSION_1_10_0 0x00011000
6729dbbd 85#define PRIV_VERSION_1_11_0 0x00011100
dc5bd18f 86
9ec6622d 87#define VEXT_VERSION_1_00_0 0x00010000
32931383 88
33a9a57d
YJ
89enum {
90 TRANSLATE_SUCCESS,
91 TRANSLATE_FAIL,
92 TRANSLATE_PMP_FAIL,
93 TRANSLATE_G_STAGE_FAIL
94};
95
dc5bd18f
MC
96#define MMU_USER_IDX 3
97
98#define MAX_RISCV_PMPS (16)
99
100typedef struct CPURISCVState CPURISCVState;
101
bbf3d1b4 102#if !defined(CONFIG_USER_ONLY)
dc5bd18f 103#include "pmp.h"
bbf3d1b4 104#endif
dc5bd18f 105
8a4b5257 106#define RV_VLEN_MAX 1024
ad9e5aa2 107
33f1beaf
FC
108FIELD(VTYPE, VLMUL, 0, 3)
109FIELD(VTYPE, VSEW, 3, 3)
3479a814
FC
110FIELD(VTYPE, VTA, 6, 1)
111FIELD(VTYPE, VMA, 7, 1)
33f1beaf
FC
112FIELD(VTYPE, VEDIV, 8, 2)
113FIELD(VTYPE, RESERVED, 10, sizeof(target_ulong) * 8 - 11)
fbcbafa2 114FIELD(VTYPE, VILL, sizeof(target_ulong) * 8 - 1, 1)
2b7168fc 115
dc5bd18f
MC
116struct CPURISCVState {
117 target_ulong gpr[32];
2b547084 118 target_ulong gprh[32]; /* 64 top bits of the 128-bit registers */
dc5bd18f 119 uint64_t fpr[32]; /* assume both F and D extensions */
ad9e5aa2
LZ
120
121 /* vector coprocessor state. */
122 uint64_t vreg[32 * RV_VLEN_MAX / 64] QEMU_ALIGNED(16);
123 target_ulong vxrm;
124 target_ulong vxsat;
125 target_ulong vl;
126 target_ulong vstart;
127 target_ulong vtype;
d96a271a 128 bool vill;
ad9e5aa2 129
dc5bd18f
MC
130 target_ulong pc;
131 target_ulong load_res;
132 target_ulong load_val;
133
134 target_ulong frm;
135
136 target_ulong badaddr;
48eaeb56
AF
137 uint32_t bins;
138
36a18664 139 target_ulong guest_phys_fault_addr;
dc5bd18f 140
dc5bd18f 141 target_ulong priv_ver;
d2c1a177 142 target_ulong bext_ver;
32931383 143 target_ulong vext_ver;
e91a7227
RH
144
145 /* RISCVMXL, but uint32_t for vmstate migration */
146 uint32_t misa_mxl; /* current mxl */
147 uint32_t misa_mxl_max; /* max mxl for this cpu */
148 uint32_t misa_ext; /* current extensions */
149 uint32_t misa_ext_mask; /* max ext for this cpu */
440544e1 150 uint32_t xl; /* current xlen */
dc5bd18f 151
b3a5d1fb
FP
152 /* 128-bit helpers upper part return value */
153 target_ulong retxh;
154
dc5bd18f
MC
155 uint32_t features;
156
5836c3ec
KC
157#ifdef CONFIG_USER_ONLY
158 uint32_t elf_flags;
159#endif
160
dc5bd18f
MC
161#ifndef CONFIG_USER_ONLY
162 target_ulong priv;
ef6bb7b6
AF
163 /* This contains QEMU specific information about the virt state. */
164 target_ulong virt;
dc5bd18f
MC
165 target_ulong resetvec;
166
167 target_ulong mhartid;
284d697c
YJ
168 /*
169 * For RV32 this is 32-bit mstatus and 32-bit mstatush.
170 * For RV64 this is a 64-bit mstatus.
171 */
172 uint64_t mstatus;
85ba724f 173
02861613 174 target_ulong mip;
66e594f2 175
e3e7039c 176 uint32_t miclaim;
85ba724f 177
dc5bd18f
MC
178 target_ulong mie;
179 target_ulong mideleg;
180
dc5bd18f 181 target_ulong satp; /* since: priv-1.10.0 */
ac12b601 182 target_ulong stval;
dc5bd18f
MC
183 target_ulong medeleg;
184
185 target_ulong stvec;
186 target_ulong sepc;
187 target_ulong scause;
188
189 target_ulong mtvec;
190 target_ulong mepc;
191 target_ulong mcause;
192 target_ulong mtval; /* since: priv-1.10.0 */
193
bd023ce3
AF
194 /* Hypervisor CSRs */
195 target_ulong hstatus;
196 target_ulong hedeleg;
197 target_ulong hideleg;
198 target_ulong hcounteren;
199 target_ulong htval;
200 target_ulong htinst;
201 target_ulong hgatp;
c6957248 202 uint64_t htimedelta;
bd023ce3 203
2c64ab66
FP
204 /* Upper 64-bits of 128-bit CSRs */
205 uint64_t mscratchh;
206 uint64_t sscratchh;
207
bd023ce3 208 /* Virtual CSRs */
284d697c
YJ
209 /*
210 * For RV32 this is 32-bit vsstatus and 32-bit vsstatush.
211 * For RV64 this is a 64-bit vsstatus.
212 */
213 uint64_t vsstatus;
bd023ce3
AF
214 target_ulong vstvec;
215 target_ulong vsscratch;
216 target_ulong vsepc;
217 target_ulong vscause;
218 target_ulong vstval;
219 target_ulong vsatp;
220
221 target_ulong mtval2;
222 target_ulong mtinst;
223
66e594f2
AF
224 /* HS Backup CSRs */
225 target_ulong stvec_hs;
226 target_ulong sscratch_hs;
227 target_ulong sepc_hs;
228 target_ulong scause_hs;
229 target_ulong stval_hs;
230 target_ulong satp_hs;
284d697c 231 uint64_t mstatus_hs;
66e594f2 232
ec352d0c
GK
233 /* Signals whether the current exception occurred with two-stage address
234 translation active. */
235 bool two_stage_lookup;
236
8c59f5c1
MC
237 target_ulong scounteren;
238 target_ulong mcounteren;
dc5bd18f
MC
239
240 target_ulong sscratch;
241 target_ulong mscratch;
242
243 /* temporary htif regs */
244 uint64_t mfromhost;
245 uint64_t mtohost;
246 uint64_t timecmp;
247
248 /* physical memory protection */
249 pmp_table_t pmp_state;
2582a95c 250 target_ulong mseccfg;
753e3fe2 251
c6957248 252 /* machine specific rdtime callback */
a47ef6e9
BM
253 uint64_t (*rdtime_fn)(uint32_t);
254 uint32_t rdtime_fn_arg;
c6957248 255
753e3fe2
JW
256 /* True if in debugger mode. */
257 bool debugger;
4bbe8033
AB
258
259 /*
260 * CSRs for PointerMasking extension
261 */
262 target_ulong mmte;
263 target_ulong mpmmask;
264 target_ulong mpmbase;
265 target_ulong spmmask;
266 target_ulong spmbase;
267 target_ulong upmmask;
268 target_ulong upmbase;
dc5bd18f 269#endif
40bfa5f6
LZ
270 target_ulong cur_pmmask;
271 target_ulong cur_pmbase;
dc5bd18f
MC
272
273 float_status fp_status;
274
dc5bd18f
MC
275 /* Fields from here on are preserved across CPU reset. */
276 QEMUTimer *timer; /* Internal timer */
ad40be27
YJ
277
278 hwaddr kernel_addr;
279 hwaddr fdt_addr;
27abe66f
YJ
280
281 /* kvm timer */
282 bool kvm_timer_dirty;
283 uint64_t kvm_timer_time;
284 uint64_t kvm_timer_compare;
285 uint64_t kvm_timer_state;
286 uint64_t kvm_timer_frequency;
dc5bd18f
MC
287};
288
c821774a 289OBJECT_DECLARE_TYPE(RISCVCPU, RISCVCPUClass,
30b5707c 290 RISCV_CPU)
dc5bd18f
MC
291
292/**
293 * RISCVCPUClass:
294 * @parent_realize: The parent class' realize handler.
295 * @parent_reset: The parent class' reset handler.
296 *
297 * A RISCV CPU model.
298 */
db1015e9 299struct RISCVCPUClass {
dc5bd18f
MC
300 /*< private >*/
301 CPUClass parent_class;
302 /*< public >*/
303 DeviceRealize parent_realize;
781c67ca 304 DeviceReset parent_reset;
db1015e9 305};
dc5bd18f
MC
306
307/**
308 * RISCVCPU:
309 * @env: #CPURISCVState
310 *
311 * A RISCV CPU.
312 */
db1015e9 313struct RISCVCPU {
dc5bd18f
MC
314 /*< private >*/
315 CPUState parent_obj;
316 /*< public >*/
5b146dc7 317 CPUNegativeOffsetState neg;
dc5bd18f 318 CPURISCVState env;
c4e95030 319
b93777e1 320 char *dyn_csr_xml;
719d3561 321 char *dyn_vreg_xml;
b93777e1 322
c4e95030
AF
323 /* Configuration Settings */
324 struct {
b55d7d34
AF
325 bool ext_i;
326 bool ext_e;
327 bool ext_g;
328 bool ext_m;
329 bool ext_a;
330 bool ext_f;
331 bool ext_d;
332 bool ext_c;
333 bool ext_s;
334 bool ext_u;
c9eefe05 335 bool ext_h;
53dcea58 336 bool ext_j;
6bf91617 337 bool ext_v;
878dd0e9
PT
338 bool ext_zba;
339 bool ext_zbb;
340 bool ext_zbc;
341 bool ext_zbs;
0a13a5b8 342 bool ext_counters;
50fba816 343 bool ext_ifencei;
591bddea 344 bool ext_icsr;
915f77b2 345 bool ext_zfh;
2d258b42 346 bool ext_zfhmin;
32e579b8 347 bool ext_zve32f;
b4a99d40 348 bool ext_zve64f;
b55d7d34 349
c4e95030
AF
350 char *priv_spec;
351 char *user_spec;
d2c1a177 352 char *bext_spec;
6bf91617 353 char *vext_spec;
32931383
LZ
354 uint16_t vlen;
355 uint16_t elen;
c4e95030
AF
356 bool mmu;
357 bool pmp;
5da9514e 358 bool epmp;
9b4c9b2b 359 uint64_t resetvec;
c4e95030 360 } cfg;
db1015e9 361};
dc5bd18f 362
dc5bd18f
MC
363static inline int riscv_has_ext(CPURISCVState *env, target_ulong ext)
364{
e91a7227 365 return (env->misa_ext & ext) != 0;
dc5bd18f
MC
366}
367
368static inline bool riscv_feature(CPURISCVState *env, int feature)
369{
370 return env->features & (1ULL << feature);
371}
372
373#include "cpu_user.h"
dc5bd18f
MC
374
375extern const char * const riscv_int_regnames[];
2b547084 376extern const char * const riscv_int_regnamesh[];
dc5bd18f 377extern const char * const riscv_fpr_regnames[];
dc5bd18f 378
c51a3f5d 379const char *riscv_cpu_get_trap_name(target_ulong cause, bool async);
dc5bd18f 380void riscv_cpu_do_interrupt(CPUState *cpu);
43a96588
YJ
381int riscv_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
382 int cpuid, void *opaque);
383int riscv_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cs,
384 int cpuid, void *opaque);
a010bdbe 385int riscv_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
dc5bd18f 386int riscv_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
b345b480 387bool riscv_cpu_fp_enabled(CPURISCVState *env);
61b4b69d 388bool riscv_cpu_vector_enabled(CPURISCVState *env);
ef6bb7b6
AF
389bool riscv_cpu_virt_enabled(CPURISCVState *env);
390void riscv_cpu_set_virt_enabled(CPURISCVState *env, bool enable);
1c1c060a 391bool riscv_cpu_two_stage_lookup(int mmu_idx);
dc5bd18f
MC
392int riscv_cpu_mmu_index(CPURISCVState *env, bool ifetch);
393hwaddr riscv_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
394void riscv_cpu_do_unaligned_access(CPUState *cs, vaddr addr,
395 MMUAccessType access_type, int mmu_idx,
fa947a66 396 uintptr_t retaddr) QEMU_NORETURN;
8a4ca3c1
RH
397bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
398 MMUAccessType access_type, int mmu_idx,
399 bool probe, uintptr_t retaddr);
37207e12
PD
400void riscv_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
401 vaddr addr, unsigned size,
402 MMUAccessType access_type,
403 int mmu_idx, MemTxAttrs attrs,
404 MemTxResult response, uintptr_t retaddr);
dc5bd18f 405char *riscv_isa_string(RISCVCPU *cpu);
0442428a 406void riscv_cpu_list(void);
dc5bd18f 407
dc5bd18f
MC
408#define cpu_list riscv_cpu_list
409#define cpu_mmu_index riscv_cpu_mmu_index
410
85ba724f 411#ifndef CONFIG_USER_ONLY
17b3c353 412bool riscv_cpu_exec_interrupt(CPUState *cs, int interrupt_request);
66e594f2 413void riscv_cpu_swap_hypervisor_regs(CPURISCVState *env);
e3e7039c 414int riscv_cpu_claim_interrupts(RISCVCPU *cpu, uint32_t interrupts);
85ba724f
MC
415uint32_t riscv_cpu_update_mip(RISCVCPU *cpu, uint32_t mask, uint32_t value);
416#define BOOL_TO_MASK(x) (-!!(x)) /* helper for riscv_cpu_update_mip value */
a47ef6e9
BM
417void riscv_cpu_set_rdtime_fn(CPURISCVState *env, uint64_t (*fn)(uint32_t),
418 uint32_t arg);
85ba724f 419#endif
fb738839 420void riscv_cpu_set_mode(CPURISCVState *env, target_ulong newpriv);
dc5bd18f
MC
421
422void riscv_translate_init(void);
fb738839
MC
423void QEMU_NORETURN riscv_raise_exception(CPURISCVState *env,
424 uint32_t exception, uintptr_t pc);
dc5bd18f 425
fb738839
MC
426target_ulong riscv_cpu_get_fflags(CPURISCVState *env);
427void riscv_cpu_set_fflags(CPURISCVState *env, target_ulong);
dc5bd18f 428
c445593d
AF
429#define TB_FLAGS_PRIV_MMU_MASK 3
430#define TB_FLAGS_PRIV_HYP_ACCESS_MASK (1 << 2)
83a71719 431#define TB_FLAGS_MSTATUS_FS MSTATUS_FS
61b4b69d 432#define TB_FLAGS_MSTATUS_VS MSTATUS_VS
dc5bd18f 433
2b7168fc
LZ
434typedef CPURISCVState CPUArchState;
435typedef RISCVCPU ArchCPU;
436#include "exec/cpu-all.h"
437
61d56494 438FIELD(TB_FLAGS, MEM_IDX, 0, 3)
33f1beaf 439FIELD(TB_FLAGS, LMUL, 3, 3)
61d56494 440FIELD(TB_FLAGS, SEW, 6, 3)
33f1beaf
FC
441/* Skip MSTATUS_VS (0x600) bits */
442FIELD(TB_FLAGS, VL_EQ_VLMAX, 11, 1)
443FIELD(TB_FLAGS, VILL, 12, 1)
444/* Skip MSTATUS_FS (0x6000) bits */
743077b3 445/* Is a Hypervisor instruction load/store allowed? */
33f1beaf
FC
446FIELD(TB_FLAGS, HLSX, 15, 1)
447FIELD(TB_FLAGS, MSTATUS_HS_FS, 16, 2)
448FIELD(TB_FLAGS, MSTATUS_HS_VS, 18, 2)
92371bd9 449/* The combination of MXL/SXL/UXL that applies to the current cpu mode. */
33f1beaf 450FIELD(TB_FLAGS, XL, 20, 2)
0774a7a1 451/* If PointerMasking should be applied */
4208dc7e
LZ
452FIELD(TB_FLAGS, PM_MASK_ENABLED, 22, 1)
453FIELD(TB_FLAGS, PM_BASE_ENABLED, 23, 1)
2b7168fc 454
db23e5d9
RH
455#ifdef TARGET_RISCV32
456#define riscv_cpu_mxl(env) ((void)(env), MXL_RV32)
457#else
458static inline RISCVMXL riscv_cpu_mxl(CPURISCVState *env)
459{
460 return env->misa_mxl;
461}
462#endif
51ae0cab 463
440544e1
LZ
464#if defined(TARGET_RISCV32)
465#define cpu_recompute_xl(env) ((void)(env), MXL_RV32)
466#else
467static inline RISCVMXL cpu_recompute_xl(CPURISCVState *env)
468{
469 RISCVMXL xl = env->misa_mxl;
470#if !defined(CONFIG_USER_ONLY)
471 /*
472 * When emulating a 32-bit-only cpu, use RV32.
473 * When emulating a 64-bit cpu, and MXL has been reduced to RV32,
474 * MSTATUSH doesn't have UXL/SXL, therefore XLEN cannot be widened
475 * back to RV64 for lower privs.
476 */
477 if (xl != MXL_RV32) {
478 switch (env->priv) {
479 case PRV_M:
480 break;
481 case PRV_U:
482 xl = get_field(env->mstatus, MSTATUS64_UXL);
483 break;
484 default: /* PRV_S | PRV_H */
485 xl = get_field(env->mstatus, MSTATUS64_SXL);
486 break;
487 }
488 }
489#endif
490 return xl;
491}
492#endif
493
2b7168fc 494/*
a689a82b
FC
495 * Encode LMUL to lmul as follows:
496 * LMUL vlmul lmul
497 * 1 000 0
498 * 2 001 1
499 * 4 010 2
500 * 8 011 3
501 * - 100 -
502 * 1/8 101 -3
503 * 1/4 110 -2
504 * 1/2 111 -1
505 *
506 * then, we can calculate VLMAX = vlen >> (vsew + 3 - lmul)
507 * e.g. vlen = 256 bits, SEW = 16, LMUL = 1/8
508 * => VLMAX = vlen >> (1 + 3 - (-3))
509 * = 256 >> 7
510 * = 2
2b7168fc
LZ
511 */
512static inline uint32_t vext_get_vlmax(RISCVCPU *cpu, target_ulong vtype)
513{
a689a82b
FC
514 uint8_t sew = FIELD_EX64(vtype, VTYPE, VSEW);
515 int8_t lmul = sextract32(FIELD_EX64(vtype, VTYPE, VLMUL), 0, 3);
2b7168fc
LZ
516 return cpu->cfg.vlen >> (sew + 3 - lmul);
517}
518
53677acf
RH
519void cpu_get_tb_cpu_state(CPURISCVState *env, target_ulong *pc,
520 target_ulong *cs_base, uint32_t *pflags);
dc5bd18f 521
40bfa5f6
LZ
522void riscv_cpu_update_mask(CPURISCVState *env);
523
533c91e8
AF
524RISCVException riscv_csrrw(CPURISCVState *env, int csrno,
525 target_ulong *ret_value,
526 target_ulong new_value, target_ulong write_mask);
527RISCVException riscv_csrrw_debug(CPURISCVState *env, int csrno,
528 target_ulong *ret_value,
529 target_ulong new_value,
530 target_ulong write_mask);
c7b95171 531
fb738839
MC
532static inline void riscv_csr_write(CPURISCVState *env, int csrno,
533 target_ulong val)
c7b95171
MC
534{
535 riscv_csrrw(env, csrno, NULL, val, MAKE_64BIT_MASK(0, TARGET_LONG_BITS));
536}
537
fb738839 538static inline target_ulong riscv_csr_read(CPURISCVState *env, int csrno)
c7b95171
MC
539{
540 target_ulong val = 0;
541 riscv_csrrw(env, csrno, &val, 0, 0);
542 return val;
543}
544
0e62f92e
AF
545typedef RISCVException (*riscv_csr_predicate_fn)(CPURISCVState *env,
546 int csrno);
605def6e
AF
547typedef RISCVException (*riscv_csr_read_fn)(CPURISCVState *env, int csrno,
548 target_ulong *ret_value);
549typedef RISCVException (*riscv_csr_write_fn)(CPURISCVState *env, int csrno,
550 target_ulong new_value);
551typedef RISCVException (*riscv_csr_op_fn)(CPURISCVState *env, int csrno,
552 target_ulong *ret_value,
553 target_ulong new_value,
554 target_ulong write_mask);
c7b95171 555
961738ff
FP
556RISCVException riscv_csrrw_i128(CPURISCVState *env, int csrno,
557 Int128 *ret_value,
558 Int128 new_value, Int128 write_mask);
559
457c360f
FP
560typedef RISCVException (*riscv_csr_read128_fn)(CPURISCVState *env, int csrno,
561 Int128 *ret_value);
562typedef RISCVException (*riscv_csr_write128_fn)(CPURISCVState *env, int csrno,
563 Int128 new_value);
564
c7b95171 565typedef struct {
8ceac5dc 566 const char *name;
a88365c1 567 riscv_csr_predicate_fn predicate;
c7b95171
MC
568 riscv_csr_read_fn read;
569 riscv_csr_write_fn write;
570 riscv_csr_op_fn op;
457c360f
FP
571 riscv_csr_read128_fn read128;
572 riscv_csr_write128_fn write128;
c7b95171
MC
573} riscv_csr_operations;
574
56118ee8
BM
575/* CSR function table constants */
576enum {
577 CSR_TABLE_SIZE = 0x1000
578};
579
580/* CSR function table */
6f03770d 581extern riscv_csr_operations csr_ops[CSR_TABLE_SIZE];
56118ee8 582
c7b95171
MC
583void riscv_get_csr_ops(int csrno, riscv_csr_operations *ops);
584void riscv_set_csr_ops(int csrno, riscv_csr_operations *ops);
dc5bd18f 585
5371f5cd
JW
586void riscv_cpu_register_gdb_regs_for_features(CPUState *cs);
587
dc5bd18f 588#endif /* RISCV_CPU_H */
This page took 0.380522 seconds and 4 git commands to generate.