1
The following changes since commit c95bd5ff1660883d15ad6e0005e4c8571604f51a:
1
The following changes since commit fdd0df5340a8ebc8de88078387ebc85c5af7b40f:
2
2
3
Merge remote-tracking branch 'remotes/philmd/tags/mips-fixes-20210322' into staging (2021-03-22 14:26:13 +0000)
3
Merge tag 'pull-ppc-20230610' of https://gitlab.com/danielhb/qemu into staging (2023-06-10 07:25:00 -0700)
4
4
5
are available in the Git repository at:
5
are available in the Git repository at:
6
6
7
git@github.com:alistair23/qemu.git tags/pull-riscv-to-apply-20210322-2
7
https://github.com/alistair23/qemu.git tags/pull-riscv-to-apply-20230614
8
8
9
for you to fetch changes up to 9a27f69bd668d9d71674407badc412ce1231c7d5:
9
for you to fetch changes up to 860029321d9ebdff47e89561de61e9441fead70a:
10
10
11
target/riscv: Prevent lost illegal instruction exceptions (2021-03-22 21:54:40 -0400)
11
hw/intc: If mmsiaddrcfgh.L == 1, smsiaddrcfg and smsiaddrcfgh are read-only. (2023-06-14 10:04:30 +1000)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
RISC-V PR for 6.0
14
Second RISC-V PR for 8.1
15
15
16
This PR includes:
16
* Skip Vector set tail when vta is zero
17
- Fix for vector CSR access
17
* Move zc* out of the experimental properties
18
- Improvements to the Ibex UART device
18
* Mask the implicitly enabled extensions in isa_string based on priv version
19
- PMP improvements and bug fixes
19
* Rework CPU extension validation and validate MISA changes
20
- Hypervisor extension bug fixes
20
* Fixup PMP TLB cacheing errors
21
- ramfb support for the virt machine
21
* Writing to pmpaddr and MML/MMWP correctly triggers TLB flushes
22
- Fast read support for SST flash
22
* Fixup PMP bypass checks
23
- Improvements to the microchip_pfsoc machine
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
24
39
25
----------------------------------------------------------------
40
----------------------------------------------------------------
26
Alexander Wagner (1):
41
Daniel Henrique Barboza (10):
27
hw/char: disable ibex uart receive if the buffer is full
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()
28
52
29
Asherah Connor (2):
53
Himanshu Chauhan (1):
30
hw/riscv: Add fw_cfg support to virt
54
target/riscv: Smepmp: Return error when access permission not allowed in PMP
31
hw/riscv: allow ramfb on virt
32
55
33
Bin Meng (3):
56
Ivan Klokov (1):
34
hw/block: m25p80: Support fast read for SST flashes
57
util/log: Add vector registers to log
35
hw/riscv: microchip_pfsoc: Map EMMC/SD mux register
36
docs/system: riscv: Add documentation for 'microchip-icicle-kit' machine
37
58
38
Frank Chang (1):
59
Mayuresh Chitale (3):
39
target/riscv: fix vs() to return proper error code
60
target/riscv: smstateen check for fcsr
61
target/riscv: Reuse tb->flags.FS
62
target/riscv: smstateen knobs
40
63
41
Georg Kotheimer (6):
64
Philippe Mathieu-Daudé (5):
42
target/riscv: Adjust privilege level for HLV(X)/HSV instructions
65
hw/riscv/opentitan: Rename machine_[class]_init() functions
43
target/riscv: Make VSTIP and VSEIP read-only in hip
66
hw/riscv/opentitan: Declare QOM types using DEFINE_TYPES() macro
44
target/riscv: Use background registers also for MSTATUS_MPV
67
hw/riscv/opentitan: Add TYPE_OPENTITAN_MACHINE definition
45
target/riscv: Fix read and write accesses to vsip and vsie
68
hw/riscv/opentitan: Explicit machine type definition
46
target/riscv: Add proper two-stage lookup exception detection
69
hw/riscv/opentitan: Correct OpenTitanState parent type/size
47
target/riscv: Prevent lost illegal instruction exceptions
48
70
49
Jim Shu (3):
71
Sunil V L (3):
50
target/riscv: propagate PMP permission to TLB page
72
hw/riscv: virt: Assume M-mode FW in pflash0 only when "-bios none"
51
target/riscv: add log of PMP permission checking
73
riscv/virt: Support using pflash via -blockdev option
52
target/riscv: flush TLB pages if PMP permission has been changed
74
docs/system: riscv: Add pflash usage details
53
75
54
docs/system/riscv/microchip-icicle-kit.rst | 89 ++++++++++++++
76
Tommy Wu (1):
55
docs/system/target-riscv.rst | 1 +
77
hw/intc: If mmsiaddrcfgh.L == 1, smsiaddrcfg and smsiaddrcfgh are read-only.
56
include/hw/char/ibex_uart.h | 4 +
57
include/hw/riscv/microchip_pfsoc.h | 1 +
58
include/hw/riscv/virt.h | 2 +
59
target/riscv/cpu.h | 4 +
60
target/riscv/pmp.h | 4 +-
61
hw/block/m25p80.c | 3 +
62
hw/char/ibex_uart.c | 23 +++-
63
hw/riscv/microchip_pfsoc.c | 6 +
64
hw/riscv/virt.c | 33 ++++++
65
target/riscv/cpu.c | 1 +
66
target/riscv/cpu_helper.c | 144 +++++++++++++++--------
67
target/riscv/csr.c | 77 +++++++------
68
target/riscv/pmp.c | 84 ++++++++++----
69
target/riscv/translate.c | 179 +----------------------------
70
hw/riscv/Kconfig | 1 +
71
17 files changed, 367 insertions(+), 289 deletions(-)
72
create mode 100644 docs/system/riscv/microchip-icicle-kit.rst
73
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
1
From: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
1
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
2
2
3
The current two-stage lookup detection in riscv_cpu_do_interrupt falls
3
write_misa() must use as much common logic as possible. We want to open
4
short of its purpose, as all it checks is whether two-stage address
4
code just the bits that are exclusive to the CSR write operation and TCG
5
translation either via the hypervisor-load store instructions or the
5
internals.
6
MPRV feature would be allowed.
7
6
8
What we really need instead is whether two-stage address translation was
7
Our validation is done with riscv_cpu_validate_set_extensions(), but we
9
active when the exception was raised. However, in riscv_cpu_do_interrupt
8
need a small tweak first. When enabling RVG we're doing:
10
we do not have the information to reliably detect this. Therefore, when
11
we raise a memory fault exception we have to record whether two-stage
12
address translation is active.
13
9
14
Signed-off-by: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
10
env->misa_ext |= RVI | RVM | RVA | RVF | RVD;
15
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
11
env->misa_ext_mask = env->misa_ext;
16
Message-id: 20210319141459.1196741-1-georg.kotheimer@kernkonzept.com
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>
17
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
43
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
18
---
44
---
19
target/riscv/cpu.h | 4 ++++
45
target/riscv/cpu.h | 1 +
20
target/riscv/cpu.c | 1 +
46
target/riscv/cpu.c | 4 ++--
21
target/riscv/cpu_helper.c | 21 ++++++++-------------
47
target/riscv/csr.c | 51 ++++++++++++++++++++++------------------------
22
3 files changed, 13 insertions(+), 13 deletions(-)
48
3 files changed, 27 insertions(+), 29 deletions(-)
23
49
24
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
50
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
25
index XXXXXXX..XXXXXXX 100644
51
index XXXXXXX..XXXXXXX 100644
26
--- a/target/riscv/cpu.h
52
--- a/target/riscv/cpu.h
27
+++ b/target/riscv/cpu.h
53
+++ b/target/riscv/cpu.h
28
@@ -XXX,XX +XXX,XX @@ struct CPURISCVState {
54
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
29
target_ulong satp_hs;
55
bool probe, uintptr_t retaddr);
30
uint64_t mstatus_hs;
56
char *riscv_isa_string(RISCVCPU *cpu);
31
57
void riscv_cpu_list(void);
32
+ /* Signals whether the current exception occurred with two-stage address
58
+void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp);
33
+ translation active. */
59
34
+ bool two_stage_lookup;
60
#define cpu_list riscv_cpu_list
35
+
61
#define cpu_mmu_index riscv_cpu_mmu_index
36
target_ulong scounteren;
37
target_ulong mcounteren;
38
39
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
62
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
40
index XXXXXXX..XXXXXXX 100644
63
index XXXXXXX..XXXXXXX 100644
41
--- a/target/riscv/cpu.c
64
--- a/target/riscv/cpu.c
42
+++ b/target/riscv/cpu.c
65
+++ b/target/riscv/cpu.c
43
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_reset(DeviceState *dev)
66
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_validate_misa_mxl(RISCVCPU *cpu, Error **errp)
44
env->mstatus &= ~(MSTATUS_MIE | MSTATUS_MPRV);
67
* Check consistency between chosen extensions while setting
45
env->mcause = 0;
68
* cpu->cfg accordingly.
46
env->pc = env->resetvec;
69
*/
47
+ env->two_stage_lookup = false;
70
-static void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
48
#endif
71
+void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
49
cs->exception_index = EXCP_NONE;
72
{
50
env->load_res = -1;
73
CPURISCVState *env = &cpu->env;
51
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
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
52
index XXXXXXX..XXXXXXX 100644
85
index XXXXXXX..XXXXXXX 100644
53
--- a/target/riscv/cpu_helper.c
86
--- a/target/riscv/csr.c
54
+++ b/target/riscv/cpu_helper.c
87
+++ b/target/riscv/csr.c
55
@@ -XXX,XX +XXX,XX @@ static void raise_mmu_exception(CPURISCVState *env, target_ulong address,
88
@@ -XXX,XX +XXX,XX @@ static RISCVException read_misa(CPURISCVState *env, int csrno,
56
g_assert_not_reached();
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;
57
}
99
}
58
env->badaddr = address;
100
59
+ env->two_stage_lookup = two_stage;
101
- /* 'I' or 'E' must be present */
60
}
102
- if (!(val & (RVI | RVE))) {
61
103
- /* It is not, drop write to misa */
62
hwaddr riscv_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
104
- return RISCV_EXCP_NONE;
63
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
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;
64
}
134
}
65
135
66
env->badaddr = addr;
136
+ /* Disable RVG if any of its dependencies are disabled */
67
+ env->two_stage_lookup = riscv_cpu_virt_enabled(env) ||
137
+ if (!(val & RVI && val & RVM && val & RVA &&
68
+ riscv_cpu_two_stage_lookup(mmu_idx);
138
+ val & RVF && val & RVD)) {
69
riscv_raise_exception(&cpu->env, cs->exception_index, retaddr);
139
+ val &= ~RVG;
70
}
140
+ }
71
141
+
72
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_do_unaligned_access(CPUState *cs, vaddr addr,
142
/* If nothing changed, do nothing. */
73
g_assert_not_reached();
143
if (val == env->misa_ext) {
144
return RISCV_EXCP_NONE;
74
}
145
}
75
env->badaddr = addr;
146
76
+ env->two_stage_lookup = riscv_cpu_virt_enabled(env) ||
147
- if (!(val & RVF)) {
77
+ riscv_cpu_two_stage_lookup(mmu_idx);
148
+ env->misa_ext = val;
78
riscv_raise_exception(env, cs->exception_index, retaddr);
149
+ riscv_cpu_validate_set_extensions(cpu, &local_err);
79
}
150
+ if (local_err != NULL) {
80
#endif /* !CONFIG_USER_ONLY */
151
+ /* Rollback on validation error */
81
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_do_interrupt(CPUState *cs)
152
+ qemu_log_mask(LOG_GUEST_ERROR, "Unable to write MISA ext value "
82
/* handle the trap in S-mode */
153
+ "0x%x, keeping existing MISA ext 0x%x\n",
83
if (riscv_has_ext(env, RVH)) {
154
+ env->misa_ext, orig_misa_ext);
84
target_ulong hdeleg = async ? env->hideleg : env->hedeleg;
155
+
85
- bool two_stage_lookup = false;
156
+ env->misa_ext = orig_misa_ext;
86
157
+
87
- if (env->priv == PRV_M ||
158
+ return RISCV_EXCP_NONE;
88
- (env->priv == PRV_S && !riscv_cpu_virt_enabled(env)) ||
159
+ }
89
- (env->priv == PRV_U && !riscv_cpu_virt_enabled(env) &&
160
+
90
- get_field(env->hstatus, HSTATUS_HU))) {
161
+ if (!(env->misa_ext & RVF)) {
91
- two_stage_lookup = true;
162
env->mstatus &= ~MSTATUS_FS;
92
- }
163
}
93
-
164
94
- if ((riscv_cpu_virt_enabled(env) || two_stage_lookup) && write_tval) {
165
/* flush translation cache */
95
+ if (env->two_stage_lookup && write_tval) {
166
tb_flush(env_cpu(env));
96
/*
167
- env->misa_ext = val;
97
* If we are writing a guest virtual address to stval, set
168
env->xl = riscv_cpu_mxl(env);
98
* this to 1. If we are trapping to VS we will set this to 0
169
return RISCV_EXCP_NONE;
99
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_do_interrupt(CPUState *cs)
100
riscv_cpu_set_force_hs_excep(env, 0);
101
} else {
102
/* Trap into HS mode */
103
- if (!two_stage_lookup) {
104
- env->hstatus = set_field(env->hstatus, HSTATUS_SPV,
105
- riscv_cpu_virt_enabled(env));
106
- }
107
+ env->hstatus = set_field(env->hstatus, HSTATUS_SPV, false);
108
htval = env->guest_phys_fault_addr;
109
}
110
}
111
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_do_interrupt(CPUState *cs)
112
* RISC-V ISA Specification.
113
*/
114
115
+ env->two_stage_lookup = false;
116
#endif
117
cs->exception_index = EXCP_NONE; /* mark handled to qemu */
118
}
170
}
119
--
171
--
120
2.30.1
172
2.40.1
121
122
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
1
From: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
2
2
3
According to the specification the "field SPVP of hstatus controls the
3
pmp_get_tlb_size can be separated from get_physical_address_pmp and is only
4
privilege level of the access" for the hypervisor virtual-machine load
4
needed when ret == TRANSLATE_SUCCESS.
5
and store instructions HLV, HLVX and HSV.
6
5
7
Signed-off-by: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
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>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 20210311103005.1400718-1-georg.kotheimer@kernkonzept.com
10
Message-Id: <20230517091519.34439-3-liweiwei@iscas.ac.cn>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
---
12
target/riscv/cpu_helper.c | 25 ++++++++++++++-----------
13
target/riscv/cpu_helper.c | 16 ++++++----------
13
1 file changed, 14 insertions(+), 11 deletions(-)
14
1 file changed, 6 insertions(+), 10 deletions(-)
14
15
15
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
16
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
16
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/cpu_helper.c
18
--- a/target/riscv/cpu_helper.c
18
+++ b/target/riscv/cpu_helper.c
19
+++ b/target/riscv/cpu_helper.c
19
@@ -XXX,XX +XXX,XX @@ static int get_physical_address(CPURISCVState *env, hwaddr *physical,
20
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_set_mode(CPURISCVState *env, target_ulong newpriv)
20
use_background = true;
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,
21
}
37
}
22
38
23
- if (mode == PRV_M && access_type != MMU_INST_FETCH) {
39
*prot = pmp_priv_to_page_prot(pmp_priv);
24
+ /* MPRV does not affect the virtual-machine load/store
40
- if (tlb_size != NULL) {
25
+ instructions, HLV, HLVX, and HSV. */
41
- *tlb_size = pmp_get_tlb_size(env, addr);
26
+ if (riscv_cpu_two_stage_lookup(mmu_idx)) {
42
- }
27
+ mode = get_field(env->hstatus, HSTATUS_SPVP);
43
28
+ } else if (mode == PRV_M && access_type != MMU_INST_FETCH) {
44
return TRANSLATE_SUCCESS;
29
if (get_field(env->mstatus, MSTATUS_MPRV)) {
45
}
30
mode = get_field(env->mstatus, MSTATUS_MPP);
46
@@ -XXX,XX +XXX,XX @@ restart:
31
}
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) {
32
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
55
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
33
qemu_log_mask(CPU_LOG_MMU, "%s ad %" VADDR_PRIx " rw %d mmu_idx %d\n",
56
prot &= prot2;
34
__func__, address, access_type, mmu_idx);
57
35
58
if (ret == TRANSLATE_SUCCESS) {
36
- if (mode == PRV_M && access_type != MMU_INST_FETCH) {
59
- ret = get_physical_address_pmp(env, &prot_pmp, &tlb_size, pa,
37
- if (get_field(env->mstatus, MSTATUS_MPRV)) {
60
+ ret = get_physical_address_pmp(env, &prot_pmp, pa,
38
- mode = get_field(env->mstatus, MSTATUS_MPP);
61
size, access_type, mode);
39
+ /* MPRV does not affect the virtual-machine load/store
62
+ tlb_size = pmp_get_tlb_size(env, pa);
40
+ instructions, HLV, HLVX, and HSV. */
63
41
+ if (riscv_cpu_two_stage_lookup(mmu_idx)) {
64
qemu_log_mask(CPU_LOG_MMU,
42
+ mode = get_field(env->hstatus, HSTATUS_SPVP);
65
"%s PMP address=" HWADDR_FMT_plx " ret %d prot"
43
+ } else if (mode == PRV_M && access_type != MMU_INST_FETCH &&
66
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
44
+ get_field(env->mstatus, MSTATUS_MPRV)) {
67
__func__, address, ret, pa, prot);
45
+ mode = get_field(env->mstatus, MSTATUS_MPP);
68
46
+ if (riscv_has_ext(env, RVH) && get_field(env->mstatus, MSTATUS_MPV)) {
69
if (ret == TRANSLATE_SUCCESS) {
47
+ two_stage_lookup = true;
70
- ret = get_physical_address_pmp(env, &prot_pmp, &tlb_size, pa,
48
}
71
+ ret = get_physical_address_pmp(env, &prot_pmp, pa,
49
}
72
size, access_type, mode);
50
73
+ tlb_size = pmp_get_tlb_size(env, pa);
51
- if (riscv_has_ext(env, RVH) && env->priv == PRV_M &&
74
52
- access_type != MMU_INST_FETCH &&
75
qemu_log_mask(CPU_LOG_MMU,
53
- get_field(env->mstatus, MSTATUS_MPRV) &&
76
"%s PMP address=" HWADDR_FMT_plx " ret %d prot"
54
- get_field(env->mstatus, MSTATUS_MPV)) {
55
- two_stage_lookup = true;
56
- }
57
-
58
if (riscv_cpu_virt_enabled(env) ||
59
((riscv_cpu_two_stage_lookup(mmu_idx) || two_stage_lookup) &&
60
access_type != MMU_INST_FETCH)) {
61
--
77
--
62
2.30.1
78
2.40.1
63
64
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
1
From: Jim Shu <cwshu@andestech.com>
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
2
2
3
Currently, PMP permission checking of TLB page is bypassed if TLB hits
3
We no longer need the pmp_index for matched PMP entry now.
4
Fix it by propagating PMP permission to TLB page permission.
5
4
6
PMP permission checking also use MMU-style API to change TLB permission
5
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
7
and size.
6
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
8
9
Signed-off-by: Jim Shu <cwshu@andestech.com>
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
11
Message-id: 1613916082-19528-2-git-send-email-cwshu@andestech.com
8
Message-Id: <20230517091519.34439-5-liweiwei@iscas.ac.cn>
12
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
13
---
10
---
14
target/riscv/pmp.h | 4 +-
11
target/riscv/pmp.h | 8 ++++----
15
target/riscv/cpu_helper.c | 84 +++++++++++++++++++++++++++++----------
12
target/riscv/cpu_helper.c | 8 ++++----
16
target/riscv/pmp.c | 80 +++++++++++++++++++++++++++----------
13
target/riscv/pmp.c | 32 +++++++++++++-------------------
17
3 files changed, 125 insertions(+), 43 deletions(-)
14
3 files changed, 21 insertions(+), 27 deletions(-)
18
15
19
diff --git a/target/riscv/pmp.h b/target/riscv/pmp.h
16
diff --git a/target/riscv/pmp.h b/target/riscv/pmp.h
20
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
21
--- a/target/riscv/pmp.h
18
--- a/target/riscv/pmp.h
22
+++ b/target/riscv/pmp.h
19
+++ b/target/riscv/pmp.h
23
@@ -XXX,XX +XXX,XX @@ void pmpaddr_csr_write(CPURISCVState *env, uint32_t addr_index,
20
@@ -XXX,XX +XXX,XX @@ target_ulong mseccfg_csr_read(CPURISCVState *env);
24
target_ulong val);
21
void pmpaddr_csr_write(CPURISCVState *env, uint32_t addr_index,
22
target_ulong val);
25
target_ulong pmpaddr_csr_read(CPURISCVState *env, uint32_t addr_index);
23
target_ulong pmpaddr_csr_read(CPURISCVState *env, uint32_t addr_index);
26
bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
24
-int pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
27
- target_ulong size, pmp_priv_t priv, target_ulong mode);
25
- target_ulong size, pmp_priv_t privs,
28
+ target_ulong size, pmp_priv_t privs, pmp_priv_t *allowed_privs,
26
- pmp_priv_t *allowed_privs,
29
+ target_ulong mode);
27
- target_ulong mode);
30
bool pmp_is_range_in_tlb(CPURISCVState *env, hwaddr tlb_sa,
28
+bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
31
target_ulong *tlb_size);
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);
32
void pmp_update_rule_addr(CPURISCVState *env, uint32_t pmp_index);
33
void pmp_update_rule_addr(CPURISCVState *env, uint32_t pmp_index);
33
void pmp_update_rule_nums(CPURISCVState *env);
34
void pmp_update_rule_nums(CPURISCVState *env);
34
uint32_t pmp_get_num_rules(CPURISCVState *env);
35
+int pmp_priv_to_page_prot(pmp_priv_t pmp_priv);
36
37
#endif
38
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
35
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
39
index XXXXXXX..XXXXXXX 100644
36
index XXXXXXX..XXXXXXX 100644
40
--- a/target/riscv/cpu_helper.c
37
--- a/target/riscv/cpu_helper.c
41
+++ b/target/riscv/cpu_helper.c
38
+++ b/target/riscv/cpu_helper.c
42
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_set_mode(CPURISCVState *env, target_ulong newpriv)
39
@@ -XXX,XX +XXX,XX @@ static int get_physical_address_pmp(CPURISCVState *env, int *prot, hwaddr addr,
43
env->load_res = -1;
40
int mode)
44
}
41
{
45
42
pmp_priv_t pmp_priv;
46
+/*
43
- int pmp_index = -1;
47
+ * get_physical_address_pmp - check PMP permission for this physical address
44
+ bool pmp_has_privs;
48
+ *
45
49
+ * Match the PMP region and check permission for this physical address and it's
46
if (!riscv_cpu_cfg(env)->pmp) {
50
+ * TLB page. Returns 0 if the permission checking was successful
47
*prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
51
+ *
48
return TRANSLATE_SUCCESS;
52
+ * @env: CPURISCVState
53
+ * @prot: The returned protection attributes
54
+ * @tlb_size: TLB page size containing addr. It could be modified after PMP
55
+ * permission checking. NULL if not set TLB page for addr.
56
+ * @addr: The physical address to be checked permission
57
+ * @access_type: The type of MMU access
58
+ * @mode: Indicates current privilege level.
59
+ */
60
+static int get_physical_address_pmp(CPURISCVState *env, int *prot,
61
+ target_ulong *tlb_size, hwaddr addr,
62
+ int size, MMUAccessType access_type,
63
+ int mode)
64
+{
65
+ pmp_priv_t pmp_priv;
66
+ target_ulong tlb_size_pmp = 0;
67
+
68
+ if (!riscv_feature(env, RISCV_FEATURE_PMP)) {
69
+ *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
70
+ return TRANSLATE_SUCCESS;
71
+ }
72
+
73
+ if (!pmp_hart_has_privs(env, addr, size, 1 << access_type, &pmp_priv,
74
+ mode)) {
75
+ *prot = 0;
76
+ return TRANSLATE_PMP_FAIL;
77
+ }
78
+
79
+ *prot = pmp_priv_to_page_prot(pmp_priv);
80
+ if (tlb_size != NULL) {
81
+ if (pmp_is_range_in_tlb(env, addr & ~(*tlb_size - 1), &tlb_size_pmp)) {
82
+ *tlb_size = tlb_size_pmp;
83
+ }
84
+ }
85
+
86
+ return TRANSLATE_SUCCESS;
87
+}
88
+
89
/* get_physical_address - get the physical address for this virtual address
90
*
91
* Do a page table walk to obtain the physical address corresponding to a
92
@@ -XXX,XX +XXX,XX @@ restart:
93
pte_addr = base + idx * ptesize;
94
}
95
96
- if (riscv_feature(env, RISCV_FEATURE_PMP) &&
97
- !pmp_hart_has_privs(env, pte_addr, sizeof(target_ulong),
98
- 1 << MMU_DATA_LOAD, PRV_S)) {
99
+ int pmp_prot;
100
+ int pmp_ret = get_physical_address_pmp(env, &pmp_prot, NULL, pte_addr,
101
+ sizeof(target_ulong),
102
+ MMU_DATA_LOAD, PRV_S);
103
+ if (pmp_ret != TRANSLATE_SUCCESS) {
104
return TRANSLATE_PMP_FAIL;
105
}
106
107
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
108
#ifndef CONFIG_USER_ONLY
109
vaddr im_address;
110
hwaddr pa = 0;
111
- int prot, prot2;
112
+ int prot, prot2, prot_pmp;
113
bool pmp_violation = false;
114
bool first_stage_error = true;
115
bool two_stage_lookup = false;
116
int ret = TRANSLATE_FAIL;
117
int mode = mmu_idx;
118
- target_ulong tlb_size = 0;
119
+ /* default TLB page size */
120
+ target_ulong tlb_size = TARGET_PAGE_SIZE;
121
122
env->guest_phys_fault_addr = 0;
123
124
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
125
126
prot &= prot2;
127
128
- if (riscv_feature(env, RISCV_FEATURE_PMP) &&
129
- (ret == TRANSLATE_SUCCESS) &&
130
- !pmp_hart_has_privs(env, pa, size, 1 << access_type, mode)) {
131
- ret = TRANSLATE_PMP_FAIL;
132
+ if (ret == TRANSLATE_SUCCESS) {
133
+ ret = get_physical_address_pmp(env, &prot_pmp, &tlb_size, pa,
134
+ size, access_type, mode);
135
+ prot &= prot_pmp;
136
}
137
138
if (ret != TRANSLATE_SUCCESS) {
139
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
140
"%s address=%" VADDR_PRIx " ret %d physical "
141
TARGET_FMT_plx " prot %d\n",
142
__func__, address, ret, pa, prot);
143
- }
144
145
- if (riscv_feature(env, RISCV_FEATURE_PMP) &&
146
- (ret == TRANSLATE_SUCCESS) &&
147
- !pmp_hart_has_privs(env, pa, size, 1 << access_type, mode)) {
148
- ret = TRANSLATE_PMP_FAIL;
149
+ if (ret == TRANSLATE_SUCCESS) {
150
+ ret = get_physical_address_pmp(env, &prot_pmp, &tlb_size, pa,
151
+ size, access_type, mode);
152
+ prot &= prot_pmp;
153
+ }
154
}
49
}
155
+
50
156
if (ret == TRANSLATE_PMP_FAIL) {
51
- pmp_index = pmp_hart_has_privs(env, addr, size, 1 << access_type,
157
pmp_violation = true;
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;
158
}
59
}
159
160
if (ret == TRANSLATE_SUCCESS) {
161
- if (pmp_is_range_in_tlb(env, pa & TARGET_PAGE_MASK, &tlb_size)) {
162
- tlb_set_page(cs, address & ~(tlb_size - 1), pa & ~(tlb_size - 1),
163
- prot, mmu_idx, tlb_size);
164
- } else {
165
- tlb_set_page(cs, address & TARGET_PAGE_MASK, pa & TARGET_PAGE_MASK,
166
- prot, mmu_idx, TARGET_PAGE_SIZE);
167
- }
168
+ tlb_set_page(cs, address & ~(tlb_size - 1), pa & ~(tlb_size - 1),
169
+ prot, mmu_idx, tlb_size);
170
return true;
171
} else if (probe) {
172
return false;
173
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
60
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
174
index XXXXXXX..XXXXXXX 100644
61
index XXXXXXX..XXXXXXX 100644
175
--- a/target/riscv/pmp.c
62
--- a/target/riscv/pmp.c
176
+++ b/target/riscv/pmp.c
63
+++ b/target/riscv/pmp.c
177
@@ -XXX,XX +XXX,XX @@ static int pmp_is_in_range(CPURISCVState *env, int pmp_index, target_ulong addr)
64
@@ -XXX,XX +XXX,XX @@ static bool pmp_hart_has_privs_default(CPURISCVState *env, target_ulong addr,
178
return result;
179
}
180
181
+/*
182
+ * Check if the address has required RWX privs when no PMP entry is matched.
183
+ */
184
+static bool pmp_hart_has_privs_default(CPURISCVState *env, target_ulong addr,
185
+ target_ulong size, pmp_priv_t privs, pmp_priv_t *allowed_privs,
186
+ target_ulong mode)
187
+{
188
+ bool ret;
189
+
190
+ if ((!riscv_feature(env, RISCV_FEATURE_PMP)) || (mode == PRV_M)) {
191
+ /*
192
+ * Privileged spec v1.10 states if HW doesn't implement any PMP entry
193
+ * or no PMP entry matches an M-Mode access, the access succeeds.
194
+ */
195
+ ret = true;
196
+ *allowed_privs = PMP_READ | PMP_WRITE | PMP_EXEC;
197
+ } else {
198
+ /*
199
+ * Other modes are not allowed to succeed if they don't * match a rule,
200
+ * but there are rules. We've checked for no rule earlier in this
201
+ * function.
202
+ */
203
+ ret = false;
204
+ *allowed_privs = 0;
205
+ }
206
+
207
+ return ret;
208
+}
209
+
210
65
211
/*
66
/*
212
* Public Interface
213
@@ -XXX,XX +XXX,XX @@ static int pmp_is_in_range(CPURISCVState *env, int pmp_index, target_ulong addr)
214
* Check if the address has required RWX privs to complete desired operation
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
215
*/
73
*/
216
bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
74
-int pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
217
- target_ulong size, pmp_priv_t privs, target_ulong mode)
75
- target_ulong size, pmp_priv_t privs,
218
+ target_ulong size, pmp_priv_t privs, pmp_priv_t *allowed_privs,
76
- pmp_priv_t *allowed_privs, target_ulong mode)
219
+ 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)
220
{
80
{
221
int i = 0;
81
int i = 0;
222
int ret = -1;
82
- int ret = -1;
83
+ bool ret = false;
223
int pmp_size = 0;
84
int pmp_size = 0;
224
target_ulong s = 0;
85
target_ulong s = 0;
225
target_ulong e = 0;
86
target_ulong e = 0;
226
- pmp_priv_t allowed_privs = 0;
227
87
228
/* Short cut if no rules */
88
/* Short cut if no rules */
229
if (0 == pmp_get_num_rules(env)) {
89
if (0 == pmp_get_num_rules(env)) {
230
- return (env->priv == PRV_M) ? true : false;
90
- if (pmp_hart_has_privs_default(env, addr, size, privs,
91
- allowed_privs, mode)) {
92
- ret = MAX_RISCV_PMPS;
93
- }
94
- return ret;
231
+ return pmp_hart_has_privs_default(env, addr, size, privs,
95
+ return pmp_hart_has_privs_default(env, addr, size, privs,
232
+ allowed_privs, mode);
96
+ allowed_privs, mode);
233
}
97
}
234
98
235
if (size == 0) {
99
if (size == 0) {
236
@@ -XXX,XX +XXX,XX @@ bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
100
@@ -XXX,XX +XXX,XX @@ int pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
237
* check
101
if ((s + e) == 1) {
238
*/
102
qemu_log_mask(LOG_GUEST_ERROR,
239
if (((s + e) == 2) && (PMP_AMATCH_OFF != a_field)) {
103
"pmp violation - access is partially inside\n");
240
- allowed_privs = PMP_READ | PMP_WRITE | PMP_EXEC;
104
- ret = -1;
241
+ *allowed_privs = PMP_READ | PMP_WRITE | PMP_EXEC;
105
+ ret = false;
242
if ((mode != PRV_M) || pmp_is_locked(env, i)) {
106
break;
243
- allowed_privs &= env->pmp_state.pmp[i].cfg_reg;
107
}
244
+ *allowed_privs &= env->pmp_state.pmp[i].cfg_reg;
108
245
}
109
@@ -XXX,XX +XXX,XX @@ int pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
246
110
* defined with PMP must be used. We shouldn't fallback on
247
- if ((privs & allowed_privs) == privs) {
111
* finding default privileges.
248
- ret = 1;
112
*/
249
- break;
113
- ret = i;
250
- } else {
114
+ ret = true;
251
- ret = 0;
115
break;
252
- break;
253
- }
254
+ ret = ((privs & *allowed_privs) == privs);
255
+ break;
256
}
116
}
257
}
117
}
258
118
259
/* No rule matched */
119
/* No rule matched */
260
if (ret == -1) {
120
- if (ret == -1) {
261
- if (mode == PRV_M) {
121
- if (pmp_hart_has_privs_default(env, addr, size, privs,
262
- ret = 1; /* Privileged spec v1.10 states if no PMP entry matches an
122
- allowed_privs, mode)) {
263
- * M-Mode access, the access succeeds */
123
- ret = MAX_RISCV_PMPS;
264
- } else {
265
- ret = 0; /* Other modes are not allowed to succeed if they don't
266
- * match a rule, but there are rules. We've checked for
267
- * no rule earlier in this function. */
268
- }
124
- }
269
+ return pmp_hart_has_privs_default(env, addr, size, privs,
125
+ if (!ret) {
270
+ allowed_privs, mode);
126
+ ret = pmp_hart_has_privs_default(env, addr, size, privs,
127
+ allowed_privs, mode);
271
}
128
}
272
129
273
return ret == 1 ? true : false;
130
return ret;
274
}
275
276
-
277
/*
278
* Handle a write to a pmpcfg CSP
279
*/
280
@@ -XXX,XX +XXX,XX @@ bool pmp_is_range_in_tlb(CPURISCVState *env, hwaddr tlb_sa,
281
282
return false;
283
}
284
+
285
+/*
286
+ * Convert PMP privilege to TLB page privilege.
287
+ */
288
+int pmp_priv_to_page_prot(pmp_priv_t pmp_priv)
289
+{
290
+ int prot = 0;
291
+
292
+ if (pmp_priv & PMP_READ) {
293
+ prot |= PAGE_READ;
294
+ }
295
+ if (pmp_priv & PMP_WRITE) {
296
+ prot |= PAGE_WRITE;
297
+ }
298
+ if (pmp_priv & PMP_EXEC) {
299
+ prot |= PAGE_EXEC;
300
+ }
301
+
302
+ return prot;
303
+}
304
--
131
--
305
2.30.1
132
2.40.1
306
307
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
1
From: Jim Shu <cwshu@andestech.com>
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
2
2
3
If PMP permission of any address has been changed by updating PMP entry,
3
TLB needn't be flushed when pmpcfg/pmpaddr don't changes.
4
flush all TLB pages to prevent from getting old permission.
5
4
6
Signed-off-by: Jim Shu <cwshu@andestech.com>
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>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-id: 1613916082-19528-4-git-send-email-cwshu@andestech.com
8
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
9
Message-Id: <20230517091519.34439-11-liweiwei@iscas.ac.cn>
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
---
11
---
11
target/riscv/pmp.c | 4 ++++
12
target/riscv/pmp.c | 28 ++++++++++++++++++----------
12
1 file changed, 4 insertions(+)
13
1 file changed, 18 insertions(+), 10 deletions(-)
13
14
14
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
15
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/target/riscv/pmp.c
17
--- a/target/riscv/pmp.c
17
+++ b/target/riscv/pmp.c
18
+++ b/target/riscv/pmp.c
18
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@
19
#include "qapi/error.h"
20
#include "cpu.h"
21
#include "trace.h"
20
#include "trace.h"
22
+#include "exec/exec-all.h"
21
#include "exec/exec-all.h"
23
22
24
static void pmp_write_cfg(CPURISCVState *env, uint32_t addr_index,
23
-static void pmp_write_cfg(CPURISCVState *env, uint32_t addr_index,
25
uint8_t val);
24
+static bool pmp_write_cfg(CPURISCVState *env, uint32_t addr_index,
26
@@ -XXX,XX +XXX,XX @@ void pmpcfg_csr_write(CPURISCVState *env, uint32_t reg_index,
25
uint8_t val);
27
cfg_val = (val >> 8 * i) & 0xff;
26
static uint8_t pmp_read_cfg(CPURISCVState *env, uint32_t addr_index);
28
pmp_write_cfg(env, (reg_index * 4) + i, cfg_val);
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");
29
}
50
}
30
+
51
+
31
+ /* If PMP permission of any addr has been changed, flush TLB pages. */
52
+ return false;
32
+ tlb_flush(env_cpu(env));
33
}
53
}
34
54
35
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");
36
--
98
--
37
2.30.1
99
2.40.1
38
39
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: Bin Meng <bin.meng@windriver.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Per SST25VF016B datasheet [1], SST flash requires a dummy byte after
3
QOM type names are usually defined as TYPE_FOO.
4
the address bytes. Note only SPI mode is supported by SST flashes.
5
4
6
[1] http://ww1.microchip.com/downloads/en/devicedoc/s71271_04.pdf
5
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Signed-off-by: Bin Meng <bin.meng@windriver.com>
7
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
9
Acked-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-Id: <20230520054510.68822-4-philmd@linaro.org>
10
Message-id: 20210306060152.7250-1-bmeng.cn@gmail.com
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
10
---
13
hw/block/m25p80.c | 3 +++
11
include/hw/riscv/opentitan.h | 2 ++
14
1 file changed, 3 insertions(+)
12
hw/riscv/opentitan.c | 2 +-
13
2 files changed, 3 insertions(+), 1 deletion(-)
15
14
16
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
15
diff --git a/include/hw/riscv/opentitan.h b/include/hw/riscv/opentitan.h
17
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/block/m25p80.c
17
--- a/include/hw/riscv/opentitan.h
19
+++ b/hw/block/m25p80.c
18
+++ b/include/hw/riscv/opentitan.h
20
@@ -XXX,XX +XXX,XX @@ static void decode_fast_read_cmd(Flash *s)
19
@@ -XXX,XX +XXX,XX @@ struct LowRISCIbexSoCState {
21
s->needed_bytes = get_addr_length(s);
20
MemoryRegion flash_alias;
22
switch (get_man(s)) {
21
};
23
/* Dummy cycles - modeled with bytes writes instead of bits */
22
24
+ case MAN_SST:
23
+#define TYPE_OPENTITAN_MACHINE "opentitan"
25
+ s->needed_bytes += 1;
24
+
26
+ break;
25
typedef struct OpenTitanState {
27
case MAN_WINBOND:
26
/*< private >*/
28
s->needed_bytes += 8;
27
SysBusDevice parent_obj;
29
break;
28
diff --git a/hw/riscv/opentitan.c b/hw/riscv/opentitan.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/riscv/opentitan.c
31
+++ b/hw/riscv/opentitan.c
32
@@ -XXX,XX +XXX,XX @@ static void opentitan_machine_class_init(MachineClass *mc)
33
mc->default_ram_size = ibex_memmap[IBEX_DEV_RAM].size;
34
}
35
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
{
30
--
41
--
31
2.30.1
42
2.40.1
32
43
33
44
diff view generated by jsdifflib
1
From: Alexander Wagner <alexander.wagner@ulal.de>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Not disabling the UART leads to QEMU overwriting the UART receive buffer with
3
Expand the DEFINE_MACHINE() macro, converting the class_init()
4
the newest received byte. The rx_level variable is added to allow the use of
4
handler.
5
the existing OpenTitan driver libraries.
6
5
7
Signed-off-by: Alexander Wagner <alexander.wagner@ulal.de>
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 20210309152130.13038-1-alexander.wagner@ulal.de
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>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
11
---
12
include/hw/char/ibex_uart.h | 4 ++++
12
include/hw/riscv/opentitan.h | 3 ++-
13
hw/char/ibex_uart.c | 23 ++++++++++++++++++-----
13
hw/riscv/opentitan.c | 10 +++++++---
14
2 files changed, 22 insertions(+), 5 deletions(-)
14
2 files changed, 9 insertions(+), 4 deletions(-)
15
15
16
diff --git a/include/hw/char/ibex_uart.h b/include/hw/char/ibex_uart.h
16
diff --git a/include/hw/riscv/opentitan.h b/include/hw/riscv/opentitan.h
17
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/char/ibex_uart.h
18
--- a/include/hw/riscv/opentitan.h
19
+++ b/include/hw/char/ibex_uart.h
19
+++ b/include/hw/riscv/opentitan.h
20
@@ -XXX,XX +XXX,XX @@ REG32(FIFO_CTRL, 0x1c)
20
@@ -XXX,XX +XXX,XX @@
21
FIELD(FIFO_CTRL, RXILVL, 2, 3)
21
#include "hw/char/ibex_uart.h"
22
FIELD(FIFO_CTRL, TXILVL, 5, 2)
22
#include "hw/timer/ibex_timer.h"
23
REG32(FIFO_STATUS, 0x20)
23
#include "hw/ssi/ibex_spi_host.h"
24
+ FIELD(FIFO_STATUS, TXLVL, 0, 5)
24
+#include "hw/boards.h"
25
+ FIELD(FIFO_STATUS, RXLVL, 16, 5)
25
#include "qom/object.h"
26
REG32(OVRD, 0x24)
26
27
REG32(VAL, 0x28)
27
#define TYPE_RISCV_IBEX_SOC "riscv.lowrisc.ibex.soc"
28
REG32(TIMEOUT_CTRL, 0x2c)
28
@@ -XXX,XX +XXX,XX @@ struct LowRISCIbexSoCState {
29
@@ -XXX,XX +XXX,XX @@ struct IbexUartState {
29
MemoryRegion flash_alias;
30
uint8_t tx_fifo[IBEX_UART_TX_FIFO_SIZE];
30
};
31
uint32_t tx_level;
31
32
32
-#define TYPE_OPENTITAN_MACHINE "opentitan"
33
+ uint32_t rx_level;
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);
34
+
49
+
35
QEMUTimer *fifo_trigger_handle;
50
mc->desc = "RISC-V Board compatible with OpenTitan";
36
uint64_t char_tx_time;
51
mc->init = opentitan_machine_init;
37
52
mc->max_cpus = 1;
38
diff --git a/hw/char/ibex_uart.c b/hw/char/ibex_uart.c
53
@@ -XXX,XX +XXX,XX @@ static void opentitan_machine_class_init(MachineClass *mc)
39
index XXXXXXX..XXXXXXX 100644
54
mc->default_ram_size = ibex_memmap[IBEX_DEV_RAM].size;
40
--- a/hw/char/ibex_uart.c
55
}
41
+++ b/hw/char/ibex_uart.c
56
42
@@ -XXX,XX +XXX,XX @@ static int ibex_uart_can_receive(void *opaque)
57
-DEFINE_MACHINE(TYPE_OPENTITAN_MACHINE, opentitan_machine_class_init)
58
-
59
static void lowrisc_ibex_soc_init(Object *obj)
43
{
60
{
44
IbexUartState *s = opaque;
61
LowRISCIbexSoCState *s = RISCV_IBEX_SOC(obj);
45
62
@@ -XXX,XX +XXX,XX @@ static const TypeInfo open_titan_types[] = {
46
- if (s->uart_ctrl & R_CTRL_RX_ENABLE_MASK) {
63
.instance_size = sizeof(LowRISCIbexSoCState),
47
+ if ((s->uart_ctrl & R_CTRL_RX_ENABLE_MASK)
64
.instance_init = lowrisc_ibex_soc_init,
48
+ && !(s->uart_status & R_STATUS_RXFULL_MASK)) {
65
.class_init = lowrisc_ibex_soc_class_init,
49
return 1;
66
+ }, {
67
+ .name = TYPE_OPENTITAN_MACHINE,
68
+ .parent = TYPE_MACHINE,
69
+ .class_init = opentitan_machine_class_init,
50
}
70
}
51
71
};
52
@@ -XXX,XX +XXX,XX @@ static void ibex_uart_receive(void *opaque, const uint8_t *buf, int size)
72
53
54
s->uart_status &= ~R_STATUS_RXIDLE_MASK;
55
s->uart_status &= ~R_STATUS_RXEMPTY_MASK;
56
+ /* The RXFULL is set after receiving a single byte
57
+ * as the FIFO buffers are not yet implemented.
58
+ */
59
+ s->uart_status |= R_STATUS_RXFULL_MASK;
60
+ s->rx_level += 1;
61
62
if (size > rx_fifo_level) {
63
s->uart_intr_state |= R_INTR_STATE_RX_WATERMARK_MASK;
64
@@ -XXX,XX +XXX,XX @@ static void ibex_uart_reset(DeviceState *dev)
65
s->uart_timeout_ctrl = 0x00000000;
66
67
s->tx_level = 0;
68
+ s->rx_level = 0;
69
70
s->char_tx_time = (NANOSECONDS_PER_SECOND / 230400) * 10;
71
72
@@ -XXX,XX +XXX,XX @@ static uint64_t ibex_uart_read(void *opaque, hwaddr addr,
73
74
case R_RDATA:
75
retvalue = s->uart_rdata;
76
- if (s->uart_ctrl & R_CTRL_RX_ENABLE_MASK) {
77
+ if ((s->uart_ctrl & R_CTRL_RX_ENABLE_MASK) && (s->rx_level > 0)) {
78
qemu_chr_fe_accept_input(&s->chr);
79
80
- s->uart_status |= R_STATUS_RXIDLE_MASK;
81
- s->uart_status |= R_STATUS_RXEMPTY_MASK;
82
+ s->rx_level -= 1;
83
+ s->uart_status &= ~R_STATUS_RXFULL_MASK;
84
+ if (s->rx_level == 0) {
85
+ s->uart_status |= R_STATUS_RXIDLE_MASK;
86
+ s->uart_status |= R_STATUS_RXEMPTY_MASK;
87
+ }
88
}
89
break;
90
case R_WDATA:
91
@@ -XXX,XX +XXX,XX @@ static uint64_t ibex_uart_read(void *opaque, hwaddr addr,
92
case R_FIFO_STATUS:
93
retvalue = s->uart_fifo_status;
94
95
- retvalue |= s->tx_level & 0x1F;
96
+ retvalue |= (s->rx_level & 0x1F) << R_FIFO_STATUS_RXLVL_SHIFT;
97
+ retvalue |= (s->tx_level & 0x1F) << R_FIFO_STATUS_TXLVL_SHIFT;
98
99
qemu_log_mask(LOG_UNIMP,
100
"%s: RX fifos are not supported\n", __func__);
101
@@ -XXX,XX +XXX,XX @@ static void ibex_uart_write(void *opaque, hwaddr addr,
102
s->uart_fifo_ctrl = value;
103
104
if (value & R_FIFO_CTRL_RXRST_MASK) {
105
+ s->rx_level = 0;
106
qemu_log_mask(LOG_UNIMP,
107
"%s: RX fifos are not supported\n", __func__);
108
}
109
--
73
--
110
2.30.1
74
2.40.1
111
75
112
76
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Since HSS commit c20a89f8dcac, the Icicle Kit reference design has
3
OpenTitanState is the 'machine' (or 'board') state: it isn't
4
been updated to use a register mapped at 0x4f000000 instead of a
4
a SysBus device, but inherits from the MachineState type.
5
GPIO to control whether eMMC or SD card is to be used. With this
5
Correct the instance size.
6
support the same HSS image can be used for both eMMC and SD card
6
Doing so we avoid leaking an OpenTitanState pointer in
7
boot flow, while previously two different board configurations were
7
opentitan_machine_init().
8
used. This is undocumented but one can take a look at the HSS code
9
HSS_MMCInit() in services/mmc/mmc_api.c.
10
8
11
With this commit, HSS image built from 2020.12 release boots again.
9
Fixes: fe0fe4735e ("riscv: Initial commit of OpenTitan machine")
12
10
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
13
Signed-off-by: Bin Meng <bin.meng@windriver.com>
14
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
11
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
15
Message-id: 20210322075248.136255-1-bmeng.cn@gmail.com
12
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
13
Message-Id: <20230520054510.68822-6-philmd@linaro.org>
16
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
14
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
17
---
15
---
18
include/hw/riscv/microchip_pfsoc.h | 1 +
16
include/hw/riscv/opentitan.h | 3 ++-
19
hw/riscv/microchip_pfsoc.c | 6 ++++++
17
hw/riscv/opentitan.c | 3 ++-
20
2 files changed, 7 insertions(+)
18
2 files changed, 4 insertions(+), 2 deletions(-)
21
19
22
diff --git a/include/hw/riscv/microchip_pfsoc.h b/include/hw/riscv/microchip_pfsoc.h
20
diff --git a/include/hw/riscv/opentitan.h b/include/hw/riscv/opentitan.h
23
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
24
--- a/include/hw/riscv/microchip_pfsoc.h
22
--- a/include/hw/riscv/opentitan.h
25
+++ b/include/hw/riscv/microchip_pfsoc.h
23
+++ b/include/hw/riscv/opentitan.h
26
@@ -XXX,XX +XXX,XX @@ enum {
24
@@ -XXX,XX +XXX,XX @@ struct LowRISCIbexSoCState {
27
MICROCHIP_PFSOC_ENVM_DATA,
25
};
28
MICROCHIP_PFSOC_QSPI_XIP,
26
29
MICROCHIP_PFSOC_IOSCB,
27
#define TYPE_OPENTITAN_MACHINE MACHINE_TYPE_NAME("opentitan")
30
+ MICROCHIP_PFSOC_EMMC_SD_MUX,
28
+OBJECT_DECLARE_SIMPLE_TYPE(OpenTitanState, OPENTITAN_MACHINE)
31
MICROCHIP_PFSOC_DRAM_LO,
29
32
MICROCHIP_PFSOC_DRAM_LO_ALIAS,
30
typedef struct OpenTitanState {
33
MICROCHIP_PFSOC_DRAM_HI,
31
/*< private >*/
34
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
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
35
index XXXXXXX..XXXXXXX 100644
38
index XXXXXXX..XXXXXXX 100644
36
--- a/hw/riscv/microchip_pfsoc.c
39
--- a/hw/riscv/opentitan.c
37
+++ b/hw/riscv/microchip_pfsoc.c
40
+++ b/hw/riscv/opentitan.c
38
@@ -XXX,XX +XXX,XX @@ static const MemMapEntry microchip_pfsoc_memmap[] = {
41
@@ -XXX,XX +XXX,XX @@ static const MemMapEntry ibex_memmap[] = {
39
[MICROCHIP_PFSOC_ENVM_DATA] = { 0x20220000, 0x20000 },
42
static void opentitan_machine_init(MachineState *machine)
40
[MICROCHIP_PFSOC_QSPI_XIP] = { 0x21000000, 0x1000000 },
43
{
41
[MICROCHIP_PFSOC_IOSCB] = { 0x30000000, 0x10000000 },
44
MachineClass *mc = MACHINE_GET_CLASS(machine);
42
+ [MICROCHIP_PFSOC_EMMC_SD_MUX] = { 0x4f000000, 0x4 },
45
+ OpenTitanState *s = OPENTITAN_MACHINE(machine);
43
[MICROCHIP_PFSOC_DRAM_LO] = { 0x80000000, 0x40000000 },
46
const MemMapEntry *memmap = ibex_memmap;
44
[MICROCHIP_PFSOC_DRAM_LO_ALIAS] = { 0xc0000000, 0x40000000 },
47
- OpenTitanState *s = g_new0(OpenTitanState, 1);
45
[MICROCHIP_PFSOC_DRAM_HI] = { 0x1000000000, 0x0 },
48
MemoryRegion *sys_mem = get_system_memory();
46
@@ -XXX,XX +XXX,XX @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
49
47
sysbus_mmio_map(SYS_BUS_DEVICE(&s->ioscb), 0,
50
if (machine->ram_size != mc->default_ram_size) {
48
memmap[MICROCHIP_PFSOC_IOSCB].base);
51
@@ -XXX,XX +XXX,XX @@ static const TypeInfo open_titan_types[] = {
49
52
}, {
50
+ /* eMMC/SD mux */
53
.name = TYPE_OPENTITAN_MACHINE,
51
+ create_unimplemented_device("microchip.pfsoc.emmc_sd_mux",
54
.parent = TYPE_MACHINE,
52
+ memmap[MICROCHIP_PFSOC_EMMC_SD_MUX].base,
55
+ .instance_size = sizeof(OpenTitanState),
53
+ memmap[MICROCHIP_PFSOC_EMMC_SD_MUX].size);
56
.class_init = opentitan_machine_class_init,
54
+
57
}
55
/* QSPI Flash */
58
};
56
memory_region_init_rom(qspi_xip_mem, OBJECT(dev),
57
"microchip.pfsoc.qspi_xip",
58
--
59
--
59
2.30.1
60
2.40.1
60
61
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
1
From: Frank Chang <frank.chang@sifive.com>
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
2
2
3
vs() should return -RISCV_EXCP_ILLEGAL_INST instead of -1 if rvv feature
3
write_mstatus() can only change current xl when in debug mode.
4
is not enabled.
4
And we need update cur_pmmask/base in this case.
5
5
6
If -1 is returned, exception will be raised and cs->exception_index will
6
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
7
be set to the negative return value. The exception will then be treated
7
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
8
as an instruction access fault instead of illegal instruction fault.
8
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
9
9
Message-Id: <20230524015933.17349-3-liweiwei@iscas.ac.cn>
10
Signed-off-by: Frank Chang <frank.chang@sifive.com>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
13
Message-id: 20210223065935.20208-1-frank.chang@sifive.com
14
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
15
---
11
---
16
target/riscv/csr.c | 2 +-
12
target/riscv/csr.c | 9 ++++++++-
17
1 file changed, 1 insertion(+), 1 deletion(-)
13
1 file changed, 8 insertions(+), 1 deletion(-)
18
14
19
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
15
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
20
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
21
--- a/target/riscv/csr.c
17
--- a/target/riscv/csr.c
22
+++ b/target/riscv/csr.c
18
+++ b/target/riscv/csr.c
23
@@ -XXX,XX +XXX,XX @@ static int vs(CPURISCVState *env, int csrno)
19
@@ -XXX,XX +XXX,XX @@ static RISCVException write_mstatus(CPURISCVState *env, int csrno,
24
if (env->misa & RVV) {
20
mstatus = set_field(mstatus, MSTATUS64_SXL, xl);
25
return 0;
26
}
21
}
27
- return -1;
22
env->mstatus = mstatus;
28
+ return -RISCV_EXCP_ILLEGAL_INST;
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;
29
}
34
}
30
35
31
static int ctr(CPURISCVState *env, int csrno)
32
--
36
--
33
2.30.1
37
2.40.1
34
35
diff view generated by jsdifflib
1
From: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
1
From: Mayuresh Chitale <mchitale@ventanamicro.com>
2
2
3
Signed-off-by: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
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>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Message-id: 20210311094902.1377593-1-georg.kotheimer@kernkonzept.com
9
Message-Id: <20230518175058.2772506-2-mchitale@ventanamicro.com>
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
---
11
---
8
target/riscv/csr.c | 7 ++++---
12
target/riscv/csr.c | 15 +++++++++++++++
9
1 file changed, 4 insertions(+), 3 deletions(-)
13
1 file changed, 15 insertions(+)
10
14
11
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
15
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
12
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
13
--- a/target/riscv/csr.c
17
--- a/target/riscv/csr.c
14
+++ b/target/riscv/csr.c
18
+++ b/target/riscv/csr.c
15
@@ -XXX,XX +XXX,XX @@ static const target_ulong sstatus_v1_10_mask = SSTATUS_SIE | SSTATUS_SPIE |
19
@@ -XXX,XX +XXX,XX @@ static RISCVException fs(CPURISCVState *env, int csrno)
16
SSTATUS_UIE | SSTATUS_UPIE | SSTATUS_SPP | SSTATUS_FS | SSTATUS_XS |
20
!riscv_cpu_cfg(env)->ext_zfinx) {
17
SSTATUS_SUM | SSTATUS_MXR | SSTATUS_SD;
21
return RISCV_EXCP_ILLEGAL_INST;
18
static const target_ulong sip_writable_mask = SIP_SSIP | MIP_USIP | MIP_UEIP;
22
}
19
-static const target_ulong hip_writable_mask = MIP_VSSIP | MIP_VSTIP | MIP_VSEIP;
23
+
20
+static const target_ulong hip_writable_mask = MIP_VSSIP;
24
+ if (!env->debugger && !riscv_cpu_fp_enabled(env)) {
21
+static const target_ulong hvip_writable_mask = MIP_VSSIP | MIP_VSTIP | MIP_VSEIP;
25
+ return smstateen_acc_ok(env, 0, SMSTATEEN0_FCSR);
22
static const target_ulong vsip_writable_mask = MIP_VSSIP;
26
+ }
23
27
#endif
24
static const char valid_vm_1_10_32[16] = {
28
return RISCV_EXCP_NONE;
25
@@ -XXX,XX +XXX,XX @@ static int rmw_hvip(CPURISCVState *env, int csrno, target_ulong *ret_value,
29
}
26
target_ulong new_value, target_ulong write_mask)
30
@@ -XXX,XX +XXX,XX @@ static RISCVException write_mstateen0(CPURISCVState *env, int csrno,
31
target_ulong new_val)
27
{
32
{
28
int ret = rmw_mip(env, 0, ret_value, new_value,
33
uint64_t wr_mask = SMSTATEEN_STATEEN | SMSTATEEN0_HSENVCFG;
29
- write_mask & hip_writable_mask);
34
+ if (!riscv_has_ext(env, RVF)) {
30
+ write_mask & hvip_writable_mask);
35
+ wr_mask |= SMSTATEEN0_FCSR;
31
36
+ }
32
- *ret_value &= hip_writable_mask;
37
33
+ *ret_value &= hvip_writable_mask;
38
return write_mstateen(env, csrno, wr_mask, new_val);
34
35
return ret;
36
}
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
37
--
62
--
38
2.30.1
63
2.40.1
39
40
diff view generated by jsdifflib
1
From: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
1
From: Mayuresh Chitale <mchitale@ventanamicro.com>
2
2
3
The current condition for the use of background registers only
3
When misa.F is 0 tb->flags.FS field is unused and can be used to save
4
considers the hypervisor load and store instructions,
4
the current state of smstateen0.FCSR check which is needed by the
5
but not accesses from M mode via MSTATUS_MPRV+MPV.
5
floating point translation routines.
6
6
7
Signed-off-by: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
7
Signed-off-by: Mayuresh Chitale <mchitale@ventanamicro.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20210311103036.1401073-1-georg.kotheimer@kernkonzept.com
9
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
10
Message-Id: <20230518175058.2772506-3-mchitale@ventanamicro.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
---
12
target/riscv/cpu_helper.c | 2 +-
13
target/riscv/cpu_helper.c | 6 ++++++
13
1 file changed, 1 insertion(+), 1 deletion(-)
14
target/riscv/insn_trans/trans_rvf.c.inc | 7 ++++---
15
2 files changed, 10 insertions(+), 3 deletions(-)
14
16
15
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
17
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
16
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/cpu_helper.c
19
--- a/target/riscv/cpu_helper.c
18
+++ b/target/riscv/cpu_helper.c
20
+++ b/target/riscv/cpu_helper.c
19
@@ -XXX,XX +XXX,XX @@ static int get_physical_address(CPURISCVState *env, hwaddr *physical,
21
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPURISCVState *env, target_ulong *pc,
20
* was called. Background registers will be used if the guest has
22
vs = MIN(vs, get_field(env->mstatus_hs, MSTATUS_VS));
21
* forced a two stage translation to be on (in HS or M mode).
22
*/
23
- if (!riscv_cpu_virt_enabled(env) && riscv_cpu_two_stage_lookup(mmu_idx)) {
24
+ if (!riscv_cpu_virt_enabled(env) && two_stage) {
25
use_background = true;
26
}
23
}
27
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 {\
28
--
52
--
29
2.30.1
53
2.40.1
30
31
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
1
From: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
2
2
3
When decode_insn16() fails, we fall back to decode_RV32_64C() for
3
Reduce reliance on absolute value to prepare for PC-relative translation.
4
further compressed instruction decoding. However, prior to this change,
5
we did not raise an illegal instruction exception, if decode_RV32_64C()
6
fails to decode the instruction. This means that we skipped illegal
7
compressed instructions instead of raising an illegal instruction
8
exception.
9
4
10
Instead of patching decode_RV32_64C(), we can just remove it,
5
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
11
as it is dead code since f330433b363 anyway.
6
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
12
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Signed-off-by: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
14
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
15
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-Id: <20230526072124.298466-4-liweiwei@iscas.ac.cn>
16
Message-id: 20210322121609.3097928-1-georg.kotheimer@kernkonzept.com
17
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
18
---
11
---
19
target/riscv/translate.c | 179 +--------------------------------------
12
target/riscv/translate.c | 8 +++++---
20
1 file changed, 1 insertion(+), 178 deletions(-)
13
target/riscv/insn_trans/trans_rvi.c.inc | 4 ++--
14
2 files changed, 7 insertions(+), 5 deletions(-)
21
15
22
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
16
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
23
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
24
--- a/target/riscv/translate.c
18
--- a/target/riscv/translate.c
25
+++ b/target/riscv/translate.c
19
+++ b/target/riscv/translate.c
26
@@ -XXX,XX +XXX,XX @@ typedef struct DisasContext {
20
@@ -XXX,XX +XXX,XX @@ static void exit_tb(DisasContext *ctx)
27
CPUState *cs;
21
tcg_gen_exit_tb(NULL, 0);
28
} DisasContext;
22
}
29
23
30
-#ifdef TARGET_RISCV64
24
-static void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
31
-/* convert riscv funct3 to qemu memop for load/store */
25
+static void gen_goto_tb(DisasContext *ctx, int n, target_long diff)
32
-static const int tcg_memop_lookup[8] = {
26
{
33
- [0 ... 7] = -1,
27
+ target_ulong dest = ctx->base.pc_next + diff;
34
- [0] = MO_SB,
28
+
35
- [1] = MO_TESW,
29
/*
36
- [2] = MO_TESL,
30
* Under itrigger, instruction executes one by one like singlestep,
37
- [3] = MO_TEQ,
31
* direct block chain benefits will be small.
38
- [4] = MO_UB,
39
- [5] = MO_TEUW,
40
- [6] = MO_TEUL,
41
-};
42
-#endif
43
-
44
#ifdef TARGET_RISCV64
45
#define CASE_OP_32_64(X) case X: case glue(X, W)
46
#else
47
@@ -XXX,XX +XXX,XX @@ static void gen_jal(DisasContext *ctx, int rd, target_ulong imm)
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 */
48
ctx->base.is_jmp = DISAS_NORETURN;
38
ctx->base.is_jmp = DISAS_NORETURN;
49
}
39
}
50
40
51
-#ifdef TARGET_RISCV64
41
@@ -XXX,XX +XXX,XX @@ static void riscv_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
52
-static void gen_load_c(DisasContext *ctx, uint32_t opc, int rd, int rs1,
42
53
- target_long imm)
43
switch (ctx->base.is_jmp) {
54
-{
44
case DISAS_TOO_MANY:
55
- TCGv t0 = tcg_temp_new();
45
- gen_goto_tb(ctx, 0, ctx->base.pc_next);
56
- TCGv t1 = tcg_temp_new();
46
+ gen_goto_tb(ctx, 0, 0);
57
- gen_get_gpr(t0, rs1);
47
break;
58
- tcg_gen_addi_tl(t0, t0, imm);
48
case DISAS_NORETURN:
59
- int memop = tcg_memop_lookup[(opc >> 12) & 0x7];
49
break;
60
-
50
diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_trans/trans_rvi.c.inc
61
- if (memop < 0) {
51
index XXXXXXX..XXXXXXX 100644
62
- gen_exception_illegal(ctx);
52
--- a/target/riscv/insn_trans/trans_rvi.c.inc
63
- return;
53
+++ b/target/riscv/insn_trans/trans_rvi.c.inc
64
- }
54
@@ -XXX,XX +XXX,XX @@ static bool gen_branch(DisasContext *ctx, arg_b *a, TCGCond cond)
65
-
66
- tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, memop);
67
- gen_set_gpr(rd, t1);
68
- tcg_temp_free(t0);
69
- tcg_temp_free(t1);
70
-}
71
-
72
-static void gen_store_c(DisasContext *ctx, uint32_t opc, int rs1, int rs2,
73
- target_long imm)
74
-{
75
- TCGv t0 = tcg_temp_new();
76
- TCGv dat = tcg_temp_new();
77
- gen_get_gpr(t0, rs1);
78
- tcg_gen_addi_tl(t0, t0, imm);
79
- gen_get_gpr(dat, rs2);
80
- int memop = tcg_memop_lookup[(opc >> 12) & 0x7];
81
-
82
- if (memop < 0) {
83
- gen_exception_illegal(ctx);
84
- return;
85
- }
86
-
87
- tcg_gen_qemu_st_tl(dat, t0, ctx->mem_idx, memop);
88
- tcg_temp_free(t0);
89
- tcg_temp_free(dat);
90
-}
91
-#endif
92
-
93
#ifndef CONFIG_USER_ONLY
94
/* The states of mstatus_fs are:
95
* 0 = disabled, 1 = initial, 2 = clean, 3 = dirty
96
@@ -XXX,XX +XXX,XX @@ static void mark_fs_dirty(DisasContext *ctx)
97
static inline void mark_fs_dirty(DisasContext *ctx) { }
98
#endif
99
100
-#if !defined(TARGET_RISCV64)
101
-static void gen_fp_load(DisasContext *ctx, uint32_t opc, int rd,
102
- int rs1, target_long imm)
103
-{
104
- TCGv t0;
105
-
106
- if (ctx->mstatus_fs == 0) {
107
- gen_exception_illegal(ctx);
108
- return;
109
- }
110
-
111
- t0 = tcg_temp_new();
112
- gen_get_gpr(t0, rs1);
113
- tcg_gen_addi_tl(t0, t0, imm);
114
-
115
- switch (opc) {
116
- case OPC_RISC_FLW:
117
- if (!has_ext(ctx, RVF)) {
118
- goto do_illegal;
119
- }
120
- tcg_gen_qemu_ld_i64(cpu_fpr[rd], t0, ctx->mem_idx, MO_TEUL);
121
- /* RISC-V requires NaN-boxing of narrower width floating point values */
122
- tcg_gen_ori_i64(cpu_fpr[rd], cpu_fpr[rd], 0xffffffff00000000ULL);
123
- break;
124
- case OPC_RISC_FLD:
125
- if (!has_ext(ctx, RVD)) {
126
- goto do_illegal;
127
- }
128
- tcg_gen_qemu_ld_i64(cpu_fpr[rd], t0, ctx->mem_idx, MO_TEQ);
129
- break;
130
- do_illegal:
131
- default:
132
- gen_exception_illegal(ctx);
133
- break;
134
- }
135
- tcg_temp_free(t0);
136
-
137
- mark_fs_dirty(ctx);
138
-}
139
-
140
-static void gen_fp_store(DisasContext *ctx, uint32_t opc, int rs1,
141
- int rs2, target_long imm)
142
-{
143
- TCGv t0;
144
-
145
- if (ctx->mstatus_fs == 0) {
146
- gen_exception_illegal(ctx);
147
- return;
148
- }
149
-
150
- t0 = tcg_temp_new();
151
- gen_get_gpr(t0, rs1);
152
- tcg_gen_addi_tl(t0, t0, imm);
153
-
154
- switch (opc) {
155
- case OPC_RISC_FSW:
156
- if (!has_ext(ctx, RVF)) {
157
- goto do_illegal;
158
- }
159
- tcg_gen_qemu_st_i64(cpu_fpr[rs2], t0, ctx->mem_idx, MO_TEUL);
160
- break;
161
- case OPC_RISC_FSD:
162
- if (!has_ext(ctx, RVD)) {
163
- goto do_illegal;
164
- }
165
- tcg_gen_qemu_st_i64(cpu_fpr[rs2], t0, ctx->mem_idx, MO_TEQ);
166
- break;
167
- do_illegal:
168
- default:
169
- gen_exception_illegal(ctx);
170
- break;
171
- }
172
-
173
- tcg_temp_free(t0);
174
-}
175
-#endif
176
-
177
static void gen_set_rm(DisasContext *ctx, int rm)
178
{
179
TCGv_i32 t0;
180
@@ -XXX,XX +XXX,XX @@ static void gen_set_rm(DisasContext *ctx, int rm)
181
tcg_temp_free_i32(t0);
182
}
183
184
-static void decode_RV32_64C0(DisasContext *ctx, uint16_t opcode)
185
-{
186
- uint8_t funct3 = extract16(opcode, 13, 3);
187
- uint8_t rd_rs2 = GET_C_RS2S(opcode);
188
- uint8_t rs1s = GET_C_RS1S(opcode);
189
-
190
- switch (funct3) {
191
- case 3:
192
-#if defined(TARGET_RISCV64)
193
- /* C.LD(RV64/128) -> ld rd', offset[7:3](rs1')*/
194
- gen_load_c(ctx, OPC_RISC_LD, rd_rs2, rs1s,
195
- GET_C_LD_IMM(opcode));
196
-#else
197
- /* C.FLW (RV32) -> flw rd', offset[6:2](rs1')*/
198
- gen_fp_load(ctx, OPC_RISC_FLW, rd_rs2, rs1s,
199
- GET_C_LW_IMM(opcode));
200
-#endif
201
- break;
202
- case 7:
203
-#if defined(TARGET_RISCV64)
204
- /* C.SD (RV64/128) -> sd rs2', offset[7:3](rs1')*/
205
- gen_store_c(ctx, OPC_RISC_SD, rs1s, rd_rs2,
206
- GET_C_LD_IMM(opcode));
207
-#else
208
- /* C.FSW (RV32) -> fsw rs2', offset[6:2](rs1')*/
209
- gen_fp_store(ctx, OPC_RISC_FSW, rs1s, rd_rs2,
210
- GET_C_LW_IMM(opcode));
211
-#endif
212
- break;
213
- }
214
-}
215
-
216
-static void decode_RV32_64C(DisasContext *ctx, uint16_t opcode)
217
-{
218
- uint8_t op = extract16(opcode, 0, 2);
219
-
220
- switch (op) {
221
- case 0:
222
- decode_RV32_64C0(ctx, opcode);
223
- break;
224
- }
225
-}
226
-
227
static int ex_plus_1(DisasContext *ctx, int nf)
228
{
229
return nf + 1;
230
@@ -XXX,XX +XXX,XX @@ static void decode_opc(CPURISCVState *env, DisasContext *ctx, uint16_t opcode)
231
} else {
232
ctx->pc_succ_insn = ctx->base.pc_next + 2;
233
if (!decode_insn16(ctx, opcode)) {
234
- /* fall back to old decoder */
235
- decode_RV32_64C(ctx, opcode);
236
+ gen_exception_illegal(ctx);
237
}
238
}
239
} else {
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
240
--
72
--
241
2.30.1
73
2.40.1
242
243
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
1
From: Asherah Connor <ashe@kivikakk.ee>
1
From: Sunil V L <sunilvl@ventanamicro.com>
2
2
3
Provides fw_cfg for the virt machine on riscv. This enables
3
Currently, virt machine supports two pflash instances each with
4
using e.g. ramfb later.
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.
5
9
6
Signed-off-by: Asherah Connor <ashe@kivikakk.ee>
10
The OS distros keep the EDK2 FW code as readonly. When non-volatile
7
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
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>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
47
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 20210318235041.17175-2-ashe@kivikakk.ee
48
Message-Id: <20230601045910.18646-2-sunilvl@ventanamicro.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
49
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
50
---
12
include/hw/riscv/virt.h | 2 ++
51
hw/riscv/virt.c | 53 ++++++++++++++++++++-----------------------------
13
hw/riscv/virt.c | 30 ++++++++++++++++++++++++++++++
52
1 file changed, 21 insertions(+), 32 deletions(-)
14
hw/riscv/Kconfig | 1 +
15
3 files changed, 33 insertions(+)
16
53
17
diff --git a/include/hw/riscv/virt.h b/include/hw/riscv/virt.h
18
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/riscv/virt.h
20
+++ b/include/hw/riscv/virt.h
21
@@ -XXX,XX +XXX,XX @@ struct RISCVVirtState {
22
RISCVHartArrayState soc[VIRT_SOCKETS_MAX];
23
DeviceState *plic[VIRT_SOCKETS_MAX];
24
PFlashCFI01 *flash[2];
25
+ FWCfgState *fw_cfg;
26
27
int fdt_size;
28
};
29
@@ -XXX,XX +XXX,XX @@ enum {
30
VIRT_PLIC,
31
VIRT_UART0,
32
VIRT_VIRTIO,
33
+ VIRT_FW_CFG,
34
VIRT_FLASH,
35
VIRT_DRAM,
36
VIRT_PCIE_MMIO,
37
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
54
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
38
index XXXXXXX..XXXXXXX 100644
55
index XXXXXXX..XXXXXXX 100644
39
--- a/hw/riscv/virt.c
56
--- a/hw/riscv/virt.c
40
+++ b/hw/riscv/virt.c
57
+++ b/hw/riscv/virt.c
41
@@ -XXX,XX +XXX,XX @@ static const MemMapEntry virt_memmap[] = {
58
@@ -XXX,XX +XXX,XX @@ static void virt_machine_done(Notifier *notifier, void *data)
42
[VIRT_PLIC] = { 0xc000000, VIRT_PLIC_SIZE(VIRT_CPUS_MAX * 2) },
59
target_ulong firmware_end_addr, kernel_start_addr;
43
[VIRT_UART0] = { 0x10000000, 0x100 },
60
const char *firmware_name = riscv_default_firmware_name(&s->soc[0]);
44
[VIRT_VIRTIO] = { 0x10001000, 0x1000 },
61
uint32_t fdt_load_addr;
45
+ [VIRT_FW_CFG] = { 0x10100000, 0x18 },
62
- uint64_t kernel_entry;
46
[VIRT_FLASH] = { 0x20000000, 0x4000000 },
63
+ uint64_t kernel_entry = 0;
47
[VIRT_PCIE_ECAM] = { 0x30000000, 0x10000000 },
64
48
[VIRT_PCIE_MMIO] = { 0x40000000, 0x40000000 },
65
/*
49
@@ -XXX,XX +XXX,XX @@ static inline DeviceState *gpex_pcie_init(MemoryRegion *sys_mem,
66
* Only direct boot kernel is currently supported for KVM VM,
50
return dev;
67
@@ -XXX,XX +XXX,XX @@ static void virt_machine_done(Notifier *notifier, void *data)
51
}
68
firmware_end_addr = riscv_find_and_load_firmware(machine, firmware_name,
52
69
start_addr, NULL);
53
+static FWCfgState *create_fw_cfg(const MachineState *mc)
70
54
+{
71
- if (drive_get(IF_PFLASH, 0, 1)) {
55
+ hwaddr base = virt_memmap[VIRT_FW_CFG].base;
72
- /*
56
+ hwaddr size = virt_memmap[VIRT_FW_CFG].size;
73
- * S-mode FW like EDK2 will be kept in second plash (unit 1).
57
+ FWCfgState *fw_cfg;
74
- * When both kernel, initrd and pflash options are provided in the
58
+ char *nodename;
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
+ }
59
+
106
+
60
+ fw_cfg = fw_cfg_init_mem_wide(base + 8, base, 8, base + 16,
107
+ if (machine->kernel_filename && !kernel_entry) {
61
+ &address_space_memory);
108
kernel_start_addr = riscv_calc_kernel_start_addr(&s->soc[0],
62
+ fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)mc->smp.cpus);
109
firmware_end_addr);
63
+
110
64
+ nodename = g_strdup_printf("/fw-cfg@%" PRIx64, base);
111
kernel_entry = riscv_load_kernel(machine, &s->soc[0],
65
+ qemu_fdt_add_subnode(mc->fdt, nodename);
112
kernel_start_addr, true, NULL);
66
+ qemu_fdt_setprop_string(mc->fdt, nodename,
113
- } else {
67
+ "compatible", "qemu,fw-cfg-mmio");
114
- /*
68
+ qemu_fdt_setprop_sized_cells(mc->fdt, nodename, "reg",
115
- * If dynamic firmware is used, it doesn't know where is the next mode
69
+ 2, base, 2, size);
116
- * if kernel argument is not set.
70
+ qemu_fdt_setprop(mc->fdt, nodename, "dma-coherent", NULL, 0);
117
- */
71
+ g_free(nodename);
118
- kernel_entry = 0;
72
+ return fw_cfg;
119
- }
73
+}
120
-
74
+
121
- if (drive_get(IF_PFLASH, 0, 0)) {
75
static void virt_machine_init(MachineState *machine)
122
- /*
76
{
123
- * Pflash was supplied, let's overwrite the address we jump to after
77
const MemMapEntry *memmap = virt_memmap;
124
- * reset to the base of the flash.
78
@@ -XXX,XX +XXX,XX @@ static void virt_machine_init(MachineState *machine)
125
- */
79
start_addr = virt_memmap[VIRT_FLASH].base;
126
- start_addr = virt_memmap[VIRT_FLASH].base;
80
}
127
}
81
128
82
+ /*
129
fdt_load_addr = riscv_compute_fdt_addr(memmap[VIRT_DRAM].base,
83
+ * Init fw_cfg. Must be done before riscv_load_fdt, otherwise the device
84
+ * tree cannot be altered and we get FDT_ERR_NOSPACE.
85
+ */
86
+ s->fw_cfg = create_fw_cfg(machine);
87
+ rom_set_fw(s->fw_cfg);
88
+
89
/* Compute the fdt load address in dram */
90
fdt_load_addr = riscv_load_fdt(memmap[VIRT_DRAM].base,
91
machine->ram_size, machine->fdt);
92
diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig
93
index XXXXXXX..XXXXXXX 100644
94
--- a/hw/riscv/Kconfig
95
+++ b/hw/riscv/Kconfig
96
@@ -XXX,XX +XXX,XX @@ config RISCV_VIRT
97
select SIFIVE_PLIC
98
select SIFIVE_TEST
99
select VIRTIO_MMIO
100
+ select FW_CFG_DMA
101
102
config SIFIVE_E
103
bool
104
--
130
--
105
2.30.1
131
2.40.1
106
107
diff view generated by jsdifflib
1
From: Asherah Connor <ashe@kivikakk.ee>
1
From: Sunil V L <sunilvl@ventanamicro.com>
2
2
3
Allow ramfb on virt. This lets `-device ramfb' work.
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.
4
7
5
Signed-off-by: Asherah Connor <ashe@kivikakk.ee>
8
To support -blockdev option, pflash devices need to be
6
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
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>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
18
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-id: 20210318235041.17175-3-ashe@kivikakk.ee
19
Message-Id: <20230601045910.18646-3-sunilvl@ventanamicro.com>
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
20
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
---
21
---
11
hw/riscv/virt.c | 3 +++
22
hw/riscv/virt.c | 8 +++++---
12
1 file changed, 3 insertions(+)
23
1 file changed, 5 insertions(+), 3 deletions(-)
13
24
14
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
25
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
15
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/riscv/virt.c
27
--- a/hw/riscv/virt.c
17
+++ b/hw/riscv/virt.c
28
+++ b/hw/riscv/virt.c
18
@@ -XXX,XX +XXX,XX @@
29
@@ -XXX,XX +XXX,XX @@ static void virt_machine_done(Notifier *notifier, void *data)
19
#include "sysemu/sysemu.h"
30
const char *firmware_name = riscv_default_firmware_name(&s->soc[0]);
20
#include "hw/pci/pci.h"
31
uint32_t fdt_load_addr;
21
#include "hw/pci-host/gpex.h"
32
uint64_t kernel_entry = 0;
22
+#include "hw/display/ramfb.h"
33
+ BlockBackend *pflash_blk0;
23
34
24
static const MemMapEntry virt_memmap[] = {
35
/*
25
[VIRT_DEBUG] = { 0x0, 0x100 },
36
* Only direct boot kernel is currently supported for KVM VM,
26
@@ -XXX,XX +XXX,XX @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
37
@@ -XXX,XX +XXX,XX @@ static void virt_machine_done(Notifier *notifier, void *data)
27
mc->cpu_index_to_instance_props = riscv_numa_cpu_index_to_props;
38
firmware_end_addr = riscv_find_and_load_firmware(machine, firmware_name,
28
mc->get_default_cpu_node_id = riscv_numa_get_default_cpu_node_id;
39
start_addr, NULL);
29
mc->numa_mem_supported = true;
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);
30
+
61
+
31
+ machine_class_allow_dynamic_sysbus_dev(mc, TYPE_RAMFB_DEVICE);
62
s->oem_id = g_strndup(ACPI_BUILD_APPNAME6, 6);
32
}
63
s->oem_table_id = g_strndup(ACPI_BUILD_APPNAME8, 8);
33
64
s->acpi = ON_OFF_AUTO_AUTO;
34
static const TypeInfo virt_machine_typeinfo = {
35
--
65
--
36
2.30.1
66
2.40.1
37
67
38
68
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: Sunil V L <sunilvl@ventanamicro.com>
2
2
3
This adds the documentation to describe what is supported for the
3
pflash devices can be used in virt machine for different
4
'microchip-icicle-kit' machine, and how to boot the machine in QEMU.
4
purposes like for ROM code or S-mode FW payload. Add a
5
section in the documentation on how to use pflash devices
6
for different purposes.
5
7
6
Signed-off-by: Bin Meng <bin.meng@windriver.com>
8
Signed-off-by: Sunil V L <sunilvl@ventanamicro.com>
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-id: 20210322075248.136255-2-bmeng.cn@gmail.com
11
Message-Id: <20230601045910.18646-4-sunilvl@ventanamicro.com>
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
---
13
---
11
docs/system/riscv/microchip-icicle-kit.rst | 89 ++++++++++++++++++++++
14
docs/system/riscv/virt.rst | 31 +++++++++++++++++++++++++++++++
12
docs/system/target-riscv.rst | 1 +
15
1 file changed, 31 insertions(+)
13
2 files changed, 90 insertions(+)
14
create mode 100644 docs/system/riscv/microchip-icicle-kit.rst
15
16
16
diff --git a/docs/system/riscv/microchip-icicle-kit.rst b/docs/system/riscv/microchip-icicle-kit.rst
17
diff --git a/docs/system/riscv/virt.rst b/docs/system/riscv/virt.rst
17
new file mode 100644
18
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX
19
--- a/docs/system/riscv/virt.rst
19
--- /dev/null
20
+++ b/docs/system/riscv/virt.rst
20
+++ b/docs/system/riscv/microchip-icicle-kit.rst
21
@@ -XXX,XX +XXX,XX @@ with the default OpenSBI firmware image as the -bios. It also supports
21
@@ -XXX,XX +XXX,XX @@
22
the recommended RISC-V bootflow: U-Boot SPL (M-mode) loads OpenSBI fw_dynamic
22
+Microchip PolarFire SoC Icicle Kit (``microchip-icicle-kit``)
23
firmware and U-Boot proper (S-mode), using the standard -bios functionality.
23
+=============================================================
24
25
+Using flash devices
26
+-------------------
24
+
27
+
25
+Microchip PolarFire SoC Icicle Kit integrates a PolarFire SoC, with one
28
+By default, the first flash device (pflash0) is expected to contain
26
+SiFive's E51 plus four U54 cores and many on-chip peripherals and an FPGA.
29
+S-mode firmware code. It can be configured as read-only, with the
30
+second flash device (pflash1) available to store configuration data.
27
+
31
+
28
+For more details about Microchip PolarFire SoC, please see:
32
+For example, booting edk2 looks like
29
+https://www.microsemi.com/product-directory/soc-fpgas/5498-polarfire-soc-fpga
30
+
31
+The Icicle Kit board information can be found here:
32
+https://www.microsemi.com/existing-parts/parts/152514
33
+
34
+Supported devices
35
+-----------------
36
+
37
+The ``microchip-icicle-kit`` machine supports the following devices:
38
+
39
+ * 1 E51 core
40
+ * 4 U54 cores
41
+ * Core Level Interruptor (CLINT)
42
+ * Platform-Level Interrupt Controller (PLIC)
43
+ * L2 Loosely Integrated Memory (L2-LIM)
44
+ * DDR memory controller
45
+ * 5 MMUARTs
46
+ * 1 DMA controller
47
+ * 2 GEM Ethernet controllers
48
+ * 1 SDHC storage controller
49
+
50
+Boot options
51
+------------
52
+
53
+The ``microchip-icicle-kit`` machine can start using the standard -bios
54
+functionality for loading its BIOS image, aka Hart Software Services (HSS_).
55
+HSS loads the second stage bootloader U-Boot from an SD card. It does not
56
+support direct kernel loading via the -kernel option. One has to load kernel
57
+from U-Boot.
58
+
59
+The memory is set to 1537 MiB by default which is the minimum required high
60
+memory size by HSS. A sanity check on ram size is performed in the machine
61
+init routine to prompt user to increase the RAM size to > 1537 MiB when less
62
+than 1537 MiB ram is detected.
63
+
64
+Boot the machine
65
+----------------
66
+
67
+HSS 2020.12 release is tested at the time of writing. To build an HSS image
68
+that can be booted by the ``microchip-icicle-kit`` machine, type the following
69
+in the HSS source tree:
70
+
33
+
71
+.. code-block:: bash
34
+.. code-block:: bash
72
+
35
+
73
+ $ export CROSS_COMPILE=riscv64-linux-
36
+ $ qemu-system-riscv64 \
74
+ $ cp boards/mpfs-icicle-kit-es/def_config .config
37
+ -blockdev node-name=pflash0,driver=file,read-only=on,filename=<edk2_code> \
75
+ $ make BOARD=mpfs-icicle-kit-es
38
+ -blockdev node-name=pflash1,driver=file,filename=<edk2_vars> \
39
+ -M virt,pflash0=pflash0,pflash1=pflash1 \
40
+ ... other args ....
76
+
41
+
77
+Download the official SD card image released by Microchip and prepare it for
42
+For TCG guests only, it is also possible to boot M-mode firmware from
78
+QEMU usage:
43
+the first flash device (pflash0) by additionally passing ``-bios
44
+none``, as in
79
+
45
+
80
+.. code-block:: bash
46
+.. code-block:: bash
81
+
47
+
82
+ $ wget ftp://ftpsoc.microsemi.com/outgoing/core-image-minimal-dev-icicle-kit-es-sd-20201009141623.rootfs.wic.gz
48
+ $ qemu-system-riscv64 \
83
+ $ gunzip core-image-minimal-dev-icicle-kit-es-sd-20201009141623.rootfs.wic.gz
49
+ -bios none \
84
+ $ qemu-img resize core-image-minimal-dev-icicle-kit-es-sd-20201009141623.rootfs.wic 4G
50
+ -blockdev node-name=pflash0,driver=file,read-only=on,filename=<m_mode_code> \
51
+ -M virt,pflash0=pflash0 \
52
+ ... other args ....
85
+
53
+
86
+Then we can boot the machine by:
54
+Firmware images used for pflash must be exactly 32 MiB in size.
87
+
55
+
88
+.. code-block:: bash
56
Machine-specific options
89
+
57
------------------------
90
+ $ qemu-system-riscv64 -M microchip-icicle-kit -smp 5 \
58
91
+ -bios path/to/hss.bin -sd path/to/sdcard.img \
92
+ -nic user,model=cadence_gem \
93
+ -nic tap,ifname=tap,model=cadence_gem,script=no \
94
+ -display none -serial stdio \
95
+ -chardev socket,id=serial1,path=serial1.sock,server=on,wait=on \
96
+ -serial chardev:serial1
97
+
98
+With above command line, current terminal session will be used for the first
99
+serial port. Open another terminal window, and use `minicom` to connect the
100
+second serial port.
101
+
102
+.. code-block:: bash
103
+
104
+ $ minicom -D unix\#serial1.sock
105
+
106
+HSS output is on the first serial port (stdio) and U-Boot outputs on the
107
+second serial port. U-Boot will automatically load the Linux kernel from
108
+the SD card image.
109
+
110
+.. _HSS: https://github.com/polarfire-soc/hart-software-services
111
diff --git a/docs/system/target-riscv.rst b/docs/system/target-riscv.rst
112
index XXXXXXX..XXXXXXX 100644
113
--- a/docs/system/target-riscv.rst
114
+++ b/docs/system/target-riscv.rst
115
@@ -XXX,XX +XXX,XX @@ undocumented; you can get a complete list by running
116
.. toctree::
117
:maxdepth: 1
118
119
+ riscv/microchip-icicle-kit
120
riscv/sifive_u
121
122
RISC-V CPU features
123
--
59
--
124
2.30.1
60
2.40.1
125
61
126
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
1
From: Jim Shu <cwshu@andestech.com>
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
2
2
3
Like MMU translation, add qemu log of PMP permission checking for
3
We initialize cur_pmmask as -1(UINT32_MAX/UINT64_MAX) and regard it
4
debugging.
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.
5
8
6
Signed-off-by: Jim Shu <cwshu@andestech.com>
9
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
8
Message-id: 1613916082-19528-3-git-send-email-cwshu@andestech.com
11
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
12
Message-Id: <20230610094651.43786-1-liweiwei@iscas.ac.cn>
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
13
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
---
14
---
11
target/riscv/cpu_helper.c | 12 ++++++++++++
15
target/riscv/cpu_helper.c | 4 ++--
12
1 file changed, 12 insertions(+)
16
1 file changed, 2 insertions(+), 2 deletions(-)
13
17
14
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
18
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
15
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
16
--- a/target/riscv/cpu_helper.c
20
--- a/target/riscv/cpu_helper.c
17
+++ b/target/riscv/cpu_helper.c
21
+++ b/target/riscv/cpu_helper.c
18
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
22
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPURISCVState *env, target_ulong *pc,
19
if (ret == TRANSLATE_SUCCESS) {
23
flags = FIELD_DP32(flags, TB_FLAGS, FS, fs);
20
ret = get_physical_address_pmp(env, &prot_pmp, &tlb_size, pa,
24
flags = FIELD_DP32(flags, TB_FLAGS, VS, vs);
21
size, access_type, mode);
25
flags = FIELD_DP32(flags, TB_FLAGS, XL, env->xl);
22
+
26
- if (env->cur_pmmask < (env->xl == MXL_RV32 ? UINT32_MAX : UINT64_MAX)) {
23
+ qemu_log_mask(CPU_LOG_MMU,
27
+ if (env->cur_pmmask != 0) {
24
+ "%s PMP address=" TARGET_FMT_plx " ret %d prot"
28
flags = FIELD_DP32(flags, TB_FLAGS, PM_MASK_ENABLED, 1);
25
+ " %d tlb_size " TARGET_FMT_lu "\n",
26
+ __func__, pa, ret, prot_pmp, tlb_size);
27
+
28
prot &= prot_pmp;
29
}
30
31
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
32
if (ret == TRANSLATE_SUCCESS) {
33
ret = get_physical_address_pmp(env, &prot_pmp, &tlb_size, pa,
34
size, access_type, mode);
35
+
36
+ qemu_log_mask(CPU_LOG_MMU,
37
+ "%s PMP address=" TARGET_FMT_plx " ret %d prot"
38
+ " %d tlb_size " TARGET_FMT_lu "\n",
39
+ __func__, pa, ret, prot_pmp, tlb_size);
40
+
41
prot &= prot_pmp;
42
}
43
}
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.
44
--
40
--
45
2.30.1
41
2.40.1
46
47
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
1
From: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
1
From: Xiao Wang <xiao.w.wang@intel.com>
2
2
3
The previous implementation was broken in many ways:
3
Commit 752614cab8e6 ("target/riscv: rvv: Add tail agnostic for vector
4
- Used mideleg instead of hideleg to mask accesses
4
load / store instructions") added an extra check for LMUL fragmentation,
5
- Used MIP_VSSIP instead of VS_MODE_INTERRUPTS to mask writes to vsie
5
intended for setting the "rest tail elements" in the last register for a
6
- Did not shift between S bits and VS bits (VSEIP <-> SEIP, ...)
6
segment load insn.
7
7
8
Signed-off-by: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
8
Actually, the max_elements derived in vext_ld*() won't be a fraction of
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
vector register size, since the lmul encoded in desc is emul, which has
10
Message-id: 20210311094738.1376795-1-georg.kotheimer@kernkonzept.com
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>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
25
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
26
---
13
target/riscv/csr.c | 68 +++++++++++++++++++++++-----------------------
27
target/riscv/vector_helper.c | 22 ++++++----------------
14
1 file changed, 34 insertions(+), 34 deletions(-)
28
1 file changed, 6 insertions(+), 16 deletions(-)
15
29
16
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
30
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
17
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
18
--- a/target/riscv/csr.c
32
--- a/target/riscv/vector_helper.c
19
+++ b/target/riscv/csr.c
33
+++ b/target/riscv/vector_helper.c
20
@@ -XXX,XX +XXX,XX @@ static int write_sstatus(CPURISCVState *env, int csrno, target_ulong val)
34
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_ST_ELEM(ste_h, int16_t, H2, stw)
21
return write_mstatus(env, CSR_MSTATUS, newval);
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
- }
22
}
65
}
23
66
24
+static int read_vsie(CPURISCVState *env, int csrno, target_ulong *val)
67
/*
25
+{
68
@@ -XXX,XX +XXX,XX @@ vext_ldst_stride(void *vd, void *v0, target_ulong base,
26
+ /* Shift the VS bits to their S bit location in vsie */
27
+ *val = (env->mie & env->hideleg & VS_MODE_INTERRUPTS) >> 1;
28
+ return 0;
29
+}
30
+
31
static int read_sie(CPURISCVState *env, int csrno, target_ulong *val)
32
{
33
if (riscv_cpu_virt_enabled(env)) {
34
- /* Tell the guest the VS bits, shifted to the S bit locations */
35
- *val = (env->mie & env->mideleg & VS_MODE_INTERRUPTS) >> 1;
36
+ read_vsie(env, CSR_VSIE, val);
37
} else {
38
*val = env->mie & env->mideleg;
39
}
69
}
40
return 0;
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);
41
}
74
}
42
75
43
-static int write_sie(CPURISCVState *env, int csrno, target_ulong val)
76
#define GEN_VEXT_LD_STRIDE(NAME, ETYPE, LOAD_FN) \
44
+static int write_vsie(CPURISCVState *env, int csrno, target_ulong val)
77
@@ -XXX,XX +XXX,XX @@ vext_ldst_us(void *vd, target_ulong base, CPURISCVState *env, uint32_t desc,
45
{
46
- target_ulong newval;
47
+ /* Shift the S bits to their VS bit location in mie */
48
+ target_ulong newval = (env->mie & ~VS_MODE_INTERRUPTS) |
49
+ ((val << 1) & env->hideleg & VS_MODE_INTERRUPTS);
50
+ return write_mie(env, CSR_MIE, newval);
51
+}
52
53
+static int write_sie(CPURISCVState *env, int csrno, target_ulong val)
54
+{
55
if (riscv_cpu_virt_enabled(env)) {
56
- /* Shift the guests S bits to VS */
57
- newval = (env->mie & ~VS_MODE_INTERRUPTS) |
58
- ((val << 1) & VS_MODE_INTERRUPTS);
59
+ write_vsie(env, CSR_VSIE, val);
60
} else {
61
- newval = (env->mie & ~S_MODE_INTERRUPTS) | (val & S_MODE_INTERRUPTS);
62
+ target_ulong newval = (env->mie & ~S_MODE_INTERRUPTS) |
63
+ (val & S_MODE_INTERRUPTS);
64
+ write_mie(env, CSR_MIE, newval);
65
}
78
}
66
79
env->vstart = 0;
67
- return write_mie(env, CSR_MIE, newval);
80
68
+ return 0;
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);
69
}
83
}
70
84
71
static int read_stvec(CPURISCVState *env, int csrno, target_ulong *val)
85
/*
72
@@ -XXX,XX +XXX,XX @@ static int write_sbadaddr(CPURISCVState *env, int csrno, target_ulong val)
86
@@ -XXX,XX +XXX,XX @@ vext_ldst_index(void *vd, void *v0, target_ulong base,
73
return 0;
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);
74
}
92
}
75
93
76
+static int rmw_vsip(CPURISCVState *env, int csrno, target_ulong *ret_value,
94
#define GEN_VEXT_LD_INDEX(NAME, ETYPE, INDEX_FN, LOAD_FN) \
77
+ target_ulong new_value, target_ulong write_mask)
95
@@ -XXX,XX +XXX,XX @@ ProbeSuccess:
78
+{
96
}
79
+ /* Shift the S bits to their VS bit location in mip */
97
env->vstart = 0;
80
+ int ret = rmw_mip(env, 0, ret_value, new_value << 1,
98
81
+ (write_mask << 1) & vsip_writable_mask & env->hideleg);
99
- vext_set_tail_elems_1s(env, env->vl, vd, desc, nf, esz, max_elems);
82
+ *ret_value &= VS_MODE_INTERRUPTS;
100
+ vext_set_tail_elems_1s(env->vl, vd, desc, nf, esz, max_elems);
83
+ /* Shift the VS bits to their S bit location in vsip */
84
+ *ret_value >>= 1;
85
+ return ret;
86
+}
87
+
88
static int rmw_sip(CPURISCVState *env, int csrno, target_ulong *ret_value,
89
target_ulong new_value, target_ulong write_mask)
90
{
91
int ret;
92
93
if (riscv_cpu_virt_enabled(env)) {
94
- /* Shift the new values to line up with the VS bits */
95
- ret = rmw_mip(env, CSR_MSTATUS, ret_value, new_value << 1,
96
- (write_mask & sip_writable_mask) << 1 & env->mideleg);
97
- ret &= vsip_writable_mask;
98
- ret >>= 1;
99
+ ret = rmw_vsip(env, CSR_VSIP, ret_value, new_value, write_mask);
100
} else {
101
ret = rmw_mip(env, CSR_MSTATUS, ret_value, new_value,
102
write_mask & env->mideleg & sip_writable_mask);
103
@@ -XXX,XX +XXX,XX @@ static int write_vsstatus(CPURISCVState *env, int csrno, target_ulong val)
104
return 0;
105
}
101
}
106
102
107
-static int rmw_vsip(CPURISCVState *env, int csrno, target_ulong *ret_value,
103
#define GEN_VEXT_LDFF(NAME, ETYPE, LOAD_FN) \
108
- target_ulong new_value, target_ulong write_mask)
109
-{
110
- int ret = rmw_mip(env, 0, ret_value, new_value,
111
- write_mask & env->mideleg & vsip_writable_mask);
112
- return ret;
113
-}
114
-
115
-static int read_vsie(CPURISCVState *env, int csrno, target_ulong *val)
116
-{
117
- *val = env->mie & env->mideleg & VS_MODE_INTERRUPTS;
118
- return 0;
119
-}
120
-
121
-static int write_vsie(CPURISCVState *env, int csrno, target_ulong val)
122
-{
123
- target_ulong newval = (env->mie & ~env->mideleg) | (val & env->mideleg & MIP_VSSIP);
124
- return write_mie(env, CSR_MIE, newval);
125
-}
126
-
127
static int read_vstvec(CPURISCVState *env, int csrno, target_ulong *val)
128
{
129
*val = env->vstvec;
130
--
104
--
131
2.30.1
105
2.40.1
132
133
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