1
From: Alistair Francis <alistair.francis@wdc.com>
1
The following changes since commit fdd0df5340a8ebc8de88078387ebc85c5af7b40f:
2
2
3
The following changes since commit c5fbdd60cf1fb52f01bdfe342b6fa65d5343e1b1:
3
Merge tag 'pull-ppc-20230610' of https://gitlab.com/danielhb/qemu into staging (2023-06-10 07:25:00 -0700)
4
5
Merge tag 'qemu-sparc-20211121' of git://github.com/mcayland/qemu into staging (2021-11-21 14:12:25 +0100)
6
4
7
are available in the Git repository at:
5
are available in the Git repository at:
8
6
9
git@github.com:alistair23/qemu.git tags/pull-riscv-to-apply-20211122
7
https://github.com/alistair23/qemu.git tags/pull-riscv-to-apply-20230614
10
8
11
for you to fetch changes up to 526e7443027c71fe7b04c29df529e1f9f425f9e3:
9
for you to fetch changes up to 860029321d9ebdff47e89561de61e9441fead70a:
12
10
13
hw/misc/sifive_u_otp: Do not reset OTP content on hardware reset (2021-11-22 10:46:22 +1000)
11
hw/intc: If mmsiaddrcfgh.L == 1, smsiaddrcfg and smsiaddrcfgh are read-only. (2023-06-14 10:04:30 +1000)
14
12
15
----------------------------------------------------------------
13
----------------------------------------------------------------
16
Seventh RISC-V PR for QEMU 6.2
14
Second RISC-V PR for 8.1
17
15
18
- Deprecate IF_NONE for SiFive OTP
16
* Skip Vector set tail when vta is zero
19
- Don't reset SiFive OTP content
17
* Move zc* out of the experimental properties
18
* Mask the implicitly enabled extensions in isa_string based on priv version
19
* Rework CPU extension validation and validate MISA changes
20
* Fixup PMP TLB cacheing errors
21
* Writing to pmpaddr and MML/MMWP correctly triggers TLB flushes
22
* Fixup PMP bypass checks
23
* Deny access if access is partially inside a PMP entry
24
* Correct OpenTitanState parent type/size
25
* Fix QEMU crash when NUMA nodes exceed available CPUs
26
* Fix pointer mask transformation for vector address
27
* Updates and improvements for Smstateen
28
* Support disas for Zcm* extensions
29
* Support disas for Z*inx extensions
30
* Remove unused decomp_rv32/64 value for vector instructions
31
* Enable PC-relative translation
32
* Assume M-mode FW in pflash0 only when "-bios none"
33
* Support using pflash via -blockdev option
34
* Add vector registers to log
35
* Clean up reference of Vector MTYPE
36
* Remove the check for extra Vector tail elements
37
* Smepmp: Return error when access permission not allowed in PMP
38
* Fixes for smsiaddrcfg and smsiaddrcfgh in AIA
20
39
21
----------------------------------------------------------------
40
----------------------------------------------------------------
22
Philippe Mathieu-Daudé (1):
41
Daniel Henrique Barboza (10):
23
hw/misc/sifive_u_otp: Do not reset OTP content on hardware reset
42
target/riscv/vector_helper.c: skip set tail when vta is zero
43
target/riscv/cpu.c: add riscv_cpu_validate_v()
44
target/riscv/cpu.c: remove set_vext_version()
45
target/riscv/cpu.c: remove set_priv_version()
46
target/riscv: add PRIV_VERSION_LATEST
47
target/riscv/cpu.c: add priv_spec validate/disable_exts helpers
48
target/riscv/cpu.c: add riscv_cpu_validate_misa_mxl()
49
target/riscv/cpu.c: validate extensions before riscv_timer_init()
50
target/riscv/cpu.c: remove cfg setup from riscv_cpu_init()
51
target/riscv: rework write_misa()
24
52
25
Thomas Huth (1):
53
Himanshu Chauhan (1):
26
hw/misc/sifive_u_otp: Use IF_PFLASH for the OTP device instead of IF_NONE
54
target/riscv: Smepmp: Return error when access permission not allowed in PMP
27
55
28
docs/about/deprecated.rst | 6 ++++++
56
Ivan Klokov (1):
29
hw/misc/sifive_u_otp.c | 22 +++++++++++++---------
57
util/log: Add vector registers to log
30
2 files changed, 19 insertions(+), 9 deletions(-)
31
58
59
Mayuresh Chitale (3):
60
target/riscv: smstateen check for fcsr
61
target/riscv: Reuse tb->flags.FS
62
target/riscv: smstateen knobs
63
64
Philippe Mathieu-Daudé (5):
65
hw/riscv/opentitan: Rename machine_[class]_init() functions
66
hw/riscv/opentitan: Declare QOM types using DEFINE_TYPES() macro
67
hw/riscv/opentitan: Add TYPE_OPENTITAN_MACHINE definition
68
hw/riscv/opentitan: Explicit machine type definition
69
hw/riscv/opentitan: Correct OpenTitanState parent type/size
70
71
Sunil V L (3):
72
hw/riscv: virt: Assume M-mode FW in pflash0 only when "-bios none"
73
riscv/virt: Support using pflash via -blockdev option
74
docs/system: riscv: Add pflash usage details
75
76
Tommy Wu (1):
77
hw/intc: If mmsiaddrcfgh.L == 1, smsiaddrcfg and smsiaddrcfgh are read-only.
78
79
Weiwei Li (33):
80
target/riscv: Move zc* out of the experimental properties
81
target/riscv: Mask the implicitly enabled extensions in isa_string based on priv version
82
target/riscv: Update check for Zca/Zcf/Zcd
83
target/riscv: Update pmp_get_tlb_size()
84
target/riscv: Move pmp_get_tlb_size apart from get_physical_address_pmp
85
target/riscv: Make the short cut really work in pmp_hart_has_privs
86
target/riscv: Change the return type of pmp_hart_has_privs() to bool
87
target/riscv: Make RLB/MML/MMWP bits writable only when Smepmp is enabled
88
target/riscv: Remove unused paramters in pmp_hart_has_privs_default()
89
target/riscv: Flush TLB when MMWP or MML bits are changed
90
target/riscv: Update the next rule addr in pmpaddr_csr_write()
91
target/riscv: Flush TLB when pmpaddr is updated
92
target/riscv: Flush TLB only when pmpcfg/pmpaddr really changes
93
target/riscv: Separate pmp_update_rule() in pmpcfg_csr_write
94
target/riscv: Deny access if access is partially inside the PMP entry
95
target/riscv: Fix pointer mask transformation for vector address
96
target/riscv: Update cur_pmmask/base when xl changes
97
disas: Change type of disassemble_info.target_info to pointer
98
target/riscv: Split RISCVCPUConfig declarations from cpu.h into cpu_cfg.h
99
target/riscv: Pass RISCVCPUConfig as target_info to disassemble_info
100
disas/riscv.c: Support disas for Zcm* extensions
101
disas/riscv.c: Support disas for Z*inx extensions
102
disas/riscv.c: Remove unused decomp_rv32/64 value for vector instructions
103
disas/riscv.c: Fix lines with over 80 characters
104
disas/riscv.c: Remove redundant parentheses
105
target/riscv: Fix target address to update badaddr
106
target/riscv: Introduce cur_insn_len into DisasContext
107
target/riscv: Change gen_goto_tb to work on displacements
108
target/riscv: Change gen_set_pc_imm to gen_update_pc
109
target/riscv: Use true diff for gen_pc_plus_diff
110
target/riscv: Enable PC-relative translation
111
target/riscv: Remove pc_succ_insn from DisasContext
112
target/riscv: Fix initialized value for cur_pmmask
113
114
Xiao Wang (2):
115
target/riscv/vector_helper.c: clean up reference of MTYPE
116
target/riscv/vector_helper.c: Remove the check for extra tail elements
117
118
Yin Wang (1):
119
hw/riscv: qemu crash when NUMA nodes exceed available CPUs
120
121
docs/system/riscv/virt.rst | 31 +
122
include/disas/dis-asm.h | 2 +-
123
include/hw/core/cpu.h | 2 +
124
include/hw/riscv/opentitan.h | 6 +-
125
include/qemu/log.h | 1 +
126
target/riscv/cpu.h | 117 +--
127
target/riscv/cpu_cfg.h | 136 +++
128
target/riscv/pmp.h | 11 +-
129
accel/tcg/cpu-exec.c | 3 +
130
disas/riscv.c | 1194 +++++++++++++-----------
131
hw/intc/riscv_aplic.c | 4 +-
132
hw/riscv/numa.c | 6 +
133
hw/riscv/opentitan.c | 38 +-
134
hw/riscv/virt.c | 59 +-
135
target/riscv/cpu.c | 384 +++++---
136
target/riscv/cpu_helper.c | 37 +-
137
target/riscv/csr.c | 75 +-
138
target/riscv/pmp.c | 205 ++--
139
target/riscv/translate.c | 99 +-
140
target/riscv/vector_helper.c | 33 +-
141
util/log.c | 2 +
142
target/riscv/insn_trans/trans_privileged.c.inc | 2 +-
143
target/riscv/insn_trans/trans_rvd.c.inc | 12 +-
144
target/riscv/insn_trans/trans_rvf.c.inc | 21 +-
145
target/riscv/insn_trans/trans_rvi.c.inc | 46 +-
146
target/riscv/insn_trans/trans_rvv.c.inc | 4 +-
147
target/riscv/insn_trans/trans_rvzawrs.c.inc | 2 +-
148
target/riscv/insn_trans/trans_rvzce.c.inc | 10 +-
149
target/riscv/insn_trans/trans_xthead.c.inc | 2 +-
150
29 files changed, 1442 insertions(+), 1102 deletions(-)
151
create mode 100644 target/riscv/cpu_cfg.h
152
diff view generated by jsdifflib
New patch
1
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
1
2
3
The function is a no-op if 'vta' is zero but we're still doing a lot of
4
stuff in this function regardless. vext_set_elems_1s() will ignore every
5
single time (since vta is zero) and we just wasted time.
6
7
Skip it altogether in this case. Aside from the code simplification
8
there's a noticeable emulation performance gain by doing it. For a
9
regular C binary that does a vectors operation like this:
10
11
=======
12
#define SZ 10000000
13
14
int main ()
15
{
16
int *a = malloc (SZ * sizeof (int));
17
int *b = malloc (SZ * sizeof (int));
18
int *c = malloc (SZ * sizeof (int));
19
20
for (int i = 0; i < SZ; i++)
21
c[i] = a[i] + b[i];
22
return c[SZ - 1];
23
}
24
=======
25
26
Emulating it with qemu-riscv64 and RVV takes ~0.3 sec:
27
28
$ time ~/work/qemu/build/qemu-riscv64 \
29
-cpu rv64,debug=false,vext_spec=v1.0,v=true,vlen=128 ./foo.out
30
31
real 0m0.303s
32
user 0m0.281s
33
sys 0m0.023s
34
35
With this skip we take ~0.275 sec:
36
37
$ time ~/work/qemu/build/qemu-riscv64 \
38
-cpu rv64,debug=false,vext_spec=v1.0,v=true,vlen=128 ./foo.out
39
40
real 0m0.274s
41
user 0m0.252s
42
sys 0m0.019s
43
44
This performance gain adds up fast when executing heavy benchmarks like
45
SPEC.
46
47
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
48
Acked-by: Alistair Francis <alistair.francis@wdc.com>
49
Reviewed-by: Palmer Dabbelt <palmer@rivosinc.com>
50
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
51
Message-Id: <20230427205708.246679-2-dbarboza@ventanamicro.com>
52
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
53
---
54
target/riscv/vector_helper.c | 11 ++++++++---
55
1 file changed, 8 insertions(+), 3 deletions(-)
56
57
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
58
index XXXXXXX..XXXXXXX 100644
59
--- a/target/riscv/vector_helper.c
60
+++ b/target/riscv/vector_helper.c
61
@@ -XXX,XX +XXX,XX @@ static void vext_set_tail_elems_1s(CPURISCVState *env, target_ulong vl,
62
void *vd, uint32_t desc, uint32_t nf,
63
uint32_t esz, uint32_t max_elems)
64
{
65
- uint32_t total_elems = vext_get_total_elems(env, desc, esz);
66
- uint32_t vlenb = riscv_cpu_cfg(env)->vlen >> 3;
67
+ uint32_t total_elems, vlenb, registers_used;
68
uint32_t vta = vext_vta(desc);
69
- uint32_t registers_used;
70
int k;
71
72
+ if (vta == 0) {
73
+ return;
74
+ }
75
+
76
+ total_elems = vext_get_total_elems(env, desc, esz);
77
+ vlenb = riscv_cpu_cfg(env)->vlen >> 3;
78
+
79
for (k = 0; k < nf; ++k) {
80
vext_set_elems_1s(vd, vta, (k * max_elems + vl) * esz,
81
(k * max_elems + max_elems) * esz);
82
--
83
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
Zc* extensions (version 1.0) are ratified.
4
5
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
6
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
7
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
8
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
9
Message-Id: <20230510030040.20528-1-liweiwei@iscas.ac.cn>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
target/riscv/cpu.c | 16 ++++++++--------
13
1 file changed, 8 insertions(+), 8 deletions(-)
14
15
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/cpu.c
18
+++ b/target/riscv/cpu.c
19
@@ -XXX,XX +XXX,XX @@ static Property riscv_cpu_extensions[] = {
20
21
DEFINE_PROP_BOOL("zmmul", RISCVCPU, cfg.ext_zmmul, false),
22
23
+ DEFINE_PROP_BOOL("zca", RISCVCPU, cfg.ext_zca, false),
24
+ DEFINE_PROP_BOOL("zcb", RISCVCPU, cfg.ext_zcb, false),
25
+ DEFINE_PROP_BOOL("zcd", RISCVCPU, cfg.ext_zcd, false),
26
+ DEFINE_PROP_BOOL("zce", RISCVCPU, cfg.ext_zce, false),
27
+ DEFINE_PROP_BOOL("zcf", RISCVCPU, cfg.ext_zcf, false),
28
+ DEFINE_PROP_BOOL("zcmp", RISCVCPU, cfg.ext_zcmp, false),
29
+ DEFINE_PROP_BOOL("zcmt", RISCVCPU, cfg.ext_zcmt, false),
30
+
31
/* Vendor-specific custom extensions */
32
DEFINE_PROP_BOOL("xtheadba", RISCVCPU, cfg.ext_xtheadba, false),
33
DEFINE_PROP_BOOL("xtheadbb", RISCVCPU, cfg.ext_xtheadbb, false),
34
@@ -XXX,XX +XXX,XX @@ static Property riscv_cpu_extensions[] = {
35
/* These are experimental so mark with 'x-' */
36
DEFINE_PROP_BOOL("x-zicond", RISCVCPU, cfg.ext_zicond, false),
37
38
- DEFINE_PROP_BOOL("x-zca", RISCVCPU, cfg.ext_zca, false),
39
- DEFINE_PROP_BOOL("x-zcb", RISCVCPU, cfg.ext_zcb, false),
40
- DEFINE_PROP_BOOL("x-zcd", RISCVCPU, cfg.ext_zcd, false),
41
- DEFINE_PROP_BOOL("x-zce", RISCVCPU, cfg.ext_zce, false),
42
- DEFINE_PROP_BOOL("x-zcf", RISCVCPU, cfg.ext_zcf, false),
43
- DEFINE_PROP_BOOL("x-zcmp", RISCVCPU, cfg.ext_zcmp, false),
44
- DEFINE_PROP_BOOL("x-zcmt", RISCVCPU, cfg.ext_zcmt, false),
45
-
46
/* ePMP 0.9.3 */
47
DEFINE_PROP_BOOL("x-epmp", RISCVCPU, cfg.epmp, false),
48
DEFINE_PROP_BOOL("x-smaia", RISCVCPU, cfg.ext_smaia, false),
49
--
50
2.40.1
diff view generated by jsdifflib
New patch
1
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
1
2
3
The RVV verification will error out if fails and it's being done at the
4
end of riscv_cpu_validate_set_extensions(), after we've already set some
5
extensions that are dependent on RVV. Let's put it in its own function
6
and do it earlier.
7
8
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
9
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
10
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
11
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
12
Message-Id: <20230517135714.211809-2-dbarboza@ventanamicro.com>
13
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
14
---
15
target/riscv/cpu.c | 89 +++++++++++++++++++++++++---------------------
16
1 file changed, 48 insertions(+), 41 deletions(-)
17
18
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/target/riscv/cpu.c
21
+++ b/target/riscv/cpu.c
22
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_disas_set_info(CPUState *s, disassemble_info *info)
23
}
24
}
25
26
+static void riscv_cpu_validate_v(CPURISCVState *env, RISCVCPUConfig *cfg,
27
+ Error **errp)
28
+{
29
+ int vext_version = VEXT_VERSION_1_00_0;
30
+
31
+ if (!is_power_of_2(cfg->vlen)) {
32
+ error_setg(errp, "Vector extension VLEN must be power of 2");
33
+ return;
34
+ }
35
+ if (cfg->vlen > RV_VLEN_MAX || cfg->vlen < 128) {
36
+ error_setg(errp,
37
+ "Vector extension implementation only supports VLEN "
38
+ "in the range [128, %d]", RV_VLEN_MAX);
39
+ return;
40
+ }
41
+ if (!is_power_of_2(cfg->elen)) {
42
+ error_setg(errp, "Vector extension ELEN must be power of 2");
43
+ return;
44
+ }
45
+ if (cfg->elen > 64 || cfg->elen < 8) {
46
+ error_setg(errp,
47
+ "Vector extension implementation only supports ELEN "
48
+ "in the range [8, 64]");
49
+ return;
50
+ }
51
+ if (cfg->vext_spec) {
52
+ if (!g_strcmp0(cfg->vext_spec, "v1.0")) {
53
+ vext_version = VEXT_VERSION_1_00_0;
54
+ } else {
55
+ error_setg(errp, "Unsupported vector spec version '%s'",
56
+ cfg->vext_spec);
57
+ return;
58
+ }
59
+ } else {
60
+ qemu_log("vector version is not specified, "
61
+ "use the default value v1.0\n");
62
+ }
63
+ set_vext_version(env, vext_version);
64
+}
65
+
66
/*
67
* Check consistency between chosen extensions while setting
68
* cpu->cfg accordingly.
69
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_disas_set_info(CPUState *s, disassemble_info *info)
70
static void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
71
{
72
CPURISCVState *env = &cpu->env;
73
+ Error *local_err = NULL;
74
75
/* Do some ISA extension error checking */
76
if (riscv_has_ext(env, RVG) &&
77
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
78
return;
79
}
80
81
- /* The V vector extension depends on the Zve64d extension */
82
if (riscv_has_ext(env, RVV)) {
83
+ riscv_cpu_validate_v(env, &cpu->cfg, &local_err);
84
+ if (local_err != NULL) {
85
+ error_propagate(errp, local_err);
86
+ return;
87
+ }
88
+
89
+ /* The V vector extension depends on the Zve64d extension */
90
cpu->cfg.ext_zve64d = true;
91
}
92
93
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
94
cpu->cfg.ext_zksed = true;
95
cpu->cfg.ext_zksh = true;
96
}
97
-
98
- if (riscv_has_ext(env, RVV)) {
99
- int vext_version = VEXT_VERSION_1_00_0;
100
- if (!is_power_of_2(cpu->cfg.vlen)) {
101
- error_setg(errp,
102
- "Vector extension VLEN must be power of 2");
103
- return;
104
- }
105
- if (cpu->cfg.vlen > RV_VLEN_MAX || cpu->cfg.vlen < 128) {
106
- error_setg(errp,
107
- "Vector extension implementation only supports VLEN "
108
- "in the range [128, %d]", RV_VLEN_MAX);
109
- return;
110
- }
111
- if (!is_power_of_2(cpu->cfg.elen)) {
112
- error_setg(errp,
113
- "Vector extension ELEN must be power of 2");
114
- return;
115
- }
116
- if (cpu->cfg.elen > 64 || cpu->cfg.elen < 8) {
117
- error_setg(errp,
118
- "Vector extension implementation only supports ELEN "
119
- "in the range [8, 64]");
120
- return;
121
- }
122
- if (cpu->cfg.vext_spec) {
123
- if (!g_strcmp0(cpu->cfg.vext_spec, "v1.0")) {
124
- vext_version = VEXT_VERSION_1_00_0;
125
- } else {
126
- error_setg(errp,
127
- "Unsupported vector spec version '%s'",
128
- cpu->cfg.vext_spec);
129
- return;
130
- }
131
- } else {
132
- qemu_log("vector version is not specified, "
133
- "use the default value v1.0\n");
134
- }
135
- set_vext_version(env, vext_version);
136
- }
137
}
138
139
#ifndef CONFIG_USER_ONLY
140
--
141
2.40.1
diff view generated by jsdifflib
New patch
1
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
1
2
3
This setter is doing nothing else but setting env->vext_ver. Assign the
4
value directly.
5
6
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
7
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
8
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-Id: <20230517135714.211809-3-dbarboza@ventanamicro.com>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
13
target/riscv/cpu.c | 7 +------
14
1 file changed, 1 insertion(+), 6 deletions(-)
15
16
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/riscv/cpu.c
19
+++ b/target/riscv/cpu.c
20
@@ -XXX,XX +XXX,XX @@ static void set_priv_version(CPURISCVState *env, int priv_ver)
21
env->priv_ver = priv_ver;
22
}
23
24
-static void set_vext_version(CPURISCVState *env, int vext_ver)
25
-{
26
- env->vext_ver = vext_ver;
27
-}
28
-
29
#ifndef CONFIG_USER_ONLY
30
static uint8_t satp_mode_from_str(const char *satp_mode_str)
31
{
32
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_validate_v(CPURISCVState *env, RISCVCPUConfig *cfg,
33
qemu_log("vector version is not specified, "
34
"use the default value v1.0\n");
35
}
36
- set_vext_version(env, vext_version);
37
+ env->vext_ver = vext_version;
38
}
39
40
/*
41
--
42
2.40.1
diff view generated by jsdifflib
New patch
1
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
1
2
3
The setter is doing nothing special. Just set env->priv_ver directly.
4
5
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
6
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
7
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <20230517135714.211809-4-dbarboza@ventanamicro.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
target/riscv/cpu.c | 29 ++++++++++++-----------------
13
1 file changed, 12 insertions(+), 17 deletions(-)
14
15
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/cpu.c
18
+++ b/target/riscv/cpu.c
19
@@ -XXX,XX +XXX,XX @@ static void set_misa(CPURISCVState *env, RISCVMXL mxl, uint32_t ext)
20
env->misa_ext_mask = env->misa_ext = ext;
21
}
22
23
-static void set_priv_version(CPURISCVState *env, int priv_ver)
24
-{
25
- env->priv_ver = priv_ver;
26
-}
27
-
28
#ifndef CONFIG_USER_ONLY
29
static uint8_t satp_mode_from_str(const char *satp_mode_str)
30
{
31
@@ -XXX,XX +XXX,XX @@ static void riscv_any_cpu_init(Object *obj)
32
VM_1_10_SV32 : VM_1_10_SV57);
33
#endif
34
35
- set_priv_version(env, PRIV_VERSION_1_12_0);
36
+ env->priv_ver = PRIV_VERSION_1_12_0;
37
}
38
39
#if defined(TARGET_RISCV64)
40
@@ -XXX,XX +XXX,XX @@ static void rv64_base_cpu_init(Object *obj)
41
set_misa(env, MXL_RV64, 0);
42
riscv_cpu_add_user_properties(obj);
43
/* Set latest version of privileged specification */
44
- set_priv_version(env, PRIV_VERSION_1_12_0);
45
+ env->priv_ver = PRIV_VERSION_1_12_0;
46
#ifndef CONFIG_USER_ONLY
47
set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV57);
48
#endif
49
@@ -XXX,XX +XXX,XX @@ static void rv64_sifive_u_cpu_init(Object *obj)
50
{
51
CPURISCVState *env = &RISCV_CPU(obj)->env;
52
set_misa(env, MXL_RV64, RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU);
53
- set_priv_version(env, PRIV_VERSION_1_10_0);
54
+ env->priv_ver = PRIV_VERSION_1_10_0;
55
#ifndef CONFIG_USER_ONLY
56
set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV39);
57
#endif
58
@@ -XXX,XX +XXX,XX @@ static void rv64_sifive_e_cpu_init(Object *obj)
59
RISCVCPU *cpu = RISCV_CPU(obj);
60
61
set_misa(env, MXL_RV64, RVI | RVM | RVA | RVC | RVU);
62
- set_priv_version(env, PRIV_VERSION_1_10_0);
63
+ env->priv_ver = PRIV_VERSION_1_10_0;
64
cpu->cfg.mmu = false;
65
#ifndef CONFIG_USER_ONLY
66
set_satp_mode_max_supported(cpu, VM_1_10_MBARE);
67
@@ -XXX,XX +XXX,XX @@ static void rv64_thead_c906_cpu_init(Object *obj)
68
RISCVCPU *cpu = RISCV_CPU(obj);
69
70
set_misa(env, MXL_RV64, RVG | RVC | RVS | RVU);
71
- set_priv_version(env, PRIV_VERSION_1_11_0);
72
+ env->priv_ver = PRIV_VERSION_1_11_0;
73
74
cpu->cfg.ext_zfh = true;
75
cpu->cfg.mmu = true;
76
@@ -XXX,XX +XXX,XX @@ static void rv128_base_cpu_init(Object *obj)
77
set_misa(env, MXL_RV128, 0);
78
riscv_cpu_add_user_properties(obj);
79
/* Set latest version of privileged specification */
80
- set_priv_version(env, PRIV_VERSION_1_12_0);
81
+ env->priv_ver = PRIV_VERSION_1_12_0;
82
#ifndef CONFIG_USER_ONLY
83
set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV57);
84
#endif
85
@@ -XXX,XX +XXX,XX @@ static void rv32_base_cpu_init(Object *obj)
86
set_misa(env, MXL_RV32, 0);
87
riscv_cpu_add_user_properties(obj);
88
/* Set latest version of privileged specification */
89
- set_priv_version(env, PRIV_VERSION_1_12_0);
90
+ env->priv_ver = PRIV_VERSION_1_12_0;
91
#ifndef CONFIG_USER_ONLY
92
set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV32);
93
#endif
94
@@ -XXX,XX +XXX,XX @@ static void rv32_sifive_u_cpu_init(Object *obj)
95
{
96
CPURISCVState *env = &RISCV_CPU(obj)->env;
97
set_misa(env, MXL_RV32, RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU);
98
- set_priv_version(env, PRIV_VERSION_1_10_0);
99
+ env->priv_ver = PRIV_VERSION_1_10_0;
100
#ifndef CONFIG_USER_ONLY
101
set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV32);
102
#endif
103
@@ -XXX,XX +XXX,XX @@ static void rv32_sifive_e_cpu_init(Object *obj)
104
RISCVCPU *cpu = RISCV_CPU(obj);
105
106
set_misa(env, MXL_RV32, RVI | RVM | RVA | RVC | RVU);
107
- set_priv_version(env, PRIV_VERSION_1_10_0);
108
+ env->priv_ver = PRIV_VERSION_1_10_0;
109
cpu->cfg.mmu = false;
110
#ifndef CONFIG_USER_ONLY
111
set_satp_mode_max_supported(cpu, VM_1_10_MBARE);
112
@@ -XXX,XX +XXX,XX @@ static void rv32_ibex_cpu_init(Object *obj)
113
RISCVCPU *cpu = RISCV_CPU(obj);
114
115
set_misa(env, MXL_RV32, RVI | RVM | RVC | RVU);
116
- set_priv_version(env, PRIV_VERSION_1_11_0);
117
+ env->priv_ver = PRIV_VERSION_1_11_0;
118
cpu->cfg.mmu = false;
119
#ifndef CONFIG_USER_ONLY
120
set_satp_mode_max_supported(cpu, VM_1_10_MBARE);
121
@@ -XXX,XX +XXX,XX @@ static void rv32_imafcu_nommu_cpu_init(Object *obj)
122
RISCVCPU *cpu = RISCV_CPU(obj);
123
124
set_misa(env, MXL_RV32, RVI | RVM | RVA | RVF | RVC | RVU);
125
- set_priv_version(env, PRIV_VERSION_1_10_0);
126
+ env->priv_ver = PRIV_VERSION_1_10_0;
127
cpu->cfg.mmu = false;
128
#ifndef CONFIG_USER_ONLY
129
set_satp_mode_max_supported(cpu, VM_1_10_MBARE);
130
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
131
}
132
133
if (priv_version >= PRIV_VERSION_1_10_0) {
134
- set_priv_version(env, priv_version);
135
+ env->priv_ver = priv_version;
136
}
137
138
riscv_cpu_validate_misa_priv(env, &local_err);
139
--
140
2.40.1
diff view generated by jsdifflib
New patch
1
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
1
2
3
All these generic CPUs are using the latest priv available, at this
4
moment PRIV_VERSION_1_12_0:
5
6
- riscv_any_cpu_init()
7
- rv32_base_cpu_init()
8
- rv64_base_cpu_init()
9
- rv128_base_cpu_init()
10
11
Create a new PRIV_VERSION_LATEST enum and use it in those cases. I'll
12
make it easier to update everything at once when a new priv version is
13
available.
14
15
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
16
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
17
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
18
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
19
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
20
Message-Id: <20230517135714.211809-5-dbarboza@ventanamicro.com>
21
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
22
---
23
target/riscv/cpu.h | 2 ++
24
target/riscv/cpu.c | 8 ++++----
25
2 files changed, 6 insertions(+), 4 deletions(-)
26
27
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
28
index XXXXXXX..XXXXXXX 100644
29
--- a/target/riscv/cpu.h
30
+++ b/target/riscv/cpu.h
31
@@ -XXX,XX +XXX,XX @@ enum {
32
PRIV_VERSION_1_10_0 = 0,
33
PRIV_VERSION_1_11_0,
34
PRIV_VERSION_1_12_0,
35
+
36
+ PRIV_VERSION_LATEST = PRIV_VERSION_1_12_0,
37
};
38
39
#define VEXT_VERSION_1_00_0 0x00010000
40
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/target/riscv/cpu.c
43
+++ b/target/riscv/cpu.c
44
@@ -XXX,XX +XXX,XX @@ static void riscv_any_cpu_init(Object *obj)
45
VM_1_10_SV32 : VM_1_10_SV57);
46
#endif
47
48
- env->priv_ver = PRIV_VERSION_1_12_0;
49
+ env->priv_ver = PRIV_VERSION_LATEST;
50
}
51
52
#if defined(TARGET_RISCV64)
53
@@ -XXX,XX +XXX,XX @@ static void rv64_base_cpu_init(Object *obj)
54
set_misa(env, MXL_RV64, 0);
55
riscv_cpu_add_user_properties(obj);
56
/* Set latest version of privileged specification */
57
- env->priv_ver = PRIV_VERSION_1_12_0;
58
+ env->priv_ver = PRIV_VERSION_LATEST;
59
#ifndef CONFIG_USER_ONLY
60
set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV57);
61
#endif
62
@@ -XXX,XX +XXX,XX @@ static void rv128_base_cpu_init(Object *obj)
63
set_misa(env, MXL_RV128, 0);
64
riscv_cpu_add_user_properties(obj);
65
/* Set latest version of privileged specification */
66
- env->priv_ver = PRIV_VERSION_1_12_0;
67
+ env->priv_ver = PRIV_VERSION_LATEST;
68
#ifndef CONFIG_USER_ONLY
69
set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV57);
70
#endif
71
@@ -XXX,XX +XXX,XX @@ static void rv32_base_cpu_init(Object *obj)
72
set_misa(env, MXL_RV32, 0);
73
riscv_cpu_add_user_properties(obj);
74
/* Set latest version of privileged specification */
75
- env->priv_ver = PRIV_VERSION_1_12_0;
76
+ env->priv_ver = PRIV_VERSION_LATEST;
77
#ifndef CONFIG_USER_ONLY
78
set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV32);
79
#endif
80
--
81
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
Using implicitly enabled extensions such as Zca/Zcf/Zcd instead of their
4
super extensions can simplify the extension related check. However, they
5
may have higher priv version than their super extensions. So we should mask
6
them in the isa_string based on priv version to make them invisible to user
7
if the specified priv version is lower than their minimal priv version.
8
9
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
10
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
11
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
12
Acked-by: Alistair Francis <alistair.francis@wdc.com>
13
Message-Id: <20230517135714.211809-6-dbarboza@ventanamicro.com>
14
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
15
---
16
target/riscv/cpu.c | 3 ++-
17
1 file changed, 2 insertions(+), 1 deletion(-)
18
19
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/target/riscv/cpu.c
22
+++ b/target/riscv/cpu.c
23
@@ -XXX,XX +XXX,XX @@ static void riscv_isa_string_ext(RISCVCPU *cpu, char **isa_str,
24
int i;
25
26
for (i = 0; i < ARRAY_SIZE(isa_edata_arr); i++) {
27
- if (isa_ext_is_enabled(cpu, &isa_edata_arr[i])) {
28
+ if (cpu->env.priv_ver >= isa_edata_arr[i].min_version &&
29
+ isa_ext_is_enabled(cpu, &isa_edata_arr[i])) {
30
new = g_strconcat(old, "_", isa_edata_arr[i].name, NULL);
31
g_free(old);
32
old = new;
33
--
34
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
Even though Zca/Zcf/Zcd can be included by C/F/D, however, their priv
4
version is higher than the priv version of C/F/D. So if we use check
5
for them instead of check for C/F/D totally, it will trigger new
6
problem when we try to disable the extensions based on the configured
7
priv version.
8
9
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
10
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
11
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
12
Message-Id: <20230517135714.211809-7-dbarboza@ventanamicro.com>
13
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
14
---
15
target/riscv/translate.c | 5 +++--
16
target/riscv/insn_trans/trans_rvd.c.inc | 12 +++++++-----
17
target/riscv/insn_trans/trans_rvf.c.inc | 14 ++++++++------
18
target/riscv/insn_trans/trans_rvi.c.inc | 5 +++--
19
4 files changed, 21 insertions(+), 15 deletions(-)
20
21
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
22
index XXXXXXX..XXXXXXX 100644
23
--- a/target/riscv/translate.c
24
+++ b/target/riscv/translate.c
25
@@ -XXX,XX +XXX,XX @@ static void gen_jal(DisasContext *ctx, int rd, target_ulong imm)
26
27
/* check misaligned: */
28
next_pc = ctx->base.pc_next + imm;
29
- if (!ctx->cfg_ptr->ext_zca) {
30
+ if (!has_ext(ctx, RVC) && !ctx->cfg_ptr->ext_zca) {
31
if ((next_pc & 0x3) != 0) {
32
gen_exception_inst_addr_mis(ctx);
33
return;
34
@@ -XXX,XX +XXX,XX @@ static void decode_opc(CPURISCVState *env, DisasContext *ctx, uint16_t opcode)
35
* The Zca extension is added as way to refer to instructions in the C
36
* extension that do not include the floating-point loads and stores
37
*/
38
- if (ctx->cfg_ptr->ext_zca && decode_insn16(ctx, opcode)) {
39
+ if ((has_ext(ctx, RVC) || ctx->cfg_ptr->ext_zca) &&
40
+ decode_insn16(ctx, opcode)) {
41
return;
42
}
43
} else {
44
diff --git a/target/riscv/insn_trans/trans_rvd.c.inc b/target/riscv/insn_trans/trans_rvd.c.inc
45
index XXXXXXX..XXXXXXX 100644
46
--- a/target/riscv/insn_trans/trans_rvd.c.inc
47
+++ b/target/riscv/insn_trans/trans_rvd.c.inc
48
@@ -XXX,XX +XXX,XX @@
49
} \
50
} while (0)
51
52
-#define REQUIRE_ZCD(ctx) do { \
53
- if (!ctx->cfg_ptr->ext_zcd) { \
54
- return false; \
55
+#define REQUIRE_ZCD_OR_DC(ctx) do { \
56
+ if (!ctx->cfg_ptr->ext_zcd) { \
57
+ if (!has_ext(ctx, RVD) || !has_ext(ctx, RVC)) { \
58
+ return false; \
59
+ } \
60
} \
61
} while (0)
62
63
@@ -XXX,XX +XXX,XX @@ static bool trans_fsd(DisasContext *ctx, arg_fsd *a)
64
65
static bool trans_c_fld(DisasContext *ctx, arg_fld *a)
66
{
67
- REQUIRE_ZCD(ctx);
68
+ REQUIRE_ZCD_OR_DC(ctx);
69
return trans_fld(ctx, a);
70
}
71
72
static bool trans_c_fsd(DisasContext *ctx, arg_fsd *a)
73
{
74
- REQUIRE_ZCD(ctx);
75
+ REQUIRE_ZCD_OR_DC(ctx);
76
return trans_fsd(ctx, a);
77
}
78
79
diff --git a/target/riscv/insn_trans/trans_rvf.c.inc b/target/riscv/insn_trans/trans_rvf.c.inc
80
index XXXXXXX..XXXXXXX 100644
81
--- a/target/riscv/insn_trans/trans_rvf.c.inc
82
+++ b/target/riscv/insn_trans/trans_rvf.c.inc
83
@@ -XXX,XX +XXX,XX @@
84
} \
85
} while (0)
86
87
-#define REQUIRE_ZCF(ctx) do { \
88
- if (!ctx->cfg_ptr->ext_zcf) { \
89
- return false; \
90
- } \
91
+#define REQUIRE_ZCF_OR_FC(ctx) do { \
92
+ if (!ctx->cfg_ptr->ext_zcf) { \
93
+ if (!has_ext(ctx, RVF) || !has_ext(ctx, RVC)) { \
94
+ return false; \
95
+ } \
96
+ } \
97
} while (0)
98
99
static bool trans_flw(DisasContext *ctx, arg_flw *a)
100
@@ -XXX,XX +XXX,XX @@ static bool trans_fsw(DisasContext *ctx, arg_fsw *a)
101
102
static bool trans_c_flw(DisasContext *ctx, arg_flw *a)
103
{
104
- REQUIRE_ZCF(ctx);
105
+ REQUIRE_ZCF_OR_FC(ctx);
106
return trans_flw(ctx, a);
107
}
108
109
static bool trans_c_fsw(DisasContext *ctx, arg_fsw *a)
110
{
111
- REQUIRE_ZCF(ctx);
112
+ REQUIRE_ZCF_OR_FC(ctx);
113
return trans_fsw(ctx, a);
114
}
115
116
diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_trans/trans_rvi.c.inc
117
index XXXXXXX..XXXXXXX 100644
118
--- a/target/riscv/insn_trans/trans_rvi.c.inc
119
+++ b/target/riscv/insn_trans/trans_rvi.c.inc
120
@@ -XXX,XX +XXX,XX @@ static bool trans_jalr(DisasContext *ctx, arg_jalr *a)
121
tcg_gen_andi_tl(cpu_pc, cpu_pc, (target_ulong)-2);
122
123
gen_set_pc(ctx, cpu_pc);
124
- if (!ctx->cfg_ptr->ext_zca) {
125
+ if (!has_ext(ctx, RVC) && !ctx->cfg_ptr->ext_zca) {
126
TCGv t0 = tcg_temp_new();
127
128
misaligned = gen_new_label();
129
@@ -XXX,XX +XXX,XX @@ static bool gen_branch(DisasContext *ctx, arg_b *a, TCGCond cond)
130
131
gen_set_label(l); /* branch taken */
132
133
- if (!ctx->cfg_ptr->ext_zca && ((ctx->base.pc_next + a->imm) & 0x3)) {
134
+ if (!has_ext(ctx, RVC) && !ctx->cfg_ptr->ext_zca &&
135
+ ((ctx->base.pc_next + a->imm) & 0x3)) {
136
/* misaligned */
137
gen_exception_inst_addr_mis(ctx);
138
} else {
139
--
140
2.40.1
diff view generated by jsdifflib
New patch
1
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
1
2
3
We're doing env->priv_spec validation and assignment at the start of
4
riscv_cpu_realize(), which is fine, but then we're doing a force disable
5
on extensions that aren't compatible with the priv version.
6
7
This second step is being done too early. The disabled extensions might be
8
re-enabled again in riscv_cpu_validate_set_extensions() by accident. A
9
better place to put this code is at the end of
10
riscv_cpu_validate_set_extensions() after all the validations are
11
completed.
12
13
Add a new helper, riscv_cpu_disable_priv_spec_isa_exts(), to disable the
14
extesions after the validation is done. While we're at it, create a
15
riscv_cpu_validate_priv_spec() helper to host all env->priv_spec related
16
validation to unclog riscv_cpu_realize a bit.
17
18
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
19
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
20
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
21
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
22
Message-Id: <20230517135714.211809-8-dbarboza@ventanamicro.com>
23
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
24
---
25
target/riscv/cpu.c | 91 ++++++++++++++++++++++++++++------------------
26
1 file changed, 56 insertions(+), 35 deletions(-)
27
28
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/target/riscv/cpu.c
31
+++ b/target/riscv/cpu.c
32
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_validate_v(CPURISCVState *env, RISCVCPUConfig *cfg,
33
env->vext_ver = vext_version;
34
}
35
36
+static void riscv_cpu_validate_priv_spec(RISCVCPU *cpu, Error **errp)
37
+{
38
+ CPURISCVState *env = &cpu->env;
39
+ int priv_version = -1;
40
+
41
+ if (cpu->cfg.priv_spec) {
42
+ if (!g_strcmp0(cpu->cfg.priv_spec, "v1.12.0")) {
43
+ priv_version = PRIV_VERSION_1_12_0;
44
+ } else if (!g_strcmp0(cpu->cfg.priv_spec, "v1.11.0")) {
45
+ priv_version = PRIV_VERSION_1_11_0;
46
+ } else if (!g_strcmp0(cpu->cfg.priv_spec, "v1.10.0")) {
47
+ priv_version = PRIV_VERSION_1_10_0;
48
+ } else {
49
+ error_setg(errp,
50
+ "Unsupported privilege spec version '%s'",
51
+ cpu->cfg.priv_spec);
52
+ return;
53
+ }
54
+
55
+ env->priv_ver = priv_version;
56
+ }
57
+}
58
+
59
+static void riscv_cpu_disable_priv_spec_isa_exts(RISCVCPU *cpu)
60
+{
61
+ CPURISCVState *env = &cpu->env;
62
+ int i;
63
+
64
+ /* Force disable extensions if priv spec version does not match */
65
+ for (i = 0; i < ARRAY_SIZE(isa_edata_arr); i++) {
66
+ if (isa_ext_is_enabled(cpu, &isa_edata_arr[i]) &&
67
+ (env->priv_ver < isa_edata_arr[i].min_version)) {
68
+ isa_ext_update_enabled(cpu, &isa_edata_arr[i], false);
69
+#ifndef CONFIG_USER_ONLY
70
+ warn_report("disabling %s extension for hart 0x" TARGET_FMT_lx
71
+ " because privilege spec version does not match",
72
+ isa_edata_arr[i].name, env->mhartid);
73
+#else
74
+ warn_report("disabling %s extension because "
75
+ "privilege spec version does not match",
76
+ isa_edata_arr[i].name);
77
+#endif
78
+ }
79
+ }
80
+}
81
+
82
/*
83
* Check consistency between chosen extensions while setting
84
* cpu->cfg accordingly.
85
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
86
cpu->cfg.ext_zksed = true;
87
cpu->cfg.ext_zksh = true;
88
}
89
+
90
+ /*
91
+ * Disable isa extensions based on priv spec after we
92
+ * validated and set everything we need.
93
+ */
94
+ riscv_cpu_disable_priv_spec_isa_exts(cpu);
95
}
96
97
#ifndef CONFIG_USER_ONLY
98
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
99
CPURISCVState *env = &cpu->env;
100
RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(dev);
101
CPUClass *cc = CPU_CLASS(mcc);
102
- int i, priv_version = -1;
103
Error *local_err = NULL;
104
105
cpu_exec_realizefn(cs, &local_err);
106
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
107
return;
108
}
109
110
- if (cpu->cfg.priv_spec) {
111
- if (!g_strcmp0(cpu->cfg.priv_spec, "v1.12.0")) {
112
- priv_version = PRIV_VERSION_1_12_0;
113
- } else if (!g_strcmp0(cpu->cfg.priv_spec, "v1.11.0")) {
114
- priv_version = PRIV_VERSION_1_11_0;
115
- } else if (!g_strcmp0(cpu->cfg.priv_spec, "v1.10.0")) {
116
- priv_version = PRIV_VERSION_1_10_0;
117
- } else {
118
- error_setg(errp,
119
- "Unsupported privilege spec version '%s'",
120
- cpu->cfg.priv_spec);
121
- return;
122
- }
123
- }
124
-
125
- if (priv_version >= PRIV_VERSION_1_10_0) {
126
- env->priv_ver = priv_version;
127
+ riscv_cpu_validate_priv_spec(cpu, &local_err);
128
+ if (local_err != NULL) {
129
+ error_propagate(errp, local_err);
130
+ return;
131
}
132
133
riscv_cpu_validate_misa_priv(env, &local_err);
134
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
135
return;
136
}
137
138
- /* Force disable extensions if priv spec version does not match */
139
- for (i = 0; i < ARRAY_SIZE(isa_edata_arr); i++) {
140
- if (isa_ext_is_enabled(cpu, &isa_edata_arr[i]) &&
141
- (env->priv_ver < isa_edata_arr[i].min_version)) {
142
- isa_ext_update_enabled(cpu, &isa_edata_arr[i], false);
143
-#ifndef CONFIG_USER_ONLY
144
- warn_report("disabling %s extension for hart 0x" TARGET_FMT_lx
145
- " because privilege spec version does not match",
146
- isa_edata_arr[i].name, env->mhartid);
147
-#else
148
- warn_report("disabling %s extension because "
149
- "privilege spec version does not match",
150
- isa_edata_arr[i].name);
151
-#endif
152
- }
153
- }
154
-
155
if (cpu->cfg.epmp && !cpu->cfg.pmp) {
156
/*
157
* Enhanced PMP should only be available
158
--
159
2.40.1
diff view generated by jsdifflib
New patch
1
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
1
2
3
Let's remove more code that is open coded in riscv_cpu_realize() and put
4
it into a helper. Let's also add an error message instead of just
5
asserting out if env->misa_mxl_max != env->misa_mlx.
6
7
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
8
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
9
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
11
Message-Id: <20230517135714.211809-9-dbarboza@ventanamicro.com>
12
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
13
---
14
target/riscv/cpu.c | 50 ++++++++++++++++++++++++++++++----------------
15
1 file changed, 33 insertions(+), 17 deletions(-)
16
17
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/target/riscv/cpu.c
20
+++ b/target/riscv/cpu.c
21
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_disable_priv_spec_isa_exts(RISCVCPU *cpu)
22
}
23
}
24
25
+static void riscv_cpu_validate_misa_mxl(RISCVCPU *cpu, Error **errp)
26
+{
27
+ RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cpu);
28
+ CPUClass *cc = CPU_CLASS(mcc);
29
+ CPURISCVState *env = &cpu->env;
30
+
31
+ /* Validate that MISA_MXL is set properly. */
32
+ switch (env->misa_mxl_max) {
33
+#ifdef TARGET_RISCV64
34
+ case MXL_RV64:
35
+ case MXL_RV128:
36
+ cc->gdb_core_xml_file = "riscv-64bit-cpu.xml";
37
+ break;
38
+#endif
39
+ case MXL_RV32:
40
+ cc->gdb_core_xml_file = "riscv-32bit-cpu.xml";
41
+ break;
42
+ default:
43
+ g_assert_not_reached();
44
+ }
45
+
46
+ if (env->misa_mxl_max != env->misa_mxl) {
47
+ error_setg(errp, "misa_mxl_max must be equal to misa_mxl");
48
+ return;
49
+ }
50
+}
51
+
52
/*
53
* Check consistency between chosen extensions while setting
54
* cpu->cfg accordingly.
55
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
56
RISCVCPU *cpu = RISCV_CPU(dev);
57
CPURISCVState *env = &cpu->env;
58
RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(dev);
59
- CPUClass *cc = CPU_CLASS(mcc);
60
Error *local_err = NULL;
61
62
cpu_exec_realizefn(cs, &local_err);
63
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
64
return;
65
}
66
67
+ riscv_cpu_validate_misa_mxl(cpu, &local_err);
68
+ if (local_err != NULL) {
69
+ error_propagate(errp, local_err);
70
+ return;
71
+ }
72
+
73
riscv_cpu_validate_priv_spec(cpu, &local_err);
74
if (local_err != NULL) {
75
error_propagate(errp, local_err);
76
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
77
}
78
#endif /* CONFIG_USER_ONLY */
79
80
- /* Validate that MISA_MXL is set properly. */
81
- switch (env->misa_mxl_max) {
82
-#ifdef TARGET_RISCV64
83
- case MXL_RV64:
84
- case MXL_RV128:
85
- cc->gdb_core_xml_file = "riscv-64bit-cpu.xml";
86
- break;
87
-#endif
88
- case MXL_RV32:
89
- cc->gdb_core_xml_file = "riscv-32bit-cpu.xml";
90
- break;
91
- default:
92
- g_assert_not_reached();
93
- }
94
- assert(env->misa_mxl_max == env->misa_mxl);
95
-
96
riscv_cpu_validate_set_extensions(cpu, &local_err);
97
if (local_err != NULL) {
98
error_propagate(errp, local_err);
99
--
100
2.40.1
diff view generated by jsdifflib
New patch
1
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
1
2
3
There is no need to init timers if we're not even sure that our
4
extensions are valid. Execute riscv_cpu_validate_set_extensions() before
5
riscv_timer_init().
6
7
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
8
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
9
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
11
Message-Id: <20230517135714.211809-10-dbarboza@ventanamicro.com>
12
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
13
---
14
target/riscv/cpu.c | 11 ++++-------
15
1 file changed, 4 insertions(+), 7 deletions(-)
16
17
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/target/riscv/cpu.c
20
+++ b/target/riscv/cpu.c
21
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
22
return;
23
}
24
25
-
26
-#ifndef CONFIG_USER_ONLY
27
- if (cpu->cfg.ext_sstc) {
28
- riscv_timer_init(cpu);
29
- }
30
-#endif /* CONFIG_USER_ONLY */
31
-
32
riscv_cpu_validate_set_extensions(cpu, &local_err);
33
if (local_err != NULL) {
34
error_propagate(errp, local_err);
35
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
36
}
37
38
#ifndef CONFIG_USER_ONLY
39
+ if (cpu->cfg.ext_sstc) {
40
+ riscv_timer_init(cpu);
41
+ }
42
+
43
if (cpu->cfg.pmu_num) {
44
if (!riscv_pmu_init(cpu, cpu->cfg.pmu_num) && cpu->cfg.ext_sscofpmf) {
45
cpu->pmu_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
46
--
47
2.40.1
diff view generated by jsdifflib
New patch
1
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
1
2
3
We have 4 config settings being done in riscv_cpu_init(): ext_ifencei,
4
ext_icsr, mmu and pmp. This is also the constructor of the "riscv-cpu"
5
device, which happens to be the parent device of every RISC-V cpu.
6
7
The result is that these 4 configs are being set every time, and every
8
other CPU should always account for them. CPUs such as sifive_e need to
9
disable settings that aren't enabled simply because the parent class
10
happens to be enabling it.
11
12
Moving all configurations from the parent class to each CPU will
13
centralize the config of each CPU into its own init(), which is clearer
14
than having to account to whatever happens to be set in the parent
15
device. These settings are also being set in register_cpu_props() when
16
no 'misa_ext' is set, so for these CPUs we don't need changes. Named
17
CPUs will receive all cfgs that the parent were setting into their
18
init().
19
20
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
21
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
22
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
23
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
24
Message-Id: <20230517135714.211809-11-dbarboza@ventanamicro.com>
25
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
26
---
27
target/riscv/cpu.c | 59 ++++++++++++++++++++++++++++++++++++----------
28
1 file changed, 47 insertions(+), 12 deletions(-)
29
30
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
31
index XXXXXXX..XXXXXXX 100644
32
--- a/target/riscv/cpu.c
33
+++ b/target/riscv/cpu.c
34
@@ -XXX,XX +XXX,XX @@ static void set_satp_mode_default_map(RISCVCPU *cpu)
35
36
static void riscv_any_cpu_init(Object *obj)
37
{
38
- CPURISCVState *env = &RISCV_CPU(obj)->env;
39
+ RISCVCPU *cpu = RISCV_CPU(obj);
40
+ CPURISCVState *env = &cpu->env;
41
#if defined(TARGET_RISCV32)
42
set_misa(env, MXL_RV32, RVI | RVM | RVA | RVF | RVD | RVC | RVU);
43
#elif defined(TARGET_RISCV64)
44
@@ -XXX,XX +XXX,XX @@ static void riscv_any_cpu_init(Object *obj)
45
#endif
46
47
env->priv_ver = PRIV_VERSION_LATEST;
48
+
49
+ /* inherited from parent obj via riscv_cpu_init() */
50
+ cpu->cfg.ext_ifencei = true;
51
+ cpu->cfg.ext_icsr = true;
52
+ cpu->cfg.mmu = true;
53
+ cpu->cfg.pmp = true;
54
}
55
56
#if defined(TARGET_RISCV64)
57
@@ -XXX,XX +XXX,XX @@ static void rv64_base_cpu_init(Object *obj)
58
59
static void rv64_sifive_u_cpu_init(Object *obj)
60
{
61
- CPURISCVState *env = &RISCV_CPU(obj)->env;
62
+ RISCVCPU *cpu = RISCV_CPU(obj);
63
+ CPURISCVState *env = &cpu->env;
64
set_misa(env, MXL_RV64, RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU);
65
env->priv_ver = PRIV_VERSION_1_10_0;
66
#ifndef CONFIG_USER_ONLY
67
set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV39);
68
#endif
69
+
70
+ /* inherited from parent obj via riscv_cpu_init() */
71
+ cpu->cfg.ext_ifencei = true;
72
+ cpu->cfg.ext_icsr = true;
73
+ cpu->cfg.mmu = true;
74
+ cpu->cfg.pmp = true;
75
}
76
77
static void rv64_sifive_e_cpu_init(Object *obj)
78
@@ -XXX,XX +XXX,XX @@ static void rv64_sifive_e_cpu_init(Object *obj)
79
80
set_misa(env, MXL_RV64, RVI | RVM | RVA | RVC | RVU);
81
env->priv_ver = PRIV_VERSION_1_10_0;
82
- cpu->cfg.mmu = false;
83
#ifndef CONFIG_USER_ONLY
84
set_satp_mode_max_supported(cpu, VM_1_10_MBARE);
85
#endif
86
+
87
+ /* inherited from parent obj via riscv_cpu_init() */
88
+ cpu->cfg.ext_ifencei = true;
89
+ cpu->cfg.ext_icsr = true;
90
+ cpu->cfg.pmp = true;
91
}
92
93
static void rv64_thead_c906_cpu_init(Object *obj)
94
@@ -XXX,XX +XXX,XX @@ static void rv64_thead_c906_cpu_init(Object *obj)
95
#ifndef CONFIG_USER_ONLY
96
set_satp_mode_max_supported(cpu, VM_1_10_SV39);
97
#endif
98
+
99
+ /* inherited from parent obj via riscv_cpu_init() */
100
+ cpu->cfg.pmp = true;
101
}
102
103
static void rv64_veyron_v1_cpu_init(Object *obj)
104
@@ -XXX,XX +XXX,XX @@ static void rv32_base_cpu_init(Object *obj)
105
106
static void rv32_sifive_u_cpu_init(Object *obj)
107
{
108
- CPURISCVState *env = &RISCV_CPU(obj)->env;
109
+ RISCVCPU *cpu = RISCV_CPU(obj);
110
+ CPURISCVState *env = &cpu->env;
111
set_misa(env, MXL_RV32, RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU);
112
env->priv_ver = PRIV_VERSION_1_10_0;
113
#ifndef CONFIG_USER_ONLY
114
set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV32);
115
#endif
116
+
117
+ /* inherited from parent obj via riscv_cpu_init() */
118
+ cpu->cfg.ext_ifencei = true;
119
+ cpu->cfg.ext_icsr = true;
120
+ cpu->cfg.mmu = true;
121
+ cpu->cfg.pmp = true;
122
}
123
124
static void rv32_sifive_e_cpu_init(Object *obj)
125
@@ -XXX,XX +XXX,XX @@ static void rv32_sifive_e_cpu_init(Object *obj)
126
127
set_misa(env, MXL_RV32, RVI | RVM | RVA | RVC | RVU);
128
env->priv_ver = PRIV_VERSION_1_10_0;
129
- cpu->cfg.mmu = false;
130
#ifndef CONFIG_USER_ONLY
131
set_satp_mode_max_supported(cpu, VM_1_10_MBARE);
132
#endif
133
+
134
+ /* inherited from parent obj via riscv_cpu_init() */
135
+ cpu->cfg.ext_ifencei = true;
136
+ cpu->cfg.ext_icsr = true;
137
+ cpu->cfg.pmp = true;
138
}
139
140
static void rv32_ibex_cpu_init(Object *obj)
141
@@ -XXX,XX +XXX,XX @@ static void rv32_ibex_cpu_init(Object *obj)
142
143
set_misa(env, MXL_RV32, RVI | RVM | RVC | RVU);
144
env->priv_ver = PRIV_VERSION_1_11_0;
145
- cpu->cfg.mmu = false;
146
#ifndef CONFIG_USER_ONLY
147
set_satp_mode_max_supported(cpu, VM_1_10_MBARE);
148
#endif
149
cpu->cfg.epmp = true;
150
+
151
+ /* inherited from parent obj via riscv_cpu_init() */
152
+ cpu->cfg.ext_ifencei = true;
153
+ cpu->cfg.ext_icsr = true;
154
+ cpu->cfg.pmp = true;
155
}
156
157
static void rv32_imafcu_nommu_cpu_init(Object *obj)
158
@@ -XXX,XX +XXX,XX @@ static void rv32_imafcu_nommu_cpu_init(Object *obj)
159
160
set_misa(env, MXL_RV32, RVI | RVM | RVA | RVF | RVC | RVU);
161
env->priv_ver = PRIV_VERSION_1_10_0;
162
- cpu->cfg.mmu = false;
163
#ifndef CONFIG_USER_ONLY
164
set_satp_mode_max_supported(cpu, VM_1_10_MBARE);
165
#endif
166
+
167
+ /* inherited from parent obj via riscv_cpu_init() */
168
+ cpu->cfg.ext_ifencei = true;
169
+ cpu->cfg.ext_icsr = true;
170
+ cpu->cfg.pmp = true;
171
}
172
#endif
173
174
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_init(Object *obj)
175
{
176
RISCVCPU *cpu = RISCV_CPU(obj);
177
178
- cpu->cfg.ext_ifencei = true;
179
- cpu->cfg.ext_icsr = true;
180
- cpu->cfg.mmu = true;
181
- cpu->cfg.pmp = true;
182
-
183
cpu_set_cpustate_pointers(cpu);
184
185
#ifndef CONFIG_USER_ONLY
186
--
187
2.40.1
diff view generated by jsdifflib
New patch
1
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
1
2
3
write_misa() must use as much common logic as possible. We want to open
4
code just the bits that are exclusive to the CSR write operation and TCG
5
internals.
6
7
Our validation is done with riscv_cpu_validate_set_extensions(), but we
8
need a small tweak first. When enabling RVG we're doing:
9
10
env->misa_ext |= RVI | RVM | RVA | RVF | RVD;
11
env->misa_ext_mask = env->misa_ext;
12
13
This works fine for realize() time but this can potentially overwrite
14
env->misa_ext_mask if we reutilize the function for write_misa().
15
16
Instead of doing misa_ext_mask = misa_ext, sum up the RVG extensions in
17
misa_ext_mask as well. This won't change realize() time behavior
18
(misa_ext_mask will be == misa_ext) and will ensure that write_misa()
19
won't change misa_ext_mask by accident.
20
21
After that, rewrite write_misa() to work as follows:
22
23
- mask the write using misa_ext_mask to avoid enabling unsupported
24
extensions;
25
26
- suppress RVC if the next insn isn't aligned;
27
28
- disable RVG if any of RVG dependencies are being disabled by the user;
29
30
- assign env->misa_ext and run riscv_cpu_validate_set_extensions(). On
31
error, rollback env->misa_ext to its original value, logging a
32
GUEST_ERROR to inform the user about the failed write;
33
34
- handle RVF and MSTATUS_FS and continue as usual.
35
36
Let's keep write_misa() as experimental for now until this logic gains
37
enough mileage.
38
39
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
40
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
41
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
42
Message-Id: <20230517135714.211809-12-dbarboza@ventanamicro.com>
43
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
44
---
45
target/riscv/cpu.h | 1 +
46
target/riscv/cpu.c | 4 ++--
47
target/riscv/csr.c | 51 ++++++++++++++++++++++------------------------
48
3 files changed, 27 insertions(+), 29 deletions(-)
49
50
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
51
index XXXXXXX..XXXXXXX 100644
52
--- a/target/riscv/cpu.h
53
+++ b/target/riscv/cpu.h
54
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
55
bool probe, uintptr_t retaddr);
56
char *riscv_isa_string(RISCVCPU *cpu);
57
void riscv_cpu_list(void);
58
+void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp);
59
60
#define cpu_list riscv_cpu_list
61
#define cpu_mmu_index riscv_cpu_mmu_index
62
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
63
index XXXXXXX..XXXXXXX 100644
64
--- a/target/riscv/cpu.c
65
+++ b/target/riscv/cpu.c
66
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_validate_misa_mxl(RISCVCPU *cpu, Error **errp)
67
* Check consistency between chosen extensions while setting
68
* cpu->cfg accordingly.
69
*/
70
-static void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
71
+void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
72
{
73
CPURISCVState *env = &cpu->env;
74
Error *local_err = NULL;
75
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
76
cpu->cfg.ext_ifencei = true;
77
78
env->misa_ext |= RVI | RVM | RVA | RVF | RVD;
79
- env->misa_ext_mask = env->misa_ext;
80
+ env->misa_ext_mask |= RVI | RVM | RVA | RVF | RVD;
81
}
82
83
if (riscv_has_ext(env, RVI) && riscv_has_ext(env, RVE)) {
84
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
85
index XXXXXXX..XXXXXXX 100644
86
--- a/target/riscv/csr.c
87
+++ b/target/riscv/csr.c
88
@@ -XXX,XX +XXX,XX @@ static RISCVException read_misa(CPURISCVState *env, int csrno,
89
static RISCVException write_misa(CPURISCVState *env, int csrno,
90
target_ulong val)
91
{
92
+ RISCVCPU *cpu = env_archcpu(env);
93
+ uint32_t orig_misa_ext = env->misa_ext;
94
+ Error *local_err = NULL;
95
+
96
if (!riscv_cpu_cfg(env)->misa_w) {
97
/* drop write to misa */
98
return RISCV_EXCP_NONE;
99
}
100
101
- /* 'I' or 'E' must be present */
102
- if (!(val & (RVI | RVE))) {
103
- /* It is not, drop write to misa */
104
- return RISCV_EXCP_NONE;
105
- }
106
-
107
- /* 'E' excludes all other extensions */
108
- if (val & RVE) {
109
- /*
110
- * when we support 'E' we can do "val = RVE;" however
111
- * for now we just drop writes if 'E' is present.
112
- */
113
- return RISCV_EXCP_NONE;
114
- }
115
-
116
- /*
117
- * misa.MXL writes are not supported by QEMU.
118
- * Drop writes to those bits.
119
- */
120
-
121
/* Mask extensions that are not supported by this hart */
122
val &= env->misa_ext_mask;
123
124
- /* 'D' depends on 'F', so clear 'D' if 'F' is not present */
125
- if ((val & RVD) && !(val & RVF)) {
126
- val &= ~RVD;
127
- }
128
-
129
/*
130
* Suppress 'C' if next instruction is not aligned
131
* TODO: this should check next_pc
132
@@ -XXX,XX +XXX,XX @@ static RISCVException write_misa(CPURISCVState *env, int csrno,
133
val &= ~RVC;
134
}
135
136
+ /* Disable RVG if any of its dependencies are disabled */
137
+ if (!(val & RVI && val & RVM && val & RVA &&
138
+ val & RVF && val & RVD)) {
139
+ val &= ~RVG;
140
+ }
141
+
142
/* If nothing changed, do nothing. */
143
if (val == env->misa_ext) {
144
return RISCV_EXCP_NONE;
145
}
146
147
- if (!(val & RVF)) {
148
+ env->misa_ext = val;
149
+ riscv_cpu_validate_set_extensions(cpu, &local_err);
150
+ if (local_err != NULL) {
151
+ /* Rollback on validation error */
152
+ qemu_log_mask(LOG_GUEST_ERROR, "Unable to write MISA ext value "
153
+ "0x%x, keeping existing MISA ext 0x%x\n",
154
+ env->misa_ext, orig_misa_ext);
155
+
156
+ env->misa_ext = orig_misa_ext;
157
+
158
+ return RISCV_EXCP_NONE;
159
+ }
160
+
161
+ if (!(env->misa_ext & RVF)) {
162
env->mstatus &= ~MSTATUS_FS;
163
}
164
165
/* flush translation cache */
166
tb_flush(env_cpu(env));
167
- env->misa_ext = val;
168
env->xl = riscv_cpu_mxl(env);
169
return RISCV_EXCP_NONE;
170
}
171
--
172
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
PMP entries before (including) the matched PMP entry may only cover partial
4
of the TLB page, and this may split the page into regions with different
5
permissions. Such as for PMP0 (0x80000008~0x8000000F, R) and PMP1 (0x80000000~
6
0x80000FFF, RWX), write access to 0x80000000 will match PMP1. However we cannot
7
cache the translation result in the TLB since this will make the write access
8
to 0x80000008 bypass the check of PMP0. So we should check all of them instead
9
of the matched PMP entry in pmp_get_tlb_size() and set the tlb_size to 1 in
10
this case.
11
Set tlb_size to TARGET_PAGE_SIZE if PMP is not support or there is no PMP rules.
12
13
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
14
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
15
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
16
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
17
Message-Id: <20230517091519.34439-2-liweiwei@iscas.ac.cn>
18
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
19
---
20
target/riscv/pmp.h | 3 +-
21
target/riscv/cpu_helper.c | 7 ++--
22
target/riscv/pmp.c | 69 ++++++++++++++++++++++++++++++---------
23
3 files changed, 57 insertions(+), 22 deletions(-)
24
25
diff --git a/target/riscv/pmp.h b/target/riscv/pmp.h
26
index XXXXXXX..XXXXXXX 100644
27
--- a/target/riscv/pmp.h
28
+++ b/target/riscv/pmp.h
29
@@ -XXX,XX +XXX,XX @@ int pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
30
target_ulong size, pmp_priv_t privs,
31
pmp_priv_t *allowed_privs,
32
target_ulong mode);
33
-target_ulong pmp_get_tlb_size(CPURISCVState *env, int pmp_index,
34
- target_ulong tlb_sa, target_ulong tlb_ea);
35
+target_ulong pmp_get_tlb_size(CPURISCVState *env, target_ulong addr);
36
void pmp_update_rule_addr(CPURISCVState *env, uint32_t pmp_index);
37
void pmp_update_rule_nums(CPURISCVState *env);
38
uint32_t pmp_get_num_rules(CPURISCVState *env);
39
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
40
index XXXXXXX..XXXXXXX 100644
41
--- a/target/riscv/cpu_helper.c
42
+++ b/target/riscv/cpu_helper.c
43
@@ -XXX,XX +XXX,XX @@ static int get_physical_address_pmp(CPURISCVState *env, int *prot,
44
}
45
46
*prot = pmp_priv_to_page_prot(pmp_priv);
47
- if ((tlb_size != NULL) && pmp_index != MAX_RISCV_PMPS) {
48
- target_ulong tlb_sa = addr & ~(TARGET_PAGE_SIZE - 1);
49
- target_ulong tlb_ea = tlb_sa + TARGET_PAGE_SIZE - 1;
50
-
51
- *tlb_size = pmp_get_tlb_size(env, pmp_index, tlb_sa, tlb_ea);
52
+ if (tlb_size != NULL) {
53
+ *tlb_size = pmp_get_tlb_size(env, addr);
54
}
55
56
return TRANSLATE_SUCCESS;
57
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
58
index XXXXXXX..XXXXXXX 100644
59
--- a/target/riscv/pmp.c
60
+++ b/target/riscv/pmp.c
61
@@ -XXX,XX +XXX,XX @@ target_ulong mseccfg_csr_read(CPURISCVState *env)
62
}
63
64
/*
65
- * Calculate the TLB size if the start address or the end address of
66
- * PMP entry is presented in the TLB page.
67
+ * Calculate the TLB size.
68
+ * It's possible that PMP regions only cover partial of the TLB page, and
69
+ * this may split the page into regions with different permissions.
70
+ * For example if PMP0 is (0x80000008~0x8000000F, R) and PMP1 is (0x80000000
71
+ * ~0x80000FFF, RWX), then region 0x80000008~0x8000000F has R permission, and
72
+ * the other regions in this page have RWX permissions.
73
+ * A write access to 0x80000000 will match PMP1. However we cannot cache the
74
+ * translation result in the TLB since this will make the write access to
75
+ * 0x80000008 bypass the check of PMP0.
76
+ * To avoid this we return a size of 1 (which means no caching) if the PMP
77
+ * region only covers partial of the TLB page.
78
*/
79
-target_ulong pmp_get_tlb_size(CPURISCVState *env, int pmp_index,
80
- target_ulong tlb_sa, target_ulong tlb_ea)
81
+target_ulong pmp_get_tlb_size(CPURISCVState *env, target_ulong addr)
82
{
83
- target_ulong pmp_sa = env->pmp_state.addr[pmp_index].sa;
84
- target_ulong pmp_ea = env->pmp_state.addr[pmp_index].ea;
85
+ target_ulong pmp_sa;
86
+ target_ulong pmp_ea;
87
+ target_ulong tlb_sa = addr & ~(TARGET_PAGE_SIZE - 1);
88
+ target_ulong tlb_ea = tlb_sa + TARGET_PAGE_SIZE - 1;
89
+ int i;
90
91
- if (pmp_sa <= tlb_sa && pmp_ea >= tlb_ea) {
92
+ /*
93
+ * If PMP is not supported or there are no PMP rules, the TLB page will not
94
+ * be split into regions with different permissions by PMP so we set the
95
+ * size to TARGET_PAGE_SIZE.
96
+ */
97
+ if (!riscv_cpu_cfg(env)->pmp || !pmp_get_num_rules(env)) {
98
return TARGET_PAGE_SIZE;
99
- } else {
100
+ }
101
+
102
+ for (i = 0; i < MAX_RISCV_PMPS; i++) {
103
+ if (pmp_get_a_field(env->pmp_state.pmp[i].cfg_reg) == PMP_AMATCH_OFF) {
104
+ continue;
105
+ }
106
+
107
+ pmp_sa = env->pmp_state.addr[i].sa;
108
+ pmp_ea = env->pmp_state.addr[i].ea;
109
+
110
/*
111
- * At this point we have a tlb_size that is the smallest possible size
112
- * That fits within a TARGET_PAGE_SIZE and the PMP region.
113
- *
114
- * If the size is less then TARGET_PAGE_SIZE we drop the size to 1.
115
- * This means the result isn't cached in the TLB and is only used for
116
- * a single translation.
117
+ * Only the first PMP entry that covers (whole or partial of) the TLB
118
+ * page really matters:
119
+ * If it covers the whole TLB page, set the size to TARGET_PAGE_SIZE,
120
+ * since the following PMP entries have lower priority and will not
121
+ * affect the permissions of the page.
122
+ * If it only covers partial of the TLB page, set the size to 1 since
123
+ * the allowed permissions of the region may be different from other
124
+ * region of the page.
125
*/
126
- return 1;
127
+ if (pmp_sa <= tlb_sa && pmp_ea >= tlb_ea) {
128
+ return TARGET_PAGE_SIZE;
129
+ } else if ((pmp_sa >= tlb_sa && pmp_sa <= tlb_ea) ||
130
+ (pmp_ea >= tlb_sa && pmp_ea <= tlb_ea)) {
131
+ return 1;
132
+ }
133
}
134
+
135
+ /*
136
+ * If no PMP entry matches the TLB page, the TLB page will also not be
137
+ * split into regions with different permissions by PMP so we set the size
138
+ * to TARGET_PAGE_SIZE.
139
+ */
140
+ return TARGET_PAGE_SIZE;
141
}
142
143
/*
144
--
145
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
pmp_get_tlb_size can be separated from get_physical_address_pmp and is only
4
needed when ret == TRANSLATE_SUCCESS.
5
6
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
7
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
8
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-Id: <20230517091519.34439-3-liweiwei@iscas.ac.cn>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
13
target/riscv/cpu_helper.c | 16 ++++++----------
14
1 file changed, 6 insertions(+), 10 deletions(-)
15
16
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/riscv/cpu_helper.c
19
+++ b/target/riscv/cpu_helper.c
20
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_set_mode(CPURISCVState *env, target_ulong newpriv)
21
*
22
* @env: CPURISCVState
23
* @prot: The returned protection attributes
24
- * @tlb_size: TLB page size containing addr. It could be modified after PMP
25
- * permission checking. NULL if not set TLB page for addr.
26
* @addr: The physical address to be checked permission
27
* @access_type: The type of MMU access
28
* @mode: Indicates current privilege level.
29
*/
30
-static int get_physical_address_pmp(CPURISCVState *env, int *prot,
31
- target_ulong *tlb_size, hwaddr addr,
32
+static int get_physical_address_pmp(CPURISCVState *env, int *prot, hwaddr addr,
33
int size, MMUAccessType access_type,
34
int mode)
35
{
36
@@ -XXX,XX +XXX,XX @@ static int get_physical_address_pmp(CPURISCVState *env, int *prot,
37
}
38
39
*prot = pmp_priv_to_page_prot(pmp_priv);
40
- if (tlb_size != NULL) {
41
- *tlb_size = pmp_get_tlb_size(env, addr);
42
- }
43
44
return TRANSLATE_SUCCESS;
45
}
46
@@ -XXX,XX +XXX,XX @@ restart:
47
}
48
49
int pmp_prot;
50
- int pmp_ret = get_physical_address_pmp(env, &pmp_prot, NULL, pte_addr,
51
+ int pmp_ret = get_physical_address_pmp(env, &pmp_prot, pte_addr,
52
sizeof(target_ulong),
53
MMU_DATA_LOAD, PRV_S);
54
if (pmp_ret != TRANSLATE_SUCCESS) {
55
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
56
prot &= prot2;
57
58
if (ret == TRANSLATE_SUCCESS) {
59
- ret = get_physical_address_pmp(env, &prot_pmp, &tlb_size, pa,
60
+ ret = get_physical_address_pmp(env, &prot_pmp, pa,
61
size, access_type, mode);
62
+ tlb_size = pmp_get_tlb_size(env, pa);
63
64
qemu_log_mask(CPU_LOG_MMU,
65
"%s PMP address=" HWADDR_FMT_plx " ret %d prot"
66
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
67
__func__, address, ret, pa, prot);
68
69
if (ret == TRANSLATE_SUCCESS) {
70
- ret = get_physical_address_pmp(env, &prot_pmp, &tlb_size, pa,
71
+ ret = get_physical_address_pmp(env, &prot_pmp, pa,
72
size, access_type, mode);
73
+ tlb_size = pmp_get_tlb_size(env, pa);
74
75
qemu_log_mask(CPU_LOG_MMU,
76
"%s PMP address=" HWADDR_FMT_plx " ret %d prot"
77
--
78
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
Return the result directly for short cut, since We needn't do the
4
following check on the PMP entries if there is no PMP rules.
5
6
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
7
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <20230517091519.34439-4-liweiwei@iscas.ac.cn>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
target/riscv/pmp.c | 1 +
13
1 file changed, 1 insertion(+)
14
15
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/pmp.c
18
+++ b/target/riscv/pmp.c
19
@@ -XXX,XX +XXX,XX @@ int pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
20
allowed_privs, mode)) {
21
ret = MAX_RISCV_PMPS;
22
}
23
+ return ret;
24
}
25
26
if (size == 0) {
27
--
28
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
We no longer need the pmp_index for matched PMP entry now.
4
5
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
6
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-Id: <20230517091519.34439-5-liweiwei@iscas.ac.cn>
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
---
11
target/riscv/pmp.h | 8 ++++----
12
target/riscv/cpu_helper.c | 8 ++++----
13
target/riscv/pmp.c | 32 +++++++++++++-------------------
14
3 files changed, 21 insertions(+), 27 deletions(-)
15
16
diff --git a/target/riscv/pmp.h b/target/riscv/pmp.h
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/riscv/pmp.h
19
+++ b/target/riscv/pmp.h
20
@@ -XXX,XX +XXX,XX @@ target_ulong mseccfg_csr_read(CPURISCVState *env);
21
void pmpaddr_csr_write(CPURISCVState *env, uint32_t addr_index,
22
target_ulong val);
23
target_ulong pmpaddr_csr_read(CPURISCVState *env, uint32_t addr_index);
24
-int pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
25
- target_ulong size, pmp_priv_t privs,
26
- pmp_priv_t *allowed_privs,
27
- target_ulong mode);
28
+bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
29
+ target_ulong size, pmp_priv_t privs,
30
+ pmp_priv_t *allowed_privs,
31
+ target_ulong mode);
32
target_ulong pmp_get_tlb_size(CPURISCVState *env, target_ulong addr);
33
void pmp_update_rule_addr(CPURISCVState *env, uint32_t pmp_index);
34
void pmp_update_rule_nums(CPURISCVState *env);
35
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
36
index XXXXXXX..XXXXXXX 100644
37
--- a/target/riscv/cpu_helper.c
38
+++ b/target/riscv/cpu_helper.c
39
@@ -XXX,XX +XXX,XX @@ static int get_physical_address_pmp(CPURISCVState *env, int *prot, hwaddr addr,
40
int mode)
41
{
42
pmp_priv_t pmp_priv;
43
- int pmp_index = -1;
44
+ bool pmp_has_privs;
45
46
if (!riscv_cpu_cfg(env)->pmp) {
47
*prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
48
return TRANSLATE_SUCCESS;
49
}
50
51
- pmp_index = pmp_hart_has_privs(env, addr, size, 1 << access_type,
52
- &pmp_priv, mode);
53
- if (pmp_index < 0) {
54
+ pmp_has_privs = pmp_hart_has_privs(env, addr, size, 1 << access_type,
55
+ &pmp_priv, mode);
56
+ if (!pmp_has_privs) {
57
*prot = 0;
58
return TRANSLATE_PMP_FAIL;
59
}
60
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
61
index XXXXXXX..XXXXXXX 100644
62
--- a/target/riscv/pmp.c
63
+++ b/target/riscv/pmp.c
64
@@ -XXX,XX +XXX,XX @@ static bool pmp_hart_has_privs_default(CPURISCVState *env, target_ulong addr,
65
66
/*
67
* Check if the address has required RWX privs to complete desired operation
68
- * Return PMP rule index if a pmp rule match
69
- * Return MAX_RISCV_PMPS if default match
70
- * Return negtive value if no match
71
+ * Return true if a pmp rule match or default match
72
+ * Return false if no match
73
*/
74
-int pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
75
- target_ulong size, pmp_priv_t privs,
76
- pmp_priv_t *allowed_privs, target_ulong mode)
77
+bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
78
+ target_ulong size, pmp_priv_t privs,
79
+ pmp_priv_t *allowed_privs, target_ulong mode)
80
{
81
int i = 0;
82
- int ret = -1;
83
+ bool ret = false;
84
int pmp_size = 0;
85
target_ulong s = 0;
86
target_ulong e = 0;
87
88
/* Short cut if no rules */
89
if (0 == pmp_get_num_rules(env)) {
90
- if (pmp_hart_has_privs_default(env, addr, size, privs,
91
- allowed_privs, mode)) {
92
- ret = MAX_RISCV_PMPS;
93
- }
94
- return ret;
95
+ return pmp_hart_has_privs_default(env, addr, size, privs,
96
+ allowed_privs, mode);
97
}
98
99
if (size == 0) {
100
@@ -XXX,XX +XXX,XX @@ int pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
101
if ((s + e) == 1) {
102
qemu_log_mask(LOG_GUEST_ERROR,
103
"pmp violation - access is partially inside\n");
104
- ret = -1;
105
+ ret = false;
106
break;
107
}
108
109
@@ -XXX,XX +XXX,XX @@ int pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
110
* defined with PMP must be used. We shouldn't fallback on
111
* finding default privileges.
112
*/
113
- ret = i;
114
+ ret = true;
115
break;
116
}
117
}
118
119
/* No rule matched */
120
- if (ret == -1) {
121
- if (pmp_hart_has_privs_default(env, addr, size, privs,
122
- allowed_privs, mode)) {
123
- ret = MAX_RISCV_PMPS;
124
- }
125
+ if (!ret) {
126
+ ret = pmp_hart_has_privs_default(env, addr, size, privs,
127
+ allowed_privs, mode);
128
}
129
130
return ret;
131
--
132
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
RLB/MML/MMWP bits in mseccfg CSR are introduced by Smepmp extension.
4
So they can only be writable and set to 1s when cfg.epmp is true.
5
Then we also need't check on epmp in pmp_hart_has_privs_default().
6
7
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
8
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-Id: <20230517091519.34439-6-liweiwei@iscas.ac.cn>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
13
target/riscv/pmp.c | 50 ++++++++++++++++++++++++----------------------
14
1 file changed, 26 insertions(+), 24 deletions(-)
15
16
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/riscv/pmp.c
19
+++ b/target/riscv/pmp.c
20
@@ -XXX,XX +XXX,XX @@ static bool pmp_hart_has_privs_default(CPURISCVState *env, target_ulong addr,
21
{
22
bool ret;
23
24
- if (riscv_cpu_cfg(env)->epmp) {
25
- if (MSECCFG_MMWP_ISSET(env)) {
26
- /*
27
- * The Machine Mode Whitelist Policy (mseccfg.MMWP) is set
28
- * so we default to deny all, even for M-mode.
29
- */
30
+ if (MSECCFG_MMWP_ISSET(env)) {
31
+ /*
32
+ * The Machine Mode Whitelist Policy (mseccfg.MMWP) is set
33
+ * so we default to deny all, even for M-mode.
34
+ */
35
+ *allowed_privs = 0;
36
+ return false;
37
+ } else if (MSECCFG_MML_ISSET(env)) {
38
+ /*
39
+ * The Machine Mode Lockdown (mseccfg.MML) bit is set
40
+ * so we can only execute code in M-mode with an applicable
41
+ * rule. Other modes are disabled.
42
+ */
43
+ if (mode == PRV_M && !(privs & PMP_EXEC)) {
44
+ ret = true;
45
+ *allowed_privs = PMP_READ | PMP_WRITE;
46
+ } else {
47
+ ret = false;
48
*allowed_privs = 0;
49
- return false;
50
- } else if (MSECCFG_MML_ISSET(env)) {
51
- /*
52
- * The Machine Mode Lockdown (mseccfg.MML) bit is set
53
- * so we can only execute code in M-mode with an applicable
54
- * rule. Other modes are disabled.
55
- */
56
- if (mode == PRV_M && !(privs & PMP_EXEC)) {
57
- ret = true;
58
- *allowed_privs = PMP_READ | PMP_WRITE;
59
- } else {
60
- ret = false;
61
- *allowed_privs = 0;
62
- }
63
-
64
- return ret;
65
}
66
+
67
+ return ret;
68
}
69
70
if (!riscv_cpu_cfg(env)->pmp || (mode == PRV_M)) {
71
@@ -XXX,XX +XXX,XX @@ void mseccfg_csr_write(CPURISCVState *env, target_ulong val)
72
}
73
}
74
75
- /* Sticky bits */
76
- val |= (env->mseccfg & (MSECCFG_MMWP | MSECCFG_MML));
77
+ if (riscv_cpu_cfg(env)->epmp) {
78
+ /* Sticky bits */
79
+ val |= (env->mseccfg & (MSECCFG_MMWP | MSECCFG_MML));
80
+ } else {
81
+ val &= ~(MSECCFG_MMWP | MSECCFG_MML | MSECCFG_RLB);
82
+ }
83
84
env->mseccfg = val;
85
}
86
--
87
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
The addr and size parameters in pmp_hart_has_privs_default() are unused.
4
5
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
6
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-Id: <20230517091519.34439-7-liweiwei@iscas.ac.cn>
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
---
11
target/riscv/pmp.c | 9 +++------
12
1 file changed, 3 insertions(+), 6 deletions(-)
13
14
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/riscv/pmp.c
17
+++ b/target/riscv/pmp.c
18
@@ -XXX,XX +XXX,XX @@ static int pmp_is_in_range(CPURISCVState *env, int pmp_index,
19
/*
20
* Check if the address has required RWX privs when no PMP entry is matched.
21
*/
22
-static bool pmp_hart_has_privs_default(CPURISCVState *env, target_ulong addr,
23
- target_ulong size, pmp_priv_t privs,
24
+static bool pmp_hart_has_privs_default(CPURISCVState *env, pmp_priv_t privs,
25
pmp_priv_t *allowed_privs,
26
target_ulong mode)
27
{
28
@@ -XXX,XX +XXX,XX @@ bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
29
30
/* Short cut if no rules */
31
if (0 == pmp_get_num_rules(env)) {
32
- return pmp_hart_has_privs_default(env, addr, size, privs,
33
- allowed_privs, mode);
34
+ return pmp_hart_has_privs_default(env, privs, allowed_privs, mode);
35
}
36
37
if (size == 0) {
38
@@ -XXX,XX +XXX,XX @@ bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
39
40
/* No rule matched */
41
if (!ret) {
42
- ret = pmp_hart_has_privs_default(env, addr, size, privs,
43
- allowed_privs, mode);
44
+ ret = pmp_hart_has_privs_default(env, privs, allowed_privs, mode);
45
}
46
47
return ret;
48
--
49
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
MMWP and MML bits may affect the allowed privs of PMP entries and the
4
default privs, both of which may change the allowed privs of exsited
5
TLB entries. So we need flush TLB when they are changed.
6
7
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
8
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-Id: <20230517091519.34439-8-liweiwei@iscas.ac.cn>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
13
target/riscv/pmp.c | 3 +++
14
1 file changed, 3 insertions(+)
15
16
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/riscv/pmp.c
19
+++ b/target/riscv/pmp.c
20
@@ -XXX,XX +XXX,XX @@ void mseccfg_csr_write(CPURISCVState *env, target_ulong val)
21
if (riscv_cpu_cfg(env)->epmp) {
22
/* Sticky bits */
23
val |= (env->mseccfg & (MSECCFG_MMWP | MSECCFG_MML));
24
+ if ((val ^ env->mseccfg) & (MSECCFG_MMWP | MSECCFG_MML)) {
25
+ tlb_flush(env_cpu(env));
26
+ }
27
} else {
28
val &= ~(MSECCFG_MMWP | MSECCFG_MML | MSECCFG_RLB);
29
}
30
--
31
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
Currently only the rule addr of the same index of pmpaddr is updated
4
when pmpaddr CSR is modified. However, the rule addr of next PMP entry
5
may also be affected if its A field is PMP_AMATCH_TOR. So we should
6
also update it in this case.
7
8
Write to pmpaddr CSR will not affect the rule nums, So we needn't update
9
call pmp_update_rule_nums() in pmpaddr_csr_write().
10
11
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
12
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
13
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
14
Message-Id: <20230517091519.34439-9-liweiwei@iscas.ac.cn>
15
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
16
---
17
target/riscv/pmp.c | 10 +++++++---
18
1 file changed, 7 insertions(+), 3 deletions(-)
19
20
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
21
index XXXXXXX..XXXXXXX 100644
22
--- a/target/riscv/pmp.c
23
+++ b/target/riscv/pmp.c
24
@@ -XXX,XX +XXX,XX @@ void pmpaddr_csr_write(CPURISCVState *env, uint32_t addr_index,
25
target_ulong val)
26
{
27
trace_pmpaddr_csr_write(env->mhartid, addr_index, val);
28
+ bool is_next_cfg_tor = false;
29
30
if (addr_index < MAX_RISCV_PMPS) {
31
/*
32
@@ -XXX,XX +XXX,XX @@ void pmpaddr_csr_write(CPURISCVState *env, uint32_t addr_index,
33
*/
34
if (addr_index + 1 < MAX_RISCV_PMPS) {
35
uint8_t pmp_cfg = env->pmp_state.pmp[addr_index + 1].cfg_reg;
36
+ is_next_cfg_tor = PMP_AMATCH_TOR == pmp_get_a_field(pmp_cfg);
37
38
- if (pmp_cfg & PMP_LOCK &&
39
- PMP_AMATCH_TOR == pmp_get_a_field(pmp_cfg)) {
40
+ if (pmp_cfg & PMP_LOCK && is_next_cfg_tor) {
41
qemu_log_mask(LOG_GUEST_ERROR,
42
"ignoring pmpaddr write - pmpcfg + 1 locked\n");
43
return;
44
@@ -XXX,XX +XXX,XX @@ void pmpaddr_csr_write(CPURISCVState *env, uint32_t addr_index,
45
46
if (!pmp_is_locked(env, addr_index)) {
47
env->pmp_state.pmp[addr_index].addr_reg = val;
48
- pmp_update_rule(env, addr_index);
49
+ pmp_update_rule_addr(env, addr_index);
50
+ if (is_next_cfg_tor) {
51
+ pmp_update_rule_addr(env, addr_index + 1);
52
+ }
53
} else {
54
qemu_log_mask(LOG_GUEST_ERROR,
55
"ignoring pmpaddr write - locked\n");
56
--
57
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
TLB should be flushed not only for pmpcfg csr changes, but also for
4
pmpaddr csr changes.
5
6
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
7
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
10
Message-Id: <20230517091519.34439-10-liweiwei@iscas.ac.cn>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
13
target/riscv/pmp.c | 1 +
14
1 file changed, 1 insertion(+)
15
16
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/riscv/pmp.c
19
+++ b/target/riscv/pmp.c
20
@@ -XXX,XX +XXX,XX @@ void pmpaddr_csr_write(CPURISCVState *env, uint32_t addr_index,
21
if (is_next_cfg_tor) {
22
pmp_update_rule_addr(env, addr_index + 1);
23
}
24
+ tlb_flush(env_cpu(env));
25
} else {
26
qemu_log_mask(LOG_GUEST_ERROR,
27
"ignoring pmpaddr write - locked\n");
28
--
29
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
TLB needn't be flushed when pmpcfg/pmpaddr don't changes.
4
5
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
6
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
9
Message-Id: <20230517091519.34439-11-liweiwei@iscas.ac.cn>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
target/riscv/pmp.c | 28 ++++++++++++++++++----------
13
1 file changed, 18 insertions(+), 10 deletions(-)
14
15
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/pmp.c
18
+++ b/target/riscv/pmp.c
19
@@ -XXX,XX +XXX,XX @@
20
#include "trace.h"
21
#include "exec/exec-all.h"
22
23
-static void pmp_write_cfg(CPURISCVState *env, uint32_t addr_index,
24
+static bool pmp_write_cfg(CPURISCVState *env, uint32_t addr_index,
25
uint8_t val);
26
static uint8_t pmp_read_cfg(CPURISCVState *env, uint32_t addr_index);
27
static void pmp_update_rule(CPURISCVState *env, uint32_t pmp_index);
28
@@ -XXX,XX +XXX,XX @@ static inline uint8_t pmp_read_cfg(CPURISCVState *env, uint32_t pmp_index)
29
* Accessor to set the cfg reg for a specific PMP/HART
30
* Bounds checks and relevant lock bit.
31
*/
32
-static void pmp_write_cfg(CPURISCVState *env, uint32_t pmp_index, uint8_t val)
33
+static bool pmp_write_cfg(CPURISCVState *env, uint32_t pmp_index, uint8_t val)
34
{
35
if (pmp_index < MAX_RISCV_PMPS) {
36
bool locked = true;
37
@@ -XXX,XX +XXX,XX @@ static void pmp_write_cfg(CPURISCVState *env, uint32_t pmp_index, uint8_t val)
38
39
if (locked) {
40
qemu_log_mask(LOG_GUEST_ERROR, "ignoring pmpcfg write - locked\n");
41
- } else {
42
+ } else if (env->pmp_state.pmp[pmp_index].cfg_reg != val) {
43
env->pmp_state.pmp[pmp_index].cfg_reg = val;
44
pmp_update_rule(env, pmp_index);
45
+ return true;
46
}
47
} else {
48
qemu_log_mask(LOG_GUEST_ERROR,
49
"ignoring pmpcfg write - out of bounds\n");
50
}
51
+
52
+ return false;
53
}
54
55
static void pmp_decode_napot(target_ulong a, target_ulong *sa,
56
@@ -XXX,XX +XXX,XX @@ void pmpcfg_csr_write(CPURISCVState *env, uint32_t reg_index,
57
int i;
58
uint8_t cfg_val;
59
int pmpcfg_nums = 2 << riscv_cpu_mxl(env);
60
+ bool modified = false;
61
62
trace_pmpcfg_csr_write(env->mhartid, reg_index, val);
63
64
for (i = 0; i < pmpcfg_nums; i++) {
65
cfg_val = (val >> 8 * i) & 0xff;
66
- pmp_write_cfg(env, (reg_index * 4) + i, cfg_val);
67
+ modified |= pmp_write_cfg(env, (reg_index * 4) + i, cfg_val);
68
}
69
70
/* If PMP permission of any addr has been changed, flush TLB pages. */
71
- tlb_flush(env_cpu(env));
72
+ if (modified) {
73
+ tlb_flush(env_cpu(env));
74
+ }
75
}
76
77
78
@@ -XXX,XX +XXX,XX @@ void pmpaddr_csr_write(CPURISCVState *env, uint32_t addr_index,
79
}
80
81
if (!pmp_is_locked(env, addr_index)) {
82
- env->pmp_state.pmp[addr_index].addr_reg = val;
83
- pmp_update_rule_addr(env, addr_index);
84
- if (is_next_cfg_tor) {
85
- pmp_update_rule_addr(env, addr_index + 1);
86
+ if (env->pmp_state.pmp[addr_index].addr_reg != val) {
87
+ env->pmp_state.pmp[addr_index].addr_reg = val;
88
+ pmp_update_rule_addr(env, addr_index);
89
+ if (is_next_cfg_tor) {
90
+ pmp_update_rule_addr(env, addr_index + 1);
91
+ }
92
+ tlb_flush(env_cpu(env));
93
}
94
- tlb_flush(env_cpu(env));
95
} else {
96
qemu_log_mask(LOG_GUEST_ERROR,
97
"ignoring pmpaddr write - locked\n");
98
--
99
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
Use pmp_update_rule_addr() and pmp_update_rule_nums() separately to
4
update rule nums only once for each pmpcfg_csr_write. Then remove
5
pmp_update_rule() since it become unused.
6
7
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
8
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-Id: <20230517091519.34439-12-liweiwei@iscas.ac.cn>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
13
target/riscv/pmp.c | 16 ++--------------
14
1 file changed, 2 insertions(+), 14 deletions(-)
15
16
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/riscv/pmp.c
19
+++ b/target/riscv/pmp.c
20
@@ -XXX,XX +XXX,XX @@
21
static bool pmp_write_cfg(CPURISCVState *env, uint32_t addr_index,
22
uint8_t val);
23
static uint8_t pmp_read_cfg(CPURISCVState *env, uint32_t addr_index);
24
-static void pmp_update_rule(CPURISCVState *env, uint32_t pmp_index);
25
26
/*
27
* Accessor method to extract address matching type 'a field' from cfg reg
28
@@ -XXX,XX +XXX,XX @@ static bool pmp_write_cfg(CPURISCVState *env, uint32_t pmp_index, uint8_t val)
29
qemu_log_mask(LOG_GUEST_ERROR, "ignoring pmpcfg write - locked\n");
30
} else if (env->pmp_state.pmp[pmp_index].cfg_reg != val) {
31
env->pmp_state.pmp[pmp_index].cfg_reg = val;
32
- pmp_update_rule(env, pmp_index);
33
+ pmp_update_rule_addr(env, pmp_index);
34
return true;
35
}
36
} else {
37
@@ -XXX,XX +XXX,XX @@ void pmp_update_rule_nums(CPURISCVState *env)
38
}
39
}
40
41
-/*
42
- * Convert cfg/addr reg values here into simple 'sa' --> start address and 'ea'
43
- * end address values.
44
- * This function is called relatively infrequently whereas the check that
45
- * an address is within a pmp rule is called often, so optimise that one
46
- */
47
-static void pmp_update_rule(CPURISCVState *env, uint32_t pmp_index)
48
-{
49
- pmp_update_rule_addr(env, pmp_index);
50
- pmp_update_rule_nums(env);
51
-}
52
-
53
static int pmp_is_in_range(CPURISCVState *env, int pmp_index,
54
target_ulong addr)
55
{
56
@@ -XXX,XX +XXX,XX @@ void pmpcfg_csr_write(CPURISCVState *env, uint32_t reg_index,
57
58
/* If PMP permission of any addr has been changed, flush TLB pages. */
59
if (modified) {
60
+ pmp_update_rule_nums(env);
61
tlb_flush(env_cpu(env));
62
}
63
}
64
--
65
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
Access will fail if access is partially inside the PMP entry.
4
However,only setting ret = false doesn't really mean pmp violation
5
since pmp_hart_has_privs_default() may return true at the end of
6
pmp_hart_has_privs().
7
8
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
9
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
11
Message-Id: <20230517091519.34439-13-liweiwei@iscas.ac.cn>
12
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
13
---
14
target/riscv/pmp.c | 4 ++--
15
1 file changed, 2 insertions(+), 2 deletions(-)
16
17
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/target/riscv/pmp.c
20
+++ b/target/riscv/pmp.c
21
@@ -XXX,XX +XXX,XX @@ bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
22
if ((s + e) == 1) {
23
qemu_log_mask(LOG_GUEST_ERROR,
24
"pmp violation - access is partially inside\n");
25
- ret = false;
26
- break;
27
+ *allowed_privs = 0;
28
+ return false;
29
}
30
31
/* fully inside */
32
--
33
2.40.1
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
2
3
Follow QOM style which declares FOO_init() as instance
4
initializer and FOO_class_init() as class initializer:
5
rename the OpenTitan machine class/instance init()
6
accordingly.
7
8
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
11
Message-Id: <20230520054510.68822-2-philmd@linaro.org>
12
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
13
---
14
hw/riscv/opentitan.c | 8 ++++----
15
1 file changed, 4 insertions(+), 4 deletions(-)
16
17
diff --git a/hw/riscv/opentitan.c b/hw/riscv/opentitan.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/riscv/opentitan.c
20
+++ b/hw/riscv/opentitan.c
21
@@ -XXX,XX +XXX,XX @@ static const MemMapEntry ibex_memmap[] = {
22
[IBEX_DEV_FLASH_VIRTUAL] = { 0x80000000, 0x80000 },
23
};
24
25
-static void opentitan_board_init(MachineState *machine)
26
+static void opentitan_machine_init(MachineState *machine)
27
{
28
MachineClass *mc = MACHINE_GET_CLASS(machine);
29
const MemMapEntry *memmap = ibex_memmap;
30
@@ -XXX,XX +XXX,XX @@ static void opentitan_board_init(MachineState *machine)
31
}
32
}
33
34
-static void opentitan_machine_init(MachineClass *mc)
35
+static void opentitan_machine_class_init(MachineClass *mc)
36
{
37
mc->desc = "RISC-V Board compatible with OpenTitan";
38
- mc->init = opentitan_board_init;
39
+ mc->init = opentitan_machine_init;
40
mc->max_cpus = 1;
41
mc->default_cpu_type = TYPE_RISCV_CPU_IBEX;
42
mc->default_ram_id = "riscv.lowrisc.ibex.ram";
43
mc->default_ram_size = ibex_memmap[IBEX_DEV_RAM].size;
44
}
45
46
-DEFINE_MACHINE("opentitan", opentitan_machine_init)
47
+DEFINE_MACHINE("opentitan", opentitan_machine_class_init)
48
49
static void lowrisc_ibex_soc_init(Object *obj)
50
{
51
--
52
2.40.1
53
54
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
2
3
When multiple QOM types are registered in the same file,
4
it is simpler to use the the DEFINE_TYPES() macro. Replace
5
the type_init() / type_register_static() combination. This
6
is in preparation of adding the OpenTitan machine type to
7
this array in a pair of commits.
8
9
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
11
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
12
Message-Id: <20230520054510.68822-3-philmd@linaro.org>
13
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
14
---
15
hw/riscv/opentitan.c | 21 +++++++++------------
16
1 file changed, 9 insertions(+), 12 deletions(-)
17
18
diff --git a/hw/riscv/opentitan.c b/hw/riscv/opentitan.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/riscv/opentitan.c
21
+++ b/hw/riscv/opentitan.c
22
@@ -XXX,XX +XXX,XX @@ static void lowrisc_ibex_soc_class_init(ObjectClass *oc, void *data)
23
dc->user_creatable = false;
24
}
25
26
-static const TypeInfo lowrisc_ibex_soc_type_info = {
27
- .name = TYPE_RISCV_IBEX_SOC,
28
- .parent = TYPE_DEVICE,
29
- .instance_size = sizeof(LowRISCIbexSoCState),
30
- .instance_init = lowrisc_ibex_soc_init,
31
- .class_init = lowrisc_ibex_soc_class_init,
32
+static const TypeInfo open_titan_types[] = {
33
+ {
34
+ .name = TYPE_RISCV_IBEX_SOC,
35
+ .parent = TYPE_DEVICE,
36
+ .instance_size = sizeof(LowRISCIbexSoCState),
37
+ .instance_init = lowrisc_ibex_soc_init,
38
+ .class_init = lowrisc_ibex_soc_class_init,
39
+ }
40
};
41
42
-static void lowrisc_ibex_soc_register_types(void)
43
-{
44
- type_register_static(&lowrisc_ibex_soc_type_info);
45
-}
46
-
47
-type_init(lowrisc_ibex_soc_register_types)
48
+DEFINE_TYPES(open_titan_types)
49
--
50
2.40.1
51
52
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Once a "One Time Programmable" is programmed, it shouldn't be reset.
3
QOM type names are usually defined as TYPE_FOO.
4
4
5
Do not re-initialize the OTP content in the DeviceReset handler,
5
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
initialize it once in the DeviceRealize one.
7
8
Fixes: 9fb45c62ae8 ("riscv: sifive: Implement a model for SiFive FU540 OTP")
9
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
11
Message-Id: <20211119104757.331579-1-f4bug@amsat.org>
7
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
8
Message-Id: <20230520054510.68822-4-philmd@linaro.org>
12
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
13
---
10
---
14
hw/misc/sifive_u_otp.c | 13 +++++--------
11
include/hw/riscv/opentitan.h | 2 ++
15
1 file changed, 5 insertions(+), 8 deletions(-)
12
hw/riscv/opentitan.c | 2 +-
13
2 files changed, 3 insertions(+), 1 deletion(-)
16
14
17
diff --git a/hw/misc/sifive_u_otp.c b/hw/misc/sifive_u_otp.c
15
diff --git a/include/hw/riscv/opentitan.h b/include/hw/riscv/opentitan.h
18
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/misc/sifive_u_otp.c
17
--- a/include/hw/riscv/opentitan.h
20
+++ b/hw/misc/sifive_u_otp.c
18
+++ b/include/hw/riscv/opentitan.h
21
@@ -XXX,XX +XXX,XX @@ static void sifive_u_otp_realize(DeviceState *dev, Error **errp)
19
@@ -XXX,XX +XXX,XX @@ struct LowRISCIbexSoCState {
22
20
MemoryRegion flash_alias;
23
if (blk_pread(s->blk, 0, s->fuse, filesize) != filesize) {
21
};
24
error_setg(errp, "failed to read the initial flash content");
22
25
+ return;
23
+#define TYPE_OPENTITAN_MACHINE "opentitan"
26
}
24
+
27
}
25
typedef struct OpenTitanState {
28
}
26
/*< private >*/
29
-}
27
SysBusDevice parent_obj;
30
-
28
diff --git a/hw/riscv/opentitan.c b/hw/riscv/opentitan.c
31
-static void sifive_u_otp_reset(DeviceState *dev)
29
index XXXXXXX..XXXXXXX 100644
32
-{
30
--- a/hw/riscv/opentitan.c
33
- SiFiveUOTPState *s = SIFIVE_U_OTP(dev);
31
+++ b/hw/riscv/opentitan.c
34
32
@@ -XXX,XX +XXX,XX @@ static void opentitan_machine_class_init(MachineClass *mc)
35
/* Initialize all fuses' initial value to 0xFFs */
33
mc->default_ram_size = ibex_memmap[IBEX_DEV_RAM].size;
36
memset(s->fuse, 0xff, sizeof(s->fuse));
37
@@ -XXX,XX +XXX,XX @@ static void sifive_u_otp_reset(DeviceState *dev)
38
serial_data = s->serial;
39
if (blk_pwrite(s->blk, index * SIFIVE_U_OTP_FUSE_WORD,
40
&serial_data, SIFIVE_U_OTP_FUSE_WORD, 0) < 0) {
41
- error_report("write error index<%d>", index);
42
+ error_setg(errp, "failed to write index<%d>", index);
43
+ return;
44
}
45
46
serial_data = ~(s->serial);
47
if (blk_pwrite(s->blk, (index + 1) * SIFIVE_U_OTP_FUSE_WORD,
48
&serial_data, SIFIVE_U_OTP_FUSE_WORD, 0) < 0) {
49
- error_report("write error index<%d>", index + 1);
50
+ error_setg(errp, "failed to write index<%d>", index + 1);
51
+ return;
52
}
53
}
54
55
@@ -XXX,XX +XXX,XX @@ static void sifive_u_otp_class_init(ObjectClass *klass, void *data)
56
57
device_class_set_props(dc, sifive_u_otp_properties);
58
dc->realize = sifive_u_otp_realize;
59
- dc->reset = sifive_u_otp_reset;
60
}
34
}
61
35
62
static const TypeInfo sifive_u_otp_info = {
36
-DEFINE_MACHINE("opentitan", opentitan_machine_class_init)
37
+DEFINE_MACHINE(TYPE_OPENTITAN_MACHINE, opentitan_machine_class_init)
38
39
static void lowrisc_ibex_soc_init(Object *obj)
40
{
63
--
41
--
64
2.31.1
42
2.40.1
65
43
66
44
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
2
3
Expand the DEFINE_MACHINE() macro, converting the class_init()
4
handler.
5
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
9
Message-Id: <20230520054510.68822-5-philmd@linaro.org>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
include/hw/riscv/opentitan.h | 3 ++-
13
hw/riscv/opentitan.c | 10 +++++++---
14
2 files changed, 9 insertions(+), 4 deletions(-)
15
16
diff --git a/include/hw/riscv/opentitan.h b/include/hw/riscv/opentitan.h
17
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/riscv/opentitan.h
19
+++ b/include/hw/riscv/opentitan.h
20
@@ -XXX,XX +XXX,XX @@
21
#include "hw/char/ibex_uart.h"
22
#include "hw/timer/ibex_timer.h"
23
#include "hw/ssi/ibex_spi_host.h"
24
+#include "hw/boards.h"
25
#include "qom/object.h"
26
27
#define TYPE_RISCV_IBEX_SOC "riscv.lowrisc.ibex.soc"
28
@@ -XXX,XX +XXX,XX @@ struct LowRISCIbexSoCState {
29
MemoryRegion flash_alias;
30
};
31
32
-#define TYPE_OPENTITAN_MACHINE "opentitan"
33
+#define TYPE_OPENTITAN_MACHINE MACHINE_TYPE_NAME("opentitan")
34
35
typedef struct OpenTitanState {
36
/*< private >*/
37
diff --git a/hw/riscv/opentitan.c b/hw/riscv/opentitan.c
38
index XXXXXXX..XXXXXXX 100644
39
--- a/hw/riscv/opentitan.c
40
+++ b/hw/riscv/opentitan.c
41
@@ -XXX,XX +XXX,XX @@ static void opentitan_machine_init(MachineState *machine)
42
}
43
}
44
45
-static void opentitan_machine_class_init(MachineClass *mc)
46
+static void opentitan_machine_class_init(ObjectClass *oc, void *data)
47
{
48
+ MachineClass *mc = MACHINE_CLASS(oc);
49
+
50
mc->desc = "RISC-V Board compatible with OpenTitan";
51
mc->init = opentitan_machine_init;
52
mc->max_cpus = 1;
53
@@ -XXX,XX +XXX,XX @@ static void opentitan_machine_class_init(MachineClass *mc)
54
mc->default_ram_size = ibex_memmap[IBEX_DEV_RAM].size;
55
}
56
57
-DEFINE_MACHINE(TYPE_OPENTITAN_MACHINE, opentitan_machine_class_init)
58
-
59
static void lowrisc_ibex_soc_init(Object *obj)
60
{
61
LowRISCIbexSoCState *s = RISCV_IBEX_SOC(obj);
62
@@ -XXX,XX +XXX,XX @@ static const TypeInfo open_titan_types[] = {
63
.instance_size = sizeof(LowRISCIbexSoCState),
64
.instance_init = lowrisc_ibex_soc_init,
65
.class_init = lowrisc_ibex_soc_class_init,
66
+ }, {
67
+ .name = TYPE_OPENTITAN_MACHINE,
68
+ .parent = TYPE_MACHINE,
69
+ .class_init = opentitan_machine_class_init,
70
}
71
};
72
73
--
74
2.40.1
75
76
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
2
3
OpenTitanState is the 'machine' (or 'board') state: it isn't
4
a SysBus device, but inherits from the MachineState type.
5
Correct the instance size.
6
Doing so we avoid leaking an OpenTitanState pointer in
7
opentitan_machine_init().
8
9
Fixes: fe0fe4735e ("riscv: Initial commit of OpenTitan machine")
10
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
11
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
12
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
13
Message-Id: <20230520054510.68822-6-philmd@linaro.org>
14
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
15
---
16
include/hw/riscv/opentitan.h | 3 ++-
17
hw/riscv/opentitan.c | 3 ++-
18
2 files changed, 4 insertions(+), 2 deletions(-)
19
20
diff --git a/include/hw/riscv/opentitan.h b/include/hw/riscv/opentitan.h
21
index XXXXXXX..XXXXXXX 100644
22
--- a/include/hw/riscv/opentitan.h
23
+++ b/include/hw/riscv/opentitan.h
24
@@ -XXX,XX +XXX,XX @@ struct LowRISCIbexSoCState {
25
};
26
27
#define TYPE_OPENTITAN_MACHINE MACHINE_TYPE_NAME("opentitan")
28
+OBJECT_DECLARE_SIMPLE_TYPE(OpenTitanState, OPENTITAN_MACHINE)
29
30
typedef struct OpenTitanState {
31
/*< private >*/
32
- SysBusDevice parent_obj;
33
+ MachineState parent_obj;
34
35
/*< public >*/
36
LowRISCIbexSoCState soc;
37
diff --git a/hw/riscv/opentitan.c b/hw/riscv/opentitan.c
38
index XXXXXXX..XXXXXXX 100644
39
--- a/hw/riscv/opentitan.c
40
+++ b/hw/riscv/opentitan.c
41
@@ -XXX,XX +XXX,XX @@ static const MemMapEntry ibex_memmap[] = {
42
static void opentitan_machine_init(MachineState *machine)
43
{
44
MachineClass *mc = MACHINE_GET_CLASS(machine);
45
+ OpenTitanState *s = OPENTITAN_MACHINE(machine);
46
const MemMapEntry *memmap = ibex_memmap;
47
- OpenTitanState *s = g_new0(OpenTitanState, 1);
48
MemoryRegion *sys_mem = get_system_memory();
49
50
if (machine->ram_size != mc->default_ram_size) {
51
@@ -XXX,XX +XXX,XX @@ static const TypeInfo open_titan_types[] = {
52
}, {
53
.name = TYPE_OPENTITAN_MACHINE,
54
.parent = TYPE_MACHINE,
55
+ .instance_size = sizeof(OpenTitanState),
56
.class_init = opentitan_machine_class_init,
57
}
58
};
59
--
60
2.40.1
61
62
diff view generated by jsdifflib
New patch
1
From: Yin Wang <yin.wang@intel.com>
1
2
3
Command "qemu-system-riscv64 -machine virt
4
-m 2G -smp 1 -numa node,mem=1G -numa node,mem=1G"
5
would trigger this problem.Backtrace with:
6
#0 0x0000555555b5b1a4 in riscv_numa_get_default_cpu_node_id at ../hw/riscv/numa.c:211
7
#1 0x00005555558ce510 in machine_numa_finish_cpu_init at ../hw/core/machine.c:1230
8
#2 0x00005555558ce9d3 in machine_run_board_init at ../hw/core/machine.c:1346
9
#3 0x0000555555aaedc3 in qemu_init_board at ../softmmu/vl.c:2513
10
#4 0x0000555555aaf064 in qmp_x_exit_preconfig at ../softmmu/vl.c:2609
11
#5 0x0000555555ab1916 in qemu_init at ../softmmu/vl.c:3617
12
#6 0x000055555585463b in main at ../softmmu/main.c:47
13
This commit fixes the issue by adding parameter checks.
14
15
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
16
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
17
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
18
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
19
Signed-off-by: Yin Wang <yin.wang@intel.com>
20
Message-Id: <20230519023758.1759434-1-yin.wang@intel.com>
21
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
22
---
23
hw/riscv/numa.c | 6 ++++++
24
1 file changed, 6 insertions(+)
25
26
diff --git a/hw/riscv/numa.c b/hw/riscv/numa.c
27
index XXXXXXX..XXXXXXX 100644
28
--- a/hw/riscv/numa.c
29
+++ b/hw/riscv/numa.c
30
@@ -XXX,XX +XXX,XX @@ int64_t riscv_numa_get_default_cpu_node_id(const MachineState *ms, int idx)
31
{
32
int64_t nidx = 0;
33
34
+ if (ms->numa_state->num_nodes > ms->smp.cpus) {
35
+ error_report("Number of NUMA nodes (%d)"
36
+ " cannot exceed the number of available CPUs (%d).",
37
+ ms->numa_state->num_nodes, ms->smp.max_cpus);
38
+ exit(EXIT_FAILURE);
39
+ }
40
if (ms->numa_state->num_nodes) {
41
nidx = idx / (ms->smp.cpus / ms->numa_state->num_nodes);
42
if (ms->numa_state->num_nodes <= nidx) {
43
--
44
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
actual_address = (requested_address & ~mpmmask) | mpmbase.
4
5
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
6
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
7
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
8
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
9
Message-Id: <20230524015933.17349-2-liweiwei@iscas.ac.cn>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
target/riscv/vector_helper.c | 2 +-
13
1 file changed, 1 insertion(+), 1 deletion(-)
14
15
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/vector_helper.c
18
+++ b/target/riscv/vector_helper.c
19
@@ -XXX,XX +XXX,XX @@ static inline uint32_t vext_get_total_elems(CPURISCVState *env, uint32_t desc,
20
21
static inline target_ulong adjust_addr(CPURISCVState *env, target_ulong addr)
22
{
23
- return (addr & env->cur_pmmask) | env->cur_pmbase;
24
+ return (addr & ~env->cur_pmmask) | env->cur_pmbase;
25
}
26
27
/*
28
--
29
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
write_mstatus() can only change current xl when in debug mode.
4
And we need update cur_pmmask/base in this case.
5
6
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
7
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
8
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
9
Message-Id: <20230524015933.17349-3-liweiwei@iscas.ac.cn>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
target/riscv/csr.c | 9 ++++++++-
13
1 file changed, 8 insertions(+), 1 deletion(-)
14
15
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/csr.c
18
+++ b/target/riscv/csr.c
19
@@ -XXX,XX +XXX,XX @@ static RISCVException write_mstatus(CPURISCVState *env, int csrno,
20
mstatus = set_field(mstatus, MSTATUS64_SXL, xl);
21
}
22
env->mstatus = mstatus;
23
- env->xl = cpu_recompute_xl(env);
24
25
+ /*
26
+ * Except in debug mode, UXL/SXL can only be modified by higher
27
+ * privilege mode. So xl will not be changed in normal mode.
28
+ */
29
+ if (env->debugger) {
30
+ env->xl = cpu_recompute_xl(env);
31
+ riscv_cpu_update_mask(env);
32
+ }
33
return RISCV_EXCP_NONE;
34
}
35
36
--
37
2.40.1
diff view generated by jsdifflib
New patch
1
From: Mayuresh Chitale <mchitale@ventanamicro.com>
1
2
3
Implement the s/h/mstateen.fcsr bit as defined in the smstateen spec
4
and check for it when accessing the fcsr register and its fields.
5
6
Signed-off-by: Mayuresh Chitale <mchitale@ventanamicro.com>
7
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <20230518175058.2772506-2-mchitale@ventanamicro.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
target/riscv/csr.c | 15 +++++++++++++++
13
1 file changed, 15 insertions(+)
14
15
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/csr.c
18
+++ b/target/riscv/csr.c
19
@@ -XXX,XX +XXX,XX @@ static RISCVException fs(CPURISCVState *env, int csrno)
20
!riscv_cpu_cfg(env)->ext_zfinx) {
21
return RISCV_EXCP_ILLEGAL_INST;
22
}
23
+
24
+ if (!env->debugger && !riscv_cpu_fp_enabled(env)) {
25
+ return smstateen_acc_ok(env, 0, SMSTATEEN0_FCSR);
26
+ }
27
#endif
28
return RISCV_EXCP_NONE;
29
}
30
@@ -XXX,XX +XXX,XX @@ static RISCVException write_mstateen0(CPURISCVState *env, int csrno,
31
target_ulong new_val)
32
{
33
uint64_t wr_mask = SMSTATEEN_STATEEN | SMSTATEEN0_HSENVCFG;
34
+ if (!riscv_has_ext(env, RVF)) {
35
+ wr_mask |= SMSTATEEN0_FCSR;
36
+ }
37
38
return write_mstateen(env, csrno, wr_mask, new_val);
39
}
40
@@ -XXX,XX +XXX,XX @@ static RISCVException write_hstateen0(CPURISCVState *env, int csrno,
41
{
42
uint64_t wr_mask = SMSTATEEN_STATEEN | SMSTATEEN0_HSENVCFG;
43
44
+ if (!riscv_has_ext(env, RVF)) {
45
+ wr_mask |= SMSTATEEN0_FCSR;
46
+ }
47
+
48
return write_hstateen(env, csrno, wr_mask, new_val);
49
}
50
51
@@ -XXX,XX +XXX,XX @@ static RISCVException write_sstateen0(CPURISCVState *env, int csrno,
52
{
53
uint64_t wr_mask = SMSTATEEN_STATEEN | SMSTATEEN0_HSENVCFG;
54
55
+ if (!riscv_has_ext(env, RVF)) {
56
+ wr_mask |= SMSTATEEN0_FCSR;
57
+ }
58
+
59
return write_sstateen(env, csrno, wr_mask, new_val);
60
}
61
62
--
63
2.40.1
diff view generated by jsdifflib
New patch
1
From: Mayuresh Chitale <mchitale@ventanamicro.com>
1
2
3
When misa.F is 0 tb->flags.FS field is unused and can be used to save
4
the current state of smstateen0.FCSR check which is needed by the
5
floating point translation routines.
6
7
Signed-off-by: Mayuresh Chitale <mchitale@ventanamicro.com>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
10
Message-Id: <20230518175058.2772506-3-mchitale@ventanamicro.com>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
13
target/riscv/cpu_helper.c | 6 ++++++
14
target/riscv/insn_trans/trans_rvf.c.inc | 7 ++++---
15
2 files changed, 10 insertions(+), 3 deletions(-)
16
17
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/target/riscv/cpu_helper.c
20
+++ b/target/riscv/cpu_helper.c
21
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPURISCVState *env, target_ulong *pc,
22
vs = MIN(vs, get_field(env->mstatus_hs, MSTATUS_VS));
23
}
24
25
+ /* With Zfinx, floating point is enabled/disabled by Smstateen. */
26
+ if (!riscv_has_ext(env, RVF)) {
27
+ fs = (smstateen_acc_ok(env, 0, SMSTATEEN0_FCSR) == RISCV_EXCP_NONE)
28
+ ? EXT_STATUS_DIRTY : EXT_STATUS_DISABLED;
29
+ }
30
+
31
if (cpu->cfg.debug && !icount_enabled()) {
32
flags = FIELD_DP32(flags, TB_FLAGS, ITRIGGER, env->itrigger_enabled);
33
}
34
diff --git a/target/riscv/insn_trans/trans_rvf.c.inc b/target/riscv/insn_trans/trans_rvf.c.inc
35
index XXXXXXX..XXXXXXX 100644
36
--- a/target/riscv/insn_trans/trans_rvf.c.inc
37
+++ b/target/riscv/insn_trans/trans_rvf.c.inc
38
@@ -XXX,XX +XXX,XX @@
39
*/
40
41
#define REQUIRE_FPU do {\
42
- if (ctx->mstatus_fs == EXT_STATUS_DISABLED) \
43
- if (!ctx->cfg_ptr->ext_zfinx) \
44
- return false; \
45
+ if (ctx->mstatus_fs == EXT_STATUS_DISABLED) { \
46
+ ctx->virt_inst_excp = ctx->virt_enabled && ctx->cfg_ptr->ext_zfinx; \
47
+ return false; \
48
+ } \
49
} while (0)
50
51
#define REQUIRE_ZFINX_OR_F(ctx) do {\
52
--
53
2.40.1
diff view generated by jsdifflib
New patch
1
From: Mayuresh Chitale <mchitale@ventanamicro.com>
1
2
3
Add knobs to allow users to enable smstateen and also export it via the
4
ISA extension string.
5
6
Signed-off-by: Mayuresh Chitale <mchitale@ventanamicro.com>
7
Reviewed-by: Weiwei Li<liweiwei@iscas.ac.cn>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <20230518175058.2772506-4-mchitale@ventanamicro.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
target/riscv/cpu.c | 3 ++-
13
1 file changed, 2 insertions(+), 1 deletion(-)
14
15
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/cpu.c
18
+++ b/target/riscv/cpu.c
19
@@ -XXX,XX +XXX,XX @@ static const struct isa_ext_data isa_edata_arr[] = {
20
ISA_EXT_DATA_ENTRY(zhinx, PRIV_VERSION_1_12_0, ext_zhinx),
21
ISA_EXT_DATA_ENTRY(zhinxmin, PRIV_VERSION_1_12_0, ext_zhinxmin),
22
ISA_EXT_DATA_ENTRY(smaia, PRIV_VERSION_1_12_0, ext_smaia),
23
+ ISA_EXT_DATA_ENTRY(smstateen, PRIV_VERSION_1_12_0, ext_smstateen),
24
ISA_EXT_DATA_ENTRY(ssaia, PRIV_VERSION_1_12_0, ext_ssaia),
25
ISA_EXT_DATA_ENTRY(sscofpmf, PRIV_VERSION_1_12_0, ext_sscofpmf),
26
ISA_EXT_DATA_ENTRY(sstc, PRIV_VERSION_1_12_0, ext_sstc),
27
@@ -XXX,XX +XXX,XX @@ static Property riscv_cpu_extensions[] = {
28
DEFINE_PROP_UINT16("vlen", RISCVCPU, cfg.vlen, 128),
29
DEFINE_PROP_UINT16("elen", RISCVCPU, cfg.elen, 64),
30
31
+ DEFINE_PROP_BOOL("smstateen", RISCVCPU, cfg.ext_smstateen, false),
32
DEFINE_PROP_BOOL("svadu", RISCVCPU, cfg.ext_svadu, true),
33
-
34
DEFINE_PROP_BOOL("svinval", RISCVCPU, cfg.ext_svinval, false),
35
DEFINE_PROP_BOOL("svnapot", RISCVCPU, cfg.ext_svnapot, false),
36
DEFINE_PROP_BOOL("svpbmt", RISCVCPU, cfg.ext_svpbmt, false),
37
--
38
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
Use pointer to pass more information of target to disasembler,
4
such as pass cpu.cfg related information in following commits.
5
6
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
7
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
8
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-Id: <20230523093539.203909-2-liweiwei@iscas.ac.cn>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
13
include/disas/dis-asm.h | 2 +-
14
1 file changed, 1 insertion(+), 1 deletion(-)
15
16
diff --git a/include/disas/dis-asm.h b/include/disas/dis-asm.h
17
index XXXXXXX..XXXXXXX 100644
18
--- a/include/disas/dis-asm.h
19
+++ b/include/disas/dis-asm.h
20
@@ -XXX,XX +XXX,XX @@ typedef struct disassemble_info {
21
char * disassembler_options;
22
23
/* Field intended to be used by targets in any way they deem suitable. */
24
- int64_t target_info;
25
+ void *target_info;
26
27
/* Options for Capstone disassembly. */
28
int cap_arch;
29
--
30
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
Split RISCVCPUConfig declarations to prepare for passing it to disas.
4
5
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
6
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
9
Message-Id: <20230523093539.203909-3-liweiwei@iscas.ac.cn>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
target/riscv/cpu.h | 114 +---------------------------------
13
target/riscv/cpu_cfg.h | 136 +++++++++++++++++++++++++++++++++++++++++
14
2 files changed, 137 insertions(+), 113 deletions(-)
15
create mode 100644 target/riscv/cpu_cfg.h
16
17
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
18
index XXXXXXX..XXXXXXX 100644
19
--- a/target/riscv/cpu.h
20
+++ b/target/riscv/cpu.h
21
@@ -XXX,XX +XXX,XX @@
22
#include "qom/object.h"
23
#include "qemu/int128.h"
24
#include "cpu_bits.h"
25
+#include "cpu_cfg.h"
26
#include "qapi/qapi-types-common.h"
27
#include "cpu-qom.h"
28
29
@@ -XXX,XX +XXX,XX @@ struct CPUArchState {
30
uint64_t kvm_timer_frequency;
31
};
32
33
-/*
34
- * map is a 16-bit bitmap: the most significant set bit in map is the maximum
35
- * satp mode that is supported. It may be chosen by the user and must respect
36
- * what qemu implements (valid_1_10_32/64) and what the hw is capable of
37
- * (supported bitmap below).
38
- *
39
- * init is a 16-bit bitmap used to make sure the user selected a correct
40
- * configuration as per the specification.
41
- *
42
- * supported is a 16-bit bitmap used to reflect the hw capabilities.
43
- */
44
-typedef struct {
45
- uint16_t map, init, supported;
46
-} RISCVSATPMap;
47
-
48
-struct RISCVCPUConfig {
49
- bool ext_zba;
50
- bool ext_zbb;
51
- bool ext_zbc;
52
- bool ext_zbkb;
53
- bool ext_zbkc;
54
- bool ext_zbkx;
55
- bool ext_zbs;
56
- bool ext_zca;
57
- bool ext_zcb;
58
- bool ext_zcd;
59
- bool ext_zce;
60
- bool ext_zcf;
61
- bool ext_zcmp;
62
- bool ext_zcmt;
63
- bool ext_zk;
64
- bool ext_zkn;
65
- bool ext_zknd;
66
- bool ext_zkne;
67
- bool ext_zknh;
68
- bool ext_zkr;
69
- bool ext_zks;
70
- bool ext_zksed;
71
- bool ext_zksh;
72
- bool ext_zkt;
73
- bool ext_ifencei;
74
- bool ext_icsr;
75
- bool ext_icbom;
76
- bool ext_icboz;
77
- bool ext_zicond;
78
- bool ext_zihintpause;
79
- bool ext_smstateen;
80
- bool ext_sstc;
81
- bool ext_svadu;
82
- bool ext_svinval;
83
- bool ext_svnapot;
84
- bool ext_svpbmt;
85
- bool ext_zdinx;
86
- bool ext_zawrs;
87
- bool ext_zfh;
88
- bool ext_zfhmin;
89
- bool ext_zfinx;
90
- bool ext_zhinx;
91
- bool ext_zhinxmin;
92
- bool ext_zve32f;
93
- bool ext_zve64f;
94
- bool ext_zve64d;
95
- bool ext_zmmul;
96
- bool ext_zvfh;
97
- bool ext_zvfhmin;
98
- bool ext_smaia;
99
- bool ext_ssaia;
100
- bool ext_sscofpmf;
101
- bool rvv_ta_all_1s;
102
- bool rvv_ma_all_1s;
103
-
104
- uint32_t mvendorid;
105
- uint64_t marchid;
106
- uint64_t mimpid;
107
-
108
- /* Vendor-specific custom extensions */
109
- bool ext_xtheadba;
110
- bool ext_xtheadbb;
111
- bool ext_xtheadbs;
112
- bool ext_xtheadcmo;
113
- bool ext_xtheadcondmov;
114
- bool ext_xtheadfmemidx;
115
- bool ext_xtheadfmv;
116
- bool ext_xtheadmac;
117
- bool ext_xtheadmemidx;
118
- bool ext_xtheadmempair;
119
- bool ext_xtheadsync;
120
- bool ext_XVentanaCondOps;
121
-
122
- uint8_t pmu_num;
123
- char *priv_spec;
124
- char *user_spec;
125
- char *bext_spec;
126
- char *vext_spec;
127
- uint16_t vlen;
128
- uint16_t elen;
129
- uint16_t cbom_blocksize;
130
- uint16_t cboz_blocksize;
131
- bool mmu;
132
- bool pmp;
133
- bool epmp;
134
- bool debug;
135
- bool misa_w;
136
-
137
- bool short_isa_string;
138
-
139
-#ifndef CONFIG_USER_ONLY
140
- RISCVSATPMap satp_mode;
141
-#endif
142
-};
143
-
144
-typedef struct RISCVCPUConfig RISCVCPUConfig;
145
-
146
/*
147
* RISCVCPU:
148
* @env: #CPURISCVState
149
diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h
150
new file mode 100644
151
index XXXXXXX..XXXXXXX
152
--- /dev/null
153
+++ b/target/riscv/cpu_cfg.h
154
@@ -XXX,XX +XXX,XX @@
155
+/*
156
+ * QEMU RISC-V CPU CFG
157
+ *
158
+ * Copyright (c) 2016-2017 Sagar Karandikar, sagark@eecs.berkeley.edu
159
+ * Copyright (c) 2017-2018 SiFive, Inc.
160
+ * Copyright (c) 2021-2023 PLCT Lab
161
+ *
162
+ * This program is free software; you can redistribute it and/or modify it
163
+ * under the terms and conditions of the GNU General Public License,
164
+ * version 2 or later, as published by the Free Software Foundation.
165
+ *
166
+ * This program is distributed in the hope it will be useful, but WITHOUT
167
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
168
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
169
+ * more details.
170
+ *
171
+ * You should have received a copy of the GNU General Public License along with
172
+ * this program. If not, see <http://www.gnu.org/licenses/>.
173
+ */
174
+
175
+#ifndef RISCV_CPU_CFG_H
176
+#define RISCV_CPU_CFG_H
177
+
178
+/*
179
+ * map is a 16-bit bitmap: the most significant set bit in map is the maximum
180
+ * satp mode that is supported. It may be chosen by the user and must respect
181
+ * what qemu implements (valid_1_10_32/64) and what the hw is capable of
182
+ * (supported bitmap below).
183
+ *
184
+ * init is a 16-bit bitmap used to make sure the user selected a correct
185
+ * configuration as per the specification.
186
+ *
187
+ * supported is a 16-bit bitmap used to reflect the hw capabilities.
188
+ */
189
+typedef struct {
190
+ uint16_t map, init, supported;
191
+} RISCVSATPMap;
192
+
193
+struct RISCVCPUConfig {
194
+ bool ext_zba;
195
+ bool ext_zbb;
196
+ bool ext_zbc;
197
+ bool ext_zbkb;
198
+ bool ext_zbkc;
199
+ bool ext_zbkx;
200
+ bool ext_zbs;
201
+ bool ext_zca;
202
+ bool ext_zcb;
203
+ bool ext_zcd;
204
+ bool ext_zce;
205
+ bool ext_zcf;
206
+ bool ext_zcmp;
207
+ bool ext_zcmt;
208
+ bool ext_zk;
209
+ bool ext_zkn;
210
+ bool ext_zknd;
211
+ bool ext_zkne;
212
+ bool ext_zknh;
213
+ bool ext_zkr;
214
+ bool ext_zks;
215
+ bool ext_zksed;
216
+ bool ext_zksh;
217
+ bool ext_zkt;
218
+ bool ext_ifencei;
219
+ bool ext_icsr;
220
+ bool ext_icbom;
221
+ bool ext_icboz;
222
+ bool ext_zicond;
223
+ bool ext_zihintpause;
224
+ bool ext_smstateen;
225
+ bool ext_sstc;
226
+ bool ext_svadu;
227
+ bool ext_svinval;
228
+ bool ext_svnapot;
229
+ bool ext_svpbmt;
230
+ bool ext_zdinx;
231
+ bool ext_zawrs;
232
+ bool ext_zfh;
233
+ bool ext_zfhmin;
234
+ bool ext_zfinx;
235
+ bool ext_zhinx;
236
+ bool ext_zhinxmin;
237
+ bool ext_zve32f;
238
+ bool ext_zve64f;
239
+ bool ext_zve64d;
240
+ bool ext_zmmul;
241
+ bool ext_zvfh;
242
+ bool ext_zvfhmin;
243
+ bool ext_smaia;
244
+ bool ext_ssaia;
245
+ bool ext_sscofpmf;
246
+ bool rvv_ta_all_1s;
247
+ bool rvv_ma_all_1s;
248
+
249
+ uint32_t mvendorid;
250
+ uint64_t marchid;
251
+ uint64_t mimpid;
252
+
253
+ /* Vendor-specific custom extensions */
254
+ bool ext_xtheadba;
255
+ bool ext_xtheadbb;
256
+ bool ext_xtheadbs;
257
+ bool ext_xtheadcmo;
258
+ bool ext_xtheadcondmov;
259
+ bool ext_xtheadfmemidx;
260
+ bool ext_xtheadfmv;
261
+ bool ext_xtheadmac;
262
+ bool ext_xtheadmemidx;
263
+ bool ext_xtheadmempair;
264
+ bool ext_xtheadsync;
265
+ bool ext_XVentanaCondOps;
266
+
267
+ uint8_t pmu_num;
268
+ char *priv_spec;
269
+ char *user_spec;
270
+ char *bext_spec;
271
+ char *vext_spec;
272
+ uint16_t vlen;
273
+ uint16_t elen;
274
+ uint16_t cbom_blocksize;
275
+ uint16_t cboz_blocksize;
276
+ bool mmu;
277
+ bool pmp;
278
+ bool epmp;
279
+ bool debug;
280
+ bool misa_w;
281
+
282
+ bool short_isa_string;
283
+
284
+#ifndef CONFIG_USER_ONLY
285
+ RISCVSATPMap satp_mode;
286
+#endif
287
+};
288
+
289
+typedef struct RISCVCPUConfig RISCVCPUConfig;
290
+#endif
291
--
292
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
Pass RISCVCPUConfig as disassemble_info.target_info to support disas
4
of conflict instructions related to specific extensions.
5
6
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
7
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
8
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-Id: <20230523093539.203909-4-liweiwei@iscas.ac.cn>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
13
disas/riscv.c | 10 +++++++---
14
target/riscv/cpu.c | 1 +
15
2 files changed, 8 insertions(+), 3 deletions(-)
16
17
diff --git a/disas/riscv.c b/disas/riscv.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/disas/riscv.c
20
+++ b/disas/riscv.c
21
@@ -XXX,XX +XXX,XX @@
22
23
#include "qemu/osdep.h"
24
#include "disas/dis-asm.h"
25
-
26
+#include "target/riscv/cpu_cfg.h"
27
28
/* types */
29
30
@@ -XXX,XX +XXX,XX @@ typedef enum {
31
/* structures */
32
33
typedef struct {
34
+ RISCVCPUConfig *cfg;
35
uint64_t pc;
36
uint64_t inst;
37
int32_t imm;
38
@@ -XXX,XX +XXX,XX @@ static void decode_inst_decompress(rv_decode *dec, rv_isa isa)
39
/* disassemble instruction */
40
41
static void
42
-disasm_inst(char *buf, size_t buflen, rv_isa isa, uint64_t pc, rv_inst inst)
43
+disasm_inst(char *buf, size_t buflen, rv_isa isa, uint64_t pc, rv_inst inst,
44
+ RISCVCPUConfig *cfg)
45
{
46
rv_decode dec = { 0 };
47
dec.pc = pc;
48
dec.inst = inst;
49
+ dec.cfg = cfg;
50
decode_inst_opcode(&dec, isa);
51
decode_inst_operands(&dec, isa);
52
decode_inst_decompress(&dec, isa);
53
@@ -XXX,XX +XXX,XX @@ print_insn_riscv(bfd_vma memaddr, struct disassemble_info *info, rv_isa isa)
54
break;
55
}
56
57
- disasm_inst(buf, sizeof(buf), isa, memaddr, inst);
58
+ disasm_inst(buf, sizeof(buf), isa, memaddr, inst,
59
+ (RISCVCPUConfig *)info->target_info);
60
(*info->fprintf_func)(info->stream, "%s", buf);
61
62
return len;
63
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
64
index XXXXXXX..XXXXXXX 100644
65
--- a/target/riscv/cpu.c
66
+++ b/target/riscv/cpu.c
67
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_reset_hold(Object *obj)
68
static void riscv_cpu_disas_set_info(CPUState *s, disassemble_info *info)
69
{
70
RISCVCPU *cpu = RISCV_CPU(s);
71
+ info->target_info = &cpu->cfg;
72
73
switch (riscv_cpu_mxl(&cpu->env)) {
74
case MXL_RV32:
75
--
76
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
Support disas for Zcmt* instructions only when related extensions
4
are supported.
5
6
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
7
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
8
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-Id: <20230523093539.203909-5-liweiwei@iscas.ac.cn>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
13
disas/riscv.c | 8 +++++++-
14
1 file changed, 7 insertions(+), 1 deletion(-)
15
16
diff --git a/disas/riscv.c b/disas/riscv.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/disas/riscv.c
19
+++ b/disas/riscv.c
20
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
21
op = rv_op_c_sqsp;
22
} else {
23
op = rv_op_c_fsdsp;
24
- if (((inst >> 12) & 0b01)) {
25
+ if (dec->cfg->ext_zcmp && ((inst >> 12) & 0b01)) {
26
switch ((inst >> 8) & 0b01111) {
27
case 8:
28
if (((inst >> 4) & 0b01111) >= 4) {
29
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
30
} else {
31
switch ((inst >> 10) & 0b011) {
32
case 0:
33
+ if (!dec->cfg->ext_zcmt) {
34
+ break;
35
+ }
36
if (((inst >> 2) & 0xFF) >= 32) {
37
op = rv_op_cm_jalt;
38
} else {
39
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
40
}
41
break;
42
case 3:
43
+ if (!dec->cfg->ext_zcmp) {
44
+ break;
45
+ }
46
switch ((inst >> 5) & 0b011) {
47
case 1: op = rv_op_cm_mvsa01; break;
48
case 3: op = rv_op_cm_mva01s; break;
49
--
50
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
Support disas for Z*inx instructions only when Zfinx extension is supported.
4
5
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
6
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
7
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <20230523093539.203909-6-liweiwei@iscas.ac.cn>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
disas/riscv.c | 16 ++++++++++++----
13
1 file changed, 12 insertions(+), 4 deletions(-)
14
15
diff --git a/disas/riscv.c b/disas/riscv.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/disas/riscv.c
18
+++ b/disas/riscv.c
19
@@ -XXX,XX +XXX,XX @@ static void format_inst(char *buf, size_t buflen, size_t tab, rv_decode *dec)
20
append(buf, rv_ireg_name_sym[dec->rs2], buflen);
21
break;
22
case '3':
23
- append(buf, rv_freg_name_sym[dec->rd], buflen);
24
+ append(buf, dec->cfg->ext_zfinx ? rv_ireg_name_sym[dec->rd] :
25
+ rv_freg_name_sym[dec->rd],
26
+ buflen);
27
break;
28
case '4':
29
- append(buf, rv_freg_name_sym[dec->rs1], buflen);
30
+ append(buf, dec->cfg->ext_zfinx ? rv_ireg_name_sym[dec->rs1] :
31
+ rv_freg_name_sym[dec->rs1],
32
+ buflen);
33
break;
34
case '5':
35
- append(buf, rv_freg_name_sym[dec->rs2], buflen);
36
+ append(buf, dec->cfg->ext_zfinx ? rv_ireg_name_sym[dec->rs2] :
37
+ rv_freg_name_sym[dec->rs2],
38
+ buflen);
39
break;
40
case '6':
41
- append(buf, rv_freg_name_sym[dec->rs3], buflen);
42
+ append(buf, dec->cfg->ext_zfinx ? rv_ireg_name_sym[dec->rs3] :
43
+ rv_freg_name_sym[dec->rs3],
44
+ buflen);
45
break;
46
case '7':
47
snprintf(tmp, sizeof(tmp), "%d", dec->rs1);
48
--
49
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
Currently decomp_rv32 and decomp_rv64 value in opcode_data for vector
4
instructions are the same op index as their own. And they have no
5
functional decomp_data. So they have no functional difference from just
6
leaving them as zero.
7
8
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
9
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
10
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
11
Acked-by: Alistair Francis <alistair.francis@wdc.com>
12
Message-Id: <20230523093539.203909-7-liweiwei@iscas.ac.cn>
13
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
14
---
15
disas/riscv.c | 740 +++++++++++++++++++++++++-------------------------
16
1 file changed, 370 insertions(+), 370 deletions(-)
17
18
diff --git a/disas/riscv.c b/disas/riscv.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/disas/riscv.c
21
+++ b/disas/riscv.c
22
@@ -XXX,XX +XXX,XX @@ const rv_opcode_data opcode_data[] = {
23
{ "zip", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
24
{ "xperm4", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
25
{ "xperm8", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
26
- { "vle8.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vle8_v, rv_op_vle8_v, 0 },
27
- { "vle16.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vle16_v, rv_op_vle16_v, 0 },
28
- { "vle32.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vle32_v, rv_op_vle32_v, 0 },
29
- { "vle64.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vle64_v, rv_op_vle64_v, 0 },
30
- { "vse8.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vse8_v, rv_op_vse8_v, 0 },
31
- { "vse16.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vse16_v, rv_op_vse16_v, 0 },
32
- { "vse32.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vse32_v, rv_op_vse32_v, 0 },
33
- { "vse64.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vse64_v, rv_op_vse64_v, 0 },
34
- { "vlm.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vlm_v, rv_op_vlm_v, 0 },
35
- { "vsm.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vsm_v, rv_op_vsm_v, 0 },
36
- { "vlse8.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, rv_op_vlse8_v, rv_op_vlse8_v, 0 },
37
- { "vlse16.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, rv_op_vlse16_v, rv_op_vlse16_v, 0 },
38
- { "vlse32.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, rv_op_vlse32_v, rv_op_vlse32_v, 0 },
39
- { "vlse64.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, rv_op_vlse64_v, rv_op_vlse64_v, 0 },
40
- { "vsse8.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, rv_op_vsse8_v, rv_op_vsse8_v, 0 },
41
- { "vsse16.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, rv_op_vsse16_v, rv_op_vsse16_v, 0 },
42
- { "vsse32.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, rv_op_vsse32_v, rv_op_vsse32_v, 0 },
43
- { "vsse64.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, rv_op_vsse64_v, rv_op_vsse64_v, 0 },
44
- { "vluxei8.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vluxei8_v, rv_op_vluxei8_v, 0 },
45
- { "vluxei16.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vluxei16_v, rv_op_vluxei16_v, 0 },
46
- { "vluxei32.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vluxei32_v, rv_op_vluxei32_v, 0 },
47
- { "vluxei64.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vluxei64_v, rv_op_vluxei64_v, 0 },
48
- { "vloxei8.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vloxei8_v, rv_op_vloxei8_v, 0 },
49
- { "vloxei16.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vloxei16_v, rv_op_vloxei16_v, 0 },
50
- { "vloxei32.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vloxei32_v, rv_op_vloxei32_v, 0 },
51
- { "vloxei64.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vloxei64_v, rv_op_vloxei64_v, 0 },
52
- { "vsuxei8.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vsuxei8_v, rv_op_vsuxei8_v, 0 },
53
- { "vsuxei16.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vsuxei16_v, rv_op_vsuxei16_v, 0 },
54
- { "vsuxei32.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vsuxei32_v, rv_op_vsuxei32_v, 0 },
55
- { "vsuxei64.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vsuxei64_v, rv_op_vsuxei64_v, 0 },
56
- { "vsoxei8.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vsoxei8_v, rv_op_vsoxei8_v, 0 },
57
- { "vsoxei16.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vsoxei16_v, rv_op_vsoxei16_v, 0 },
58
- { "vsoxei32.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vsoxei32_v, rv_op_vsoxei32_v, 0 },
59
- { "vsoxei64.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vsoxei64_v, rv_op_vsoxei64_v, 0 },
60
- { "vle8ff.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vle8ff_v, rv_op_vle8ff_v, 0 },
61
- { "vle16ff.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vle16ff_v, rv_op_vle16ff_v, 0 },
62
- { "vle32ff.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vle32ff_v, rv_op_vle32ff_v, 0 },
63
- { "vle64ff.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vle64ff_v, rv_op_vle64ff_v, 0 },
64
- { "vl1re8.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl1re8_v, rv_op_vl1re8_v, 0 },
65
- { "vl1re16.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl1re16_v, rv_op_vl1re16_v, 0 },
66
- { "vl1re32.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl1re32_v, rv_op_vl1re32_v, 0 },
67
- { "vl1re64.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl1re64_v, rv_op_vl1re64_v, 0 },
68
- { "vl2re8.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl2re8_v, rv_op_vl2re8_v, 0 },
69
- { "vl2re16.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl2re16_v, rv_op_vl2re16_v, 0 },
70
- { "vl2re32.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl2re32_v, rv_op_vl2re32_v, 0 },
71
- { "vl2re64.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl2re64_v, rv_op_vl2re64_v, 0 },
72
- { "vl4re8.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl4re8_v, rv_op_vl4re8_v, 0 },
73
- { "vl4re16.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl4re16_v, rv_op_vl4re16_v, 0 },
74
- { "vl4re32.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl4re32_v, rv_op_vl4re32_v, 0 },
75
- { "vl4re64.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl4re64_v, rv_op_vl4re64_v, 0 },
76
- { "vl8re8.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl8re8_v, rv_op_vl8re8_v, 0 },
77
- { "vl8re16.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl8re16_v, rv_op_vl8re16_v, 0 },
78
- { "vl8re32.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl8re32_v, rv_op_vl8re32_v, 0 },
79
- { "vl8re64.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl8re64_v, rv_op_vl8re64_v, 0 },
80
- { "vs1r.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vs1r_v, rv_op_vs1r_v, 0 },
81
- { "vs2r.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vs2r_v, rv_op_vs2r_v, 0 },
82
- { "vs4r.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vs4r_v, rv_op_vs4r_v, 0 },
83
- { "vs8r.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vs8r_v, rv_op_vs8r_v, 0 },
84
- { "vadd.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vadd_vv, rv_op_vadd_vv, 0 },
85
- { "vadd.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vadd_vx, rv_op_vadd_vx, 0 },
86
- { "vadd.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vadd_vi, rv_op_vadd_vi, 0 },
87
- { "vsub.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vsub_vv, rv_op_vsub_vv, 0 },
88
- { "vsub.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vsub_vx, rv_op_vsub_vx, 0 },
89
- { "vrsub.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vrsub_vx, rv_op_vrsub_vx, 0 },
90
- { "vrsub.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vrsub_vi, rv_op_vrsub_vi, 0 },
91
- { "vwaddu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwaddu_vv, rv_op_vwaddu_vv, 0 },
92
- { "vwaddu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwaddu_vx, rv_op_vwaddu_vx, 0 },
93
- { "vwadd.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwadd_vv, rv_op_vwadd_vv, 0 },
94
- { "vwadd.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwadd_vx, rv_op_vwadd_vx, 0 },
95
- { "vwsubu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwsubu_vv, rv_op_vwsubu_vv, 0 },
96
- { "vwsubu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwsubu_vx, rv_op_vwsubu_vx, 0 },
97
- { "vwsub.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwsub_vv, rv_op_vwsub_vv, 0 },
98
- { "vwsub.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwsub_vx, rv_op_vwsub_vx, 0 },
99
- { "vwaddu.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwaddu_wv, rv_op_vwaddu_wv, 0 },
100
- { "vwaddu.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwaddu_wx, rv_op_vwaddu_wx, 0 },
101
- { "vwadd.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwadd_wv, rv_op_vwadd_wv, 0 },
102
- { "vwadd.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwadd_wx, rv_op_vwadd_wx, 0 },
103
- { "vwsubu.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwsubu_wv, rv_op_vwsubu_wv, 0 },
104
- { "vwsubu.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwsubu_wx, rv_op_vwsubu_wx, 0 },
105
- { "vwsub.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwsub_wv, rv_op_vwsub_wv, 0 },
106
- { "vwsub.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwsub_wx, rv_op_vwsub_wx, 0 },
107
- { "vadc.vvm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vl, NULL, rv_op_vadc_vvm, rv_op_vadc_vvm, 0 },
108
- { "vadc.vxm", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vl, NULL, rv_op_vadc_vxm, rv_op_vadc_vxm, 0 },
109
- { "vadc.vim", rv_codec_v_i, rv_fmt_vd_vs2_imm_vl, NULL, rv_op_vadc_vim, rv_op_vadc_vim, 0 },
110
- { "vmadc.vvm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vl, NULL, rv_op_vmadc_vvm, rv_op_vmadc_vvm, 0 },
111
- { "vmadc.vxm", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vl, NULL, rv_op_vmadc_vxm, rv_op_vmadc_vxm, 0 },
112
- { "vmadc.vim", rv_codec_v_i, rv_fmt_vd_vs2_imm_vl, NULL, rv_op_vmadc_vim, rv_op_vmadc_vim, 0 },
113
- { "vsbc.vvm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vl, NULL, rv_op_vsbc_vvm, rv_op_vsbc_vvm, 0 },
114
- { "vsbc.vxm", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vl, NULL, rv_op_vsbc_vxm, rv_op_vsbc_vxm, 0 },
115
- { "vmsbc.vvm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vl, NULL, rv_op_vmsbc_vvm, rv_op_vmsbc_vvm, 0 },
116
- { "vmsbc.vxm", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vl, NULL, rv_op_vmsbc_vxm, rv_op_vmsbc_vxm, 0 },
117
- { "vand.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vand_vv, rv_op_vand_vv, 0 },
118
- { "vand.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vand_vx, rv_op_vand_vx, 0 },
119
- { "vand.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vand_vi, rv_op_vand_vi, 0 },
120
- { "vor.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vor_vv, rv_op_vor_vv, 0 },
121
- { "vor.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vor_vx, rv_op_vor_vx, 0 },
122
- { "vor.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vor_vi, rv_op_vor_vi, 0 },
123
- { "vxor.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vxor_vv, rv_op_vxor_vv, 0 },
124
- { "vxor.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vxor_vx, rv_op_vxor_vx, 0 },
125
- { "vxor.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vxor_vi, rv_op_vxor_vi, 0 },
126
- { "vsll.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vsll_vv, rv_op_vsll_vv, 0 },
127
- { "vsll.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vsll_vx, rv_op_vsll_vx, 0 },
128
- { "vsll.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vsll_vi, rv_op_vsll_vi, 0 },
129
- { "vsrl.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vsrl_vv, rv_op_vsrl_vv, 0 },
130
- { "vsrl.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vsrl_vx, rv_op_vsrl_vx, 0 },
131
- { "vsrl.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vsrl_vi, rv_op_vsrl_vi, 0 },
132
- { "vsra.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vsra_vv, rv_op_vsra_vv, 0 },
133
- { "vsra.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vsra_vx, rv_op_vsra_vx, 0 },
134
- { "vsra.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vsra_vi, rv_op_vsra_vi, 0 },
135
- { "vnsrl.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vnsrl_wv, rv_op_vnsrl_wv, 0 },
136
- { "vnsrl.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vnsrl_wx, rv_op_vnsrl_wx, 0 },
137
- { "vnsrl.wi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vnsrl_wi, rv_op_vnsrl_wi, 0 },
138
- { "vnsra.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vnsra_wv, rv_op_vnsra_wv, 0 },
139
- { "vnsra.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vnsra_wx, rv_op_vnsra_wx, 0 },
140
- { "vnsra.wi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vnsra_wi, rv_op_vnsra_wi, 0 },
141
- { "vmseq.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmseq_vv, rv_op_vmseq_vv, 0 },
142
- { "vmseq.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmseq_vx, rv_op_vmseq_vx, 0 },
143
- { "vmseq.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vmseq_vi, rv_op_vmseq_vi, 0 },
144
- { "vmsne.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmsne_vv, rv_op_vmsne_vv, 0 },
145
- { "vmsne.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmsne_vx, rv_op_vmsne_vx, 0 },
146
- { "vmsne.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vmsne_vi, rv_op_vmsne_vi, 0 },
147
- { "vmsltu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmsltu_vv, rv_op_vmsltu_vv, 0 },
148
- { "vmsltu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmsltu_vx, rv_op_vmsltu_vx, 0 },
149
- { "vmslt.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmslt_vv, rv_op_vmslt_vv, 0 },
150
- { "vmslt.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmslt_vx, rv_op_vmslt_vx, 0 },
151
- { "vmsleu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmsleu_vv, rv_op_vmsleu_vv, 0 },
152
- { "vmsleu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmsleu_vx, rv_op_vmsleu_vx, 0 },
153
- { "vmsleu.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vmsleu_vi, rv_op_vmsleu_vi, 0 },
154
- { "vmsle.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmsle_vv, rv_op_vmsle_vv, 0 },
155
- { "vmsle.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmsle_vx, rv_op_vmsle_vx, 0 },
156
- { "vmsle.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vmsle_vi, rv_op_vmsle_vi, 0 },
157
- { "vmsgtu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmsgtu_vx, rv_op_vmsgtu_vx, 0 },
158
- { "vmsgtu.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vmsgtu_vi, rv_op_vmsgtu_vi, 0 },
159
- { "vmsgt.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmsgt_vx, rv_op_vmsgt_vx, 0 },
160
- { "vmsgt.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vmsgt_vi, rv_op_vmsgt_vi, 0 },
161
- { "vminu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vminu_vv, rv_op_vminu_vv, 0 },
162
- { "vminu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vminu_vx, rv_op_vminu_vx, 0 },
163
- { "vmin.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmin_vv, rv_op_vmin_vv, 0 },
164
- { "vmin.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmin_vx, rv_op_vmin_vx, 0 },
165
- { "vmaxu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmaxu_vv, rv_op_vmaxu_vv, 0 },
166
- { "vmaxu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmaxu_vx, rv_op_vmaxu_vx, 0 },
167
- { "vmax.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmax_vv, rv_op_vmax_vv, 0 },
168
- { "vmax.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmax_vx, rv_op_vmax_vx, 0 },
169
- { "vmul.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmul_vv, rv_op_vmul_vv, 0 },
170
- { "vmul.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmul_vx, rv_op_vmul_vx, 0 },
171
- { "vmulh.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmulh_vv, rv_op_vmulh_vv, 0 },
172
- { "vmulh.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmulh_vx, rv_op_vmulh_vx, 0 },
173
- { "vmulhu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmulhu_vv, rv_op_vmulhu_vv, 0 },
174
- { "vmulhu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmulhu_vx, rv_op_vmulhu_vx, 0 },
175
- { "vmulhsu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmulhsu_vv, rv_op_vmulhsu_vv, 0 },
176
- { "vmulhsu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmulhsu_vx, rv_op_vmulhsu_vx, 0 },
177
- { "vdivu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vdivu_vv, rv_op_vdivu_vv, 0 },
178
- { "vdivu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vdivu_vx, rv_op_vdivu_vx, 0 },
179
- { "vdiv.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vdiv_vv, rv_op_vdiv_vv, 0 },
180
- { "vdiv.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vdiv_vx, rv_op_vdiv_vx, 0 },
181
- { "vremu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vremu_vv, rv_op_vremu_vv, 0 },
182
- { "vremu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vremu_vx, rv_op_vremu_vx, 0 },
183
- { "vrem.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vrem_vv, rv_op_vrem_vv, 0 },
184
- { "vrem.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vrem_vx, rv_op_vrem_vx, 0 },
185
- { "vwmulu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwmulu_vv, rv_op_vwmulu_vv, 0 },
186
- { "vwmulu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwmulu_vx, rv_op_vwmulu_vx, 0 },
187
- { "vwmulsu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwmulsu_vv, rv_op_vwmulsu_vv, 0 },
188
- { "vwmulsu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwmulsu_vx, rv_op_vwmulsu_vx, 0 },
189
- { "vwmul.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwmul_vv, rv_op_vwmul_vv, 0 },
190
- { "vwmul.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwmul_vx, rv_op_vwmul_vx, 0 },
191
- { "vmacc.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vmacc_vv, rv_op_vmacc_vv, 0 },
192
- { "vmacc.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, rv_op_vmacc_vx, rv_op_vmacc_vx, 0 },
193
- { "vnmsac.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vnmsac_vv, rv_op_vnmsac_vv, 0 },
194
- { "vnmsac.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, rv_op_vnmsac_vx, rv_op_vnmsac_vx, 0 },
195
- { "vmadd.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vmadd_vv, rv_op_vmadd_vv, 0 },
196
- { "vmadd.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, rv_op_vmadd_vx, rv_op_vmadd_vx, 0 },
197
- { "vnmsub.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vnmsub_vv, rv_op_vnmsub_vv, 0 },
198
- { "vnmsub.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, rv_op_vnmsub_vx, rv_op_vnmsub_vx, 0 },
199
- { "vwmaccu.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vwmaccu_vv, rv_op_vwmaccu_vv, 0 },
200
- { "vwmaccu.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, rv_op_vwmaccu_vx, rv_op_vwmaccu_vx, 0 },
201
- { "vwmacc.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vwmacc_vv, rv_op_vwmacc_vv, 0 },
202
- { "vwmacc.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, rv_op_vwmacc_vx, rv_op_vwmacc_vx, 0 },
203
- { "vwmaccsu.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vwmaccsu_vv, rv_op_vwmaccsu_vv, 0 },
204
- { "vwmaccsu.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, rv_op_vwmaccsu_vx, rv_op_vwmaccsu_vx, 0 },
205
- { "vwmaccus.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, rv_op_vwmaccus_vx, rv_op_vwmaccus_vx, 0 },
206
- { "vmv.v.v", rv_codec_v_r, rv_fmt_vd_vs1, NULL, rv_op_vmv_v_v, rv_op_vmv_v_v, 0 },
207
- { "vmv.v.x", rv_codec_v_r, rv_fmt_vd_rs1, NULL, rv_op_vmv_v_x, rv_op_vmv_v_x, 0 },
208
- { "vmv.v.i", rv_codec_v_i, rv_fmt_vd_imm, NULL, rv_op_vmv_v_i, rv_op_vmv_v_i, 0 },
209
- { "vmerge.vvm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vl, NULL, rv_op_vmerge_vvm, rv_op_vmerge_vvm, 0 },
210
- { "vmerge.vxm", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vl, NULL, rv_op_vmerge_vxm, rv_op_vmerge_vxm, 0 },
211
- { "vmerge.vim", rv_codec_v_i, rv_fmt_vd_vs2_imm_vl, NULL, rv_op_vmerge_vim, rv_op_vmerge_vim, 0 },
212
- { "vsaddu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vsaddu_vv, rv_op_vsaddu_vv, 0 },
213
- { "vsaddu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vsaddu_vx, rv_op_vsaddu_vx, 0 },
214
- { "vsaddu.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vsaddu_vi, rv_op_vsaddu_vi, 0 },
215
- { "vsadd.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vsadd_vv, rv_op_vsadd_vv, 0 },
216
- { "vsadd.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vsadd_vx, rv_op_vsadd_vx, 0 },
217
- { "vsadd.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vsadd_vi, rv_op_vsadd_vi, 0 },
218
- { "vssubu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vssubu_vv, rv_op_vssubu_vv, 0 },
219
- { "vssubu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vssubu_vx, rv_op_vssubu_vx, 0 },
220
- { "vssub.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vssub_vv, rv_op_vssub_vv, 0 },
221
- { "vssub.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vssub_vx, rv_op_vssub_vx, 0 },
222
- { "vaadd.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vaadd_vv, rv_op_vaadd_vv, 0 },
223
- { "vaadd.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vaadd_vx, rv_op_vaadd_vx, 0 },
224
- { "vaaddu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vaaddu_vv, rv_op_vaaddu_vv, 0 },
225
- { "vaaddu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vaaddu_vx, rv_op_vaaddu_vx, 0 },
226
- { "vasub.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vasub_vv, rv_op_vasub_vv, 0 },
227
- { "vasub.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vasub_vx, rv_op_vasub_vx, 0 },
228
- { "vasubu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vasubu_vv, rv_op_vasubu_vv, 0 },
229
- { "vasubu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vasubu_vx, rv_op_vasubu_vx, 0 },
230
- { "vsmul.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vsmul_vv, rv_op_vsmul_vv, 0 },
231
- { "vsmul.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vsmul_vx, rv_op_vsmul_vx, 0 },
232
- { "vssrl.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vssrl_vv, rv_op_vssrl_vv, 0 },
233
- { "vssrl.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vssrl_vx, rv_op_vssrl_vx, 0 },
234
- { "vssrl.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vssrl_vi, rv_op_vssrl_vi, 0 },
235
- { "vssra.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vssra_vv, rv_op_vssra_vv, 0 },
236
- { "vssra.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vssra_vx, rv_op_vssra_vx, 0 },
237
- { "vssra.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vssra_vi, rv_op_vssra_vi, 0 },
238
- { "vnclipu.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vnclipu_wv, rv_op_vnclipu_wv, 0 },
239
- { "vnclipu.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vnclipu_wx, rv_op_vnclipu_wx, 0 },
240
- { "vnclipu.wi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vnclipu_wi, rv_op_vnclipu_wi, 0 },
241
- { "vnclip.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vnclip_wv, rv_op_vnclip_wv, 0 },
242
- { "vnclip.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vnclip_wx, rv_op_vnclip_wx, 0 },
243
- { "vnclip.wi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vnclip_wi, rv_op_vnclip_wi, 0 },
244
- { "vfadd.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfadd_vv, rv_op_vfadd_vv, 0 },
245
- { "vfadd.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfadd_vf, rv_op_vfadd_vf, 0 },
246
- { "vfsub.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfsub_vv, rv_op_vfsub_vv, 0 },
247
- { "vfsub.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfsub_vf, rv_op_vfsub_vf, 0 },
248
- { "vfrsub.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfrsub_vf, rv_op_vfrsub_vf, 0 },
249
- { "vfwadd.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfwadd_vv, rv_op_vfwadd_vv, 0 },
250
- { "vfwadd.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfwadd_vf, rv_op_vfwadd_vf, 0 },
251
- { "vfwadd.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfwadd_wv, rv_op_vfwadd_wv, 0 },
252
- { "vfwadd.wf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfwadd_wf, rv_op_vfwadd_wf, 0 },
253
- { "vfwsub.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfwsub_vv, rv_op_vfwsub_vv, 0 },
254
- { "vfwsub.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfwsub_vf, rv_op_vfwsub_vf, 0 },
255
- { "vfwsub.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfwsub_wv, rv_op_vfwsub_wv, 0 },
256
- { "vfwsub.wf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfwsub_wf, rv_op_vfwsub_wf, 0 },
257
- { "vfmul.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfmul_vv, rv_op_vfmul_vv, 0 },
258
- { "vfmul.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfmul_vf, rv_op_vfmul_vf, 0 },
259
- { "vfdiv.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfdiv_vv, rv_op_vfdiv_vv, 0 },
260
- { "vfdiv.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfdiv_vf, rv_op_vfdiv_vf, 0 },
261
- { "vfrdiv.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfrdiv_vf, rv_op_vfrdiv_vf, 0 },
262
- { "vfwmul.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfwmul_vv, rv_op_vfwmul_vv, 0 },
263
- { "vfwmul.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfwmul_vf, rv_op_vfwmul_vf, 0 },
264
- { "vfmacc.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfmacc_vv, rv_op_vfmacc_vv, 0 },
265
- { "vfmacc.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfmacc_vf, rv_op_vfmacc_vf, 0 },
266
- { "vfnmacc.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfnmacc_vv, rv_op_vfnmacc_vv, 0 },
267
- { "vfnmacc.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfnmacc_vf, rv_op_vfnmacc_vf, 0 },
268
- { "vfmsac.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfmsac_vv, rv_op_vfmsac_vv, 0 },
269
- { "vfmsac.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfmsac_vf, rv_op_vfmsac_vf, 0 },
270
- { "vfnmsac.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfnmsac_vv, rv_op_vfnmsac_vv, 0 },
271
- { "vfnmsac.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfnmsac_vf, rv_op_vfnmsac_vf, 0 },
272
- { "vfmadd.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfmadd_vv, rv_op_vfmadd_vv, 0 },
273
- { "vfmadd.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfmadd_vf, rv_op_vfmadd_vf, 0 },
274
- { "vfnmadd.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfnmadd_vv, rv_op_vfnmadd_vv, 0 },
275
- { "vfnmadd.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfnmadd_vf, rv_op_vfnmadd_vf, 0 },
276
- { "vfmsub.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfmsub_vv, rv_op_vfmsub_vv, 0 },
277
- { "vfmsub.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfmsub_vf, rv_op_vfmsub_vf, 0 },
278
- { "vfnmsub.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfnmsub_vv, rv_op_vfnmsub_vv, 0 },
279
- { "vfnmsub.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfnmsub_vf, rv_op_vfnmsub_vf, 0 },
280
- { "vfwmacc.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfwmacc_vv, rv_op_vfwmacc_vv, 0 },
281
- { "vfwmacc.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfwmacc_vf, rv_op_vfwmacc_vf, 0 },
282
- { "vfwnmacc.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfwnmacc_vv, rv_op_vfwnmacc_vv, 0 },
283
- { "vfwnmacc.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfwnmacc_vf, rv_op_vfwnmacc_vf, 0 },
284
- { "vfwmsac.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfwmsac_vv, rv_op_vfwmsac_vv, 0 },
285
- { "vfwmsac.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfwmsac_vf, rv_op_vfwmsac_vf, 0 },
286
- { "vfwnmsac.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfwnmsac_vv, rv_op_vfwnmsac_vv, 0 },
287
- { "vfwnmsac.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfwnmsac_vf, rv_op_vfwnmsac_vf, 0 },
288
- { "vfsqrt.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, rv_op_vfsqrt_v, rv_op_vfsqrt_v, 0 },
289
- { "vfrsqrt7.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, rv_op_vfrsqrt7_v, rv_op_vfrsqrt7_v, 0 },
290
- { "vfrec7.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, rv_op_vfrec7_v, rv_op_vfrec7_v, 0 },
291
- { "vfmin.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfmin_vv, rv_op_vfmin_vv, 0 },
292
- { "vfmin.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfmin_vf, rv_op_vfmin_vf, 0 },
293
- { "vfmax.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfmax_vv, rv_op_vfmax_vv, 0 },
294
- { "vfmax.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfmax_vf, rv_op_vfmax_vf, 0 },
295
- { "vfsgnj.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfsgnj_vv, rv_op_vfsgnj_vv, 0 },
296
- { "vfsgnj.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfsgnj_vf, rv_op_vfsgnj_vf, 0 },
297
- { "vfsgnjn.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfsgnjn_vv, rv_op_vfsgnjn_vv, 0 },
298
- { "vfsgnjn.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfsgnjn_vf, rv_op_vfsgnjn_vf, 0 },
299
- { "vfsgnjx.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfsgnjx_vv, rv_op_vfsgnjx_vv, 0 },
300
- { "vfsgnjx.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfsgnjx_vf, rv_op_vfsgnjx_vf, 0 },
301
- { "vfslide1up.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfslide1up_vf, rv_op_vfslide1up_vf, 0 },
302
- { "vfslide1down.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfslide1down_vf, rv_op_vfslide1down_vf, 0 },
303
- { "vmfeq.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmfeq_vv, rv_op_vmfeq_vv, 0 },
304
- { "vmfeq.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vmfeq_vf, rv_op_vmfeq_vf, 0 },
305
- { "vmfne.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmfne_vv, rv_op_vmfne_vv, 0 },
306
- { "vmfne.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vmfne_vf, rv_op_vmfne_vf, 0 },
307
- { "vmflt.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmflt_vv, rv_op_vmflt_vv, 0 },
308
- { "vmflt.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vmflt_vf, rv_op_vmflt_vf, 0 },
309
- { "vmfle.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmfle_vv, rv_op_vmfle_vv, 0 },
310
- { "vmfle.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vmfle_vf, rv_op_vmfle_vf, 0 },
311
- { "vmfgt.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vmfgt_vf, rv_op_vmfgt_vf, 0 },
312
- { "vmfge.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vmfge_vf, rv_op_vmfge_vf, 0 },
313
- { "vfclass.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfclass_v, rv_op_vfclass_v, 0 },
314
- { "vfmerge.vfm", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vl, NULL, rv_op_vfmerge_vfm, rv_op_vfmerge_vfm, 0 },
315
- { "vfmv.v.f", rv_codec_v_r, rv_fmt_vd_fs1, NULL, rv_op_vfmv_v_f, rv_op_vfmv_v_f, 0 },
316
- { "vfcvt.xu.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfcvt_xu_f_v, rv_op_vfcvt_xu_f_v, 0 },
317
- { "vfcvt.x.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfcvt_x_f_v, rv_op_vfcvt_x_f_v, 0 },
318
- { "vfcvt.f.xu.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfcvt_f_xu_v, rv_op_vfcvt_f_xu_v, 0 },
319
- { "vfcvt.f.x.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfcvt_f_x_v, rv_op_vfcvt_f_x_v, 0 },
320
- { "vfcvt.rtz.xu.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfcvt_rtz_xu_f_v, rv_op_vfcvt_rtz_xu_f_v, 0 },
321
- { "vfcvt.rtz.x.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfcvt_rtz_x_f_v, rv_op_vfcvt_rtz_x_f_v, 0 },
322
- { "vfwcvt.xu.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfwcvt_xu_f_v, rv_op_vfwcvt_xu_f_v, 0 },
323
- { "vfwcvt.x.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfwcvt_x_f_v, rv_op_vfwcvt_x_f_v, 0 },
324
- { "vfwcvt.f.xu.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfwcvt_f_xu_v, rv_op_vfwcvt_f_xu_v, 0 },
325
- { "vfwcvt.f.x.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfwcvt_f_x_v, rv_op_vfwcvt_f_x_v, 0 },
326
- { "vfwcvt.f.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfwcvt_f_f_v, rv_op_vfwcvt_f_f_v, 0 },
327
- { "vfwcvt.rtz.xu.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfwcvt_rtz_xu_f_v, rv_op_vfwcvt_rtz_xu_f_v, 0 },
328
- { "vfwcvt.rtz.x.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfwcvt_rtz_x_f_v, rv_op_vfwcvt_rtz_x_f_v, 0 },
329
- { "vfncvt.xu.f.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfncvt_xu_f_w, rv_op_vfncvt_xu_f_w, 0 },
330
- { "vfncvt.x.f.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfncvt_x_f_w, rv_op_vfncvt_x_f_w, 0 },
331
- { "vfncvt.f.xu.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfncvt_f_xu_w, rv_op_vfncvt_f_xu_w, 0 },
332
- { "vfncvt.f.x.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfncvt_f_x_w, rv_op_vfncvt_f_x_w, 0 },
333
- { "vfncvt.f.f.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfncvt_f_f_w, rv_op_vfncvt_f_f_w, 0 },
334
- { "vfncvt.rod.f.f.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfncvt_rod_f_f_w, rv_op_vfncvt_rod_f_f_w, 0 },
335
- { "vfncvt.rtz.xu.f.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfncvt_rtz_xu_f_w, rv_op_vfncvt_rtz_xu_f_w, 0 },
336
- { "vfncvt.rtz.x.f.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfncvt_rtz_x_f_w, rv_op_vfncvt_rtz_x_f_w, 0 },
337
- { "vredsum.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vredsum_vs, rv_op_vredsum_vs, 0 },
338
- { "vredand.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vredand_vs, rv_op_vredand_vs, 0 },
339
- { "vredor.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vredor_vs, rv_op_vredor_vs, 0 },
340
- { "vredxor.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vredxor_vs, rv_op_vredxor_vs, 0 },
341
- { "vredminu.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vredminu_vs, rv_op_vredminu_vs, 0 },
342
- { "vredmin.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vredmin_vs, rv_op_vredmin_vs, 0 },
343
- { "vredmaxu.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vredmaxu_vs, rv_op_vredmaxu_vs, 0 },
344
- { "vredmax.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vredmax_vs, rv_op_vredmax_vs, 0 },
345
- { "vwredsumu.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwredsumu_vs, rv_op_vwredsumu_vs, 0 },
346
- { "vwredsum.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwredsum_vs, rv_op_vwredsum_vs, 0 },
347
- { "vfredusum.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfredusum_vs, rv_op_vfredusum_vs, 0 },
348
- { "vfredosum.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfredosum_vs, rv_op_vfredosum_vs, 0 },
349
- { "vfredmin.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfredmin_vs, rv_op_vfredmin_vs, 0 },
350
- { "vfredmax.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfredmax_vs, rv_op_vfredmax_vs, 0 },
351
- { "vfwredusum.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfwredusum_vs, rv_op_vfwredusum_vs, 0 },
352
- { "vfwredosum.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfwredosum_vs, rv_op_vfwredosum_vs, 0 },
353
- { "vmand.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmand_mm, rv_op_vmand_mm, 0 },
354
- { "vmnand.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmnand_mm, rv_op_vmnand_mm, 0 },
355
- { "vmandn.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmandn_mm, rv_op_vmandn_mm, 0 },
356
- { "vmxor.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmxor_mm, rv_op_vmxor_mm, 0 },
357
- { "vmor.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmor_mm, rv_op_vmor_mm, 0 },
358
- { "vmnor.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmnor_mm, rv_op_vmnor_mm, 0 },
359
- { "vmorn.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmorn_mm, rv_op_vmorn_mm, 0 },
360
- { "vmxnor.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmxnor_mm, rv_op_vmxnor_mm, 0 },
361
- { "vcpop.m", rv_codec_v_r, rv_fmt_rd_vs2_vm, NULL, rv_op_vcpop_m, rv_op_vcpop_m, 0 },
362
- { "vfirst.m", rv_codec_v_r, rv_fmt_rd_vs2_vm, NULL, rv_op_vfirst_m, rv_op_vfirst_m, 0 },
363
- { "vmsbf.m", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vmsbf_m, rv_op_vmsbf_m, 0 },
364
- { "vmsif.m", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vmsif_m, rv_op_vmsif_m, 0 },
365
- { "vmsof.m", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vmsof_m, rv_op_vmsof_m, 0 },
366
- { "viota.m", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_viota_m, rv_op_viota_m, 0 },
367
- { "vid.v", rv_codec_v_r, rv_fmt_vd_vm, NULL, rv_op_vid_v, rv_op_vid_v, 0 },
368
- { "vmv.x.s", rv_codec_v_r, rv_fmt_rd_vs2, NULL, rv_op_vmv_x_s, rv_op_vmv_x_s, 0 },
369
- { "vmv.s.x", rv_codec_v_r, rv_fmt_vd_rs1, NULL, rv_op_vmv_s_x, rv_op_vmv_s_x, 0 },
370
- { "vfmv.f.s", rv_codec_v_r, rv_fmt_fd_vs2, NULL, rv_op_vfmv_f_s, rv_op_vfmv_f_s, 0 },
371
- { "vfmv.s.f", rv_codec_v_r, rv_fmt_vd_fs1, NULL, rv_op_vfmv_s_f, rv_op_vfmv_s_f, 0 },
372
- { "vslideup.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vslideup_vx, rv_op_vslideup_vx, 0 },
373
- { "vslideup.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vslideup_vi, rv_op_vslideup_vi, 0 },
374
- { "vslide1up.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vslide1up_vx, rv_op_vslide1up_vx, 0 },
375
- { "vslidedown.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vslidedown_vx, rv_op_vslidedown_vx, 0 },
376
- { "vslidedown.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vslidedown_vi, rv_op_vslidedown_vi, 0 },
377
- { "vslide1down.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vslide1down_vx, rv_op_vslide1down_vx, 0 },
378
- { "vrgather.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vrgather_vv, rv_op_vrgather_vv, 0 },
379
- { "vrgatherei16.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vrgatherei16_vv, rv_op_vrgatherei16_vv, 0 },
380
- { "vrgather.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vrgather_vx, rv_op_vrgather_vx, 0 },
381
- { "vrgather.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vrgather_vi, rv_op_vrgather_vi, 0 },
382
- { "vcompress.vm", rv_codec_v_r, rv_fmt_vd_vs2_vs1, NULL, rv_op_vcompress_vm, rv_op_vcompress_vm, 0 },
383
- { "vmv1r.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, rv_op_vmv1r_v, rv_op_vmv1r_v, 0 },
384
- { "vmv2r.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, rv_op_vmv2r_v, rv_op_vmv2r_v, 0 },
385
- { "vmv4r.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, rv_op_vmv4r_v, rv_op_vmv4r_v, 0 },
386
- { "vmv8r.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, rv_op_vmv8r_v, rv_op_vmv8r_v, 0 },
387
- { "vzext.vf2", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vzext_vf2, rv_op_vzext_vf2, 0 },
388
- { "vzext.vf4", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vzext_vf4, rv_op_vzext_vf4, 0 },
389
- { "vzext.vf8", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vzext_vf8, rv_op_vzext_vf8, 0 },
390
- { "vsext.vf2", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vsext_vf2, rv_op_vsext_vf2, 0 },
391
- { "vsext.vf4", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vsext_vf4, rv_op_vsext_vf4, 0 },
392
- { "vsext.vf8", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vsext_vf8, rv_op_vsext_vf8, 0 },
393
- { "vsetvli", rv_codec_vsetvli, rv_fmt_vsetvli, NULL, rv_op_vsetvli, rv_op_vsetvli, 0 },
394
- { "vsetivli", rv_codec_vsetivli, rv_fmt_vsetivli, NULL, rv_op_vsetivli, rv_op_vsetivli, 0 },
395
- { "vsetvl", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, rv_op_vsetvl, rv_op_vsetvl, 0 },
396
+ { "vle8.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
397
+ { "vle16.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
398
+ { "vle32.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
399
+ { "vle64.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
400
+ { "vse8.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
401
+ { "vse16.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
402
+ { "vse32.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
403
+ { "vse64.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
404
+ { "vlm.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
405
+ { "vsm.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
406
+ { "vlse8.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, 0, 0, 0 },
407
+ { "vlse16.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, 0, 0, 0 },
408
+ { "vlse32.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, 0, 0, 0 },
409
+ { "vlse64.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, 0, 0, 0 },
410
+ { "vsse8.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, 0, 0, 0 },
411
+ { "vsse16.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, 0, 0, 0 },
412
+ { "vsse32.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, 0, 0, 0 },
413
+ { "vsse64.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, 0, 0, 0 },
414
+ { "vluxei8.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, 0, 0, 0 },
415
+ { "vluxei16.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, 0, 0, 0 },
416
+ { "vluxei32.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, 0, 0, 0 },
417
+ { "vluxei64.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, 0, 0, 0 },
418
+ { "vloxei8.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, 0, 0, 0 },
419
+ { "vloxei16.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, 0, 0, 0 },
420
+ { "vloxei32.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, 0, 0, 0 },
421
+ { "vloxei64.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, 0, 0, 0 },
422
+ { "vsuxei8.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, 0, 0, 0 },
423
+ { "vsuxei16.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, 0, 0, 0 },
424
+ { "vsuxei32.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, 0, 0, 0 },
425
+ { "vsuxei64.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, 0, 0, 0 },
426
+ { "vsoxei8.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, 0, 0, 0 },
427
+ { "vsoxei16.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, 0, 0, 0 },
428
+ { "vsoxei32.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, 0, 0, 0 },
429
+ { "vsoxei64.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, 0, 0, 0 },
430
+ { "vle8ff.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
431
+ { "vle16ff.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
432
+ { "vle32ff.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
433
+ { "vle64ff.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
434
+ { "vl1re8.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
435
+ { "vl1re16.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
436
+ { "vl1re32.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
437
+ { "vl1re64.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
438
+ { "vl2re8.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
439
+ { "vl2re16.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
440
+ { "vl2re32.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
441
+ { "vl2re64.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
442
+ { "vl4re8.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
443
+ { "vl4re16.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
444
+ { "vl4re32.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
445
+ { "vl4re64.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
446
+ { "vl8re8.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
447
+ { "vl8re16.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
448
+ { "vl8re32.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
449
+ { "vl8re64.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
450
+ { "vs1r.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
451
+ { "vs2r.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
452
+ { "vs4r.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
453
+ { "vs8r.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, 0, 0, 0 },
454
+ { "vadd.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
455
+ { "vadd.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
456
+ { "vadd.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, 0, 0, 0 },
457
+ { "vsub.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
458
+ { "vsub.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
459
+ { "vrsub.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
460
+ { "vrsub.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, 0, 0, 0 },
461
+ { "vwaddu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
462
+ { "vwaddu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
463
+ { "vwadd.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
464
+ { "vwadd.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
465
+ { "vwsubu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
466
+ { "vwsubu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
467
+ { "vwsub.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
468
+ { "vwsub.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
469
+ { "vwaddu.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
470
+ { "vwaddu.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
471
+ { "vwadd.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
472
+ { "vwadd.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
473
+ { "vwsubu.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
474
+ { "vwsubu.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
475
+ { "vwsub.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
476
+ { "vwsub.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
477
+ { "vadc.vvm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vl, NULL, 0, 0, 0 },
478
+ { "vadc.vxm", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vl, NULL, 0, 0, 0 },
479
+ { "vadc.vim", rv_codec_v_i, rv_fmt_vd_vs2_imm_vl, NULL, 0, 0, 0 },
480
+ { "vmadc.vvm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vl, NULL, 0, 0, 0 },
481
+ { "vmadc.vxm", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vl, NULL, 0, 0, 0 },
482
+ { "vmadc.vim", rv_codec_v_i, rv_fmt_vd_vs2_imm_vl, NULL, 0, 0, 0 },
483
+ { "vsbc.vvm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vl, NULL, 0, 0, 0 },
484
+ { "vsbc.vxm", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vl, NULL, 0, 0, 0 },
485
+ { "vmsbc.vvm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vl, NULL, 0, 0, 0 },
486
+ { "vmsbc.vxm", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vl, NULL, 0, 0, 0 },
487
+ { "vand.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
488
+ { "vand.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
489
+ { "vand.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, 0, 0, 0 },
490
+ { "vor.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
491
+ { "vor.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
492
+ { "vor.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, 0, 0, 0 },
493
+ { "vxor.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
494
+ { "vxor.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
495
+ { "vxor.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, 0, 0, 0 },
496
+ { "vsll.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
497
+ { "vsll.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
498
+ { "vsll.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, 0, 0, 0 },
499
+ { "vsrl.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
500
+ { "vsrl.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
501
+ { "vsrl.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, 0, 0, 0 },
502
+ { "vsra.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
503
+ { "vsra.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
504
+ { "vsra.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, 0, 0, 0 },
505
+ { "vnsrl.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
506
+ { "vnsrl.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
507
+ { "vnsrl.wi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, 0, 0, 0 },
508
+ { "vnsra.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
509
+ { "vnsra.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
510
+ { "vnsra.wi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, 0, 0, 0 },
511
+ { "vmseq.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
512
+ { "vmseq.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
513
+ { "vmseq.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, 0, 0, 0 },
514
+ { "vmsne.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
515
+ { "vmsne.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
516
+ { "vmsne.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, 0, 0, 0 },
517
+ { "vmsltu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
518
+ { "vmsltu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
519
+ { "vmslt.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
520
+ { "vmslt.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
521
+ { "vmsleu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
522
+ { "vmsleu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
523
+ { "vmsleu.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, 0, 0, 0 },
524
+ { "vmsle.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
525
+ { "vmsle.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
526
+ { "vmsle.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, 0, 0, 0 },
527
+ { "vmsgtu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
528
+ { "vmsgtu.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, 0, 0, 0 },
529
+ { "vmsgt.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
530
+ { "vmsgt.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, 0, 0, 0 },
531
+ { "vminu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
532
+ { "vminu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
533
+ { "vmin.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
534
+ { "vmin.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
535
+ { "vmaxu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
536
+ { "vmaxu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
537
+ { "vmax.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
538
+ { "vmax.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
539
+ { "vmul.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
540
+ { "vmul.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
541
+ { "vmulh.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
542
+ { "vmulh.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
543
+ { "vmulhu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
544
+ { "vmulhu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
545
+ { "vmulhsu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
546
+ { "vmulhsu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
547
+ { "vdivu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
548
+ { "vdivu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
549
+ { "vdiv.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
550
+ { "vdiv.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
551
+ { "vremu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
552
+ { "vremu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
553
+ { "vrem.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
554
+ { "vrem.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
555
+ { "vwmulu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
556
+ { "vwmulu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
557
+ { "vwmulsu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
558
+ { "vwmulsu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
559
+ { "vwmul.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
560
+ { "vwmul.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
561
+ { "vmacc.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, 0, 0, 0 },
562
+ { "vmacc.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, 0, 0, 0 },
563
+ { "vnmsac.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, 0, 0, 0 },
564
+ { "vnmsac.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, 0, 0, 0 },
565
+ { "vmadd.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, 0, 0, 0 },
566
+ { "vmadd.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, 0, 0, 0 },
567
+ { "vnmsub.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, 0, 0, 0 },
568
+ { "vnmsub.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, 0, 0, 0 },
569
+ { "vwmaccu.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, 0, 0, 0 },
570
+ { "vwmaccu.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, 0, 0, 0 },
571
+ { "vwmacc.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, 0, 0, 0 },
572
+ { "vwmacc.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, 0, 0, 0 },
573
+ { "vwmaccsu.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, 0, 0, 0 },
574
+ { "vwmaccsu.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, 0, 0, 0 },
575
+ { "vwmaccus.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, 0, 0, 0 },
576
+ { "vmv.v.v", rv_codec_v_r, rv_fmt_vd_vs1, NULL, 0, 0, 0 },
577
+ { "vmv.v.x", rv_codec_v_r, rv_fmt_vd_rs1, NULL, 0, 0, 0 },
578
+ { "vmv.v.i", rv_codec_v_i, rv_fmt_vd_imm, NULL, 0, 0, 0 },
579
+ { "vmerge.vvm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vl, NULL, 0, 0, 0 },
580
+ { "vmerge.vxm", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vl, NULL, 0, 0, 0 },
581
+ { "vmerge.vim", rv_codec_v_i, rv_fmt_vd_vs2_imm_vl, NULL, 0, 0, 0 },
582
+ { "vsaddu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
583
+ { "vsaddu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
584
+ { "vsaddu.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, 0, 0, 0 },
585
+ { "vsadd.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
586
+ { "vsadd.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
587
+ { "vsadd.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, 0, 0, 0 },
588
+ { "vssubu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
589
+ { "vssubu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
590
+ { "vssub.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
591
+ { "vssub.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
592
+ { "vaadd.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
593
+ { "vaadd.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
594
+ { "vaaddu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
595
+ { "vaaddu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
596
+ { "vasub.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
597
+ { "vasub.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
598
+ { "vasubu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
599
+ { "vasubu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
600
+ { "vsmul.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
601
+ { "vsmul.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
602
+ { "vssrl.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
603
+ { "vssrl.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
604
+ { "vssrl.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, 0, 0, 0 },
605
+ { "vssra.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
606
+ { "vssra.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
607
+ { "vssra.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, 0, 0, 0 },
608
+ { "vnclipu.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
609
+ { "vnclipu.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
610
+ { "vnclipu.wi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, 0, 0, 0 },
611
+ { "vnclip.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
612
+ { "vnclip.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
613
+ { "vnclip.wi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, 0, 0, 0 },
614
+ { "vfadd.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
615
+ { "vfadd.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, 0, 0, 0 },
616
+ { "vfsub.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
617
+ { "vfsub.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, 0, 0, 0 },
618
+ { "vfrsub.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, 0, 0, 0 },
619
+ { "vfwadd.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
620
+ { "vfwadd.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, 0, 0, 0 },
621
+ { "vfwadd.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
622
+ { "vfwadd.wf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, 0, 0, 0 },
623
+ { "vfwsub.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
624
+ { "vfwsub.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, 0, 0, 0 },
625
+ { "vfwsub.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
626
+ { "vfwsub.wf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, 0, 0, 0 },
627
+ { "vfmul.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
628
+ { "vfmul.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, 0, 0, 0 },
629
+ { "vfdiv.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
630
+ { "vfdiv.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, 0, 0, 0 },
631
+ { "vfrdiv.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, 0, 0, 0 },
632
+ { "vfwmul.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
633
+ { "vfwmul.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, 0, 0, 0 },
634
+ { "vfmacc.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, 0, 0, 0 },
635
+ { "vfmacc.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, 0, 0, 0 },
636
+ { "vfnmacc.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, 0, 0, 0 },
637
+ { "vfnmacc.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, 0, 0, 0 },
638
+ { "vfmsac.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, 0, 0, 0 },
639
+ { "vfmsac.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, 0, 0, 0 },
640
+ { "vfnmsac.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, 0, 0, 0 },
641
+ { "vfnmsac.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, 0, 0, 0 },
642
+ { "vfmadd.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, 0, 0, 0 },
643
+ { "vfmadd.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, 0, 0, 0 },
644
+ { "vfnmadd.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, 0, 0, 0 },
645
+ { "vfnmadd.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, 0, 0, 0 },
646
+ { "vfmsub.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, 0, 0, 0 },
647
+ { "vfmsub.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, 0, 0, 0 },
648
+ { "vfnmsub.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, 0, 0, 0 },
649
+ { "vfnmsub.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, 0, 0, 0 },
650
+ { "vfwmacc.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, 0, 0, 0 },
651
+ { "vfwmacc.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, 0, 0, 0 },
652
+ { "vfwnmacc.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, 0, 0, 0 },
653
+ { "vfwnmacc.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, 0, 0, 0 },
654
+ { "vfwmsac.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, 0, 0, 0 },
655
+ { "vfwmsac.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, 0, 0, 0 },
656
+ { "vfwnmsac.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, 0, 0, 0 },
657
+ { "vfwnmsac.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, 0, 0, 0 },
658
+ { "vfsqrt.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, 0, 0, 0 },
659
+ { "vfrsqrt7.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, 0, 0, 0 },
660
+ { "vfrec7.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, 0, 0, 0 },
661
+ { "vfmin.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
662
+ { "vfmin.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, 0, 0, 0 },
663
+ { "vfmax.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
664
+ { "vfmax.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, 0, 0, 0 },
665
+ { "vfsgnj.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
666
+ { "vfsgnj.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, 0, 0, 0 },
667
+ { "vfsgnjn.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
668
+ { "vfsgnjn.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, 0, 0, 0 },
669
+ { "vfsgnjx.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
670
+ { "vfsgnjx.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, 0, 0, 0 },
671
+ { "vfslide1up.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, 0, 0, 0 },
672
+ { "vfslide1down.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, 0, 0, 0 },
673
+ { "vmfeq.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
674
+ { "vmfeq.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, 0, 0, 0 },
675
+ { "vmfne.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
676
+ { "vmfne.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, 0, 0, 0 },
677
+ { "vmflt.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
678
+ { "vmflt.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, 0, 0, 0 },
679
+ { "vmfle.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
680
+ { "vmfle.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, 0, 0, 0 },
681
+ { "vmfgt.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, 0, 0, 0 },
682
+ { "vmfge.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, 0, 0, 0 },
683
+ { "vfclass.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
684
+ { "vfmerge.vfm", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vl, NULL, 0, 0, 0 },
685
+ { "vfmv.v.f", rv_codec_v_r, rv_fmt_vd_fs1, NULL, 0, 0, 0 },
686
+ { "vfcvt.xu.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
687
+ { "vfcvt.x.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
688
+ { "vfcvt.f.xu.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
689
+ { "vfcvt.f.x.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
690
+ { "vfcvt.rtz.xu.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
691
+ { "vfcvt.rtz.x.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
692
+ { "vfwcvt.xu.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
693
+ { "vfwcvt.x.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
694
+ { "vfwcvt.f.xu.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
695
+ { "vfwcvt.f.x.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
696
+ { "vfwcvt.f.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
697
+ { "vfwcvt.rtz.xu.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
698
+ { "vfwcvt.rtz.x.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
699
+ { "vfncvt.xu.f.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
700
+ { "vfncvt.x.f.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
701
+ { "vfncvt.f.xu.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
702
+ { "vfncvt.f.x.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
703
+ { "vfncvt.f.f.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
704
+ { "vfncvt.rod.f.f.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
705
+ { "vfncvt.rtz.xu.f.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
706
+ { "vfncvt.rtz.x.f.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
707
+ { "vredsum.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
708
+ { "vredand.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
709
+ { "vredor.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
710
+ { "vredxor.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
711
+ { "vredminu.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
712
+ { "vredmin.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
713
+ { "vredmaxu.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
714
+ { "vredmax.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
715
+ { "vwredsumu.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
716
+ { "vwredsum.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
717
+ { "vfredusum.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
718
+ { "vfredosum.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
719
+ { "vfredmin.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
720
+ { "vfredmax.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
721
+ { "vfwredusum.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
722
+ { "vfwredosum.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
723
+ { "vmand.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
724
+ { "vmnand.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
725
+ { "vmandn.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
726
+ { "vmxor.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
727
+ { "vmor.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
728
+ { "vmnor.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
729
+ { "vmorn.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
730
+ { "vmxnor.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
731
+ { "vcpop.m", rv_codec_v_r, rv_fmt_rd_vs2_vm, NULL, 0, 0, 0 },
732
+ { "vfirst.m", rv_codec_v_r, rv_fmt_rd_vs2_vm, NULL, 0, 0, 0 },
733
+ { "vmsbf.m", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
734
+ { "vmsif.m", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
735
+ { "vmsof.m", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
736
+ { "viota.m", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
737
+ { "vid.v", rv_codec_v_r, rv_fmt_vd_vm, NULL, 0, 0, 0 },
738
+ { "vmv.x.s", rv_codec_v_r, rv_fmt_rd_vs2, NULL, 0, 0, 0 },
739
+ { "vmv.s.x", rv_codec_v_r, rv_fmt_vd_rs1, NULL, 0, 0, 0 },
740
+ { "vfmv.f.s", rv_codec_v_r, rv_fmt_fd_vs2, NULL, 0, 0, 0 },
741
+ { "vfmv.s.f", rv_codec_v_r, rv_fmt_vd_fs1, NULL, 0, 0, 0 },
742
+ { "vslideup.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
743
+ { "vslideup.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, 0, 0, 0 },
744
+ { "vslide1up.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
745
+ { "vslidedown.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
746
+ { "vslidedown.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, 0, 0, 0 },
747
+ { "vslide1down.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
748
+ { "vrgather.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
749
+ { "vrgatherei16.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, 0, 0, 0 },
750
+ { "vrgather.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, 0, 0, 0 },
751
+ { "vrgather.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, 0, 0, 0 },
752
+ { "vcompress.vm", rv_codec_v_r, rv_fmt_vd_vs2_vs1, NULL, 0, 0, 0 },
753
+ { "vmv1r.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, 0, 0, 0 },
754
+ { "vmv2r.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, 0, 0, 0 },
755
+ { "vmv4r.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, 0, 0, 0 },
756
+ { "vmv8r.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, 0, 0, 0 },
757
+ { "vzext.vf2", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
758
+ { "vzext.vf4", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
759
+ { "vzext.vf8", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
760
+ { "vsext.vf2", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
761
+ { "vsext.vf4", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
762
+ { "vsext.vf8", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, 0, 0, 0 },
763
+ { "vsetvli", rv_codec_vsetvli, rv_fmt_vsetvli, NULL, 0, 0, 0 },
764
+ { "vsetivli", rv_codec_vsetivli, rv_fmt_vsetivli, NULL, 0, 0, 0 },
765
+ { "vsetvl", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
766
{ "c.zext.b", rv_codec_zcb_ext, rv_fmt_rd, NULL, 0 },
767
{ "c.sext.b", rv_codec_zcb_ext, rv_fmt_rd, NULL, 0 },
768
{ "c.zext.h", rv_codec_zcb_ext, rv_fmt_rd, NULL, 0 },
769
--
770
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
Fix lines with over 80 characters.
4
5
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
6
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
7
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
8
Acked-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <20230523093539.203909-8-liweiwei@iscas.ac.cn>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
disas/riscv.c | 201 +++++++++++++++++++++++++++++++++++---------------
13
1 file changed, 140 insertions(+), 61 deletions(-)
14
15
diff --git a/disas/riscv.c b/disas/riscv.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/disas/riscv.c
18
+++ b/disas/riscv.c
19
@@ -XXX,XX +XXX,XX @@ static const char rv_vreg_name_sym[32][4] = {
20
/* pseudo-instruction constraints */
21
22
static const rvc_constraint rvcc_jal[] = { rvc_rd_eq_ra, rvc_end };
23
-static const rvc_constraint rvcc_jalr[] = { rvc_rd_eq_ra, rvc_imm_eq_zero, rvc_end };
24
-static const rvc_constraint rvcc_nop[] = { rvc_rd_eq_x0, rvc_rs1_eq_x0, rvc_imm_eq_zero, rvc_end };
25
+static const rvc_constraint rvcc_jalr[] = { rvc_rd_eq_ra, rvc_imm_eq_zero,
26
+ rvc_end };
27
+static const rvc_constraint rvcc_nop[] = { rvc_rd_eq_x0, rvc_rs1_eq_x0,
28
+ rvc_imm_eq_zero, rvc_end };
29
static const rvc_constraint rvcc_mv[] = { rvc_imm_eq_zero, rvc_end };
30
static const rvc_constraint rvcc_not[] = { rvc_imm_eq_n1, rvc_end };
31
static const rvc_constraint rvcc_neg[] = { rvc_rs1_eq_x0, rvc_end };
32
@@ -XXX,XX +XXX,XX @@ static const rvc_constraint rvcc_bleu[] = { rvc_end };
33
static const rvc_constraint rvcc_bgt[] = { rvc_end };
34
static const rvc_constraint rvcc_bgtu[] = { rvc_end };
35
static const rvc_constraint rvcc_j[] = { rvc_rd_eq_x0, rvc_end };
36
-static const rvc_constraint rvcc_ret[] = { rvc_rd_eq_x0, rvc_rs1_eq_ra, rvc_end };
37
-static const rvc_constraint rvcc_jr[] = { rvc_rd_eq_x0, rvc_imm_eq_zero, rvc_end };
38
-static const rvc_constraint rvcc_rdcycle[] = { rvc_rs1_eq_x0, rvc_csr_eq_0xc00, rvc_end };
39
-static const rvc_constraint rvcc_rdtime[] = { rvc_rs1_eq_x0, rvc_csr_eq_0xc01, rvc_end };
40
-static const rvc_constraint rvcc_rdinstret[] = { rvc_rs1_eq_x0, rvc_csr_eq_0xc02, rvc_end };
41
-static const rvc_constraint rvcc_rdcycleh[] = { rvc_rs1_eq_x0, rvc_csr_eq_0xc80, rvc_end };
42
-static const rvc_constraint rvcc_rdtimeh[] = { rvc_rs1_eq_x0, rvc_csr_eq_0xc81, rvc_end };
43
+static const rvc_constraint rvcc_ret[] = { rvc_rd_eq_x0, rvc_rs1_eq_ra,
44
+ rvc_end };
45
+static const rvc_constraint rvcc_jr[] = { rvc_rd_eq_x0, rvc_imm_eq_zero,
46
+ rvc_end };
47
+static const rvc_constraint rvcc_rdcycle[] = { rvc_rs1_eq_x0, rvc_csr_eq_0xc00,
48
+ rvc_end };
49
+static const rvc_constraint rvcc_rdtime[] = { rvc_rs1_eq_x0, rvc_csr_eq_0xc01,
50
+ rvc_end };
51
+static const rvc_constraint rvcc_rdinstret[] = { rvc_rs1_eq_x0,
52
+ rvc_csr_eq_0xc02, rvc_end };
53
+static const rvc_constraint rvcc_rdcycleh[] = { rvc_rs1_eq_x0,
54
+ rvc_csr_eq_0xc80, rvc_end };
55
+static const rvc_constraint rvcc_rdtimeh[] = { rvc_rs1_eq_x0, rvc_csr_eq_0xc81,
56
+ rvc_end };
57
static const rvc_constraint rvcc_rdinstreth[] = { rvc_rs1_eq_x0,
58
rvc_csr_eq_0xc82, rvc_end };
59
-static const rvc_constraint rvcc_frcsr[] = { rvc_rs1_eq_x0, rvc_csr_eq_0x003, rvc_end };
60
-static const rvc_constraint rvcc_frrm[] = { rvc_rs1_eq_x0, rvc_csr_eq_0x002, rvc_end };
61
-static const rvc_constraint rvcc_frflags[] = { rvc_rs1_eq_x0, rvc_csr_eq_0x001, rvc_end };
62
+static const rvc_constraint rvcc_frcsr[] = { rvc_rs1_eq_x0, rvc_csr_eq_0x003,
63
+ rvc_end };
64
+static const rvc_constraint rvcc_frrm[] = { rvc_rs1_eq_x0, rvc_csr_eq_0x002,
65
+ rvc_end };
66
+static const rvc_constraint rvcc_frflags[] = { rvc_rs1_eq_x0, rvc_csr_eq_0x001,
67
+ rvc_end };
68
static const rvc_constraint rvcc_fscsr[] = { rvc_csr_eq_0x003, rvc_end };
69
static const rvc_constraint rvcc_fsrm[] = { rvc_csr_eq_0x002, rvc_end };
70
static const rvc_constraint rvcc_fsflags[] = { rvc_csr_eq_0x001, rvc_end };
71
@@ -XXX,XX +XXX,XX @@ const rv_opcode_data opcode_data[] = {
72
{ "fmv.q.x", rv_codec_r, rv_fmt_frd_rs1, NULL, 0, 0, 0 },
73
{ "c.addi4spn", rv_codec_ciw_4spn, rv_fmt_rd_rs1_imm, NULL, rv_op_addi,
74
rv_op_addi, rv_op_addi, rvcd_imm_nz },
75
- { "c.fld", rv_codec_cl_ld, rv_fmt_frd_offset_rs1, NULL, rv_op_fld, rv_op_fld, 0 },
76
- { "c.lw", rv_codec_cl_lw, rv_fmt_rd_offset_rs1, NULL, rv_op_lw, rv_op_lw, rv_op_lw },
77
+ { "c.fld", rv_codec_cl_ld, rv_fmt_frd_offset_rs1, NULL, rv_op_fld,
78
+ rv_op_fld, 0 },
79
+ { "c.lw", rv_codec_cl_lw, rv_fmt_rd_offset_rs1, NULL, rv_op_lw, rv_op_lw,
80
+ rv_op_lw },
81
{ "c.flw", rv_codec_cl_lw, rv_fmt_frd_offset_rs1, NULL, rv_op_flw, 0, 0 },
82
- { "c.fsd", rv_codec_cs_sd, rv_fmt_frs2_offset_rs1, NULL, rv_op_fsd, rv_op_fsd, 0 },
83
- { "c.sw", rv_codec_cs_sw, rv_fmt_rs2_offset_rs1, NULL, rv_op_sw, rv_op_sw, rv_op_sw },
84
+ { "c.fsd", rv_codec_cs_sd, rv_fmt_frs2_offset_rs1, NULL, rv_op_fsd,
85
+ rv_op_fsd, 0 },
86
+ { "c.sw", rv_codec_cs_sw, rv_fmt_rs2_offset_rs1, NULL, rv_op_sw, rv_op_sw,
87
+ rv_op_sw },
88
{ "c.fsw", rv_codec_cs_sw, rv_fmt_frs2_offset_rs1, NULL, rv_op_fsw, 0, 0 },
89
- { "c.nop", rv_codec_ci_none, rv_fmt_none, NULL, rv_op_addi, rv_op_addi, rv_op_addi },
90
+ { "c.nop", rv_codec_ci_none, rv_fmt_none, NULL, rv_op_addi, rv_op_addi,
91
+ rv_op_addi },
92
{ "c.addi", rv_codec_ci, rv_fmt_rd_rs1_imm, NULL, rv_op_addi, rv_op_addi,
93
rv_op_addi, rvcd_imm_nz },
94
{ "c.jal", rv_codec_cj_jal, rv_fmt_rd_offset, NULL, rv_op_jal, 0, 0 },
95
- { "c.li", rv_codec_ci_li, rv_fmt_rd_rs1_imm, NULL, rv_op_addi, rv_op_addi, rv_op_addi },
96
+ { "c.li", rv_codec_ci_li, rv_fmt_rd_rs1_imm, NULL, rv_op_addi, rv_op_addi,
97
+ rv_op_addi },
98
{ "c.addi16sp", rv_codec_ci_16sp, rv_fmt_rd_rs1_imm, NULL, rv_op_addi,
99
rv_op_addi, rv_op_addi, rvcd_imm_nz },
100
{ "c.lui", rv_codec_ci_lui, rv_fmt_rd_imm, NULL, rv_op_lui, rv_op_lui,
101
@@ -XXX,XX +XXX,XX @@ const rv_opcode_data opcode_data[] = {
102
rv_op_srai, rv_op_srai, rvcd_imm_nz },
103
{ "c.andi", rv_codec_cb_imm, rv_fmt_rd_rs1_imm, NULL, rv_op_andi,
104
rv_op_andi, rv_op_andi },
105
- { "c.sub", rv_codec_cs, rv_fmt_rd_rs1_rs2, NULL, rv_op_sub, rv_op_sub, rv_op_sub },
106
- { "c.xor", rv_codec_cs, rv_fmt_rd_rs1_rs2, NULL, rv_op_xor, rv_op_xor, rv_op_xor },
107
- { "c.or", rv_codec_cs, rv_fmt_rd_rs1_rs2, NULL, rv_op_or, rv_op_or, rv_op_or },
108
- { "c.and", rv_codec_cs, rv_fmt_rd_rs1_rs2, NULL, rv_op_and, rv_op_and, rv_op_and },
109
- { "c.subw", rv_codec_cs, rv_fmt_rd_rs1_rs2, NULL, rv_op_subw, rv_op_subw, rv_op_subw },
110
- { "c.addw", rv_codec_cs, rv_fmt_rd_rs1_rs2, NULL, rv_op_addw, rv_op_addw, rv_op_addw },
111
- { "c.j", rv_codec_cj, rv_fmt_rd_offset, NULL, rv_op_jal, rv_op_jal, rv_op_jal },
112
- { "c.beqz", rv_codec_cb, rv_fmt_rs1_rs2_offset, NULL, rv_op_beq, rv_op_beq, rv_op_beq },
113
- { "c.bnez", rv_codec_cb, rv_fmt_rs1_rs2_offset, NULL, rv_op_bne, rv_op_bne, rv_op_bne },
114
+ { "c.sub", rv_codec_cs, rv_fmt_rd_rs1_rs2, NULL, rv_op_sub, rv_op_sub,
115
+ rv_op_sub },
116
+ { "c.xor", rv_codec_cs, rv_fmt_rd_rs1_rs2, NULL, rv_op_xor, rv_op_xor,
117
+ rv_op_xor },
118
+ { "c.or", rv_codec_cs, rv_fmt_rd_rs1_rs2, NULL, rv_op_or, rv_op_or,
119
+ rv_op_or },
120
+ { "c.and", rv_codec_cs, rv_fmt_rd_rs1_rs2, NULL, rv_op_and, rv_op_and,
121
+ rv_op_and },
122
+ { "c.subw", rv_codec_cs, rv_fmt_rd_rs1_rs2, NULL, rv_op_subw, rv_op_subw,
123
+ rv_op_subw },
124
+ { "c.addw", rv_codec_cs, rv_fmt_rd_rs1_rs2, NULL, rv_op_addw, rv_op_addw,
125
+ rv_op_addw },
126
+ { "c.j", rv_codec_cj, rv_fmt_rd_offset, NULL, rv_op_jal, rv_op_jal,
127
+ rv_op_jal },
128
+ { "c.beqz", rv_codec_cb, rv_fmt_rs1_rs2_offset, NULL, rv_op_beq, rv_op_beq,
129
+ rv_op_beq },
130
+ { "c.bnez", rv_codec_cb, rv_fmt_rs1_rs2_offset, NULL, rv_op_bne, rv_op_bne,
131
+ rv_op_bne },
132
{ "c.slli", rv_codec_ci_sh6, rv_fmt_rd_rs1_imm, NULL, rv_op_slli,
133
rv_op_slli, rv_op_slli, rvcd_imm_nz },
134
- { "c.fldsp", rv_codec_ci_ldsp, rv_fmt_frd_offset_rs1, NULL, rv_op_fld, rv_op_fld, rv_op_fld },
135
- { "c.lwsp", rv_codec_ci_lwsp, rv_fmt_rd_offset_rs1, NULL, rv_op_lw, rv_op_lw, rv_op_lw },
136
- { "c.flwsp", rv_codec_ci_lwsp, rv_fmt_frd_offset_rs1, NULL, rv_op_flw, 0, 0 },
137
- { "c.jr", rv_codec_cr_jr, rv_fmt_rd_rs1_offset, NULL, rv_op_jalr, rv_op_jalr, rv_op_jalr },
138
- { "c.mv", rv_codec_cr_mv, rv_fmt_rd_rs1_rs2, NULL, rv_op_addi, rv_op_addi, rv_op_addi },
139
- { "c.ebreak", rv_codec_ci_none, rv_fmt_none, NULL, rv_op_ebreak, rv_op_ebreak, rv_op_ebreak },
140
- { "c.jalr", rv_codec_cr_jalr, rv_fmt_rd_rs1_offset, NULL, rv_op_jalr, rv_op_jalr, rv_op_jalr },
141
- { "c.add", rv_codec_cr, rv_fmt_rd_rs1_rs2, NULL, rv_op_add, rv_op_add, rv_op_add },
142
- { "c.fsdsp", rv_codec_css_sdsp, rv_fmt_frs2_offset_rs1, NULL, rv_op_fsd, rv_op_fsd, rv_op_fsd },
143
- { "c.swsp", rv_codec_css_swsp, rv_fmt_rs2_offset_rs1, NULL, rv_op_sw, rv_op_sw, rv_op_sw },
144
- { "c.fswsp", rv_codec_css_swsp, rv_fmt_frs2_offset_rs1, NULL, rv_op_fsw, 0, 0 },
145
- { "c.ld", rv_codec_cl_ld, rv_fmt_rd_offset_rs1, NULL, 0, rv_op_ld, rv_op_ld },
146
- { "c.sd", rv_codec_cs_sd, rv_fmt_rs2_offset_rs1, NULL, 0, rv_op_sd, rv_op_sd },
147
- { "c.addiw", rv_codec_ci, rv_fmt_rd_rs1_imm, NULL, 0, rv_op_addiw, rv_op_addiw },
148
- { "c.ldsp", rv_codec_ci_ldsp, rv_fmt_rd_offset_rs1, NULL, 0, rv_op_ld, rv_op_ld },
149
- { "c.sdsp", rv_codec_css_sdsp, rv_fmt_rs2_offset_rs1, NULL, 0, rv_op_sd, rv_op_sd },
150
+ { "c.fldsp", rv_codec_ci_ldsp, rv_fmt_frd_offset_rs1, NULL, rv_op_fld,
151
+ rv_op_fld, rv_op_fld },
152
+ { "c.lwsp", rv_codec_ci_lwsp, rv_fmt_rd_offset_rs1, NULL, rv_op_lw,
153
+ rv_op_lw, rv_op_lw },
154
+ { "c.flwsp", rv_codec_ci_lwsp, rv_fmt_frd_offset_rs1, NULL, rv_op_flw, 0,
155
+ 0 },
156
+ { "c.jr", rv_codec_cr_jr, rv_fmt_rd_rs1_offset, NULL, rv_op_jalr,
157
+ rv_op_jalr, rv_op_jalr },
158
+ { "c.mv", rv_codec_cr_mv, rv_fmt_rd_rs1_rs2, NULL, rv_op_addi, rv_op_addi,
159
+ rv_op_addi },
160
+ { "c.ebreak", rv_codec_ci_none, rv_fmt_none, NULL, rv_op_ebreak,
161
+ rv_op_ebreak, rv_op_ebreak },
162
+ { "c.jalr", rv_codec_cr_jalr, rv_fmt_rd_rs1_offset, NULL, rv_op_jalr,
163
+ rv_op_jalr, rv_op_jalr },
164
+ { "c.add", rv_codec_cr, rv_fmt_rd_rs1_rs2, NULL, rv_op_add, rv_op_add,
165
+ rv_op_add },
166
+ { "c.fsdsp", rv_codec_css_sdsp, rv_fmt_frs2_offset_rs1, NULL, rv_op_fsd,
167
+ rv_op_fsd, rv_op_fsd },
168
+ { "c.swsp", rv_codec_css_swsp, rv_fmt_rs2_offset_rs1, NULL, rv_op_sw,
169
+ rv_op_sw, rv_op_sw },
170
+ { "c.fswsp", rv_codec_css_swsp, rv_fmt_frs2_offset_rs1, NULL, rv_op_fsw, 0,
171
+ 0 },
172
+ { "c.ld", rv_codec_cl_ld, rv_fmt_rd_offset_rs1, NULL, 0, rv_op_ld,
173
+ rv_op_ld },
174
+ { "c.sd", rv_codec_cs_sd, rv_fmt_rs2_offset_rs1, NULL, 0, rv_op_sd,
175
+ rv_op_sd },
176
+ { "c.addiw", rv_codec_ci, rv_fmt_rd_rs1_imm, NULL, 0, rv_op_addiw,
177
+ rv_op_addiw },
178
+ { "c.ldsp", rv_codec_ci_ldsp, rv_fmt_rd_offset_rs1, NULL, 0, rv_op_ld,
179
+ rv_op_ld },
180
+ { "c.sdsp", rv_codec_css_sdsp, rv_fmt_rs2_offset_rs1, NULL, 0, rv_op_sd,
181
+ rv_op_sd },
182
{ "c.lq", rv_codec_cl_lq, rv_fmt_rd_offset_rs1, NULL, 0, 0, rv_op_lq },
183
{ "c.sq", rv_codec_cs_sq, rv_fmt_rs2_offset_rs1, NULL, 0, 0, rv_op_sq },
184
{ "c.lqsp", rv_codec_ci_lqsp, rv_fmt_rd_offset_rs1, NULL, 0, 0, rv_op_lq },
185
- { "c.sqsp", rv_codec_css_sqsp, rv_fmt_rs2_offset_rs1, NULL, 0, 0, rv_op_sq },
186
+ { "c.sqsp", rv_codec_css_sqsp, rv_fmt_rs2_offset_rs1, NULL, 0, 0,
187
+ rv_op_sq },
188
{ "nop", rv_codec_i, rv_fmt_none, NULL, 0, 0, 0 },
189
{ "mv", rv_codec_i, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
190
{ "not", rv_codec_i, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
191
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
192
}
193
break;
194
case 11:
195
- switch (((inst >> 24) & 0b11111000) | ((inst >> 12) & 0b00000111)) {
196
+ switch (((inst >> 24) & 0b11111000) |
197
+ ((inst >> 12) & 0b00000111)) {
198
case 2: op = rv_op_amoadd_w; break;
199
case 3: op = rv_op_amoadd_d; break;
200
case 4: op = rv_op_amoadd_q; break;
201
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
202
}
203
break;
204
case 12:
205
- switch (((inst >> 22) & 0b1111111000) | ((inst >> 12) & 0b0000000111)) {
206
+ switch (((inst >> 22) & 0b1111111000) |
207
+ ((inst >> 12) & 0b0000000111)) {
208
case 0: op = rv_op_add; break;
209
case 1: op = rv_op_sll; break;
210
case 2: op = rv_op_slt; break;
211
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
212
break;
213
case 13: op = rv_op_lui; break;
214
case 14:
215
- switch (((inst >> 22) & 0b1111111000) | ((inst >> 12) & 0b0000000111)) {
216
+ switch (((inst >> 22) & 0b1111111000) |
217
+ ((inst >> 12) & 0b0000000111)) {
218
case 0: op = rv_op_addw; break;
219
case 1: op = rv_op_sllw; break;
220
case 5: op = rv_op_srlw; break;
221
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
222
}
223
break;
224
case 112:
225
- switch (((inst >> 17) & 0b11111000) | ((inst >> 12) & 0b00000111)) {
226
+ switch (((inst >> 17) & 0b11111000) |
227
+ ((inst >> 12) & 0b00000111)) {
228
case 0: op = rv_op_fmv_x_s; break;
229
case 1: op = rv_op_fclass_s; break;
230
}
231
break;
232
case 113:
233
- switch (((inst >> 17) & 0b11111000) | ((inst >> 12) & 0b00000111)) {
234
+ switch (((inst >> 17) & 0b11111000) |
235
+ ((inst >> 12) & 0b00000111)) {
236
case 0: op = rv_op_fmv_x_d; break;
237
case 1: op = rv_op_fclass_d; break;
238
}
239
break;
240
case 115:
241
- switch (((inst >> 17) & 0b11111000) | ((inst >> 12) & 0b00000111)) {
242
+ switch (((inst >> 17) & 0b11111000) |
243
+ ((inst >> 12) & 0b00000111)) {
244
case 0: op = rv_op_fmv_x_q; break;
245
case 1: op = rv_op_fclass_q; break;
246
}
247
break;
248
case 120:
249
- switch (((inst >> 17) & 0b11111000) | ((inst >> 12) & 0b00000111)) {
250
+ switch (((inst >> 17) & 0b11111000) |
251
+ ((inst >> 12) & 0b00000111)) {
252
case 0: op = rv_op_fmv_s_x; break;
253
}
254
break;
255
case 121:
256
- switch (((inst >> 17) & 0b11111000) | ((inst >> 12) & 0b00000111)) {
257
+ switch (((inst >> 17) & 0b11111000) |
258
+ ((inst >> 12) & 0b00000111)) {
259
case 0: op = rv_op_fmv_d_x; break;
260
}
261
break;
262
case 123:
263
- switch (((inst >> 17) & 0b11111000) | ((inst >> 12) & 0b00000111)) {
264
+ switch (((inst >> 17) & 0b11111000) |
265
+ ((inst >> 12) & 0b00000111)) {
266
case 0: op = rv_op_fmv_q_x; break;
267
}
268
break;
269
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
270
case 11: op = rv_op_vxor_vv; break;
271
case 12: op = rv_op_vrgather_vv; break;
272
case 14: op = rv_op_vrgatherei16_vv; break;
273
- case 16: if (((inst >> 25) & 1) == 0) op = rv_op_vadc_vvm; break;
274
+ case 16:
275
+ if (((inst >> 25) & 1) == 0) {
276
+ op = rv_op_vadc_vvm;
277
+ }
278
+ break;
279
case 17: op = rv_op_vmadc_vvm; break;
280
- case 18: if (((inst >> 25) & 1) == 0) op = rv_op_vsbc_vvm; break;
281
+ case 18:
282
+ if (((inst >> 25) & 1) == 0) {
283
+ op = rv_op_vsbc_vvm;
284
+ }
285
+ break;
286
case 19: op = rv_op_vmsbc_vvm; break;
287
case 23:
288
if (((inst >> 20) & 0b111111) == 32)
289
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
290
case 2: op = rv_op_vmsof_m; break;
291
case 3: op = rv_op_vmsif_m; break;
292
case 16: op = rv_op_viota_m; break;
293
- case 17: if (((inst >> 20) & 0b11111) == 0) op = rv_op_vid_v; break;
294
+ case 17:
295
+ if (((inst >> 20) & 0b11111) == 0) {
296
+ op = rv_op_vid_v;
297
+ }
298
+ break;
299
}
300
break;
301
case 23: if ((inst >> 25) & 1) op = rv_op_vcompress_vm; break;
302
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
303
case 12: op = rv_op_vrgather_vi; break;
304
case 14: op = rv_op_vslideup_vi; break;
305
case 15: op = rv_op_vslidedown_vi; break;
306
- case 16: if (((inst >> 25) & 1) == 0) op = rv_op_vadc_vim; break;
307
+ case 16:
308
+ if (((inst >> 25) & 1) == 0) {
309
+ op = rv_op_vadc_vim;
310
+ }
311
+ break;
312
case 17: op = rv_op_vmadc_vim; break;
313
case 23:
314
if (((inst >> 20) & 0b111111) == 32)
315
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
316
case 12: op = rv_op_vrgather_vx; break;
317
case 14: op = rv_op_vslideup_vx; break;
318
case 15: op = rv_op_vslidedown_vx; break;
319
- case 16: if (((inst >> 25) & 1) == 0) op = rv_op_vadc_vxm; break;
320
+ case 16:
321
+ if (((inst >> 25) & 1) == 0) {
322
+ op = rv_op_vadc_vxm;
323
+ }
324
+ break;
325
case 17: op = rv_op_vmadc_vxm; break;
326
- case 18: if (((inst >> 25) & 1) == 0) op = rv_op_vsbc_vxm; break;
327
+ case 18:
328
+ if (((inst >> 25) & 1) == 0) {
329
+ op = rv_op_vsbc_vxm;
330
+ }
331
+ break;
332
case 19: op = rv_op_vmsbc_vxm; break;
333
case 23:
334
if (((inst >> 20) & 0b111111) == 32)
335
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
336
case 28:
337
switch (((inst >> 12) & 0b111)) {
338
case 0:
339
- switch (((inst >> 20) & 0b111111100000) | ((inst >> 7) & 0b000000011111)) {
340
+ switch (((inst >> 20) & 0b111111100000) |
341
+ ((inst >> 7) & 0b000000011111)) {
342
case 0:
343
switch (((inst >> 15) & 0b1111111111)) {
344
case 0: op = rv_op_ecall; break;
345
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
346
}
347
break;
348
case 30:
349
- switch (((inst >> 22) & 0b1111111000) | ((inst >> 12) & 0b0000000111)) {
350
+ switch (((inst >> 22) & 0b1111111000) |
351
+ ((inst >> 12) & 0b0000000111)) {
352
case 0: op = rv_op_addd; break;
353
case 1: op = rv_op_slld; break;
354
case 5: op = rv_op_srld; break;
355
--
356
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
Remove redundant parenthese and fix multi-line comments.
4
5
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
6
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
7
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
8
Acked-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <20230523093539.203909-9-liweiwei@iscas.ac.cn>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
disas/riscv.c | 219 +++++++++++++++++++++++++-------------------------
13
1 file changed, 110 insertions(+), 109 deletions(-)
14
15
diff --git a/disas/riscv.c b/disas/riscv.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/disas/riscv.c
18
+++ b/disas/riscv.c
19
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
20
{
21
rv_inst inst = dec->inst;
22
rv_opcode op = rv_op_illegal;
23
- switch (((inst >> 0) & 0b11)) {
24
+ switch ((inst >> 0) & 0b11) {
25
case 0:
26
- switch (((inst >> 13) & 0b111)) {
27
+ switch ((inst >> 13) & 0b111) {
28
case 0: op = rv_op_c_addi4spn; break;
29
case 1:
30
if (isa == rv128) {
31
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
32
}
33
break;
34
case 1:
35
- switch (((inst >> 13) & 0b111)) {
36
+ switch ((inst >> 13) & 0b111) {
37
case 0:
38
- switch (((inst >> 2) & 0b11111111111)) {
39
+ switch ((inst >> 2) & 0b11111111111) {
40
case 0: op = rv_op_c_nop; break;
41
default: op = rv_op_c_addi; break;
42
}
43
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
44
break;
45
case 2: op = rv_op_c_li; break;
46
case 3:
47
- switch (((inst >> 7) & 0b11111)) {
48
+ switch ((inst >> 7) & 0b11111) {
49
case 2: op = rv_op_c_addi16sp; break;
50
default: op = rv_op_c_lui; break;
51
}
52
break;
53
case 4:
54
- switch (((inst >> 10) & 0b11)) {
55
+ switch ((inst >> 10) & 0b11) {
56
case 0:
57
op = rv_op_c_srli;
58
break;
59
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
60
}
61
break;
62
case 2:
63
- switch (((inst >> 13) & 0b111)) {
64
+ switch ((inst >> 13) & 0b111) {
65
case 0:
66
op = rv_op_c_slli;
67
break;
68
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
69
}
70
break;
71
case 4:
72
- switch (((inst >> 12) & 0b1)) {
73
+ switch ((inst >> 12) & 0b1) {
74
case 0:
75
- switch (((inst >> 2) & 0b11111)) {
76
+ switch ((inst >> 2) & 0b11111) {
77
case 0: op = rv_op_c_jr; break;
78
default: op = rv_op_c_mv; break;
79
}
80
break;
81
case 1:
82
- switch (((inst >> 2) & 0b11111)) {
83
+ switch ((inst >> 2) & 0b11111) {
84
case 0:
85
- switch (((inst >> 7) & 0b11111)) {
86
+ switch ((inst >> 7) & 0b11111) {
87
case 0: op = rv_op_c_ebreak; break;
88
default: op = rv_op_c_jalr; break;
89
}
90
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
91
}
92
break;
93
case 3:
94
- switch (((inst >> 2) & 0b11111)) {
95
+ switch ((inst >> 2) & 0b11111) {
96
case 0:
97
- switch (((inst >> 12) & 0b111)) {
98
+ switch ((inst >> 12) & 0b111) {
99
case 0: op = rv_op_lb; break;
100
case 1: op = rv_op_lh; break;
101
case 2: op = rv_op_lw; break;
102
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
103
}
104
break;
105
case 1:
106
- switch (((inst >> 12) & 0b111)) {
107
+ switch ((inst >> 12) & 0b111) {
108
case 0:
109
- switch (((inst >> 20) & 0b111111111111)) {
110
+ switch ((inst >> 20) & 0b111111111111) {
111
case 40: op = rv_op_vl1re8_v; break;
112
case 552: op = rv_op_vl2re8_v; break;
113
case 1576: op = rv_op_vl4re8_v; break;
114
case 3624: op = rv_op_vl8re8_v; break;
115
}
116
- switch (((inst >> 26) & 0b111)) {
117
+ switch ((inst >> 26) & 0b111) {
118
case 0:
119
- switch (((inst >> 20) & 0b11111)) {
120
+ switch ((inst >> 20) & 0b11111) {
121
case 0: op = rv_op_vle8_v; break;
122
case 11: op = rv_op_vlm_v; break;
123
case 16: op = rv_op_vle8ff_v; break;
124
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
125
case 3: op = rv_op_fld; break;
126
case 4: op = rv_op_flq; break;
127
case 5:
128
- switch (((inst >> 20) & 0b111111111111)) {
129
+ switch ((inst >> 20) & 0b111111111111) {
130
case 40: op = rv_op_vl1re16_v; break;
131
case 552: op = rv_op_vl2re16_v; break;
132
case 1576: op = rv_op_vl4re16_v; break;
133
case 3624: op = rv_op_vl8re16_v; break;
134
}
135
- switch (((inst >> 26) & 0b111)) {
136
+ switch ((inst >> 26) & 0b111) {
137
case 0:
138
- switch (((inst >> 20) & 0b11111)) {
139
+ switch ((inst >> 20) & 0b11111) {
140
case 0: op = rv_op_vle16_v; break;
141
case 16: op = rv_op_vle16ff_v; break;
142
}
143
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
144
}
145
break;
146
case 6:
147
- switch (((inst >> 20) & 0b111111111111)) {
148
+ switch ((inst >> 20) & 0b111111111111) {
149
case 40: op = rv_op_vl1re32_v; break;
150
case 552: op = rv_op_vl2re32_v; break;
151
case 1576: op = rv_op_vl4re32_v; break;
152
case 3624: op = rv_op_vl8re32_v; break;
153
}
154
- switch (((inst >> 26) & 0b111)) {
155
+ switch ((inst >> 26) & 0b111) {
156
case 0:
157
- switch (((inst >> 20) & 0b11111)) {
158
+ switch ((inst >> 20) & 0b11111) {
159
case 0: op = rv_op_vle32_v; break;
160
case 16: op = rv_op_vle32ff_v; break;
161
}
162
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
163
}
164
break;
165
case 7:
166
- switch (((inst >> 20) & 0b111111111111)) {
167
+ switch ((inst >> 20) & 0b111111111111) {
168
case 40: op = rv_op_vl1re64_v; break;
169
case 552: op = rv_op_vl2re64_v; break;
170
case 1576: op = rv_op_vl4re64_v; break;
171
case 3624: op = rv_op_vl8re64_v; break;
172
}
173
- switch (((inst >> 26) & 0b111)) {
174
+ switch ((inst >> 26) & 0b111) {
175
case 0:
176
- switch (((inst >> 20) & 0b11111)) {
177
+ switch ((inst >> 20) & 0b11111) {
178
case 0: op = rv_op_vle64_v; break;
179
case 16: op = rv_op_vle64ff_v; break;
180
}
181
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
182
}
183
break;
184
case 3:
185
- switch (((inst >> 12) & 0b111)) {
186
+ switch ((inst >> 12) & 0b111) {
187
case 0: op = rv_op_fence; break;
188
case 1: op = rv_op_fence_i; break;
189
case 2: op = rv_op_lq; break;
190
}
191
break;
192
case 4:
193
- switch (((inst >> 12) & 0b111)) {
194
+ switch ((inst >> 12) & 0b111) {
195
case 0: op = rv_op_addi; break;
196
case 1:
197
- switch (((inst >> 27) & 0b11111)) {
198
+ switch ((inst >> 27) & 0b11111) {
199
case 0b00000: op = rv_op_slli; break;
200
case 0b00001:
201
- switch (((inst >> 20) & 0b1111111)) {
202
+ switch ((inst >> 20) & 0b1111111) {
203
case 0b0001111: op = rv_op_zip; break;
204
}
205
break;
206
case 0b00010:
207
- switch (((inst >> 20) & 0b1111111)) {
208
+ switch ((inst >> 20) & 0b1111111) {
209
case 0b0000000: op = rv_op_sha256sum0; break;
210
case 0b0000001: op = rv_op_sha256sum1; break;
211
case 0b0000010: op = rv_op_sha256sig0; break;
212
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
213
break;
214
case 0b00101: op = rv_op_bseti; break;
215
case 0b00110:
216
- switch (((inst >> 20) & 0b1111111)) {
217
+ switch ((inst >> 20) & 0b1111111) {
218
case 0b0000000: op = rv_op_aes64im; break;
219
default:
220
if (((inst >> 24) & 0b0111) == 0b001) {
221
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
222
case 0b01001: op = rv_op_bclri; break;
223
case 0b01101: op = rv_op_binvi; break;
224
case 0b01100:
225
- switch (((inst >> 20) & 0b1111111)) {
226
+ switch ((inst >> 20) & 0b1111111) {
227
case 0b0000000: op = rv_op_clz; break;
228
case 0b0000001: op = rv_op_ctz; break;
229
case 0b0000010: op = rv_op_cpop; break;
230
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
231
case 3: op = rv_op_sltiu; break;
232
case 4: op = rv_op_xori; break;
233
case 5:
234
- switch (((inst >> 27) & 0b11111)) {
235
+ switch ((inst >> 27) & 0b11111) {
236
case 0b00000: op = rv_op_srli; break;
237
case 0b00001:
238
- switch (((inst >> 20) & 0b1111111)) {
239
+ switch ((inst >> 20) & 0b1111111) {
240
case 0b0001111: op = rv_op_unzip; break;
241
}
242
break;
243
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
244
break;
245
case 5: op = rv_op_auipc; break;
246
case 6:
247
- switch (((inst >> 12) & 0b111)) {
248
+ switch ((inst >> 12) & 0b111) {
249
case 0: op = rv_op_addiw; break;
250
case 1:
251
- switch (((inst >> 26) & 0b111111)) {
252
+ switch ((inst >> 26) & 0b111111) {
253
case 0: op = rv_op_slliw; break;
254
case 2: op = rv_op_slli_uw; break;
255
case 24:
256
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
257
}
258
break;
259
case 5:
260
- switch (((inst >> 25) & 0b1111111)) {
261
+ switch ((inst >> 25) & 0b1111111) {
262
case 0: op = rv_op_srliw; break;
263
case 32: op = rv_op_sraiw; break;
264
case 48: op = rv_op_roriw; break;
265
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
266
}
267
break;
268
case 8:
269
- switch (((inst >> 12) & 0b111)) {
270
+ switch ((inst >> 12) & 0b111) {
271
case 0: op = rv_op_sb; break;
272
case 1: op = rv_op_sh; break;
273
case 2: op = rv_op_sw; break;
274
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
275
}
276
break;
277
case 9:
278
- switch (((inst >> 12) & 0b111)) {
279
+ switch ((inst >> 12) & 0b111) {
280
case 0:
281
- switch (((inst >> 20) & 0b111111111111)) {
282
+ switch ((inst >> 20) & 0b111111111111) {
283
case 40: op = rv_op_vs1r_v; break;
284
case 552: op = rv_op_vs2r_v; break;
285
case 1576: op = rv_op_vs4r_v; break;
286
case 3624: op = rv_op_vs8r_v; break;
287
}
288
- switch (((inst >> 26) & 0b111)) {
289
+ switch ((inst >> 26) & 0b111) {
290
case 0:
291
- switch (((inst >> 20) & 0b11111)) {
292
+ switch ((inst >> 20) & 0b11111) {
293
case 0: op = rv_op_vse8_v; break;
294
case 11: op = rv_op_vsm_v; break;
295
}
296
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
297
case 3: op = rv_op_fsd; break;
298
case 4: op = rv_op_fsq; break;
299
case 5:
300
- switch (((inst >> 26) & 0b111)) {
301
+ switch ((inst >> 26) & 0b111) {
302
case 0:
303
- switch (((inst >> 20) & 0b11111)) {
304
+ switch ((inst >> 20) & 0b11111) {
305
case 0: op = rv_op_vse16_v; break;
306
}
307
break;
308
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
309
}
310
break;
311
case 6:
312
- switch (((inst >> 26) & 0b111)) {
313
+ switch ((inst >> 26) & 0b111) {
314
case 0:
315
- switch (((inst >> 20) & 0b11111)) {
316
+ switch ((inst >> 20) & 0b11111) {
317
case 0: op = rv_op_vse32_v; break;
318
}
319
break;
320
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
321
}
322
break;
323
case 7:
324
- switch (((inst >> 26) & 0b111)) {
325
+ switch ((inst >> 26) & 0b111) {
326
case 0:
327
- switch (((inst >> 20) & 0b11111)) {
328
+ switch ((inst >> 20) & 0b11111) {
329
case 0: op = rv_op_vse64_v; break;
330
}
331
break;
332
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
333
case 11: op = rv_op_amoswap_d; break;
334
case 12: op = rv_op_amoswap_q; break;
335
case 18:
336
- switch (((inst >> 20) & 0b11111)) {
337
+ switch ((inst >> 20) & 0b11111) {
338
case 0: op = rv_op_lr_w; break;
339
}
340
break;
341
case 19:
342
- switch (((inst >> 20) & 0b11111)) {
343
+ switch ((inst >> 20) & 0b11111) {
344
case 0: op = rv_op_lr_d; break;
345
}
346
break;
347
case 20:
348
- switch (((inst >> 20) & 0b11111)) {
349
+ switch ((inst >> 20) & 0b11111) {
350
case 0: op = rv_op_lr_q; break;
351
}
352
break;
353
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
354
}
355
break;
356
case 16:
357
- switch (((inst >> 25) & 0b11)) {
358
+ switch ((inst >> 25) & 0b11) {
359
case 0: op = rv_op_fmadd_s; break;
360
case 1: op = rv_op_fmadd_d; break;
361
case 3: op = rv_op_fmadd_q; break;
362
}
363
break;
364
case 17:
365
- switch (((inst >> 25) & 0b11)) {
366
+ switch ((inst >> 25) & 0b11) {
367
case 0: op = rv_op_fmsub_s; break;
368
case 1: op = rv_op_fmsub_d; break;
369
case 3: op = rv_op_fmsub_q; break;
370
}
371
break;
372
case 18:
373
- switch (((inst >> 25) & 0b11)) {
374
+ switch ((inst >> 25) & 0b11) {
375
case 0: op = rv_op_fnmsub_s; break;
376
case 1: op = rv_op_fnmsub_d; break;
377
case 3: op = rv_op_fnmsub_q; break;
378
}
379
break;
380
case 19:
381
- switch (((inst >> 25) & 0b11)) {
382
+ switch ((inst >> 25) & 0b11) {
383
case 0: op = rv_op_fnmadd_s; break;
384
case 1: op = rv_op_fnmadd_d; break;
385
case 3: op = rv_op_fnmadd_q; break;
386
}
387
break;
388
case 20:
389
- switch (((inst >> 25) & 0b1111111)) {
390
+ switch ((inst >> 25) & 0b1111111) {
391
case 0: op = rv_op_fadd_s; break;
392
case 1: op = rv_op_fadd_d; break;
393
case 3: op = rv_op_fadd_q; break;
394
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
395
case 13: op = rv_op_fdiv_d; break;
396
case 15: op = rv_op_fdiv_q; break;
397
case 16:
398
- switch (((inst >> 12) & 0b111)) {
399
+ switch ((inst >> 12) & 0b111) {
400
case 0: op = rv_op_fsgnj_s; break;
401
case 1: op = rv_op_fsgnjn_s; break;
402
case 2: op = rv_op_fsgnjx_s; break;
403
}
404
break;
405
case 17:
406
- switch (((inst >> 12) & 0b111)) {
407
+ switch ((inst >> 12) & 0b111) {
408
case 0: op = rv_op_fsgnj_d; break;
409
case 1: op = rv_op_fsgnjn_d; break;
410
case 2: op = rv_op_fsgnjx_d; break;
411
}
412
break;
413
case 19:
414
- switch (((inst >> 12) & 0b111)) {
415
+ switch ((inst >> 12) & 0b111) {
416
case 0: op = rv_op_fsgnj_q; break;
417
case 1: op = rv_op_fsgnjn_q; break;
418
case 2: op = rv_op_fsgnjx_q; break;
419
}
420
break;
421
case 20:
422
- switch (((inst >> 12) & 0b111)) {
423
+ switch ((inst >> 12) & 0b111) {
424
case 0: op = rv_op_fmin_s; break;
425
case 1: op = rv_op_fmax_s; break;
426
}
427
break;
428
case 21:
429
- switch (((inst >> 12) & 0b111)) {
430
+ switch ((inst >> 12) & 0b111) {
431
case 0: op = rv_op_fmin_d; break;
432
case 1: op = rv_op_fmax_d; break;
433
}
434
break;
435
case 23:
436
- switch (((inst >> 12) & 0b111)) {
437
+ switch ((inst >> 12) & 0b111) {
438
case 0: op = rv_op_fmin_q; break;
439
case 1: op = rv_op_fmax_q; break;
440
}
441
break;
442
case 32:
443
- switch (((inst >> 20) & 0b11111)) {
444
+ switch ((inst >> 20) & 0b11111) {
445
case 1: op = rv_op_fcvt_s_d; break;
446
case 3: op = rv_op_fcvt_s_q; break;
447
}
448
break;
449
case 33:
450
- switch (((inst >> 20) & 0b11111)) {
451
+ switch ((inst >> 20) & 0b11111) {
452
case 0: op = rv_op_fcvt_d_s; break;
453
case 3: op = rv_op_fcvt_d_q; break;
454
}
455
break;
456
case 35:
457
- switch (((inst >> 20) & 0b11111)) {
458
+ switch ((inst >> 20) & 0b11111) {
459
case 0: op = rv_op_fcvt_q_s; break;
460
case 1: op = rv_op_fcvt_q_d; break;
461
}
462
break;
463
case 44:
464
- switch (((inst >> 20) & 0b11111)) {
465
+ switch ((inst >> 20) & 0b11111) {
466
case 0: op = rv_op_fsqrt_s; break;
467
}
468
break;
469
case 45:
470
- switch (((inst >> 20) & 0b11111)) {
471
+ switch ((inst >> 20) & 0b11111) {
472
case 0: op = rv_op_fsqrt_d; break;
473
}
474
break;
475
case 47:
476
- switch (((inst >> 20) & 0b11111)) {
477
+ switch ((inst >> 20) & 0b11111) {
478
case 0: op = rv_op_fsqrt_q; break;
479
}
480
break;
481
case 80:
482
- switch (((inst >> 12) & 0b111)) {
483
+ switch ((inst >> 12) & 0b111) {
484
case 0: op = rv_op_fle_s; break;
485
case 1: op = rv_op_flt_s; break;
486
case 2: op = rv_op_feq_s; break;
487
}
488
break;
489
case 81:
490
- switch (((inst >> 12) & 0b111)) {
491
+ switch ((inst >> 12) & 0b111) {
492
case 0: op = rv_op_fle_d; break;
493
case 1: op = rv_op_flt_d; break;
494
case 2: op = rv_op_feq_d; break;
495
}
496
break;
497
case 83:
498
- switch (((inst >> 12) & 0b111)) {
499
+ switch ((inst >> 12) & 0b111) {
500
case 0: op = rv_op_fle_q; break;
501
case 1: op = rv_op_flt_q; break;
502
case 2: op = rv_op_feq_q; break;
503
}
504
break;
505
case 96:
506
- switch (((inst >> 20) & 0b11111)) {
507
+ switch ((inst >> 20) & 0b11111) {
508
case 0: op = rv_op_fcvt_w_s; break;
509
case 1: op = rv_op_fcvt_wu_s; break;
510
case 2: op = rv_op_fcvt_l_s; break;
511
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
512
}
513
break;
514
case 97:
515
- switch (((inst >> 20) & 0b11111)) {
516
+ switch ((inst >> 20) & 0b11111) {
517
case 0: op = rv_op_fcvt_w_d; break;
518
case 1: op = rv_op_fcvt_wu_d; break;
519
case 2: op = rv_op_fcvt_l_d; break;
520
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
521
}
522
break;
523
case 99:
524
- switch (((inst >> 20) & 0b11111)) {
525
+ switch ((inst >> 20) & 0b11111) {
526
case 0: op = rv_op_fcvt_w_q; break;
527
case 1: op = rv_op_fcvt_wu_q; break;
528
case 2: op = rv_op_fcvt_l_q; break;
529
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
530
}
531
break;
532
case 104:
533
- switch (((inst >> 20) & 0b11111)) {
534
+ switch ((inst >> 20) & 0b11111) {
535
case 0: op = rv_op_fcvt_s_w; break;
536
case 1: op = rv_op_fcvt_s_wu; break;
537
case 2: op = rv_op_fcvt_s_l; break;
538
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
539
}
540
break;
541
case 105:
542
- switch (((inst >> 20) & 0b11111)) {
543
+ switch ((inst >> 20) & 0b11111) {
544
case 0: op = rv_op_fcvt_d_w; break;
545
case 1: op = rv_op_fcvt_d_wu; break;
546
case 2: op = rv_op_fcvt_d_l; break;
547
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
548
}
549
break;
550
case 107:
551
- switch (((inst >> 20) & 0b11111)) {
552
+ switch ((inst >> 20) & 0b11111) {
553
case 0: op = rv_op_fcvt_q_w; break;
554
case 1: op = rv_op_fcvt_q_wu; break;
555
case 2: op = rv_op_fcvt_q_l; break;
556
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
557
}
558
break;
559
case 21:
560
- switch (((inst >> 12) & 0b111)) {
561
+ switch ((inst >> 12) & 0b111) {
562
case 0:
563
- switch (((inst >> 26) & 0b111111)) {
564
+ switch ((inst >> 26) & 0b111111) {
565
case 0: op = rv_op_vadd_vv; break;
566
case 2: op = rv_op_vsub_vv; break;
567
case 4: op = rv_op_vminu_vv; break;
568
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
569
}
570
break;
571
case 1:
572
- switch (((inst >> 26) & 0b111111)) {
573
+ switch ((inst >> 26) & 0b111111) {
574
case 0: op = rv_op_vfadd_vv; break;
575
case 1: op = rv_op_vfredusum_vs; break;
576
case 2: op = rv_op_vfsub_vv; break;
577
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
578
case 9: op = rv_op_vfsgnjn_vv; break;
579
case 10: op = rv_op_vfsgnjx_vv; break;
580
case 16:
581
- switch (((inst >> 15) & 0b11111)) {
582
+ switch ((inst >> 15) & 0b11111) {
583
case 0: if ((inst >> 25) & 1) op = rv_op_vfmv_f_s; break;
584
}
585
break;
586
case 18:
587
- switch (((inst >> 15) & 0b11111)) {
588
+ switch ((inst >> 15) & 0b11111) {
589
case 0: op = rv_op_vfcvt_xu_f_v; break;
590
case 1: op = rv_op_vfcvt_x_f_v; break;
591
case 2: op = rv_op_vfcvt_f_xu_v; break;
592
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
593
}
594
break;
595
case 19:
596
- switch (((inst >> 15) & 0b11111)) {
597
+ switch ((inst >> 15) & 0b11111) {
598
case 0: op = rv_op_vfsqrt_v; break;
599
case 4: op = rv_op_vfrsqrt7_v; break;
600
case 5: op = rv_op_vfrec7_v; break;
601
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
602
}
603
break;
604
case 2:
605
- switch (((inst >> 26) & 0b111111)) {
606
+ switch ((inst >> 26) & 0b111111) {
607
case 0: op = rv_op_vredsum_vs; break;
608
case 1: op = rv_op_vredand_vs; break;
609
case 2: op = rv_op_vredor_vs; break;
610
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
611
case 10: op = rv_op_vasubu_vv; break;
612
case 11: op = rv_op_vasub_vv; break;
613
case 16:
614
- switch (((inst >> 15) & 0b11111)) {
615
+ switch ((inst >> 15) & 0b11111) {
616
case 0: if ((inst >> 25) & 1) op = rv_op_vmv_x_s; break;
617
case 16: op = rv_op_vcpop_m; break;
618
case 17: op = rv_op_vfirst_m; break;
619
}
620
break;
621
case 18:
622
- switch (((inst >> 15) & 0b11111)) {
623
+ switch ((inst >> 15) & 0b11111) {
624
case 2: op = rv_op_vzext_vf8; break;
625
case 3: op = rv_op_vsext_vf8; break;
626
case 4: op = rv_op_vzext_vf4; break;
627
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
628
}
629
break;
630
case 20:
631
- switch (((inst >> 15) & 0b11111)) {
632
+ switch ((inst >> 15) & 0b11111) {
633
case 1: op = rv_op_vmsbf_m; break;
634
case 2: op = rv_op_vmsof_m; break;
635
case 3: op = rv_op_vmsif_m; break;
636
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
637
}
638
break;
639
case 3:
640
- switch (((inst >> 26) & 0b111111)) {
641
+ switch ((inst >> 26) & 0b111111) {
642
case 0: op = rv_op_vadd_vi; break;
643
case 3: op = rv_op_vrsub_vi; break;
644
case 9: op = rv_op_vand_vi; break;
645
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
646
case 33: op = rv_op_vsadd_vi; break;
647
case 37: op = rv_op_vsll_vi; break;
648
case 39:
649
- switch (((inst >> 15) & 0b11111)) {
650
+ switch ((inst >> 15) & 0b11111) {
651
case 0: op = rv_op_vmv1r_v; break;
652
case 1: op = rv_op_vmv2r_v; break;
653
case 3: op = rv_op_vmv4r_v; break;
654
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
655
}
656
break;
657
case 4:
658
- switch (((inst >> 26) & 0b111111)) {
659
+ switch ((inst >> 26) & 0b111111) {
660
case 0: op = rv_op_vadd_vx; break;
661
case 2: op = rv_op_vsub_vx; break;
662
case 3: op = rv_op_vrsub_vx; break;
663
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
664
}
665
break;
666
case 5:
667
- switch (((inst >> 26) & 0b111111)) {
668
+ switch ((inst >> 26) & 0b111111) {
669
case 0: op = rv_op_vfadd_vf; break;
670
case 2: op = rv_op_vfsub_vf; break;
671
case 4: op = rv_op_vfmin_vf; break;
672
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
673
case 14: op = rv_op_vfslide1up_vf; break;
674
case 15: op = rv_op_vfslide1down_vf; break;
675
case 16:
676
- switch (((inst >> 20) & 0b11111)) {
677
+ switch ((inst >> 20) & 0b11111) {
678
case 0: if ((inst >> 25) & 1) op = rv_op_vfmv_s_f; break;
679
}
680
break;
681
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
682
}
683
break;
684
case 6:
685
- switch (((inst >> 26) & 0b111111)) {
686
+ switch ((inst >> 26) & 0b111111) {
687
case 8: op = rv_op_vaaddu_vx; break;
688
case 9: op = rv_op_vaadd_vx; break;
689
case 10: op = rv_op_vasubu_vx; break;
690
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
691
case 14: op = rv_op_vslide1up_vx; break;
692
case 15: op = rv_op_vslide1down_vx; break;
693
case 16:
694
- switch (((inst >> 20) & 0b11111)) {
695
+ switch ((inst >> 20) & 0b11111) {
696
case 0: if ((inst >> 25) & 1) op = rv_op_vmv_s_x; break;
697
}
698
break;
699
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
700
}
701
break;
702
case 22:
703
- switch (((inst >> 12) & 0b111)) {
704
+ switch ((inst >> 12) & 0b111) {
705
case 0: op = rv_op_addid; break;
706
case 1:
707
- switch (((inst >> 26) & 0b111111)) {
708
+ switch ((inst >> 26) & 0b111111) {
709
case 0: op = rv_op_sllid; break;
710
}
711
break;
712
case 5:
713
- switch (((inst >> 26) & 0b111111)) {
714
+ switch ((inst >> 26) & 0b111111) {
715
case 0: op = rv_op_srlid; break;
716
case 16: op = rv_op_sraid; break;
717
}
718
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
719
}
720
break;
721
case 24:
722
- switch (((inst >> 12) & 0b111)) {
723
+ switch ((inst >> 12) & 0b111) {
724
case 0: op = rv_op_beq; break;
725
case 1: op = rv_op_bne; break;
726
case 4: op = rv_op_blt; break;
727
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
728
}
729
break;
730
case 25:
731
- switch (((inst >> 12) & 0b111)) {
732
+ switch ((inst >> 12) & 0b111) {
733
case 0: op = rv_op_jalr; break;
734
}
735
break;
736
case 27: op = rv_op_jal; break;
737
case 28:
738
- switch (((inst >> 12) & 0b111)) {
739
+ switch ((inst >> 12) & 0b111) {
740
case 0:
741
switch (((inst >> 20) & 0b111111100000) |
742
((inst >> 7) & 0b000000011111)) {
743
case 0:
744
- switch (((inst >> 15) & 0b1111111111)) {
745
+ switch ((inst >> 15) & 0b1111111111) {
746
case 0: op = rv_op_ecall; break;
747
case 32: op = rv_op_ebreak; break;
748
case 64: op = rv_op_uret; break;
749
}
750
break;
751
case 256:
752
- switch (((inst >> 20) & 0b11111)) {
753
+ switch ((inst >> 20) & 0b11111) {
754
case 2:
755
- switch (((inst >> 15) & 0b11111)) {
756
+ switch ((inst >> 15) & 0b11111) {
757
case 0: op = rv_op_sret; break;
758
}
759
break;
760
case 4: op = rv_op_sfence_vm; break;
761
case 5:
762
- switch (((inst >> 15) & 0b11111)) {
763
+ switch ((inst >> 15) & 0b11111) {
764
case 0: op = rv_op_wfi; break;
765
}
766
break;
767
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
768
break;
769
case 288: op = rv_op_sfence_vma; break;
770
case 512:
771
- switch (((inst >> 15) & 0b1111111111)) {
772
+ switch ((inst >> 15) & 0b1111111111) {
773
case 64: op = rv_op_hret; break;
774
}
775
break;
776
case 768:
777
- switch (((inst >> 15) & 0b1111111111)) {
778
+ switch ((inst >> 15) & 0b1111111111) {
779
case 64: op = rv_op_mret; break;
780
}
781
break;
782
case 1952:
783
- switch (((inst >> 15) & 0b1111111111)) {
784
+ switch ((inst >> 15) & 0b1111111111) {
785
case 576: op = rv_op_dret; break;
786
}
787
break;
788
@@ -XXX,XX +XXX,XX @@ static size_t inst_length(rv_inst inst)
789
{
790
/* NOTE: supports maximum instruction size of 64-bits */
791
792
- /* instruction length coding
793
+ /*
794
+ * instruction length coding
795
*
796
* aa - 16 bit aa != 11
797
* bbb11 - 32 bit bbb != 111
798
--
799
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
Compute the target address before storing it into badaddr
4
when mis-aligned exception is triggered.
5
Use a target_pc temp to store the target address to avoid
6
the confusing operation that udpate target address into
7
cpu_pc before misalign check, then update it into badaddr
8
and restore cpu_pc to current pc if exception is triggered.
9
10
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
11
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
14
Message-Id: <20230526072124.298466-2-liweiwei@iscas.ac.cn>
15
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
16
---
17
target/riscv/translate.c | 21 ++++++++++-----------
18
target/riscv/insn_trans/trans_rvi.c.inc | 23 ++++++++++++++++-------
19
target/riscv/insn_trans/trans_rvzce.c.inc | 4 ++--
20
3 files changed, 28 insertions(+), 20 deletions(-)
21
22
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
23
index XXXXXXX..XXXXXXX 100644
24
--- a/target/riscv/translate.c
25
+++ b/target/riscv/translate.c
26
@@ -XXX,XX +XXX,XX @@ static void decode_save_opc(DisasContext *ctx)
27
ctx->insn_start = NULL;
28
}
29
30
-static void gen_set_pc_imm(DisasContext *ctx, target_ulong dest)
31
+static void gen_pc_plus_diff(TCGv target, DisasContext *ctx,
32
+ target_ulong dest)
33
{
34
if (get_xl(ctx) == MXL_RV32) {
35
dest = (int32_t)dest;
36
}
37
- tcg_gen_movi_tl(cpu_pc, dest);
38
+ tcg_gen_movi_tl(target, dest);
39
}
40
41
-static void gen_set_pc(DisasContext *ctx, TCGv dest)
42
+static void gen_set_pc_imm(DisasContext *ctx, target_ulong dest)
43
{
44
- if (get_xl(ctx) == MXL_RV32) {
45
- tcg_gen_ext32s_tl(cpu_pc, dest);
46
- } else {
47
- tcg_gen_mov_tl(cpu_pc, dest);
48
- }
49
+ gen_pc_plus_diff(cpu_pc, ctx, dest);
50
}
51
52
static void generate_exception(DisasContext *ctx, int excp)
53
@@ -XXX,XX +XXX,XX @@ static void gen_exception_illegal(DisasContext *ctx)
54
}
55
}
56
57
-static void gen_exception_inst_addr_mis(DisasContext *ctx)
58
+static void gen_exception_inst_addr_mis(DisasContext *ctx, TCGv target)
59
{
60
- tcg_gen_st_tl(cpu_pc, cpu_env, offsetof(CPURISCVState, badaddr));
61
+ tcg_gen_st_tl(target, cpu_env, offsetof(CPURISCVState, badaddr));
62
generate_exception(ctx, RISCV_EXCP_INST_ADDR_MIS);
63
}
64
65
@@ -XXX,XX +XXX,XX @@ static void gen_jal(DisasContext *ctx, int rd, target_ulong imm)
66
next_pc = ctx->base.pc_next + imm;
67
if (!has_ext(ctx, RVC) && !ctx->cfg_ptr->ext_zca) {
68
if ((next_pc & 0x3) != 0) {
69
- gen_exception_inst_addr_mis(ctx);
70
+ TCGv target_pc = tcg_temp_new();
71
+ gen_pc_plus_diff(target_pc, ctx, next_pc);
72
+ gen_exception_inst_addr_mis(ctx, target_pc);
73
return;
74
}
75
}
76
diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_trans/trans_rvi.c.inc
77
index XXXXXXX..XXXXXXX 100644
78
--- a/target/riscv/insn_trans/trans_rvi.c.inc
79
+++ b/target/riscv/insn_trans/trans_rvi.c.inc
80
@@ -XXX,XX +XXX,XX @@ static bool trans_jal(DisasContext *ctx, arg_jal *a)
81
static bool trans_jalr(DisasContext *ctx, arg_jalr *a)
82
{
83
TCGLabel *misaligned = NULL;
84
+ TCGv target_pc = tcg_temp_new();
85
86
- tcg_gen_addi_tl(cpu_pc, get_gpr(ctx, a->rs1, EXT_NONE), a->imm);
87
- tcg_gen_andi_tl(cpu_pc, cpu_pc, (target_ulong)-2);
88
+ tcg_gen_addi_tl(target_pc, get_gpr(ctx, a->rs1, EXT_NONE), a->imm);
89
+ tcg_gen_andi_tl(target_pc, target_pc, (target_ulong)-2);
90
+
91
+ if (get_xl(ctx) == MXL_RV32) {
92
+ tcg_gen_ext32s_tl(target_pc, target_pc);
93
+ }
94
95
- gen_set_pc(ctx, cpu_pc);
96
if (!has_ext(ctx, RVC) && !ctx->cfg_ptr->ext_zca) {
97
TCGv t0 = tcg_temp_new();
98
99
misaligned = gen_new_label();
100
- tcg_gen_andi_tl(t0, cpu_pc, 0x2);
101
+ tcg_gen_andi_tl(t0, target_pc, 0x2);
102
tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0x0, misaligned);
103
}
104
105
gen_set_gpri(ctx, a->rd, ctx->pc_succ_insn);
106
+ tcg_gen_mov_tl(cpu_pc, target_pc);
107
lookup_and_goto_ptr(ctx);
108
109
if (misaligned) {
110
gen_set_label(misaligned);
111
- gen_exception_inst_addr_mis(ctx);
112
+ gen_exception_inst_addr_mis(ctx, target_pc);
113
}
114
ctx->base.is_jmp = DISAS_NORETURN;
115
116
@@ -XXX,XX +XXX,XX @@ static bool gen_branch(DisasContext *ctx, arg_b *a, TCGCond cond)
117
TCGLabel *l = gen_new_label();
118
TCGv src1 = get_gpr(ctx, a->rs1, EXT_SIGN);
119
TCGv src2 = get_gpr(ctx, a->rs2, EXT_SIGN);
120
+ target_ulong next_pc;
121
122
if (get_xl(ctx) == MXL_RV128) {
123
TCGv src1h = get_gprh(ctx, a->rs1);
124
@@ -XXX,XX +XXX,XX @@ static bool gen_branch(DisasContext *ctx, arg_b *a, TCGCond cond)
125
126
gen_set_label(l); /* branch taken */
127
128
+ next_pc = ctx->base.pc_next + a->imm;
129
if (!has_ext(ctx, RVC) && !ctx->cfg_ptr->ext_zca &&
130
- ((ctx->base.pc_next + a->imm) & 0x3)) {
131
+ (next_pc & 0x3)) {
132
/* misaligned */
133
- gen_exception_inst_addr_mis(ctx);
134
+ TCGv target_pc = tcg_temp_new();
135
+ gen_pc_plus_diff(target_pc, ctx, next_pc);
136
+ gen_exception_inst_addr_mis(ctx, target_pc);
137
} else {
138
gen_goto_tb(ctx, 0, ctx->base.pc_next + a->imm);
139
}
140
diff --git a/target/riscv/insn_trans/trans_rvzce.c.inc b/target/riscv/insn_trans/trans_rvzce.c.inc
141
index XXXXXXX..XXXXXXX 100644
142
--- a/target/riscv/insn_trans/trans_rvzce.c.inc
143
+++ b/target/riscv/insn_trans/trans_rvzce.c.inc
144
@@ -XXX,XX +XXX,XX @@ static bool gen_pop(DisasContext *ctx, arg_cmpp *a, bool ret, bool ret_val)
145
}
146
147
if (ret) {
148
- TCGv ret_addr = get_gpr(ctx, xRA, EXT_NONE);
149
- gen_set_pc(ctx, ret_addr);
150
+ TCGv ret_addr = get_gpr(ctx, xRA, EXT_SIGN);
151
+ tcg_gen_mov_tl(cpu_pc, ret_addr);
152
tcg_gen_lookup_and_goto_ptr();
153
ctx->base.is_jmp = DISAS_NORETURN;
154
}
155
--
156
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
Use cur_insn_len to store the length of the current instruction to
4
prepare for PC-relative translation.
5
6
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
7
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-Id: <20230526072124.298466-3-liweiwei@iscas.ac.cn>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
13
target/riscv/translate.c | 4 +++-
14
1 file changed, 3 insertions(+), 1 deletion(-)
15
16
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/riscv/translate.c
19
+++ b/target/riscv/translate.c
20
@@ -XXX,XX +XXX,XX @@ typedef struct DisasContext {
21
DisasContextBase base;
22
/* pc_succ_insn points to the instruction following base.pc_next */
23
target_ulong pc_succ_insn;
24
+ target_ulong cur_insn_len;
25
target_ulong priv_ver;
26
RISCVMXL misa_mxl_max;
27
RISCVMXL xl;
28
@@ -XXX,XX +XXX,XX @@ static void decode_opc(CPURISCVState *env, DisasContext *ctx, uint16_t opcode)
29
};
30
31
ctx->virt_inst_excp = false;
32
+ ctx->cur_insn_len = insn_len(opcode);
33
/* Check for compressed insn */
34
- if (insn_len(opcode) == 2) {
35
+ if (ctx->cur_insn_len == 2) {
36
ctx->opcode = opcode;
37
ctx->pc_succ_insn = ctx->base.pc_next + 2;
38
/*
39
--
40
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
Reduce reliance on absolute value to prepare for PC-relative translation.
4
5
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
6
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <20230526072124.298466-4-liweiwei@iscas.ac.cn>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
target/riscv/translate.c | 8 +++++---
13
target/riscv/insn_trans/trans_rvi.c.inc | 4 ++--
14
2 files changed, 7 insertions(+), 5 deletions(-)
15
16
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/riscv/translate.c
19
+++ b/target/riscv/translate.c
20
@@ -XXX,XX +XXX,XX @@ static void exit_tb(DisasContext *ctx)
21
tcg_gen_exit_tb(NULL, 0);
22
}
23
24
-static void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
25
+static void gen_goto_tb(DisasContext *ctx, int n, target_long diff)
26
{
27
+ target_ulong dest = ctx->base.pc_next + diff;
28
+
29
/*
30
* Under itrigger, instruction executes one by one like singlestep,
31
* direct block chain benefits will be small.
32
@@ -XXX,XX +XXX,XX @@ static void gen_jal(DisasContext *ctx, int rd, target_ulong imm)
33
}
34
35
gen_set_gpri(ctx, rd, ctx->pc_succ_insn);
36
- gen_goto_tb(ctx, 0, ctx->base.pc_next + imm); /* must use this for safety */
37
+ gen_goto_tb(ctx, 0, imm); /* must use this for safety */
38
ctx->base.is_jmp = DISAS_NORETURN;
39
}
40
41
@@ -XXX,XX +XXX,XX @@ static void riscv_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
42
43
switch (ctx->base.is_jmp) {
44
case DISAS_TOO_MANY:
45
- gen_goto_tb(ctx, 0, ctx->base.pc_next);
46
+ gen_goto_tb(ctx, 0, 0);
47
break;
48
case DISAS_NORETURN:
49
break;
50
diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_trans/trans_rvi.c.inc
51
index XXXXXXX..XXXXXXX 100644
52
--- a/target/riscv/insn_trans/trans_rvi.c.inc
53
+++ b/target/riscv/insn_trans/trans_rvi.c.inc
54
@@ -XXX,XX +XXX,XX @@ static bool gen_branch(DisasContext *ctx, arg_b *a, TCGCond cond)
55
} else {
56
tcg_gen_brcond_tl(cond, src1, src2, l);
57
}
58
- gen_goto_tb(ctx, 1, ctx->pc_succ_insn);
59
+ gen_goto_tb(ctx, 1, ctx->cur_insn_len);
60
61
gen_set_label(l); /* branch taken */
62
63
@@ -XXX,XX +XXX,XX @@ static bool gen_branch(DisasContext *ctx, arg_b *a, TCGCond cond)
64
gen_pc_plus_diff(target_pc, ctx, next_pc);
65
gen_exception_inst_addr_mis(ctx, target_pc);
66
} else {
67
- gen_goto_tb(ctx, 0, ctx->base.pc_next + a->imm);
68
+ gen_goto_tb(ctx, 0, a->imm);
69
}
70
ctx->base.is_jmp = DISAS_NORETURN;
71
72
--
73
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
Reduce reliance on absolute values(by passing pc difference) to
4
prepare for PC-relative translation.
5
6
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
7
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-Id: <20230526072124.298466-5-liweiwei@iscas.ac.cn>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
13
target/riscv/translate.c | 10 +++++-----
14
target/riscv/insn_trans/trans_privileged.c.inc | 2 +-
15
target/riscv/insn_trans/trans_rvi.c.inc | 6 +++---
16
target/riscv/insn_trans/trans_rvv.c.inc | 4 ++--
17
target/riscv/insn_trans/trans_rvzawrs.c.inc | 2 +-
18
target/riscv/insn_trans/trans_xthead.c.inc | 2 +-
19
6 files changed, 13 insertions(+), 13 deletions(-)
20
21
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
22
index XXXXXXX..XXXXXXX 100644
23
--- a/target/riscv/translate.c
24
+++ b/target/riscv/translate.c
25
@@ -XXX,XX +XXX,XX @@ static void gen_pc_plus_diff(TCGv target, DisasContext *ctx,
26
tcg_gen_movi_tl(target, dest);
27
}
28
29
-static void gen_set_pc_imm(DisasContext *ctx, target_ulong dest)
30
+static void gen_update_pc(DisasContext *ctx, target_long diff)
31
{
32
- gen_pc_plus_diff(cpu_pc, ctx, dest);
33
+ gen_pc_plus_diff(cpu_pc, ctx, ctx->base.pc_next + diff);
34
}
35
36
static void generate_exception(DisasContext *ctx, int excp)
37
{
38
- gen_set_pc_imm(ctx, ctx->base.pc_next);
39
+ gen_update_pc(ctx, 0);
40
gen_helper_raise_exception(cpu_env, tcg_constant_i32(excp));
41
ctx->base.is_jmp = DISAS_NORETURN;
42
}
43
@@ -XXX,XX +XXX,XX @@ static void gen_goto_tb(DisasContext *ctx, int n, target_long diff)
44
*/
45
if (translator_use_goto_tb(&ctx->base, dest) && !ctx->itrigger) {
46
tcg_gen_goto_tb(n);
47
- gen_set_pc_imm(ctx, dest);
48
+ gen_update_pc(ctx, diff);
49
tcg_gen_exit_tb(ctx->base.tb, n);
50
} else {
51
- gen_set_pc_imm(ctx, dest);
52
+ gen_update_pc(ctx, diff);
53
lookup_and_goto_ptr(ctx);
54
}
55
}
56
diff --git a/target/riscv/insn_trans/trans_privileged.c.inc b/target/riscv/insn_trans/trans_privileged.c.inc
57
index XXXXXXX..XXXXXXX 100644
58
--- a/target/riscv/insn_trans/trans_privileged.c.inc
59
+++ b/target/riscv/insn_trans/trans_privileged.c.inc
60
@@ -XXX,XX +XXX,XX @@ static bool trans_wfi(DisasContext *ctx, arg_wfi *a)
61
{
62
#ifndef CONFIG_USER_ONLY
63
decode_save_opc(ctx);
64
- gen_set_pc_imm(ctx, ctx->pc_succ_insn);
65
+ gen_update_pc(ctx, ctx->cur_insn_len);
66
gen_helper_wfi(cpu_env);
67
return true;
68
#else
69
diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_trans/trans_rvi.c.inc
70
index XXXXXXX..XXXXXXX 100644
71
--- a/target/riscv/insn_trans/trans_rvi.c.inc
72
+++ b/target/riscv/insn_trans/trans_rvi.c.inc
73
@@ -XXX,XX +XXX,XX @@ static bool trans_pause(DisasContext *ctx, arg_pause *a)
74
* PAUSE is a no-op in QEMU,
75
* end the TB and return to main loop
76
*/
77
- gen_set_pc_imm(ctx, ctx->pc_succ_insn);
78
+ gen_update_pc(ctx, ctx->cur_insn_len);
79
exit_tb(ctx);
80
ctx->base.is_jmp = DISAS_NORETURN;
81
82
@@ -XXX,XX +XXX,XX @@ static bool trans_fence_i(DisasContext *ctx, arg_fence_i *a)
83
* FENCE_I is a no-op in QEMU,
84
* however we need to end the translation block
85
*/
86
- gen_set_pc_imm(ctx, ctx->pc_succ_insn);
87
+ gen_update_pc(ctx, ctx->cur_insn_len);
88
exit_tb(ctx);
89
ctx->base.is_jmp = DISAS_NORETURN;
90
return true;
91
@@ -XXX,XX +XXX,XX @@ static bool do_csr_post(DisasContext *ctx)
92
/* The helper may raise ILLEGAL_INSN -- record binv for unwind. */
93
decode_save_opc(ctx);
94
/* We may have changed important cpu state -- exit to main loop. */
95
- gen_set_pc_imm(ctx, ctx->pc_succ_insn);
96
+ gen_update_pc(ctx, ctx->cur_insn_len);
97
exit_tb(ctx);
98
ctx->base.is_jmp = DISAS_NORETURN;
99
return true;
100
diff --git a/target/riscv/insn_trans/trans_rvv.c.inc b/target/riscv/insn_trans/trans_rvv.c.inc
101
index XXXXXXX..XXXXXXX 100644
102
--- a/target/riscv/insn_trans/trans_rvv.c.inc
103
+++ b/target/riscv/insn_trans/trans_rvv.c.inc
104
@@ -XXX,XX +XXX,XX @@ static bool do_vsetvl(DisasContext *s, int rd, int rs1, TCGv s2)
105
gen_set_gpr(s, rd, dst);
106
mark_vs_dirty(s);
107
108
- gen_set_pc_imm(s, s->pc_succ_insn);
109
+ gen_update_pc(s, s->cur_insn_len);
110
lookup_and_goto_ptr(s);
111
s->base.is_jmp = DISAS_NORETURN;
112
return true;
113
@@ -XXX,XX +XXX,XX @@ static bool do_vsetivli(DisasContext *s, int rd, TCGv s1, TCGv s2)
114
gen_helper_vsetvl(dst, cpu_env, s1, s2);
115
gen_set_gpr(s, rd, dst);
116
mark_vs_dirty(s);
117
- gen_set_pc_imm(s, s->pc_succ_insn);
118
+ gen_update_pc(s, s->cur_insn_len);
119
lookup_and_goto_ptr(s);
120
s->base.is_jmp = DISAS_NORETURN;
121
122
diff --git a/target/riscv/insn_trans/trans_rvzawrs.c.inc b/target/riscv/insn_trans/trans_rvzawrs.c.inc
123
index XXXXXXX..XXXXXXX 100644
124
--- a/target/riscv/insn_trans/trans_rvzawrs.c.inc
125
+++ b/target/riscv/insn_trans/trans_rvzawrs.c.inc
126
@@ -XXX,XX +XXX,XX @@ static bool trans_wrs(DisasContext *ctx)
127
/* Clear the load reservation (if any). */
128
tcg_gen_movi_tl(load_res, -1);
129
130
- gen_set_pc_imm(ctx, ctx->pc_succ_insn);
131
+ gen_update_pc(ctx, ctx->cur_insn_len);
132
tcg_gen_exit_tb(NULL, 0);
133
ctx->base.is_jmp = DISAS_NORETURN;
134
135
diff --git a/target/riscv/insn_trans/trans_xthead.c.inc b/target/riscv/insn_trans/trans_xthead.c.inc
136
index XXXXXXX..XXXXXXX 100644
137
--- a/target/riscv/insn_trans/trans_xthead.c.inc
138
+++ b/target/riscv/insn_trans/trans_xthead.c.inc
139
@@ -XXX,XX +XXX,XX @@ static void gen_th_sync_local(DisasContext *ctx)
140
* Emulate out-of-order barriers with pipeline flush
141
* by exiting the translation block.
142
*/
143
- gen_set_pc_imm(ctx, ctx->pc_succ_insn);
144
+ gen_update_pc(ctx, ctx->cur_insn_len);
145
tcg_gen_exit_tb(NULL, 0);
146
ctx->base.is_jmp = DISAS_NORETURN;
147
}
148
--
149
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
Reduce reliance on absolute values by using true pc difference for
4
gen_pc_plus_diff() to prepare for PC-relative translation.
5
6
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
7
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-Id: <20230526072124.298466-6-liweiwei@iscas.ac.cn>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
13
target/riscv/translate.c | 13 ++++++-------
14
target/riscv/insn_trans/trans_rvi.c.inc | 6 ++----
15
target/riscv/insn_trans/trans_rvzce.c.inc | 2 +-
16
3 files changed, 9 insertions(+), 12 deletions(-)
17
18
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/target/riscv/translate.c
21
+++ b/target/riscv/translate.c
22
@@ -XXX,XX +XXX,XX @@ static void decode_save_opc(DisasContext *ctx)
23
}
24
25
static void gen_pc_plus_diff(TCGv target, DisasContext *ctx,
26
- target_ulong dest)
27
+ target_long diff)
28
{
29
+ target_ulong dest = ctx->base.pc_next + diff;
30
+
31
if (get_xl(ctx) == MXL_RV32) {
32
dest = (int32_t)dest;
33
}
34
@@ -XXX,XX +XXX,XX @@ static void gen_pc_plus_diff(TCGv target, DisasContext *ctx,
35
36
static void gen_update_pc(DisasContext *ctx, target_long diff)
37
{
38
- gen_pc_plus_diff(cpu_pc, ctx, ctx->base.pc_next + diff);
39
+ gen_pc_plus_diff(cpu_pc, ctx, diff);
40
}
41
42
static void generate_exception(DisasContext *ctx, int excp)
43
@@ -XXX,XX +XXX,XX @@ static void gen_set_fpr_d(DisasContext *ctx, int reg_num, TCGv_i64 t)
44
45
static void gen_jal(DisasContext *ctx, int rd, target_ulong imm)
46
{
47
- target_ulong next_pc;
48
-
49
/* check misaligned: */
50
- next_pc = ctx->base.pc_next + imm;
51
if (!has_ext(ctx, RVC) && !ctx->cfg_ptr->ext_zca) {
52
- if ((next_pc & 0x3) != 0) {
53
+ if ((imm & 0x3) != 0) {
54
TCGv target_pc = tcg_temp_new();
55
- gen_pc_plus_diff(target_pc, ctx, next_pc);
56
+ gen_pc_plus_diff(target_pc, ctx, imm);
57
gen_exception_inst_addr_mis(ctx, target_pc);
58
return;
59
}
60
diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_trans/trans_rvi.c.inc
61
index XXXXXXX..XXXXXXX 100644
62
--- a/target/riscv/insn_trans/trans_rvi.c.inc
63
+++ b/target/riscv/insn_trans/trans_rvi.c.inc
64
@@ -XXX,XX +XXX,XX @@ static bool gen_branch(DisasContext *ctx, arg_b *a, TCGCond cond)
65
TCGLabel *l = gen_new_label();
66
TCGv src1 = get_gpr(ctx, a->rs1, EXT_SIGN);
67
TCGv src2 = get_gpr(ctx, a->rs2, EXT_SIGN);
68
- target_ulong next_pc;
69
70
if (get_xl(ctx) == MXL_RV128) {
71
TCGv src1h = get_gprh(ctx, a->rs1);
72
@@ -XXX,XX +XXX,XX @@ static bool gen_branch(DisasContext *ctx, arg_b *a, TCGCond cond)
73
74
gen_set_label(l); /* branch taken */
75
76
- next_pc = ctx->base.pc_next + a->imm;
77
if (!has_ext(ctx, RVC) && !ctx->cfg_ptr->ext_zca &&
78
- (next_pc & 0x3)) {
79
+ (a->imm & 0x3)) {
80
/* misaligned */
81
TCGv target_pc = tcg_temp_new();
82
- gen_pc_plus_diff(target_pc, ctx, next_pc);
83
+ gen_pc_plus_diff(target_pc, ctx, a->imm);
84
gen_exception_inst_addr_mis(ctx, target_pc);
85
} else {
86
gen_goto_tb(ctx, 0, a->imm);
87
diff --git a/target/riscv/insn_trans/trans_rvzce.c.inc b/target/riscv/insn_trans/trans_rvzce.c.inc
88
index XXXXXXX..XXXXXXX 100644
89
--- a/target/riscv/insn_trans/trans_rvzce.c.inc
90
+++ b/target/riscv/insn_trans/trans_rvzce.c.inc
91
@@ -XXX,XX +XXX,XX @@ static bool trans_cm_jalt(DisasContext *ctx, arg_cm_jalt *a)
92
* Update pc to current for the non-unwinding exception
93
* that might come from cpu_ld*_code() in the helper.
94
*/
95
- tcg_gen_movi_tl(cpu_pc, ctx->base.pc_next);
96
+ gen_update_pc(ctx, 0);
97
gen_helper_cm_jalt(cpu_pc, cpu_env, tcg_constant_i32(a->index));
98
99
/* c.jt vs c.jalt depends on the index. */
100
--
101
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
Add a base pc_save for PC-relative translation(CF_PCREL).
4
Diable the directly sync pc from tb by riscv_cpu_synchronize_from_tb.
5
Use gen_pc_plus_diff to get the pc-relative address.
6
Enable CF_PCREL in System mode.
7
8
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
9
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
12
Message-Id: <20230526072124.298466-7-liweiwei@iscas.ac.cn>
13
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
14
---
15
target/riscv/cpu.c | 31 ++++++++++-----
16
target/riscv/translate.c | 47 +++++++++++++++++++----
17
target/riscv/insn_trans/trans_rvi.c.inc | 12 +++++-
18
target/riscv/insn_trans/trans_rvzce.c.inc | 4 +-
19
4 files changed, 74 insertions(+), 20 deletions(-)
20
21
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
22
index XXXXXXX..XXXXXXX 100644
23
--- a/target/riscv/cpu.c
24
+++ b/target/riscv/cpu.c
25
@@ -XXX,XX +XXX,XX @@ static vaddr riscv_cpu_get_pc(CPUState *cs)
26
static void riscv_cpu_synchronize_from_tb(CPUState *cs,
27
const TranslationBlock *tb)
28
{
29
- RISCVCPU *cpu = RISCV_CPU(cs);
30
- CPURISCVState *env = &cpu->env;
31
- RISCVMXL xl = FIELD_EX32(tb->flags, TB_FLAGS, XL);
32
+ if (!(tb_cflags(tb) & CF_PCREL)) {
33
+ RISCVCPU *cpu = RISCV_CPU(cs);
34
+ CPURISCVState *env = &cpu->env;
35
+ RISCVMXL xl = FIELD_EX32(tb->flags, TB_FLAGS, XL);
36
37
- tcg_debug_assert(!(cs->tcg_cflags & CF_PCREL));
38
+ tcg_debug_assert(!(cs->tcg_cflags & CF_PCREL));
39
40
- if (xl == MXL_RV32) {
41
- env->pc = (int32_t) tb->pc;
42
- } else {
43
- env->pc = tb->pc;
44
+ if (xl == MXL_RV32) {
45
+ env->pc = (int32_t) tb->pc;
46
+ } else {
47
+ env->pc = tb->pc;
48
+ }
49
}
50
}
51
52
@@ -XXX,XX +XXX,XX @@ static void riscv_restore_state_to_opc(CPUState *cs,
53
RISCVCPU *cpu = RISCV_CPU(cs);
54
CPURISCVState *env = &cpu->env;
55
RISCVMXL xl = FIELD_EX32(tb->flags, TB_FLAGS, XL);
56
+ target_ulong pc;
57
+
58
+ if (tb_cflags(tb) & CF_PCREL) {
59
+ pc = (env->pc & TARGET_PAGE_MASK) | data[0];
60
+ } else {
61
+ pc = data[0];
62
+ }
63
64
if (xl == MXL_RV32) {
65
- env->pc = (int32_t)data[0];
66
+ env->pc = (int32_t)pc;
67
} else {
68
- env->pc = data[0];
69
+ env->pc = pc;
70
}
71
env->bins = data[1];
72
}
73
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
74
}
75
76
#ifndef CONFIG_USER_ONLY
77
+ cs->tcg_cflags |= CF_PCREL;
78
+
79
if (cpu->cfg.ext_sstc) {
80
riscv_timer_init(cpu);
81
}
82
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
83
index XXXXXXX..XXXXXXX 100644
84
--- a/target/riscv/translate.c
85
+++ b/target/riscv/translate.c
86
@@ -XXX,XX +XXX,XX @@ typedef struct DisasContext {
87
/* pc_succ_insn points to the instruction following base.pc_next */
88
target_ulong pc_succ_insn;
89
target_ulong cur_insn_len;
90
+ target_ulong pc_save;
91
target_ulong priv_ver;
92
RISCVMXL misa_mxl_max;
93
RISCVMXL xl;
94
@@ -XXX,XX +XXX,XX @@ static void gen_pc_plus_diff(TCGv target, DisasContext *ctx,
95
{
96
target_ulong dest = ctx->base.pc_next + diff;
97
98
- if (get_xl(ctx) == MXL_RV32) {
99
- dest = (int32_t)dest;
100
+ assert(ctx->pc_save != -1);
101
+ if (tb_cflags(ctx->base.tb) & CF_PCREL) {
102
+ tcg_gen_addi_tl(target, cpu_pc, dest - ctx->pc_save);
103
+ if (get_xl(ctx) == MXL_RV32) {
104
+ tcg_gen_ext32s_tl(target, target);
105
+ }
106
+ } else {
107
+ if (get_xl(ctx) == MXL_RV32) {
108
+ dest = (int32_t)dest;
109
+ }
110
+ tcg_gen_movi_tl(target, dest);
111
}
112
- tcg_gen_movi_tl(target, dest);
113
}
114
115
static void gen_update_pc(DisasContext *ctx, target_long diff)
116
{
117
gen_pc_plus_diff(cpu_pc, ctx, diff);
118
+ ctx->pc_save = ctx->base.pc_next + diff;
119
}
120
121
static void generate_exception(DisasContext *ctx, int excp)
122
@@ -XXX,XX +XXX,XX @@ static void gen_goto_tb(DisasContext *ctx, int n, target_long diff)
123
* direct block chain benefits will be small.
124
*/
125
if (translator_use_goto_tb(&ctx->base, dest) && !ctx->itrigger) {
126
- tcg_gen_goto_tb(n);
127
- gen_update_pc(ctx, diff);
128
+ /*
129
+ * For pcrel, the pc must always be up-to-date on entry to
130
+ * the linked TB, so that it can use simple additions for all
131
+ * further adjustments. For !pcrel, the linked TB is compiled
132
+ * to know its full virtual address, so we can delay the
133
+ * update to pc to the unlinked path. A long chain of links
134
+ * can thus avoid many updates to the PC.
135
+ */
136
+ if (tb_cflags(ctx->base.tb) & CF_PCREL) {
137
+ gen_update_pc(ctx, diff);
138
+ tcg_gen_goto_tb(n);
139
+ } else {
140
+ tcg_gen_goto_tb(n);
141
+ gen_update_pc(ctx, diff);
142
+ }
143
tcg_gen_exit_tb(ctx->base.tb, n);
144
} else {
145
gen_update_pc(ctx, diff);
146
@@ -XXX,XX +XXX,XX @@ static void gen_set_fpr_d(DisasContext *ctx, int reg_num, TCGv_i64 t)
147
148
static void gen_jal(DisasContext *ctx, int rd, target_ulong imm)
149
{
150
+ TCGv succ_pc = dest_gpr(ctx, rd);
151
+
152
/* check misaligned: */
153
if (!has_ext(ctx, RVC) && !ctx->cfg_ptr->ext_zca) {
154
if ((imm & 0x3) != 0) {
155
@@ -XXX,XX +XXX,XX @@ static void gen_jal(DisasContext *ctx, int rd, target_ulong imm)
156
}
157
}
158
159
- gen_set_gpri(ctx, rd, ctx->pc_succ_insn);
160
+ gen_pc_plus_diff(succ_pc, ctx, ctx->cur_insn_len);
161
+ gen_set_gpr(ctx, rd, succ_pc);
162
+
163
gen_goto_tb(ctx, 0, imm); /* must use this for safety */
164
ctx->base.is_jmp = DISAS_NORETURN;
165
}
166
@@ -XXX,XX +XXX,XX @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
167
RISCVCPU *cpu = RISCV_CPU(cs);
168
uint32_t tb_flags = ctx->base.tb->flags;
169
170
+ ctx->pc_save = ctx->base.pc_first;
171
ctx->pc_succ_insn = ctx->base.pc_first;
172
ctx->priv = FIELD_EX32(tb_flags, TB_FLAGS, PRIV);
173
ctx->mem_idx = FIELD_EX32(tb_flags, TB_FLAGS, MEM_IDX);
174
@@ -XXX,XX +XXX,XX @@ static void riscv_tr_tb_start(DisasContextBase *db, CPUState *cpu)
175
static void riscv_tr_insn_start(DisasContextBase *dcbase, CPUState *cpu)
176
{
177
DisasContext *ctx = container_of(dcbase, DisasContext, base);
178
+ target_ulong pc_next = ctx->base.pc_next;
179
+
180
+ if (tb_cflags(dcbase->tb) & CF_PCREL) {
181
+ pc_next &= ~TARGET_PAGE_MASK;
182
+ }
183
184
- tcg_gen_insn_start(ctx->base.pc_next, 0);
185
+ tcg_gen_insn_start(pc_next, 0);
186
ctx->insn_start = tcg_last_op();
187
}
188
189
diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_trans/trans_rvi.c.inc
190
index XXXXXXX..XXXXXXX 100644
191
--- a/target/riscv/insn_trans/trans_rvi.c.inc
192
+++ b/target/riscv/insn_trans/trans_rvi.c.inc
193
@@ -XXX,XX +XXX,XX @@ static bool trans_lui(DisasContext *ctx, arg_lui *a)
194
195
static bool trans_auipc(DisasContext *ctx, arg_auipc *a)
196
{
197
- gen_set_gpri(ctx, a->rd, a->imm + ctx->base.pc_next);
198
+ TCGv target_pc = dest_gpr(ctx, a->rd);
199
+ gen_pc_plus_diff(target_pc, ctx, a->imm);
200
+ gen_set_gpr(ctx, a->rd, target_pc);
201
return true;
202
}
203
204
@@ -XXX,XX +XXX,XX @@ static bool trans_jalr(DisasContext *ctx, arg_jalr *a)
205
{
206
TCGLabel *misaligned = NULL;
207
TCGv target_pc = tcg_temp_new();
208
+ TCGv succ_pc = dest_gpr(ctx, a->rd);
209
210
tcg_gen_addi_tl(target_pc, get_gpr(ctx, a->rs1, EXT_NONE), a->imm);
211
tcg_gen_andi_tl(target_pc, target_pc, (target_ulong)-2);
212
@@ -XXX,XX +XXX,XX @@ static bool trans_jalr(DisasContext *ctx, arg_jalr *a)
213
tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0x0, misaligned);
214
}
215
216
- gen_set_gpri(ctx, a->rd, ctx->pc_succ_insn);
217
+ gen_pc_plus_diff(succ_pc, ctx, ctx->cur_insn_len);
218
+ gen_set_gpr(ctx, a->rd, succ_pc);
219
+
220
tcg_gen_mov_tl(cpu_pc, target_pc);
221
lookup_and_goto_ptr(ctx);
222
223
@@ -XXX,XX +XXX,XX @@ static bool gen_branch(DisasContext *ctx, arg_b *a, TCGCond cond)
224
TCGLabel *l = gen_new_label();
225
TCGv src1 = get_gpr(ctx, a->rs1, EXT_SIGN);
226
TCGv src2 = get_gpr(ctx, a->rs2, EXT_SIGN);
227
+ target_ulong orig_pc_save = ctx->pc_save;
228
229
if (get_xl(ctx) == MXL_RV128) {
230
TCGv src1h = get_gprh(ctx, a->rs1);
231
@@ -XXX,XX +XXX,XX @@ static bool gen_branch(DisasContext *ctx, arg_b *a, TCGCond cond)
232
tcg_gen_brcond_tl(cond, src1, src2, l);
233
}
234
gen_goto_tb(ctx, 1, ctx->cur_insn_len);
235
+ ctx->pc_save = orig_pc_save;
236
237
gen_set_label(l); /* branch taken */
238
239
@@ -XXX,XX +XXX,XX @@ static bool gen_branch(DisasContext *ctx, arg_b *a, TCGCond cond)
240
} else {
241
gen_goto_tb(ctx, 0, a->imm);
242
}
243
+ ctx->pc_save = -1;
244
ctx->base.is_jmp = DISAS_NORETURN;
245
246
return true;
247
diff --git a/target/riscv/insn_trans/trans_rvzce.c.inc b/target/riscv/insn_trans/trans_rvzce.c.inc
248
index XXXXXXX..XXXXXXX 100644
249
--- a/target/riscv/insn_trans/trans_rvzce.c.inc
250
+++ b/target/riscv/insn_trans/trans_rvzce.c.inc
251
@@ -XXX,XX +XXX,XX @@ static bool trans_cm_jalt(DisasContext *ctx, arg_cm_jalt *a)
252
253
/* c.jt vs c.jalt depends on the index. */
254
if (a->index >= 32) {
255
- gen_set_gpri(ctx, xRA, ctx->pc_succ_insn);
256
+ TCGv succ_pc = dest_gpr(ctx, xRA);
257
+ gen_pc_plus_diff(succ_pc, ctx, ctx->cur_insn_len);
258
+ gen_set_gpr(ctx, xRA, succ_pc);
259
}
260
261
tcg_gen_lookup_and_goto_ptr();
262
--
263
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
pc_succ_insn is no longer useful after the introduce of cur_insn_len
4
and all pc related value use diff value instead of absolute value.
5
6
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
7
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-Id: <20230526072124.298466-8-liweiwei@iscas.ac.cn>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
13
target/riscv/translate.c | 7 +------
14
1 file changed, 1 insertion(+), 6 deletions(-)
15
16
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/riscv/translate.c
19
+++ b/target/riscv/translate.c
20
@@ -XXX,XX +XXX,XX @@ typedef enum {
21
22
typedef struct DisasContext {
23
DisasContextBase base;
24
- /* pc_succ_insn points to the instruction following base.pc_next */
25
- target_ulong pc_succ_insn;
26
target_ulong cur_insn_len;
27
target_ulong pc_save;
28
target_ulong priv_ver;
29
@@ -XXX,XX +XXX,XX @@ static void decode_opc(CPURISCVState *env, DisasContext *ctx, uint16_t opcode)
30
/* Check for compressed insn */
31
if (ctx->cur_insn_len == 2) {
32
ctx->opcode = opcode;
33
- ctx->pc_succ_insn = ctx->base.pc_next + 2;
34
/*
35
* The Zca extension is added as way to refer to instructions in the C
36
* extension that do not include the floating-point loads and stores
37
@@ -XXX,XX +XXX,XX @@ static void decode_opc(CPURISCVState *env, DisasContext *ctx, uint16_t opcode)
38
translator_lduw(env, &ctx->base,
39
ctx->base.pc_next + 2));
40
ctx->opcode = opcode32;
41
- ctx->pc_succ_insn = ctx->base.pc_next + 4;
42
43
for (size_t i = 0; i < ARRAY_SIZE(decoders); ++i) {
44
if (decoders[i].guard_func(ctx) &&
45
@@ -XXX,XX +XXX,XX @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
46
uint32_t tb_flags = ctx->base.tb->flags;
47
48
ctx->pc_save = ctx->base.pc_first;
49
- ctx->pc_succ_insn = ctx->base.pc_first;
50
ctx->priv = FIELD_EX32(tb_flags, TB_FLAGS, PRIV);
51
ctx->mem_idx = FIELD_EX32(tb_flags, TB_FLAGS, MEM_IDX);
52
ctx->mstatus_fs = FIELD_EX32(tb_flags, TB_FLAGS, FS);
53
@@ -XXX,XX +XXX,XX @@ static void riscv_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
54
55
ctx->ol = ctx->xl;
56
decode_opc(env, ctx, opcode16);
57
- ctx->base.pc_next = ctx->pc_succ_insn;
58
+ ctx->base.pc_next += ctx->cur_insn_len;
59
60
/* Only the first insn within a TB is allowed to cross a page boundary. */
61
if (ctx->base.is_jmp == DISAS_NEXT) {
62
--
63
2.40.1
diff view generated by jsdifflib
New patch
1
From: Sunil V L <sunilvl@ventanamicro.com>
1
2
3
Currently, virt machine supports two pflash instances each with
4
32MB size. However, the first pflash is always assumed to
5
contain M-mode firmware and reset vector is set to this if
6
enabled. Hence, for S-mode payloads like EDK2, only one pflash
7
instance is available for use. This means both code and NV variables
8
of EDK2 will need to use the same pflash.
9
10
The OS distros keep the EDK2 FW code as readonly. When non-volatile
11
variables also need to share the same pflash, it is not possible
12
to keep it as readonly since variables need write access.
13
14
To resolve this issue, the code and NV variables need to be separated.
15
But in that case we need an extra flash. Hence, modify the convention
16
for non-KVM guests such that, pflash0 will contain the M-mode FW
17
only when "-bios none" option is used. Otherwise, pflash0 will contain
18
the S-mode payload FW. This enables both pflash instances available
19
for EDK2 use.
20
21
When KVM is enabled, pflash0 is always assumed to contain the
22
S-mode payload firmware only.
23
24
Example usage:
25
1) pflash0 containing M-mode FW
26
qemu-system-riscv64 -bios none -pflash <mmode_fw> -machine virt
27
or
28
qemu-system-riscv64 -bios none \
29
-drive file=<mmode_fw>,if=pflash,format=raw,unit=0 -machine virt
30
31
2) pflash0 containing S-mode payload like EDK2
32
qemu-system-riscv64 -pflash <smode_fw_code> -pflash <smode_vars> -machine virt
33
or
34
qemu-system-riscv64 -bios <opensbi_fw> \
35
-pflash <smode_fw_code> \
36
-pflash <smode_vars> \
37
-machine virt
38
or
39
qemu-system-riscv64 -bios <opensbi_fw> \
40
-drive file=<smode_fw_code>,if=pflash,format=raw,unit=0,readonly=on \
41
-drive file=<smode_fw_vars>,if=pflash,format=raw,unit=1 \
42
-machine virt
43
44
Signed-off-by: Sunil V L <sunilvl@ventanamicro.com>
45
Reported-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
46
Tested-by: Andrea Bolognani <abologna@redhat.com>
47
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
48
Message-Id: <20230601045910.18646-2-sunilvl@ventanamicro.com>
49
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
50
---
51
hw/riscv/virt.c | 53 ++++++++++++++++++++-----------------------------
52
1 file changed, 21 insertions(+), 32 deletions(-)
53
54
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
55
index XXXXXXX..XXXXXXX 100644
56
--- a/hw/riscv/virt.c
57
+++ b/hw/riscv/virt.c
58
@@ -XXX,XX +XXX,XX @@ static void virt_machine_done(Notifier *notifier, void *data)
59
target_ulong firmware_end_addr, kernel_start_addr;
60
const char *firmware_name = riscv_default_firmware_name(&s->soc[0]);
61
uint32_t fdt_load_addr;
62
- uint64_t kernel_entry;
63
+ uint64_t kernel_entry = 0;
64
65
/*
66
* Only direct boot kernel is currently supported for KVM VM,
67
@@ -XXX,XX +XXX,XX @@ static void virt_machine_done(Notifier *notifier, void *data)
68
firmware_end_addr = riscv_find_and_load_firmware(machine, firmware_name,
69
start_addr, NULL);
70
71
- if (drive_get(IF_PFLASH, 0, 1)) {
72
- /*
73
- * S-mode FW like EDK2 will be kept in second plash (unit 1).
74
- * When both kernel, initrd and pflash options are provided in the
75
- * command line, the kernel and initrd will be copied to the fw_cfg
76
- * table and opensbi will jump to the flash address which is the
77
- * entry point of S-mode FW. It is the job of the S-mode FW to load
78
- * the kernel and initrd using fw_cfg table.
79
- *
80
- * If only pflash is given but not -kernel, then it is the job of
81
- * of the S-mode firmware to locate and load the kernel.
82
- * In either case, the next_addr for opensbi will be the flash address.
83
- */
84
- riscv_setup_firmware_boot(machine);
85
- kernel_entry = virt_memmap[VIRT_FLASH].base +
86
- virt_memmap[VIRT_FLASH].size / 2;
87
- } else if (machine->kernel_filename) {
88
+ if (drive_get(IF_PFLASH, 0, 0)) {
89
+ if (machine->firmware && !strcmp(machine->firmware, "none") &&
90
+ !kvm_enabled()) {
91
+ /*
92
+ * Pflash was supplied but bios is none and not KVM guest,
93
+ * let's overwrite the address we jump to after reset to
94
+ * the base of the flash.
95
+ */
96
+ start_addr = virt_memmap[VIRT_FLASH].base;
97
+ } else {
98
+ /*
99
+ * Pflash was supplied but either KVM guest or bios is not none.
100
+ * In this case, base of the flash would contain S-mode payload.
101
+ */
102
+ riscv_setup_firmware_boot(machine);
103
+ kernel_entry = virt_memmap[VIRT_FLASH].base;
104
+ }
105
+ }
106
+
107
+ if (machine->kernel_filename && !kernel_entry) {
108
kernel_start_addr = riscv_calc_kernel_start_addr(&s->soc[0],
109
firmware_end_addr);
110
111
kernel_entry = riscv_load_kernel(machine, &s->soc[0],
112
kernel_start_addr, true, NULL);
113
- } else {
114
- /*
115
- * If dynamic firmware is used, it doesn't know where is the next mode
116
- * if kernel argument is not set.
117
- */
118
- kernel_entry = 0;
119
- }
120
-
121
- if (drive_get(IF_PFLASH, 0, 0)) {
122
- /*
123
- * Pflash was supplied, let's overwrite the address we jump to after
124
- * reset to the base of the flash.
125
- */
126
- start_addr = virt_memmap[VIRT_FLASH].base;
127
}
128
129
fdt_load_addr = riscv_compute_fdt_addr(memmap[VIRT_DRAM].base,
130
--
131
2.40.1
diff view generated by jsdifflib
New patch
1
From: Sunil V L <sunilvl@ventanamicro.com>
1
2
3
Currently, pflash devices can be configured only via -pflash
4
or -drive options. This is the legacy way and the
5
better way is to use -blockdev as in other architectures.
6
libvirt also has moved to use -blockdev method.
7
8
To support -blockdev option, pflash devices need to be
9
created in instance_init itself. So, update the code to
10
move the virt_flash_create() to instance_init. Also, use
11
standard interfaces to detect whether pflash0 is
12
configured or not.
13
14
Signed-off-by: Sunil V L <sunilvl@ventanamicro.com>
15
Reported-by: Andrea Bolognani <abologna@redhat.com>
16
Tested-by: Andrea Bolognani <abologna@redhat.com>
17
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
18
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
19
Message-Id: <20230601045910.18646-3-sunilvl@ventanamicro.com>
20
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
21
---
22
hw/riscv/virt.c | 8 +++++---
23
1 file changed, 5 insertions(+), 3 deletions(-)
24
25
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
26
index XXXXXXX..XXXXXXX 100644
27
--- a/hw/riscv/virt.c
28
+++ b/hw/riscv/virt.c
29
@@ -XXX,XX +XXX,XX @@ static void virt_machine_done(Notifier *notifier, void *data)
30
const char *firmware_name = riscv_default_firmware_name(&s->soc[0]);
31
uint32_t fdt_load_addr;
32
uint64_t kernel_entry = 0;
33
+ BlockBackend *pflash_blk0;
34
35
/*
36
* Only direct boot kernel is currently supported for KVM VM,
37
@@ -XXX,XX +XXX,XX @@ static void virt_machine_done(Notifier *notifier, void *data)
38
firmware_end_addr = riscv_find_and_load_firmware(machine, firmware_name,
39
start_addr, NULL);
40
41
- if (drive_get(IF_PFLASH, 0, 0)) {
42
+ pflash_blk0 = pflash_cfi01_get_blk(s->flash[0]);
43
+ if (pflash_blk0) {
44
if (machine->firmware && !strcmp(machine->firmware, "none") &&
45
!kvm_enabled()) {
46
/*
47
@@ -XXX,XX +XXX,XX @@ static void virt_machine_init(MachineState *machine)
48
sysbus_create_simple("goldfish_rtc", memmap[VIRT_RTC].base,
49
qdev_get_gpio_in(mmio_irqchip, RTC_IRQ));
50
51
- virt_flash_create(s);
52
-
53
for (i = 0; i < ARRAY_SIZE(s->flash); i++) {
54
/* Map legacy -drive if=pflash to machine properties */
55
pflash_cfi01_legacy_drive(s->flash[i],
56
@@ -XXX,XX +XXX,XX @@ static void virt_machine_instance_init(Object *obj)
57
{
58
RISCVVirtState *s = RISCV_VIRT_MACHINE(obj);
59
60
+ virt_flash_create(s);
61
+
62
s->oem_id = g_strndup(ACPI_BUILD_APPNAME6, 6);
63
s->oem_table_id = g_strndup(ACPI_BUILD_APPNAME8, 8);
64
s->acpi = ON_OFF_AUTO_AUTO;
65
--
66
2.40.1
67
68
diff view generated by jsdifflib
1
From: Thomas Huth <thuth@redhat.com>
1
From: Sunil V L <sunilvl@ventanamicro.com>
2
2
3
Configuring a drive with "if=none" is meant for creation of a backend
3
pflash devices can be used in virt machine for different
4
only, it should not get automatically assigned to a device frontend.
4
purposes like for ROM code or S-mode FW payload. Add a
5
Use "if=pflash" for the One-Time-Programmable device instead (like
5
section in the documentation on how to use pflash devices
6
it is e.g. also done for the efuse device in hw/arm/xlnx-zcu102.c).
6
for different purposes.
7
7
8
Since the old way of configuring the device has already been published
8
Signed-off-by: Sunil V L <sunilvl@ventanamicro.com>
9
with the previous QEMU versions, we cannot remove this immediately, but
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10
have to deprecate it and support it for at least two more releases.
11
12
Signed-off-by: Thomas Huth <thuth@redhat.com>
13
Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
14
Reviewed-by: Markus Armbruster <armbru@redhat.com>
15
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
16
Message-id: 20211119102549.217755-1-thuth@redhat.com
11
Message-Id: <20230601045910.18646-4-sunilvl@ventanamicro.com>
17
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
18
---
13
---
19
docs/about/deprecated.rst | 6 ++++++
14
docs/system/riscv/virt.rst | 31 +++++++++++++++++++++++++++++++
20
hw/misc/sifive_u_otp.c | 9 ++++++++-
15
1 file changed, 31 insertions(+)
21
2 files changed, 14 insertions(+), 1 deletion(-)
22
16
23
diff --git a/docs/about/deprecated.rst b/docs/about/deprecated.rst
17
diff --git a/docs/system/riscv/virt.rst b/docs/system/riscv/virt.rst
24
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
25
--- a/docs/about/deprecated.rst
19
--- a/docs/system/riscv/virt.rst
26
+++ b/docs/about/deprecated.rst
20
+++ b/docs/system/riscv/virt.rst
27
@@ -XXX,XX +XXX,XX @@ as short-form boolean values, and passed to plugins as ``arg_name=on``.
21
@@ -XXX,XX +XXX,XX @@ with the default OpenSBI firmware image as the -bios. It also supports
28
However, short-form booleans are deprecated and full explicit ``arg_name=on``
22
the recommended RISC-V bootflow: U-Boot SPL (M-mode) loads OpenSBI fw_dynamic
29
form is preferred.
23
firmware and U-Boot proper (S-mode), using the standard -bios functionality.
30
24
31
+``-drive if=none`` for the sifive_u OTP device (since 6.2)
25
+Using flash devices
32
+''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
26
+-------------------
33
+
27
+
34
+Using ``-drive if=none`` to configure the OTP device of the sifive_u
28
+By default, the first flash device (pflash0) is expected to contain
35
+RISC-V machine is deprecated. Use ``-drive if=pflash`` instead.
29
+S-mode firmware code. It can be configured as read-only, with the
30
+second flash device (pflash1) available to store configuration data.
36
+
31
+
37
32
+For example, booting edk2 looks like
38
QEMU Machine Protocol (QMP) commands
33
+
39
------------------------------------
34
+.. code-block:: bash
40
diff --git a/hw/misc/sifive_u_otp.c b/hw/misc/sifive_u_otp.c
35
+
41
index XXXXXXX..XXXXXXX 100644
36
+ $ qemu-system-riscv64 \
42
--- a/hw/misc/sifive_u_otp.c
37
+ -blockdev node-name=pflash0,driver=file,read-only=on,filename=<edk2_code> \
43
+++ b/hw/misc/sifive_u_otp.c
38
+ -blockdev node-name=pflash1,driver=file,filename=<edk2_vars> \
44
@@ -XXX,XX +XXX,XX @@ static void sifive_u_otp_realize(DeviceState *dev, Error **errp)
39
+ -M virt,pflash0=pflash0,pflash1=pflash1 \
45
TYPE_SIFIVE_U_OTP, SIFIVE_U_OTP_REG_SIZE);
40
+ ... other args ....
46
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->mmio);
41
+
47
42
+For TCG guests only, it is also possible to boot M-mode firmware from
48
- dinfo = drive_get_next(IF_NONE);
43
+the first flash device (pflash0) by additionally passing ``-bios
49
+ dinfo = drive_get_next(IF_PFLASH);
44
+none``, as in
50
+ if (!dinfo) {
45
+
51
+ dinfo = drive_get_next(IF_NONE);
46
+.. code-block:: bash
52
+ if (dinfo) {
47
+
53
+ warn_report("using \"-drive if=none\" for the OTP is deprecated, "
48
+ $ qemu-system-riscv64 \
54
+ "use \"-drive if=pflash\" instead.");
49
+ -bios none \
55
+ }
50
+ -blockdev node-name=pflash0,driver=file,read-only=on,filename=<m_mode_code> \
56
+ }
51
+ -M virt,pflash0=pflash0 \
57
if (dinfo) {
52
+ ... other args ....
58
int ret;
53
+
59
uint64_t perm;
54
+Firmware images used for pflash must be exactly 32 MiB in size.
55
+
56
Machine-specific options
57
------------------------
58
60
--
59
--
61
2.31.1
60
2.40.1
62
61
63
62
diff view generated by jsdifflib
New patch
1
From: Ivan Klokov <ivan.klokov@syntacore.com>
1
2
3
Added QEMU option 'vpu' to log vector extension registers such as gpr\fpu.
4
5
Signed-off-by: Ivan Klokov <ivan.klokov@syntacore.com>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Message-Id: <20230410124451.15929-2-ivan.klokov@syntacore.com>
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
---
10
include/hw/core/cpu.h | 2 ++
11
include/qemu/log.h | 1 +
12
accel/tcg/cpu-exec.c | 3 +++
13
util/log.c | 2 ++
14
4 files changed, 8 insertions(+)
15
16
diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
17
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/core/cpu.h
19
+++ b/include/hw/core/cpu.h
20
@@ -XXX,XX +XXX,XX @@ GuestPanicInformation *cpu_get_crash_info(CPUState *cpu);
21
* @CPU_DUMP_CODE:
22
* @CPU_DUMP_FPU: dump FPU register state, not just integer
23
* @CPU_DUMP_CCOP: dump info about TCG QEMU's condition code optimization state
24
+ * @CPU_DUMP_VPU: dump VPU registers
25
*/
26
enum CPUDumpFlags {
27
CPU_DUMP_CODE = 0x00010000,
28
CPU_DUMP_FPU = 0x00020000,
29
CPU_DUMP_CCOP = 0x00040000,
30
+ CPU_DUMP_VPU = 0x00080000,
31
};
32
33
/**
34
diff --git a/include/qemu/log.h b/include/qemu/log.h
35
index XXXXXXX..XXXXXXX 100644
36
--- a/include/qemu/log.h
37
+++ b/include/qemu/log.h
38
@@ -XXX,XX +XXX,XX @@ bool qemu_log_separate(void);
39
/* LOG_STRACE is used for user-mode strace logging. */
40
#define LOG_STRACE (1 << 19)
41
#define LOG_PER_THREAD (1 << 20)
42
+#define CPU_LOG_TB_VPU (1 << 21)
43
44
/* Lock/unlock output. */
45
46
diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/accel/tcg/cpu-exec.c
49
+++ b/accel/tcg/cpu-exec.c
50
@@ -XXX,XX +XXX,XX @@ static void log_cpu_exec(target_ulong pc, CPUState *cpu,
51
#if defined(TARGET_I386)
52
flags |= CPU_DUMP_CCOP;
53
#endif
54
+ if (qemu_loglevel_mask(CPU_LOG_TB_VPU)) {
55
+ flags |= CPU_DUMP_VPU;
56
+ }
57
cpu_dump_state(cpu, logfile, flags);
58
qemu_log_unlock(logfile);
59
}
60
diff --git a/util/log.c b/util/log.c
61
index XXXXXXX..XXXXXXX 100644
62
--- a/util/log.c
63
+++ b/util/log.c
64
@@ -XXX,XX +XXX,XX @@ const QEMULogItem qemu_log_items[] = {
65
"log every user-mode syscall, its input, and its result" },
66
{ LOG_PER_THREAD, "tid",
67
"open a separate log file per thread; filename must contain '%d'" },
68
+ { CPU_LOG_TB_VPU, "vpu",
69
+ "include VPU registers in the 'cpu' logging" },
70
{ 0, NULL, NULL },
71
};
72
73
--
74
2.40.1
diff view generated by jsdifflib
New patch
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
1
2
3
We initialize cur_pmmask as -1(UINT32_MAX/UINT64_MAX) and regard it
4
as if pointer mask is disabled in current implementation. However,
5
the addresses for vector load/store will be adjusted to zero in this
6
case and -1(UINT32_MAX/UINT64_MAX) is valid value for pmmask when
7
pointer mask is enabled.
8
9
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
10
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
11
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
12
Message-Id: <20230610094651.43786-1-liweiwei@iscas.ac.cn>
13
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
14
---
15
target/riscv/cpu_helper.c | 4 ++--
16
1 file changed, 2 insertions(+), 2 deletions(-)
17
18
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/target/riscv/cpu_helper.c
21
+++ b/target/riscv/cpu_helper.c
22
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPURISCVState *env, target_ulong *pc,
23
flags = FIELD_DP32(flags, TB_FLAGS, FS, fs);
24
flags = FIELD_DP32(flags, TB_FLAGS, VS, vs);
25
flags = FIELD_DP32(flags, TB_FLAGS, XL, env->xl);
26
- if (env->cur_pmmask < (env->xl == MXL_RV32 ? UINT32_MAX : UINT64_MAX)) {
27
+ if (env->cur_pmmask != 0) {
28
flags = FIELD_DP32(flags, TB_FLAGS, PM_MASK_ENABLED, 1);
29
}
30
if (env->cur_pmbase != 0) {
31
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPURISCVState *env, target_ulong *pc,
32
33
void riscv_cpu_update_mask(CPURISCVState *env)
34
{
35
- target_ulong mask = -1, base = 0;
36
+ target_ulong mask = 0, base = 0;
37
/*
38
* TODO: Current RVJ spec does not specify
39
* how the extension interacts with XLEN.
40
--
41
2.40.1
diff view generated by jsdifflib
New patch
1
From: Xiao Wang <xiao.w.wang@intel.com>
1
2
3
There's no code using MTYPE, which was a concept used in older vector
4
implementation.
5
6
Signed-off-by: Xiao Wang <xiao.w.wang@intel.com>
7
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
8
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
9
Message-Id: <20230608053517.4102648-1-xiao.w.wang@intel.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
target/riscv/vector_helper.c | 6 +-----
13
1 file changed, 1 insertion(+), 5 deletions(-)
14
15
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/vector_helper.c
18
+++ b/target/riscv/vector_helper.c
19
@@ -XXX,XX +XXX,XX @@ vext_ldst_us(void *vd, target_ulong base, CPURISCVState *env, uint32_t desc,
20
21
/*
22
* masked unit-stride load and store operation will be a special case of
23
- * stride, stride = NF * sizeof (MTYPE)
24
+ * stride, stride = NF * sizeof (ETYPE)
25
*/
26
27
#define GEN_VEXT_LD_US(NAME, ETYPE, LOAD_FN) \
28
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_LDFF(vle64ff_v, int64_t, lde_d)
29
#define DO_MAX(N, M) ((N) >= (M) ? (N) : (M))
30
#define DO_MIN(N, M) ((N) >= (M) ? (M) : (N))
31
32
-/* Unsigned min/max */
33
-#define DO_MAXU(N, M) DO_MAX((UMTYPE)N, (UMTYPE)M)
34
-#define DO_MINU(N, M) DO_MIN((UMTYPE)N, (UMTYPE)M)
35
-
36
/*
37
* load and store whole register instructions
38
*/
39
--
40
2.40.1
diff view generated by jsdifflib
New patch
1
From: Xiao Wang <xiao.w.wang@intel.com>
1
2
3
Commit 752614cab8e6 ("target/riscv: rvv: Add tail agnostic for vector
4
load / store instructions") added an extra check for LMUL fragmentation,
5
intended for setting the "rest tail elements" in the last register for a
6
segment load insn.
7
8
Actually, the max_elements derived in vext_ld*() won't be a fraction of
9
vector register size, since the lmul encoded in desc is emul, which has
10
already been adjusted to 1 for LMUL fragmentation case by vext_get_emul()
11
in trans_rvv.c.inc, for ld_stride(), ld_us(), ld_index() and ldff().
12
13
Besides, vext_get_emul() has also taken EEW/SEW into consideration, so no
14
need to call vext_get_total_elems() which would base on the emul to derive
15
another emul, the second emul would be incorrect when esz differs from sew.
16
17
Thus this patch removes the check for extra tail elements.
18
19
Fixes: 752614cab8e6 ("target/riscv: rvv: Add tail agnostic for vector load / store instructions")
20
21
Signed-off-by: Xiao Wang <xiao.w.wang@intel.com>
22
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
23
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
24
Message-Id: <20230607091646.4049428-1-xiao.w.wang@intel.com>
25
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
26
---
27
target/riscv/vector_helper.c | 22 ++++++----------------
28
1 file changed, 6 insertions(+), 16 deletions(-)
29
30
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
31
index XXXXXXX..XXXXXXX 100644
32
--- a/target/riscv/vector_helper.c
33
+++ b/target/riscv/vector_helper.c
34
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_ST_ELEM(ste_h, int16_t, H2, stw)
35
GEN_VEXT_ST_ELEM(ste_w, int32_t, H4, stl)
36
GEN_VEXT_ST_ELEM(ste_d, int64_t, H8, stq)
37
38
-static void vext_set_tail_elems_1s(CPURISCVState *env, target_ulong vl,
39
- void *vd, uint32_t desc, uint32_t nf,
40
+static void vext_set_tail_elems_1s(target_ulong vl, void *vd,
41
+ uint32_t desc, uint32_t nf,
42
uint32_t esz, uint32_t max_elems)
43
{
44
- uint32_t total_elems, vlenb, registers_used;
45
uint32_t vta = vext_vta(desc);
46
int k;
47
48
@@ -XXX,XX +XXX,XX @@ static void vext_set_tail_elems_1s(CPURISCVState *env, target_ulong vl,
49
return;
50
}
51
52
- total_elems = vext_get_total_elems(env, desc, esz);
53
- vlenb = riscv_cpu_cfg(env)->vlen >> 3;
54
-
55
for (k = 0; k < nf; ++k) {
56
vext_set_elems_1s(vd, vta, (k * max_elems + vl) * esz,
57
(k * max_elems + max_elems) * esz);
58
}
59
-
60
- if (nf * max_elems % total_elems != 0) {
61
- registers_used = ((nf * max_elems) * esz + (vlenb - 1)) / vlenb;
62
- vext_set_elems_1s(vd, vta, (nf * max_elems) * esz,
63
- registers_used * vlenb);
64
- }
65
}
66
67
/*
68
@@ -XXX,XX +XXX,XX @@ vext_ldst_stride(void *vd, void *v0, target_ulong base,
69
}
70
env->vstart = 0;
71
72
- vext_set_tail_elems_1s(env, env->vl, vd, desc, nf, esz, max_elems);
73
+ vext_set_tail_elems_1s(env->vl, vd, desc, nf, esz, max_elems);
74
}
75
76
#define GEN_VEXT_LD_STRIDE(NAME, ETYPE, LOAD_FN) \
77
@@ -XXX,XX +XXX,XX @@ vext_ldst_us(void *vd, target_ulong base, CPURISCVState *env, uint32_t desc,
78
}
79
env->vstart = 0;
80
81
- vext_set_tail_elems_1s(env, evl, vd, desc, nf, esz, max_elems);
82
+ vext_set_tail_elems_1s(evl, vd, desc, nf, esz, max_elems);
83
}
84
85
/*
86
@@ -XXX,XX +XXX,XX @@ vext_ldst_index(void *vd, void *v0, target_ulong base,
87
}
88
env->vstart = 0;
89
90
- vext_set_tail_elems_1s(env, env->vl, vd, desc, nf, esz, max_elems);
91
+ vext_set_tail_elems_1s(env->vl, vd, desc, nf, esz, max_elems);
92
}
93
94
#define GEN_VEXT_LD_INDEX(NAME, ETYPE, INDEX_FN, LOAD_FN) \
95
@@ -XXX,XX +XXX,XX @@ ProbeSuccess:
96
}
97
env->vstart = 0;
98
99
- vext_set_tail_elems_1s(env, env->vl, vd, desc, nf, esz, max_elems);
100
+ vext_set_tail_elems_1s(env->vl, vd, desc, nf, esz, max_elems);
101
}
102
103
#define GEN_VEXT_LDFF(NAME, ETYPE, LOAD_FN) \
104
--
105
2.40.1
diff view generated by jsdifflib
New patch
1
From: Himanshu Chauhan <hchauhan@ventanamicro.com>
1
2
3
On an address match, skip checking for default permissions and return error
4
based on access defined in PMP configuration.
5
6
v3 Changes:
7
o Removed explicit return of boolean value from comparision
8
of priv/allowed_priv
9
10
v2 Changes:
11
o Removed goto to return in place when address matches
12
o Call pmp_hart_has_privs_default at the end of the loop
13
14
Fixes: 90b1fafce06 ("target/riscv: Smepmp: Skip applying default rules when address matches")
15
Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
16
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
17
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
18
Message-Id: <20230605164548.715336-1-hchauhan@ventanamicro.com>
19
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
20
---
21
target/riscv/pmp.c | 10 ++--------
22
1 file changed, 2 insertions(+), 8 deletions(-)
23
24
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
25
index XXXXXXX..XXXXXXX 100644
26
--- a/target/riscv/pmp.c
27
+++ b/target/riscv/pmp.c
28
@@ -XXX,XX +XXX,XX @@ bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
29
pmp_priv_t *allowed_privs, target_ulong mode)
30
{
31
int i = 0;
32
- bool ret = false;
33
int pmp_size = 0;
34
target_ulong s = 0;
35
target_ulong e = 0;
36
@@ -XXX,XX +XXX,XX @@ bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
37
* defined with PMP must be used. We shouldn't fallback on
38
* finding default privileges.
39
*/
40
- ret = true;
41
- break;
42
+ return (privs & *allowed_privs) == privs;
43
}
44
}
45
46
/* No rule matched */
47
- if (!ret) {
48
- ret = pmp_hart_has_privs_default(env, privs, allowed_privs, mode);
49
- }
50
-
51
- return ret;
52
+ return pmp_hart_has_privs_default(env, privs, allowed_privs, mode);
53
}
54
55
/*
56
--
57
2.40.1
diff view generated by jsdifflib
New patch
1
From: Tommy Wu <tommy.wu@sifive.com>
1
2
3
According to the `The RISC-V Advanced Interrupt Architecture`
4
document, if register `mmsiaddrcfgh` of the domain has bit L set
5
to one, then `smsiaddrcfg` and `smsiaddrcfgh` are locked as
6
read-only alongside `mmsiaddrcfg` and `mmsiaddrcfgh`.
7
8
Signed-off-by: Tommy Wu <tommy.wu@sifive.com>
9
Reviewed-by: Frank Chang <frank.chang@sifive.com>
10
Acked-by: Alistair Francis <alistair.francis@wdc.com>
11
Reviewed-by: Anup Patel <anup@brainfault.org>
12
Message-Id: <20230609055936.3925438-1-tommy.wu@sifive.com>
13
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
14
---
15
hw/intc/riscv_aplic.c | 4 ++--
16
1 file changed, 2 insertions(+), 2 deletions(-)
17
18
diff --git a/hw/intc/riscv_aplic.c b/hw/intc/riscv_aplic.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/intc/riscv_aplic.c
21
+++ b/hw/intc/riscv_aplic.c
22
@@ -XXX,XX +XXX,XX @@ static void riscv_aplic_write(void *opaque, hwaddr addr, uint64_t value,
23
* domains).
24
*/
25
if (aplic->num_children &&
26
- !(aplic->smsicfgaddrH & APLIC_xMSICFGADDRH_L)) {
27
+ !(aplic->mmsicfgaddrH & APLIC_xMSICFGADDRH_L)) {
28
aplic->smsicfgaddr = value;
29
}
30
} else if (aplic->mmode && aplic->msimode &&
31
(addr == APLIC_SMSICFGADDRH)) {
32
if (aplic->num_children &&
33
- !(aplic->smsicfgaddrH & APLIC_xMSICFGADDRH_L)) {
34
+ !(aplic->mmsicfgaddrH & APLIC_xMSICFGADDRH_L)) {
35
aplic->smsicfgaddrH = value & APLIC_xMSICFGADDRH_VALID_MASK;
36
}
37
} else if ((APLIC_SETIP_BASE <= addr) &&
38
--
39
2.40.1
diff view generated by jsdifflib