1
The following changes since commit a35947f15c0ee695eba3c55248ec8ac3e4e23cca:
1
The following changes since commit c5ea91da443b458352c1b629b490ee6631775cb4:
2
2
3
Merge remote-tracking branch 'remotes/stsquad/tags/pull-testing-updates-070621-2' into staging (2021-06-07 15:45:48 +0100)
3
Merge tag 'pull-trivial-patches' of https://gitlab.com/mjt0k/qemu into staging (2023-09-08 10:06:25 -0400)
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-20210608-1
7
https://github.com/alistair23/qemu.git tags/pull-riscv-to-apply-20230911
8
8
9
for you to fetch changes up to d2c1a177b138be35cb96216baa870c3564b123e4:
9
for you to fetch changes up to e7a03409f29e2da59297d55afbaec98c96e43e3a:
10
10
11
target/riscv: rvb: add b-ext version cpu option (2021-06-08 09:59:46 +1000)
11
target/riscv: don't read CSR in riscv_csrrw_do64 (2023-09-11 11:45:55 +1000)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
Second RISC-V PR for QEMU 6.1
14
First RISC-V PR for 8.2
15
15
16
- Update the PLIC and CLINT DT bindings
16
* Remove 'host' CPU from TCG
17
- Improve documentation for RISC-V machines
17
* riscv_htif Fixup printing on big endian hosts
18
- Support direct kernel boot for microchip_pfsoc
18
* Add zmmul isa string
19
- Fix WFI exception behaviour
19
* Add smepmp isa string
20
- Improve CSR printing
20
* Fix page_check_range use in fault-only-first
21
- Initial support for the experimental Bit Manip extension
21
* Use existing lookup tables for MixColumns
22
* Add RISC-V vector cryptographic instruction set support
23
* Implement WARL behaviour for mcountinhibit/mcounteren
24
* Add Zihintntl extension ISA string to DTS
25
* Fix zfa fleq.d and fltq.d
26
* Fix upper/lower mtime write calculation
27
* Make rtc variable names consistent
28
* Use abi type for linux-user target_ucontext
29
* Add RISC-V KVM AIA Support
30
* Fix riscv,pmu DT node path in the virt machine
31
* Update CSR bits name for svadu extension
32
* Mark zicond non-experimental
33
* Fix satp_mode_finalize() when satp_mode.supported = 0
34
* Fix non-KVM --enable-debug build
35
* Add new extensions to hwprobe
36
* Use accelerated helper for AES64KS1I
37
* Allocate itrigger timers only once
38
* Respect mseccfg.RLB for pmpaddrX changes
39
* Align the AIA model to v1.0 ratified spec
40
* Don't read the CSR in riscv_csrrw_do64
22
41
23
----------------------------------------------------------------
42
----------------------------------------------------------------
24
Alistair Francis (2):
43
Akihiko Odaki (1):
25
docs/system: Move the RISC-V -bios information to removed
44
target/riscv: Allocate itrigger timers only once
26
target/riscv/pmp: Add assert for ePMP operations
27
45
28
Bin Meng (9):
46
Ard Biesheuvel (2):
29
hw/riscv: sifive_u: Switch to use qemu_fdt_setprop_string_array() helper
47
target/riscv: Use existing lookup tables for MixColumns
30
hw/riscv: virt: Switch to use qemu_fdt_setprop_string_array() helper
48
target/riscv: Use accelerated helper for AES64KS1I
31
hw/riscv: Support the official CLINT DT bindings
32
hw/riscv: Support the official PLIC DT bindings
33
docs/system/riscv: Correct the indentation level of supported devices
34
docs/system/riscv: sifive_u: Document '-dtb' usage
35
hw/riscv: Use macros for BIOS image names
36
hw/riscv: microchip_pfsoc: Support direct kernel boot
37
target/riscv: Remove unnecessary riscv_*_names[] declaration
38
49
39
Changbin Du (1):
50
Conor Dooley (1):
40
target/riscv: Dump CSR mscratch/sscratch/satp
51
hw/riscv: virt: Fix riscv,pmu DT node path
41
52
42
Frank Chang (6):
53
Daniel Henrique Barboza (6):
43
target/riscv: rvb: count bits set
54
target/riscv/cpu.c: do not run 'host' CPU with TCG
44
target/riscv: add gen_shifti() and gen_shiftiw() helper functions
55
target/riscv/cpu.c: add zmmul isa string
45
target/riscv: rvb: single-bit instructions
56
target/riscv/cpu.c: add smepmp isa string
46
target/riscv: rvb: generalized reverse
57
target/riscv: fix satp_mode_finalize() when satp_mode.supported = 0
47
target/riscv: rvb: generalized or-combine
58
hw/riscv/virt.c: fix non-KVM --enable-debug build
48
target/riscv: rvb: add b-ext version cpu option
59
hw/intc/riscv_aplic.c fix non-KVM --enable-debug build
49
60
50
Jose Martins (1):
61
Dickon Hood (2):
51
target/riscv: fix wfi exception behavior
62
target/riscv: Refactor translation of vector-widening instruction
63
target/riscv: Add Zvbb ISA extension support
52
64
53
Kito Cheng (11):
65
Jason Chien (3):
54
target/riscv: reformat @sh format encoding for B-extension
66
target/riscv: Add Zihintntl extension ISA string to DTS
55
target/riscv: rvb: count leading/trailing zeros
67
hw/intc: Fix upper/lower mtime write calculation
56
target/riscv: rvb: logic-with-negate
68
hw/intc: Make rtc variable names consistent
57
target/riscv: rvb: pack two words into one register
58
target/riscv: rvb: min/max instructions
59
target/riscv: rvb: sign-extend instructions
60
target/riscv: rvb: shift ones
61
target/riscv: rvb: rotate (left/right)
62
target/riscv: rvb: address calculation
63
target/riscv: rvb: add/shift with prefix zero-extend
64
target/riscv: rvb: support and turn on B-extension from command line
65
69
66
LIU Zhiwei (1):
70
Kiran Ostrolenk (4):
67
target/riscv: Pass the same value to oprsz and maxsz.
71
target/riscv: Refactor some of the generic vector functionality
72
target/riscv: Refactor vector-vector translation macro
73
target/riscv: Refactor some of the generic vector functionality
74
target/riscv: Add Zvknh ISA extension support
68
75
69
Philippe Mathieu-Daudé (1):
76
LIU Zhiwei (3):
70
target/riscv: Do not include 'pmp.h' in user emulation
77
target/riscv: Fix page_check_range use in fault-only-first
78
target/riscv: Fix zfa fleq.d and fltq.d
79
linux-user/riscv: Use abi type for target_ucontext
71
80
72
docs/system/deprecated.rst | 19 --
81
Lawrence Hunter (2):
73
docs/system/removed-features.rst | 5 +
82
target/riscv: Add Zvbc ISA extension support
74
docs/system/riscv/microchip-icicle-kit.rst | 50 +++-
83
target/riscv: Add Zvksh ISA extension support
75
docs/system/riscv/sifive_u.rst | 77 +++--
76
docs/system/target-riscv.rst | 13 +-
77
include/hw/riscv/boot.h | 5 +
78
target/riscv/cpu.h | 9 +-
79
target/riscv/cpu_bits.h | 1 +
80
target/riscv/helper.h | 6 +
81
target/riscv/insn32.decode | 87 +++++-
82
hw/riscv/microchip_pfsoc.c | 81 +++++-
83
hw/riscv/sifive_u.c | 24 +-
84
hw/riscv/spike.c | 12 +-
85
hw/riscv/virt.c | 25 +-
86
target/riscv/bitmanip_helper.c | 90 ++++++
87
target/riscv/cpu.c | 38 ++-
88
target/riscv/op_helper.c | 11 +-
89
target/riscv/pmp.c | 4 +
90
target/riscv/translate.c | 306 ++++++++++++++++++++
91
target/riscv/insn_trans/trans_rvb.c.inc | 438 +++++++++++++++++++++++++++++
92
target/riscv/insn_trans/trans_rvi.c.inc | 54 +---
93
target/riscv/insn_trans/trans_rvv.c.inc | 89 +++---
94
target/riscv/meson.build | 1 +
95
23 files changed, 1260 insertions(+), 185 deletions(-)
96
create mode 100644 target/riscv/bitmanip_helper.c
97
create mode 100644 target/riscv/insn_trans/trans_rvb.c.inc
98
84
85
Leon Schuermann (1):
86
target/riscv/pmp.c: respect mseccfg.RLB for pmpaddrX changes
87
88
Max Chou (3):
89
crypto: Create sm4_subword
90
crypto: Add SM4 constant parameter CK
91
target/riscv: Add Zvksed ISA extension support
92
93
Nazar Kazakov (4):
94
target/riscv: Remove redundant "cpu_vl == 0" checks
95
target/riscv: Move vector translation checks
96
target/riscv: Add Zvkned ISA extension support
97
target/riscv: Add Zvkg ISA extension support
98
99
Nikita Shubin (1):
100
target/riscv: don't read CSR in riscv_csrrw_do64
101
102
Rob Bradford (1):
103
target/riscv: Implement WARL behaviour for mcountinhibit/mcounteren
104
105
Robbin Ehn (1):
106
linux-user/riscv: Add new extensions to hwprobe
107
108
Thomas Huth (2):
109
hw/char/riscv_htif: Fix printing of console characters on big endian hosts
110
hw/char/riscv_htif: Fix the console syscall on big endian hosts
111
112
Tommy Wu (1):
113
target/riscv: Align the AIA model to v1.0 ratified spec
114
115
Vineet Gupta (1):
116
riscv: zicond: make non-experimental
117
118
Weiwei Li (1):
119
target/riscv: Update CSR bits name for svadu extension
120
121
Yong-Xuan Wang (5):
122
target/riscv: support the AIA device emulation with KVM enabled
123
target/riscv: check the in-kernel irqchip support
124
target/riscv: Create an KVM AIA irqchip
125
target/riscv: update APLIC and IMSIC to support KVM AIA
126
target/riscv: select KVM AIA in riscv virt machine
127
128
include/crypto/aes.h | 7 +
129
include/crypto/sm4.h | 9 +
130
target/riscv/cpu_bits.h | 8 +-
131
target/riscv/cpu_cfg.h | 9 +
132
target/riscv/debug.h | 3 +-
133
target/riscv/helper.h | 98 +++
134
target/riscv/kvm_riscv.h | 5 +
135
target/riscv/vector_internals.h | 228 +++++++
136
target/riscv/insn32.decode | 58 ++
137
crypto/aes.c | 4 +-
138
crypto/sm4.c | 10 +
139
hw/char/riscv_htif.c | 12 +-
140
hw/intc/riscv_aclint.c | 11 +-
141
hw/intc/riscv_aplic.c | 52 +-
142
hw/intc/riscv_imsic.c | 25 +-
143
hw/riscv/virt.c | 374 ++++++------
144
linux-user/riscv/signal.c | 4 +-
145
linux-user/syscall.c | 14 +-
146
target/arm/tcg/crypto_helper.c | 10 +-
147
target/riscv/cpu.c | 83 ++-
148
target/riscv/cpu_helper.c | 6 +-
149
target/riscv/crypto_helper.c | 51 +-
150
target/riscv/csr.c | 54 +-
151
target/riscv/debug.c | 15 +-
152
target/riscv/kvm.c | 201 ++++++-
153
target/riscv/pmp.c | 4 +
154
target/riscv/translate.c | 1 +
155
target/riscv/vcrypto_helper.c | 970 ++++++++++++++++++++++++++++++
156
target/riscv/vector_helper.c | 245 +-------
157
target/riscv/vector_internals.c | 81 +++
158
target/riscv/insn_trans/trans_rvv.c.inc | 171 +++---
159
target/riscv/insn_trans/trans_rvvk.c.inc | 606 +++++++++++++++++++
160
target/riscv/insn_trans/trans_rvzfa.c.inc | 4 +-
161
target/riscv/meson.build | 4 +-
162
34 files changed, 2785 insertions(+), 652 deletions(-)
163
create mode 100644 target/riscv/vector_internals.h
164
create mode 100644 target/riscv/vcrypto_helper.c
165
create mode 100644 target/riscv/vector_internals.c
166
create mode 100644 target/riscv/insn_trans/trans_rvvk.c.inc
diff view generated by jsdifflib
1
From: Kito Cheng <kito.cheng@sifive.com>
1
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
2
2
3
B-extension is default off, use cpu rv32 or rv64 with x-b=true to
3
The 'host' CPU is available in a CONFIG_KVM build and it's currently
4
enable B-extension.
4
available for all accels, but is a KVM only CPU. This means that in a
5
RISC-V KVM capable host we can do things like this:
5
6
6
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
7
$ ./build/qemu-system-riscv64 -M virt,accel=tcg -cpu host --nographic
7
Signed-off-by: Frank Chang <frank.chang@sifive.com>
8
qemu-system-riscv64: H extension requires priv spec 1.12.0
9
10
This CPU does not have a priv spec because we don't filter its extensions
11
via priv spec. We shouldn't be reaching riscv_cpu_realize_tcg() at all
12
with the 'host' CPU.
13
14
We don't have a way to filter the 'host' CPU out of the available CPU
15
options (-cpu help) if the build includes both KVM and TCG. What we can
16
do is to error out during riscv_cpu_realize_tcg() if the user chooses
17
the 'host' CPU with accel=tcg:
18
19
$ ./build/qemu-system-riscv64 -M virt,accel=tcg -cpu host --nographic
20
qemu-system-riscv64: 'host' CPU is not compatible with TCG acceleration
21
22
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
23
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
24
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10
Message-id: 20210505160620.15723-17-frank.chang@sifive.com
25
Message-Id: <20230721133411.474105-1-dbarboza@ventanamicro.com>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
26
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
27
---
13
target/riscv/cpu.h | 1 +
28
target/riscv/cpu.c | 5 +++++
14
target/riscv/cpu.c | 4 ++++
29
1 file changed, 5 insertions(+)
15
2 files changed, 5 insertions(+)
16
30
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 @@ struct RISCVCPU {
22
bool ext_f;
23
bool ext_d;
24
bool ext_c;
25
+ bool ext_b;
26
bool ext_s;
27
bool ext_u;
28
bool ext_h;
29
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
31
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
30
index XXXXXXX..XXXXXXX 100644
32
index XXXXXXX..XXXXXXX 100644
31
--- a/target/riscv/cpu.c
33
--- a/target/riscv/cpu.c
32
+++ b/target/riscv/cpu.c
34
+++ b/target/riscv/cpu.c
33
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
35
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize_tcg(DeviceState *dev, Error **errp)
34
if (cpu->cfg.ext_h) {
36
CPURISCVState *env = &cpu->env;
35
target_misa |= RVH;
37
Error *local_err = NULL;
36
}
38
37
+ if (cpu->cfg.ext_b) {
39
+ if (object_dynamic_cast(OBJECT(dev), TYPE_RISCV_CPU_HOST)) {
38
+ target_misa |= RVB;
40
+ error_setg(errp, "'host' CPU is not compatible with TCG acceleration");
39
+ }
41
+ return;
40
if (cpu->cfg.ext_v) {
42
+ }
41
target_misa |= RVV;
43
+
42
if (!is_power_of_2(cpu->cfg.vlen)) {
44
riscv_cpu_validate_misa_mxl(cpu, &local_err);
43
@@ -XXX,XX +XXX,XX @@ static Property riscv_cpu_properties[] = {
45
if (local_err != NULL) {
44
DEFINE_PROP_BOOL("s", RISCVCPU, cfg.ext_s, true),
46
error_propagate(errp, local_err);
45
DEFINE_PROP_BOOL("u", RISCVCPU, cfg.ext_u, true),
46
/* This is experimental so mark with 'x-' */
47
+ DEFINE_PROP_BOOL("x-b", RISCVCPU, cfg.ext_b, false),
48
DEFINE_PROP_BOOL("x-h", RISCVCPU, cfg.ext_h, false),
49
DEFINE_PROP_BOOL("x-v", RISCVCPU, cfg.ext_v, false),
50
DEFINE_PROP_BOOL("Counters", RISCVCPU, cfg.ext_counters, true),
51
--
47
--
52
2.31.1
48
2.41.0
53
49
54
50
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: Thomas Huth <thuth@redhat.com>
2
2
3
Update the 'sifive_u' machine documentation to mention the '-dtb'
3
The character that should be printed is stored in the 64 bit "payload"
4
option that can be used to pass a custom DTB to QEMU.
4
variable. The code currently tries to print it by taking the address
5
of the variable and passing this pointer to qemu_chr_fe_write(). However,
6
this only works on little endian hosts where the least significant bits
7
are stored on the lowest address. To do this in a portable way, we have
8
to store the value in an uint8_t variable instead.
5
9
6
Signed-off-by: Bin Meng <bin.meng@windriver.com>
10
Fixes: 5033606780 ("RISC-V HTIF Console")
11
Signed-off-by: Thomas Huth <thuth@redhat.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
12
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-id: 20210430071302.1489082-6-bmeng.cn@gmail.com
13
Reviewed-by: Bin Meng <bmeng@tinylab.org>
14
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
15
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
16
Message-Id: <20230721094720.902454-2-thuth@redhat.com>
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
17
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
---
18
---
11
docs/system/riscv/sifive_u.rst | 47 +++++++++++++++++++++++++++++-----
19
hw/char/riscv_htif.c | 3 ++-
12
1 file changed, 41 insertions(+), 6 deletions(-)
20
1 file changed, 2 insertions(+), 1 deletion(-)
13
21
14
diff --git a/docs/system/riscv/sifive_u.rst b/docs/system/riscv/sifive_u.rst
22
diff --git a/hw/char/riscv_htif.c b/hw/char/riscv_htif.c
15
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
16
--- a/docs/system/riscv/sifive_u.rst
24
--- a/hw/char/riscv_htif.c
17
+++ b/docs/system/riscv/sifive_u.rst
25
+++ b/hw/char/riscv_htif.c
18
@@ -XXX,XX +XXX,XX @@ Hardware configuration information
26
@@ -XXX,XX +XXX,XX @@ static void htif_handle_tohost_write(HTIFState *s, uint64_t val_written)
19
----------------------------------
27
s->tohost = 0; /* clear to indicate we read */
20
28
return;
21
The ``sifive_u`` machine automatically generates a device tree blob ("dtb")
29
} else if (cmd == HTIF_CONSOLE_CMD_PUTC) {
22
-which it passes to the guest. This provides information about the addresses,
30
- qemu_chr_fe_write(&s->chr, (uint8_t *)&payload, 1);
23
-interrupt lines and other configuration of the various devices in the system.
31
+ uint8_t ch = (uint8_t)payload;
24
-Guest software should discover the devices that are present in the generated
32
+ qemu_chr_fe_write(&s->chr, &ch, 1);
25
-DTB instead of using a DTB for the real hardware, as some of the devices are
33
resp = 0x100 | (uint8_t)payload;
26
-not modeled by QEMU and trying to access these devices may cause unexpected
34
} else {
27
-behavior.
35
qemu_log("HTIF device %d: unknown command\n", device);
28
+which it passes to the guest, if there is no ``-dtb`` option. This provides
29
+information about the addresses, interrupt lines and other configuration of
30
+the various devices in the system. Guest software should discover the devices
31
+that are present in the generated DTB instead of using a DTB for the real
32
+hardware, as some of the devices are not modeled by QEMU and trying to access
33
+these devices may cause unexpected behavior.
34
+
35
+If users want to provide their own DTB, they can use the ``-dtb`` option.
36
+These DTBs should have the following requirements:
37
+
38
+* The /cpus node should contain at least one subnode for E51 and the number
39
+ of subnodes should match QEMU's ``-smp`` option
40
+* The /memory reg size should match QEMU’s selected ram_size via ``-m``
41
+* Should contain a node for the CLINT device with a compatible string
42
+ "riscv,clint0" if using with OpenSBI BIOS images
43
44
Boot options
45
------------
46
@@ -XXX,XX +XXX,XX @@ To boot the newly built Linux kernel in QEMU with the ``sifive_u`` machine:
47
-initrd /path/to/rootfs.ext4 \
48
-append "root=/dev/ram"
49
50
+Alternatively, we can use a custom DTB to boot the machine by inserting a CLINT
51
+node in fu540-c000.dtsi in the Linux kernel,
52
+
53
+.. code-block:: none
54
+
55
+ clint: clint@2000000 {
56
+ compatible = "riscv,clint0";
57
+ interrupts-extended = <&cpu0_intc 3 &cpu0_intc 7
58
+ &cpu1_intc 3 &cpu1_intc 7
59
+ &cpu2_intc 3 &cpu2_intc 7
60
+ &cpu3_intc 3 &cpu3_intc 7
61
+ &cpu4_intc 3 &cpu4_intc 7>;
62
+ reg = <0x00 0x2000000 0x00 0x10000>;
63
+ };
64
+
65
+with the following command line options:
66
+
67
+.. code-block:: bash
68
+
69
+ $ qemu-system-riscv64 -M sifive_u -smp 5 -m 8G \
70
+ -display none -serial stdio \
71
+ -kernel arch/riscv/boot/Image \
72
+ -dtb arch/riscv/boot/dts/sifive/hifive-unleashed-a00.dtb \
73
+ -initrd /path/to/rootfs.ext4 \
74
+ -append "root=/dev/ram"
75
+
76
To build a Linux mainline kernel that can be booted by the ``sifive_u`` machine
77
in 32-bit mode, use the rv32_defconfig configuration. A patch is required to
78
fix the 32-bit boot issue for Linux kernel v5.10.
79
--
36
--
80
2.31.1
37
2.41.0
81
38
82
39
diff view generated by jsdifflib
New patch
1
From: Thomas Huth <thuth@redhat.com>
1
2
3
Values that have been read via cpu_physical_memory_read() from the
4
guest's memory have to be swapped in case the host endianess differs
5
from the guest.
6
7
Fixes: a6e13e31d5 ("riscv_htif: Support console output via proxy syscall")
8
Signed-off-by: Thomas Huth <thuth@redhat.com>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Reviewed-by: Bin Meng <bmeng@tinylab.org>
11
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
12
Message-Id: <20230721094720.902454-3-thuth@redhat.com>
13
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
14
---
15
hw/char/riscv_htif.c | 9 +++++----
16
1 file changed, 5 insertions(+), 4 deletions(-)
17
18
diff --git a/hw/char/riscv_htif.c b/hw/char/riscv_htif.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/char/riscv_htif.c
21
+++ b/hw/char/riscv_htif.c
22
@@ -XXX,XX +XXX,XX @@
23
#include "qemu/timer.h"
24
#include "qemu/error-report.h"
25
#include "exec/address-spaces.h"
26
+#include "exec/tswap.h"
27
#include "sysemu/dma.h"
28
29
#define RISCV_DEBUG_HTIF 0
30
@@ -XXX,XX +XXX,XX @@ static void htif_handle_tohost_write(HTIFState *s, uint64_t val_written)
31
} else {
32
uint64_t syscall[8];
33
cpu_physical_memory_read(payload, syscall, sizeof(syscall));
34
- if (syscall[0] == PK_SYS_WRITE &&
35
- syscall[1] == HTIF_DEV_CONSOLE &&
36
- syscall[3] == HTIF_CONSOLE_CMD_PUTC) {
37
+ if (tswap64(syscall[0]) == PK_SYS_WRITE &&
38
+ tswap64(syscall[1]) == HTIF_DEV_CONSOLE &&
39
+ tswap64(syscall[3]) == HTIF_CONSOLE_CMD_PUTC) {
40
uint8_t ch;
41
- cpu_physical_memory_read(syscall[2], &ch, 1);
42
+ cpu_physical_memory_read(tswap64(syscall[2]), &ch, 1);
43
qemu_chr_fe_write(&s->chr, &ch, 1);
44
resp = 0x100 | (uint8_t)payload;
45
} else {
46
--
47
2.41.0
diff view generated by jsdifflib
New patch
1
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
1
2
3
zmmul was promoted from experimental to ratified in commit 6d00ffad4e95.
4
Add a riscv,isa string for it.
5
6
Fixes: 6d00ffad4e95 ("target/riscv: move zmmul out of the experimental properties")
7
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
8
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-Id: <20230720132424.371132-2-dbarboza@ventanamicro.com>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
13
target/riscv/cpu.c | 1 +
14
1 file changed, 1 insertion(+)
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 const struct isa_ext_data isa_edata_arr[] = {
21
ISA_EXT_DATA_ENTRY(zicsr, PRIV_VERSION_1_10_0, ext_icsr),
22
ISA_EXT_DATA_ENTRY(zifencei, PRIV_VERSION_1_10_0, ext_ifencei),
23
ISA_EXT_DATA_ENTRY(zihintpause, PRIV_VERSION_1_10_0, ext_zihintpause),
24
+ ISA_EXT_DATA_ENTRY(zmmul, PRIV_VERSION_1_12_0, ext_zmmul),
25
ISA_EXT_DATA_ENTRY(zawrs, PRIV_VERSION_1_12_0, ext_zawrs),
26
ISA_EXT_DATA_ENTRY(zfa, PRIV_VERSION_1_12_0, ext_zfa),
27
ISA_EXT_DATA_ENTRY(zfbfmin, PRIV_VERSION_1_12_0, ext_zfbfmin),
28
--
29
2.41.0
diff view generated by jsdifflib
New patch
1
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
1
2
3
The cpu->cfg.epmp extension is still experimental, but it already has a
4
'smepmp' riscv,isa string. Add it.
5
6
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
7
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <20230720132424.371132-3-dbarboza@ventanamicro.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
target/riscv/cpu.c | 1 +
13
1 file changed, 1 insertion(+)
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(smepmp, PRIV_VERSION_1_12_0, epmp),
24
ISA_EXT_DATA_ENTRY(smstateen, PRIV_VERSION_1_12_0, ext_smstateen),
25
ISA_EXT_DATA_ENTRY(ssaia, PRIV_VERSION_1_12_0, ext_ssaia),
26
ISA_EXT_DATA_ENTRY(sscofpmf, PRIV_VERSION_1_12_0, ext_sscofpmf),
27
--
28
2.41.0
diff view generated by jsdifflib
New patch
1
From: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
1
2
3
Commit bef6f008b98(accel/tcg: Return bool from page_check_range) converts
4
integer return value to bool type. However, it wrongly converted the use
5
of the API in riscv fault-only-first, where page_check_range < = 0, should
6
be converted to !page_check_range.
7
8
Signed-off-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-ID: <20230729031618.821-1-zhiwei_liu@linux.alibaba.com>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
13
target/riscv/vector_helper.c | 2 +-
14
1 file changed, 1 insertion(+), 1 deletion(-)
15
16
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/riscv/vector_helper.c
19
+++ b/target/riscv/vector_helper.c
20
@@ -XXX,XX +XXX,XX @@ vext_ldff(void *vd, void *v0, target_ulong base,
21
cpu_mmu_index(env, false));
22
if (host) {
23
#ifdef CONFIG_USER_ONLY
24
- if (page_check_range(addr, offset, PAGE_READ)) {
25
+ if (!page_check_range(addr, offset, PAGE_READ)) {
26
vl = i;
27
goto ProbeSuccess;
28
}
29
--
30
2.41.0
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: Ard Biesheuvel <ardb@kernel.org>
2
2
3
The supported device bullet list has an additional space before each
3
The AES MixColumns and InvMixColumns operations are relatively
4
entry, which makes a wrong indentation level. Correct it.
4
expensive 4x4 matrix multiplications in GF(2^8), which is why C
5
implementations usually rely on precomputed lookup tables rather than
6
performing the calculations on demand.
5
7
6
Signed-off-by: Bin Meng <bin.meng@windriver.com>
8
Given that we already carry those tables in QEMU, we can just grab the
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
right value in the implementation of the RISC-V AES32 instructions. Note
8
Message-id: 20210430071302.1489082-5-bmeng.cn@gmail.com
10
that the tables in question are permuted according to the respective
11
Sbox, so we can omit the Sbox lookup as well in this case.
12
13
Cc: Richard Henderson <richard.henderson@linaro.org>
14
Cc: Philippe Mathieu-Daudé <philmd@linaro.org>
15
Cc: Zewen Ye <lustrew@foxmail.com>
16
Cc: Weiwei Li <liweiwei@iscas.ac.cn>
17
Cc: Junqiang Wang <wangjunqiang@iscas.ac.cn>
18
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
19
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
20
Message-ID: <20230731084043.1791984-1-ardb@kernel.org>
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
21
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
---
22
---
11
docs/system/riscv/microchip-icicle-kit.rst | 20 +++++++--------
23
include/crypto/aes.h | 7 +++++++
12
docs/system/riscv/sifive_u.rst | 30 +++++++++++-----------
24
crypto/aes.c | 4 ++--
13
2 files changed, 25 insertions(+), 25 deletions(-)
25
target/riscv/crypto_helper.c | 34 ++++------------------------------
26
3 files changed, 13 insertions(+), 32 deletions(-)
14
27
15
diff --git a/docs/system/riscv/microchip-icicle-kit.rst b/docs/system/riscv/microchip-icicle-kit.rst
28
diff --git a/include/crypto/aes.h b/include/crypto/aes.h
16
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
17
--- a/docs/system/riscv/microchip-icicle-kit.rst
30
--- a/include/crypto/aes.h
18
+++ b/docs/system/riscv/microchip-icicle-kit.rst
31
+++ b/include/crypto/aes.h
19
@@ -XXX,XX +XXX,XX @@ Supported devices
32
@@ -XXX,XX +XXX,XX @@ void AES_decrypt(const unsigned char *in, unsigned char *out,
20
33
extern const uint8_t AES_sbox[256];
21
The ``microchip-icicle-kit`` machine supports the following devices:
34
extern const uint8_t AES_isbox[256];
22
35
23
- * 1 E51 core
36
+/*
24
- * 4 U54 cores
37
+AES_Te0[x] = S [x].[02, 01, 01, 03];
25
- * Core Level Interruptor (CLINT)
38
+AES_Td0[x] = Si[x].[0e, 09, 0d, 0b];
26
- * Platform-Level Interrupt Controller (PLIC)
39
+*/
27
- * L2 Loosely Integrated Memory (L2-LIM)
40
+
28
- * DDR memory controller
41
+extern const uint32_t AES_Te0[256], AES_Td0[256];
29
- * 5 MMUARTs
42
+
30
- * 1 DMA controller
43
#endif
31
- * 2 GEM Ethernet controllers
44
diff --git a/crypto/aes.c b/crypto/aes.c
32
- * 1 SDHC storage controller
33
+* 1 E51 core
34
+* 4 U54 cores
35
+* Core Level Interruptor (CLINT)
36
+* Platform-Level Interrupt Controller (PLIC)
37
+* L2 Loosely Integrated Memory (L2-LIM)
38
+* DDR memory controller
39
+* 5 MMUARTs
40
+* 1 DMA controller
41
+* 2 GEM Ethernet controllers
42
+* 1 SDHC storage controller
43
44
Boot options
45
------------
46
diff --git a/docs/system/riscv/sifive_u.rst b/docs/system/riscv/sifive_u.rst
47
index XXXXXXX..XXXXXXX 100644
45
index XXXXXXX..XXXXXXX 100644
48
--- a/docs/system/riscv/sifive_u.rst
46
--- a/crypto/aes.c
49
+++ b/docs/system/riscv/sifive_u.rst
47
+++ b/crypto/aes.c
50
@@ -XXX,XX +XXX,XX @@ Supported devices
48
@@ -XXX,XX +XXX,XX @@ AES_Td3[x] = Si[x].[09, 0d, 0b, 0e];
51
49
AES_Td4[x] = Si[x].[01, 01, 01, 01];
52
The ``sifive_u`` machine supports the following devices:
50
*/
53
51
54
- * 1 E51 / E31 core
52
-static const uint32_t AES_Te0[256] = {
55
- * Up to 4 U54 / U34 cores
53
+const uint32_t AES_Te0[256] = {
56
- * Core Level Interruptor (CLINT)
54
0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
57
- * Platform-Level Interrupt Controller (PLIC)
55
0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
58
- * Power, Reset, Clock, Interrupt (PRCI)
56
0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
59
- * L2 Loosely Integrated Memory (L2-LIM)
57
@@ -XXX,XX +XXX,XX @@ static const uint32_t AES_Te4[256] = {
60
- * DDR memory controller
58
0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U,
61
- * 2 UARTs
59
};
62
- * 1 GEM Ethernet controller
60
63
- * 1 GPIO controller
61
-static const uint32_t AES_Td0[256] = {
64
- * 1 One-Time Programmable (OTP) memory with stored serial number
62
+const uint32_t AES_Td0[256] = {
65
- * 1 DMA controller
63
0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,
66
- * 2 QSPI controllers
64
0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,
67
- * 1 ISSI 25WP256 flash
65
0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,
68
- * 1 SD card in SPI mode
66
diff --git a/target/riscv/crypto_helper.c b/target/riscv/crypto_helper.c
69
+* 1 E51 / E31 core
67
index XXXXXXX..XXXXXXX 100644
70
+* Up to 4 U54 / U34 cores
68
--- a/target/riscv/crypto_helper.c
71
+* Core Level Interruptor (CLINT)
69
+++ b/target/riscv/crypto_helper.c
72
+* Platform-Level Interrupt Controller (PLIC)
70
@@ -XXX,XX +XXX,XX @@
73
+* Power, Reset, Clock, Interrupt (PRCI)
71
#include "crypto/aes-round.h"
74
+* L2 Loosely Integrated Memory (L2-LIM)
72
#include "crypto/sm4.h"
75
+* DDR memory controller
73
76
+* 2 UARTs
74
-#define AES_XTIME(a) \
77
+* 1 GEM Ethernet controller
75
- ((a << 1) ^ ((a & 0x80) ? 0x1b : 0))
78
+* 1 GPIO controller
76
-
79
+* 1 One-Time Programmable (OTP) memory with stored serial number
77
-#define AES_GFMUL(a, b) (( \
80
+* 1 DMA controller
78
- (((b) & 0x1) ? (a) : 0) ^ \
81
+* 2 QSPI controllers
79
- (((b) & 0x2) ? AES_XTIME(a) : 0) ^ \
82
+* 1 ISSI 25WP256 flash
80
- (((b) & 0x4) ? AES_XTIME(AES_XTIME(a)) : 0) ^ \
83
+* 1 SD card in SPI mode
81
- (((b) & 0x8) ? AES_XTIME(AES_XTIME(AES_XTIME(a))) : 0)) & 0xFF)
84
82
-
85
Please note the real world HiFive Unleashed board has a fixed configuration of
83
-static inline uint32_t aes_mixcolumn_byte(uint8_t x, bool fwd)
86
1 E51 core and 4 U54 core combination and the RISC-V core boots in 64-bit mode.
84
-{
85
- uint32_t u;
86
-
87
- if (fwd) {
88
- u = (AES_GFMUL(x, 3) << 24) | (x << 16) | (x << 8) |
89
- (AES_GFMUL(x, 2) << 0);
90
- } else {
91
- u = (AES_GFMUL(x, 0xb) << 24) | (AES_GFMUL(x, 0xd) << 16) |
92
- (AES_GFMUL(x, 0x9) << 8) | (AES_GFMUL(x, 0xe) << 0);
93
- }
94
- return u;
95
-}
96
-
97
#define sext32_xlen(x) (target_ulong)(int32_t)(x)
98
99
static inline target_ulong aes32_operation(target_ulong shamt,
100
@@ -XXX,XX +XXX,XX @@ static inline target_ulong aes32_operation(target_ulong shamt,
101
bool enc, bool mix)
102
{
103
uint8_t si = rs2 >> shamt;
104
- uint8_t so;
105
uint32_t mixed;
106
target_ulong res;
107
108
if (enc) {
109
- so = AES_sbox[si];
110
if (mix) {
111
- mixed = aes_mixcolumn_byte(so, true);
112
+ mixed = be32_to_cpu(AES_Te0[si]);
113
} else {
114
- mixed = so;
115
+ mixed = AES_sbox[si];
116
}
117
} else {
118
- so = AES_isbox[si];
119
if (mix) {
120
- mixed = aes_mixcolumn_byte(so, false);
121
+ mixed = be32_to_cpu(AES_Td0[si]);
122
} else {
123
- mixed = so;
124
+ mixed = AES_isbox[si];
125
}
126
}
127
mixed = rol32(mixed, shamt);
87
--
128
--
88
2.31.1
129
2.41.0
89
130
90
131
diff view generated by jsdifflib
1
From: Kito Cheng <kito.cheng@sifive.com>
1
From: Kiran Ostrolenk <kiran.ostrolenk@codethink.co.uk>
2
2
3
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
3
Take some functions/macros out of `vector_helper` and put them in a new
4
Signed-off-by: Frank Chang <frank.chang@sifive.com>
4
module called `vector_internals`. This ensures they can be used by both
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
vector and vector-crypto helpers (latter implemented in proceeding
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
commits).
7
Message-id: 20210505160620.15723-3-frank.chang@sifive.com
7
8
Signed-off-by: Kiran Ostrolenk <kiran.ostrolenk@codethink.co.uk>
9
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
10
Signed-off-by: Max Chou <max.chou@sifive.com>
11
Acked-by: Alistair Francis <alistair.francis@wdc.com>
12
Message-ID: <20230711165917.2629866-2-max.chou@sifive.com>
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
13
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
---
14
---
10
target/riscv/cpu.h | 1 +
15
target/riscv/vector_internals.h | 182 +++++++++++++++++++++++++++++
11
target/riscv/insn32.decode | 11 ++++++-
16
target/riscv/vector_helper.c | 201 +-------------------------------
12
target/riscv/translate.c | 38 +++++++++++++++++++++
17
target/riscv/vector_internals.c | 81 +++++++++++++
13
target/riscv/insn_trans/trans_rvb.c.inc | 44 +++++++++++++++++++++++++
18
target/riscv/meson.build | 1 +
14
4 files changed, 93 insertions(+), 1 deletion(-)
19
4 files changed, 265 insertions(+), 200 deletions(-)
15
create mode 100644 target/riscv/insn_trans/trans_rvb.c.inc
20
create mode 100644 target/riscv/vector_internals.h
21
create mode 100644 target/riscv/vector_internals.c
16
22
17
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
23
diff --git a/target/riscv/vector_internals.h b/target/riscv/vector_internals.h
18
index XXXXXXX..XXXXXXX 100644
19
--- a/target/riscv/cpu.h
20
+++ b/target/riscv/cpu.h
21
@@ -XXX,XX +XXX,XX @@
22
#define RVS RV('S')
23
#define RVU RV('U')
24
#define RVH RV('H')
25
+#define RVB RV('B')
26
27
/* S extension denotes that Supervisor mode exists, however it is possible
28
to have a core that support S mode but does not have an MMU and there
29
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
30
index XXXXXXX..XXXXXXX 100644
31
--- a/target/riscv/insn32.decode
32
+++ b/target/riscv/insn32.decode
33
@@ -XXX,XX +XXX,XX @@
34
&i imm rs1 rd
35
&j imm rd
36
&r rd rs1 rs2
37
+&r2 rd rs1
38
&s imm rs1 rs2
39
&u imm rd
40
&shift shamt rs1 rd
41
@@ -XXX,XX +XXX,XX @@
42
@r4_rm ..... .. ..... ..... ... ..... ....... %rs3 %rs2 %rs1 %rm %rd
43
@r_rm ....... ..... ..... ... ..... ....... %rs2 %rs1 %rm %rd
44
@r2_rm ....... ..... ..... ... ..... ....... %rs1 %rm %rd
45
-@r2 ....... ..... ..... ... ..... ....... %rs1 %rd
46
+@r2 ....... ..... ..... ... ..... ....... &r2 %rs1 %rd
47
@r2_nfvm ... ... vm:1 ..... ..... ... ..... ....... &r2nfvm %nf %rs1 %rd
48
@r2_vm ...... vm:1 ..... ..... ... ..... ....... &rmr %rs2 %rd
49
@r1_vm ...... vm:1 ..... ..... ... ..... ....... %rd
50
@@ -XXX,XX +XXX,XX @@ vamomind_v 10000 . . ..... ..... 111 ..... 0101111 @r_wdvm
51
vamomaxd_v 10100 . . ..... ..... 111 ..... 0101111 @r_wdvm
52
vamominud_v 11000 . . ..... ..... 111 ..... 0101111 @r_wdvm
53
vamomaxud_v 11100 . . ..... ..... 111 ..... 0101111 @r_wdvm
54
+
55
+# *** RV32B Standard Extension ***
56
+clz 011000 000000 ..... 001 ..... 0010011 @r2
57
+ctz 011000 000001 ..... 001 ..... 0010011 @r2
58
+
59
+# *** RV64B Standard Extension (in addition to RV32B) ***
60
+clzw 0110000 00000 ..... 001 ..... 0011011 @r2
61
+ctzw 0110000 00001 ..... 001 ..... 0011011 @r2
62
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
63
index XXXXXXX..XXXXXXX 100644
64
--- a/target/riscv/translate.c
65
+++ b/target/riscv/translate.c
66
@@ -XXX,XX +XXX,XX @@ static bool gen_arith_div_uw(DisasContext *ctx, arg_r *a,
67
return true;
68
}
69
70
+static void gen_ctzw(TCGv ret, TCGv arg1)
71
+{
72
+ tcg_gen_ori_tl(ret, arg1, (target_ulong)MAKE_64BIT_MASK(32, 32));
73
+ tcg_gen_ctzi_tl(ret, ret, 64);
74
+}
75
+
76
+static void gen_clzw(TCGv ret, TCGv arg1)
77
+{
78
+ tcg_gen_ext32u_tl(ret, arg1);
79
+ tcg_gen_clzi_tl(ret, ret, 64);
80
+ tcg_gen_subi_tl(ret, ret, 32);
81
+}
82
+
83
static bool gen_arith(DisasContext *ctx, arg_r *a,
84
void(*func)(TCGv, TCGv, TCGv))
85
{
86
@@ -XXX,XX +XXX,XX @@ static uint32_t opcode_at(DisasContextBase *dcbase, target_ulong pc)
87
return cpu_ldl_code(env, pc);
88
}
89
90
+static void gen_ctz(TCGv ret, TCGv arg1)
91
+{
92
+ tcg_gen_ctzi_tl(ret, arg1, TARGET_LONG_BITS);
93
+}
94
+
95
+static void gen_clz(TCGv ret, TCGv arg1)
96
+{
97
+ tcg_gen_clzi_tl(ret, arg1, TARGET_LONG_BITS);
98
+}
99
+
100
+static bool gen_unary(DisasContext *ctx, arg_r2 *a,
101
+ void(*func)(TCGv, TCGv))
102
+{
103
+ TCGv source = tcg_temp_new();
104
+
105
+ gen_get_gpr(source, a->rs1);
106
+
107
+ (*func)(source, source);
108
+
109
+ gen_set_gpr(a->rd, source);
110
+ tcg_temp_free(source);
111
+ return true;
112
+}
113
+
114
/* Include insn module translation function */
115
#include "insn_trans/trans_rvi.c.inc"
116
#include "insn_trans/trans_rvm.c.inc"
117
@@ -XXX,XX +XXX,XX @@ static uint32_t opcode_at(DisasContextBase *dcbase, target_ulong pc)
118
#include "insn_trans/trans_rvd.c.inc"
119
#include "insn_trans/trans_rvh.c.inc"
120
#include "insn_trans/trans_rvv.c.inc"
121
+#include "insn_trans/trans_rvb.c.inc"
122
#include "insn_trans/trans_privileged.c.inc"
123
124
/* Include the auto-generated decoder for 16 bit insn */
125
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
126
new file mode 100644
24
new file mode 100644
127
index XXXXXXX..XXXXXXX
25
index XXXXXXX..XXXXXXX
128
--- /dev/null
26
--- /dev/null
129
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
27
+++ b/target/riscv/vector_internals.h
130
@@ -XXX,XX +XXX,XX @@
28
@@ -XXX,XX +XXX,XX @@
131
+/*
29
+/*
132
+ * RISC-V translation routines for the RVB Standard Extension.
30
+ * RISC-V Vector Extension Internals
133
+ *
31
+ *
134
+ * Copyright (c) 2020 Kito Cheng, kito.cheng@sifive.com
32
+ * Copyright (c) 2020 T-Head Semiconductor Co., Ltd. All rights reserved.
135
+ * Copyright (c) 2020 Frank Chang, frank.chang@sifive.com
136
+ *
33
+ *
137
+ * This program is free software; you can redistribute it and/or modify it
34
+ * This program is free software; you can redistribute it and/or modify it
138
+ * under the terms and conditions of the GNU General Public License,
35
+ * under the terms and conditions of the GNU General Public License,
139
+ * version 2 or later, as published by the Free Software Foundation.
36
+ * version 2 or later, as published by the Free Software Foundation.
140
+ *
37
+ *
...
...
145
+ *
42
+ *
146
+ * You should have received a copy of the GNU General Public License along with
43
+ * You should have received a copy of the GNU General Public License along with
147
+ * this program. If not, see <http://www.gnu.org/licenses/>.
44
+ * this program. If not, see <http://www.gnu.org/licenses/>.
148
+ */
45
+ */
149
+
46
+
150
+static bool trans_clz(DisasContext *ctx, arg_clz *a)
47
+#ifndef TARGET_RISCV_VECTOR_INTERNALS_H
151
+{
48
+#define TARGET_RISCV_VECTOR_INTERNALS_H
152
+ REQUIRE_EXT(ctx, RVB);
49
+
153
+ return gen_unary(ctx, a, gen_clz);
50
+#include "qemu/osdep.h"
154
+}
51
+#include "qemu/bitops.h"
155
+
52
+#include "cpu.h"
156
+static bool trans_ctz(DisasContext *ctx, arg_ctz *a)
53
+#include "tcg/tcg-gvec-desc.h"
157
+{
54
+#include "internals.h"
158
+ REQUIRE_EXT(ctx, RVB);
55
+
159
+ return gen_unary(ctx, a, gen_ctz);
56
+static inline uint32_t vext_nf(uint32_t desc)
160
+}
57
+{
161
+
58
+ return FIELD_EX32(simd_data(desc), VDATA, NF);
162
+static bool trans_clzw(DisasContext *ctx, arg_clzw *a)
59
+}
163
+{
60
+
164
+ REQUIRE_64BIT(ctx);
61
+/*
165
+ REQUIRE_EXT(ctx, RVB);
62
+ * Note that vector data is stored in host-endian 64-bit chunks,
166
+ return gen_unary(ctx, a, gen_clzw);
63
+ * so addressing units smaller than that needs a host-endian fixup.
167
+}
64
+ */
168
+
65
+#if HOST_BIG_ENDIAN
169
+static bool trans_ctzw(DisasContext *ctx, arg_ctzw *a)
66
+#define H1(x) ((x) ^ 7)
170
+{
67
+#define H1_2(x) ((x) ^ 6)
171
+ REQUIRE_64BIT(ctx);
68
+#define H1_4(x) ((x) ^ 4)
172
+ REQUIRE_EXT(ctx, RVB);
69
+#define H2(x) ((x) ^ 3)
173
+ return gen_unary(ctx, a, gen_ctzw);
70
+#define H4(x) ((x) ^ 1)
174
+}
71
+#define H8(x) ((x))
72
+#else
73
+#define H1(x) (x)
74
+#define H1_2(x) (x)
75
+#define H1_4(x) (x)
76
+#define H2(x) (x)
77
+#define H4(x) (x)
78
+#define H8(x) (x)
79
+#endif
80
+
81
+/*
82
+ * Encode LMUL to lmul as following:
83
+ * LMUL vlmul lmul
84
+ * 1 000 0
85
+ * 2 001 1
86
+ * 4 010 2
87
+ * 8 011 3
88
+ * - 100 -
89
+ * 1/8 101 -3
90
+ * 1/4 110 -2
91
+ * 1/2 111 -1
92
+ */
93
+static inline int32_t vext_lmul(uint32_t desc)
94
+{
95
+ return sextract32(FIELD_EX32(simd_data(desc), VDATA, LMUL), 0, 3);
96
+}
97
+
98
+static inline uint32_t vext_vm(uint32_t desc)
99
+{
100
+ return FIELD_EX32(simd_data(desc), VDATA, VM);
101
+}
102
+
103
+static inline uint32_t vext_vma(uint32_t desc)
104
+{
105
+ return FIELD_EX32(simd_data(desc), VDATA, VMA);
106
+}
107
+
108
+static inline uint32_t vext_vta(uint32_t desc)
109
+{
110
+ return FIELD_EX32(simd_data(desc), VDATA, VTA);
111
+}
112
+
113
+static inline uint32_t vext_vta_all_1s(uint32_t desc)
114
+{
115
+ return FIELD_EX32(simd_data(desc), VDATA, VTA_ALL_1S);
116
+}
117
+
118
+/*
119
+ * Earlier designs (pre-0.9) had a varying number of bits
120
+ * per mask value (MLEN). In the 0.9 design, MLEN=1.
121
+ * (Section 4.5)
122
+ */
123
+static inline int vext_elem_mask(void *v0, int index)
124
+{
125
+ int idx = index / 64;
126
+ int pos = index % 64;
127
+ return (((uint64_t *)v0)[idx] >> pos) & 1;
128
+}
129
+
130
+/*
131
+ * Get number of total elements, including prestart, body and tail elements.
132
+ * Note that when LMUL < 1, the tail includes the elements past VLMAX that
133
+ * are held in the same vector register.
134
+ */
135
+static inline uint32_t vext_get_total_elems(CPURISCVState *env, uint32_t desc,
136
+ uint32_t esz)
137
+{
138
+ uint32_t vlenb = simd_maxsz(desc);
139
+ uint32_t sew = 1 << FIELD_EX64(env->vtype, VTYPE, VSEW);
140
+ int8_t emul = ctzl(esz) - ctzl(sew) + vext_lmul(desc) < 0 ? 0 :
141
+ ctzl(esz) - ctzl(sew) + vext_lmul(desc);
142
+ return (vlenb << emul) / esz;
143
+}
144
+
145
+/* set agnostic elements to 1s */
146
+void vext_set_elems_1s(void *base, uint32_t is_agnostic, uint32_t cnt,
147
+ uint32_t tot);
148
+
149
+/* expand macro args before macro */
150
+#define RVVCALL(macro, ...) macro(__VA_ARGS__)
151
+
152
+/* (TD, T1, T2, TX1, TX2) */
153
+#define OP_UUU_B uint8_t, uint8_t, uint8_t, uint8_t, uint8_t
154
+#define OP_UUU_H uint16_t, uint16_t, uint16_t, uint16_t, uint16_t
155
+#define OP_UUU_W uint32_t, uint32_t, uint32_t, uint32_t, uint32_t
156
+#define OP_UUU_D uint64_t, uint64_t, uint64_t, uint64_t, uint64_t
157
+
158
+/* operation of two vector elements */
159
+typedef void opivv2_fn(void *vd, void *vs1, void *vs2, int i);
160
+
161
+#define OPIVV2(NAME, TD, T1, T2, TX1, TX2, HD, HS1, HS2, OP) \
162
+static void do_##NAME(void *vd, void *vs1, void *vs2, int i) \
163
+{ \
164
+ TX1 s1 = *((T1 *)vs1 + HS1(i)); \
165
+ TX2 s2 = *((T2 *)vs2 + HS2(i)); \
166
+ *((TD *)vd + HD(i)) = OP(s2, s1); \
167
+}
168
+
169
+void do_vext_vv(void *vd, void *v0, void *vs1, void *vs2,
170
+ CPURISCVState *env, uint32_t desc,
171
+ opivv2_fn *fn, uint32_t esz);
172
+
173
+/* generate the helpers for OPIVV */
174
+#define GEN_VEXT_VV(NAME, ESZ) \
175
+void HELPER(NAME)(void *vd, void *v0, void *vs1, \
176
+ void *vs2, CPURISCVState *env, \
177
+ uint32_t desc) \
178
+{ \
179
+ do_vext_vv(vd, v0, vs1, vs2, env, desc, \
180
+ do_##NAME, ESZ); \
181
+}
182
+
183
+typedef void opivx2_fn(void *vd, target_long s1, void *vs2, int i);
184
+
185
+/*
186
+ * (T1)s1 gives the real operator type.
187
+ * (TX1)(T1)s1 expands the operator type of widen or narrow operations.
188
+ */
189
+#define OPIVX2(NAME, TD, T1, T2, TX1, TX2, HD, HS2, OP) \
190
+static void do_##NAME(void *vd, target_long s1, void *vs2, int i) \
191
+{ \
192
+ TX2 s2 = *((T2 *)vs2 + HS2(i)); \
193
+ *((TD *)vd + HD(i)) = OP(s2, (TX1)(T1)s1); \
194
+}
195
+
196
+void do_vext_vx(void *vd, void *v0, target_long s1, void *vs2,
197
+ CPURISCVState *env, uint32_t desc,
198
+ opivx2_fn fn, uint32_t esz);
199
+
200
+/* generate the helpers for OPIVX */
201
+#define GEN_VEXT_VX(NAME, ESZ) \
202
+void HELPER(NAME)(void *vd, void *v0, target_ulong s1, \
203
+ void *vs2, CPURISCVState *env, \
204
+ uint32_t desc) \
205
+{ \
206
+ do_vext_vx(vd, v0, s1, vs2, env, desc, \
207
+ do_##NAME, ESZ); \
208
+}
209
+
210
+#endif /* TARGET_RISCV_VECTOR_INTERNALS_H */
211
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
212
index XXXXXXX..XXXXXXX 100644
213
--- a/target/riscv/vector_helper.c
214
+++ b/target/riscv/vector_helper.c
215
@@ -XXX,XX +XXX,XX @@
216
#include "fpu/softfloat.h"
217
#include "tcg/tcg-gvec-desc.h"
218
#include "internals.h"
219
+#include "vector_internals.h"
220
#include <math.h>
221
222
target_ulong HELPER(vsetvl)(CPURISCVState *env, target_ulong s1,
223
@@ -XXX,XX +XXX,XX @@ target_ulong HELPER(vsetvl)(CPURISCVState *env, target_ulong s1,
224
return vl;
225
}
226
227
-/*
228
- * Note that vector data is stored in host-endian 64-bit chunks,
229
- * so addressing units smaller than that needs a host-endian fixup.
230
- */
231
-#if HOST_BIG_ENDIAN
232
-#define H1(x) ((x) ^ 7)
233
-#define H1_2(x) ((x) ^ 6)
234
-#define H1_4(x) ((x) ^ 4)
235
-#define H2(x) ((x) ^ 3)
236
-#define H4(x) ((x) ^ 1)
237
-#define H8(x) ((x))
238
-#else
239
-#define H1(x) (x)
240
-#define H1_2(x) (x)
241
-#define H1_4(x) (x)
242
-#define H2(x) (x)
243
-#define H4(x) (x)
244
-#define H8(x) (x)
245
-#endif
246
-
247
-static inline uint32_t vext_nf(uint32_t desc)
248
-{
249
- return FIELD_EX32(simd_data(desc), VDATA, NF);
250
-}
251
-
252
-static inline uint32_t vext_vm(uint32_t desc)
253
-{
254
- return FIELD_EX32(simd_data(desc), VDATA, VM);
255
-}
256
-
257
-/*
258
- * Encode LMUL to lmul as following:
259
- * LMUL vlmul lmul
260
- * 1 000 0
261
- * 2 001 1
262
- * 4 010 2
263
- * 8 011 3
264
- * - 100 -
265
- * 1/8 101 -3
266
- * 1/4 110 -2
267
- * 1/2 111 -1
268
- */
269
-static inline int32_t vext_lmul(uint32_t desc)
270
-{
271
- return sextract32(FIELD_EX32(simd_data(desc), VDATA, LMUL), 0, 3);
272
-}
273
-
274
-static inline uint32_t vext_vta(uint32_t desc)
275
-{
276
- return FIELD_EX32(simd_data(desc), VDATA, VTA);
277
-}
278
-
279
-static inline uint32_t vext_vma(uint32_t desc)
280
-{
281
- return FIELD_EX32(simd_data(desc), VDATA, VMA);
282
-}
283
-
284
-static inline uint32_t vext_vta_all_1s(uint32_t desc)
285
-{
286
- return FIELD_EX32(simd_data(desc), VDATA, VTA_ALL_1S);
287
-}
288
-
289
/*
290
* Get the maximum number of elements can be operated.
291
*
292
@@ -XXX,XX +XXX,XX @@ static inline uint32_t vext_max_elems(uint32_t desc, uint32_t log2_esz)
293
return scale < 0 ? vlenb >> -scale : vlenb << scale;
294
}
295
296
-/*
297
- * Get number of total elements, including prestart, body and tail elements.
298
- * Note that when LMUL < 1, the tail includes the elements past VLMAX that
299
- * are held in the same vector register.
300
- */
301
-static inline uint32_t vext_get_total_elems(CPURISCVState *env, uint32_t desc,
302
- uint32_t esz)
303
-{
304
- uint32_t vlenb = simd_maxsz(desc);
305
- uint32_t sew = 1 << FIELD_EX64(env->vtype, VTYPE, VSEW);
306
- int8_t emul = ctzl(esz) - ctzl(sew) + vext_lmul(desc) < 0 ? 0 :
307
- ctzl(esz) - ctzl(sew) + vext_lmul(desc);
308
- return (vlenb << emul) / esz;
309
-}
310
-
311
static inline target_ulong adjust_addr(CPURISCVState *env, target_ulong addr)
312
{
313
return (addr & ~env->cur_pmmask) | env->cur_pmbase;
314
@@ -XXX,XX +XXX,XX @@ static void probe_pages(CPURISCVState *env, target_ulong addr,
315
}
316
}
317
318
-/* set agnostic elements to 1s */
319
-static void vext_set_elems_1s(void *base, uint32_t is_agnostic, uint32_t cnt,
320
- uint32_t tot)
321
-{
322
- if (is_agnostic == 0) {
323
- /* policy undisturbed */
324
- return;
325
- }
326
- if (tot - cnt == 0) {
327
- return;
328
- }
329
- memset(base + cnt, -1, tot - cnt);
330
-}
331
-
332
static inline void vext_set_elem_mask(void *v0, int index,
333
uint8_t value)
334
{
335
@@ -XXX,XX +XXX,XX @@ static inline void vext_set_elem_mask(void *v0, int index,
336
((uint64_t *)v0)[idx] = deposit64(old, pos, 1, value);
337
}
338
339
-/*
340
- * Earlier designs (pre-0.9) had a varying number of bits
341
- * per mask value (MLEN). In the 0.9 design, MLEN=1.
342
- * (Section 4.5)
343
- */
344
-static inline int vext_elem_mask(void *v0, int index)
345
-{
346
- int idx = index / 64;
347
- int pos = index % 64;
348
- return (((uint64_t *)v0)[idx] >> pos) & 1;
349
-}
350
-
351
/* elements operations for load and store */
352
typedef void vext_ldst_elem_fn(CPURISCVState *env, abi_ptr addr,
353
uint32_t idx, void *vd, uintptr_t retaddr);
354
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_ST_WHOLE(vs8r_v, int8_t, ste_b)
355
* Vector Integer Arithmetic Instructions
356
*/
357
358
-/* expand macro args before macro */
359
-#define RVVCALL(macro, ...) macro(__VA_ARGS__)
360
-
361
/* (TD, T1, T2, TX1, TX2) */
362
#define OP_SSS_B int8_t, int8_t, int8_t, int8_t, int8_t
363
#define OP_SSS_H int16_t, int16_t, int16_t, int16_t, int16_t
364
#define OP_SSS_W int32_t, int32_t, int32_t, int32_t, int32_t
365
#define OP_SSS_D int64_t, int64_t, int64_t, int64_t, int64_t
366
-#define OP_UUU_B uint8_t, uint8_t, uint8_t, uint8_t, uint8_t
367
-#define OP_UUU_H uint16_t, uint16_t, uint16_t, uint16_t, uint16_t
368
-#define OP_UUU_W uint32_t, uint32_t, uint32_t, uint32_t, uint32_t
369
-#define OP_UUU_D uint64_t, uint64_t, uint64_t, uint64_t, uint64_t
370
#define OP_SUS_B int8_t, uint8_t, int8_t, uint8_t, int8_t
371
#define OP_SUS_H int16_t, uint16_t, int16_t, uint16_t, int16_t
372
#define OP_SUS_W int32_t, uint32_t, int32_t, uint32_t, int32_t
373
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_ST_WHOLE(vs8r_v, int8_t, ste_b)
374
#define NOP_UUU_H uint16_t, uint16_t, uint32_t, uint16_t, uint32_t
375
#define NOP_UUU_W uint32_t, uint32_t, uint64_t, uint32_t, uint64_t
376
377
-/* operation of two vector elements */
378
-typedef void opivv2_fn(void *vd, void *vs1, void *vs2, int i);
379
-
380
-#define OPIVV2(NAME, TD, T1, T2, TX1, TX2, HD, HS1, HS2, OP) \
381
-static void do_##NAME(void *vd, void *vs1, void *vs2, int i) \
382
-{ \
383
- TX1 s1 = *((T1 *)vs1 + HS1(i)); \
384
- TX2 s2 = *((T2 *)vs2 + HS2(i)); \
385
- *((TD *)vd + HD(i)) = OP(s2, s1); \
386
-}
387
#define DO_SUB(N, M) (N - M)
388
#define DO_RSUB(N, M) (M - N)
389
390
@@ -XXX,XX +XXX,XX @@ RVVCALL(OPIVV2, vsub_vv_h, OP_SSS_H, H2, H2, H2, DO_SUB)
391
RVVCALL(OPIVV2, vsub_vv_w, OP_SSS_W, H4, H4, H4, DO_SUB)
392
RVVCALL(OPIVV2, vsub_vv_d, OP_SSS_D, H8, H8, H8, DO_SUB)
393
394
-static void do_vext_vv(void *vd, void *v0, void *vs1, void *vs2,
395
- CPURISCVState *env, uint32_t desc,
396
- opivv2_fn *fn, uint32_t esz)
397
-{
398
- uint32_t vm = vext_vm(desc);
399
- uint32_t vl = env->vl;
400
- uint32_t total_elems = vext_get_total_elems(env, desc, esz);
401
- uint32_t vta = vext_vta(desc);
402
- uint32_t vma = vext_vma(desc);
403
- uint32_t i;
404
-
405
- for (i = env->vstart; i < vl; i++) {
406
- if (!vm && !vext_elem_mask(v0, i)) {
407
- /* set masked-off elements to 1s */
408
- vext_set_elems_1s(vd, vma, i * esz, (i + 1) * esz);
409
- continue;
410
- }
411
- fn(vd, vs1, vs2, i);
412
- }
413
- env->vstart = 0;
414
- /* set tail elements to 1s */
415
- vext_set_elems_1s(vd, vta, vl * esz, total_elems * esz);
416
-}
417
-
418
-/* generate the helpers for OPIVV */
419
-#define GEN_VEXT_VV(NAME, ESZ) \
420
-void HELPER(NAME)(void *vd, void *v0, void *vs1, \
421
- void *vs2, CPURISCVState *env, \
422
- uint32_t desc) \
423
-{ \
424
- do_vext_vv(vd, v0, vs1, vs2, env, desc, \
425
- do_##NAME, ESZ); \
426
-}
427
-
428
GEN_VEXT_VV(vadd_vv_b, 1)
429
GEN_VEXT_VV(vadd_vv_h, 2)
430
GEN_VEXT_VV(vadd_vv_w, 4)
431
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_VV(vsub_vv_h, 2)
432
GEN_VEXT_VV(vsub_vv_w, 4)
433
GEN_VEXT_VV(vsub_vv_d, 8)
434
435
-typedef void opivx2_fn(void *vd, target_long s1, void *vs2, int i);
436
-
437
-/*
438
- * (T1)s1 gives the real operator type.
439
- * (TX1)(T1)s1 expands the operator type of widen or narrow operations.
440
- */
441
-#define OPIVX2(NAME, TD, T1, T2, TX1, TX2, HD, HS2, OP) \
442
-static void do_##NAME(void *vd, target_long s1, void *vs2, int i) \
443
-{ \
444
- TX2 s2 = *((T2 *)vs2 + HS2(i)); \
445
- *((TD *)vd + HD(i)) = OP(s2, (TX1)(T1)s1); \
446
-}
447
448
RVVCALL(OPIVX2, vadd_vx_b, OP_SSS_B, H1, H1, DO_ADD)
449
RVVCALL(OPIVX2, vadd_vx_h, OP_SSS_H, H2, H2, DO_ADD)
450
@@ -XXX,XX +XXX,XX @@ RVVCALL(OPIVX2, vrsub_vx_h, OP_SSS_H, H2, H2, DO_RSUB)
451
RVVCALL(OPIVX2, vrsub_vx_w, OP_SSS_W, H4, H4, DO_RSUB)
452
RVVCALL(OPIVX2, vrsub_vx_d, OP_SSS_D, H8, H8, DO_RSUB)
453
454
-static void do_vext_vx(void *vd, void *v0, target_long s1, void *vs2,
455
- CPURISCVState *env, uint32_t desc,
456
- opivx2_fn fn, uint32_t esz)
457
-{
458
- uint32_t vm = vext_vm(desc);
459
- uint32_t vl = env->vl;
460
- uint32_t total_elems = vext_get_total_elems(env, desc, esz);
461
- uint32_t vta = vext_vta(desc);
462
- uint32_t vma = vext_vma(desc);
463
- uint32_t i;
464
-
465
- for (i = env->vstart; i < vl; i++) {
466
- if (!vm && !vext_elem_mask(v0, i)) {
467
- /* set masked-off elements to 1s */
468
- vext_set_elems_1s(vd, vma, i * esz, (i + 1) * esz);
469
- continue;
470
- }
471
- fn(vd, s1, vs2, i);
472
- }
473
- env->vstart = 0;
474
- /* set tail elements to 1s */
475
- vext_set_elems_1s(vd, vta, vl * esz, total_elems * esz);
476
-}
477
-
478
-/* generate the helpers for OPIVX */
479
-#define GEN_VEXT_VX(NAME, ESZ) \
480
-void HELPER(NAME)(void *vd, void *v0, target_ulong s1, \
481
- void *vs2, CPURISCVState *env, \
482
- uint32_t desc) \
483
-{ \
484
- do_vext_vx(vd, v0, s1, vs2, env, desc, \
485
- do_##NAME, ESZ); \
486
-}
487
-
488
GEN_VEXT_VX(vadd_vx_b, 1)
489
GEN_VEXT_VX(vadd_vx_h, 2)
490
GEN_VEXT_VX(vadd_vx_w, 4)
491
diff --git a/target/riscv/vector_internals.c b/target/riscv/vector_internals.c
492
new file mode 100644
493
index XXXXXXX..XXXXXXX
494
--- /dev/null
495
+++ b/target/riscv/vector_internals.c
496
@@ -XXX,XX +XXX,XX @@
497
+/*
498
+ * RISC-V Vector Extension Internals
499
+ *
500
+ * Copyright (c) 2020 T-Head Semiconductor Co., Ltd. All rights reserved.
501
+ *
502
+ * This program is free software; you can redistribute it and/or modify it
503
+ * under the terms and conditions of the GNU General Public License,
504
+ * version 2 or later, as published by the Free Software Foundation.
505
+ *
506
+ * This program is distributed in the hope it will be useful, but WITHOUT
507
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
508
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
509
+ * more details.
510
+ *
511
+ * You should have received a copy of the GNU General Public License along with
512
+ * this program. If not, see <http://www.gnu.org/licenses/>.
513
+ */
514
+
515
+#include "vector_internals.h"
516
+
517
+/* set agnostic elements to 1s */
518
+void vext_set_elems_1s(void *base, uint32_t is_agnostic, uint32_t cnt,
519
+ uint32_t tot)
520
+{
521
+ if (is_agnostic == 0) {
522
+ /* policy undisturbed */
523
+ return;
524
+ }
525
+ if (tot - cnt == 0) {
526
+ return ;
527
+ }
528
+ memset(base + cnt, -1, tot - cnt);
529
+}
530
+
531
+void do_vext_vv(void *vd, void *v0, void *vs1, void *vs2,
532
+ CPURISCVState *env, uint32_t desc,
533
+ opivv2_fn *fn, uint32_t esz)
534
+{
535
+ uint32_t vm = vext_vm(desc);
536
+ uint32_t vl = env->vl;
537
+ uint32_t total_elems = vext_get_total_elems(env, desc, esz);
538
+ uint32_t vta = vext_vta(desc);
539
+ uint32_t vma = vext_vma(desc);
540
+ uint32_t i;
541
+
542
+ for (i = env->vstart; i < vl; i++) {
543
+ if (!vm && !vext_elem_mask(v0, i)) {
544
+ /* set masked-off elements to 1s */
545
+ vext_set_elems_1s(vd, vma, i * esz, (i + 1) * esz);
546
+ continue;
547
+ }
548
+ fn(vd, vs1, vs2, i);
549
+ }
550
+ env->vstart = 0;
551
+ /* set tail elements to 1s */
552
+ vext_set_elems_1s(vd, vta, vl * esz, total_elems * esz);
553
+}
554
+
555
+void do_vext_vx(void *vd, void *v0, target_long s1, void *vs2,
556
+ CPURISCVState *env, uint32_t desc,
557
+ opivx2_fn fn, uint32_t esz)
558
+{
559
+ uint32_t vm = vext_vm(desc);
560
+ uint32_t vl = env->vl;
561
+ uint32_t total_elems = vext_get_total_elems(env, desc, esz);
562
+ uint32_t vta = vext_vta(desc);
563
+ uint32_t vma = vext_vma(desc);
564
+ uint32_t i;
565
+
566
+ for (i = env->vstart; i < vl; i++) {
567
+ if (!vm && !vext_elem_mask(v0, i)) {
568
+ /* set masked-off elements to 1s */
569
+ vext_set_elems_1s(vd, vma, i * esz, (i + 1) * esz);
570
+ continue;
571
+ }
572
+ fn(vd, s1, vs2, i);
573
+ }
574
+ env->vstart = 0;
575
+ /* set tail elements to 1s */
576
+ vext_set_elems_1s(vd, vta, vl * esz, total_elems * esz);
577
+}
578
diff --git a/target/riscv/meson.build b/target/riscv/meson.build
579
index XXXXXXX..XXXXXXX 100644
580
--- a/target/riscv/meson.build
581
+++ b/target/riscv/meson.build
582
@@ -XXX,XX +XXX,XX @@ riscv_ss.add(files(
583
'gdbstub.c',
584
'op_helper.c',
585
'vector_helper.c',
586
+ 'vector_internals.c',
587
'bitmanip_helper.c',
588
'translate.c',
589
'm128_helper.c',
175
--
590
--
176
2.31.1
591
2.41.0
177
178
diff view generated by jsdifflib
1
From: Frank Chang <frank.chang@sifive.com>
1
From: Kiran Ostrolenk <kiran.ostrolenk@codethink.co.uk>
2
2
3
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
3
Refactor the non SEW-specific stuff out of `GEN_OPIVV_TRANS` into
4
Signed-off-by: Frank Chang <frank.chang@sifive.com>
4
function `opivv_trans` (similar to `opivi_trans`). `opivv_trans` will be
5
used in proceeding vector-crypto commits.
6
7
Signed-off-by: Kiran Ostrolenk <kiran.ostrolenk@codethink.co.uk>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Message-id: 20210505160620.15723-10-frank.chang@sifive.com
10
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
11
Signed-off-by: Max Chou <max.chou@sifive.com>
12
Message-ID: <20230711165917.2629866-3-max.chou@sifive.com>
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
13
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
---
14
---
10
target/riscv/insn32.decode | 17 +++++
15
target/riscv/insn_trans/trans_rvv.c.inc | 62 +++++++++++++------------
11
target/riscv/translate.c | 61 ++++++++++++++++
16
1 file changed, 32 insertions(+), 30 deletions(-)
12
target/riscv/insn_trans/trans_rvb.c.inc | 97 +++++++++++++++++++++++++
13
3 files changed, 175 insertions(+)
14
17
15
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
18
diff --git a/target/riscv/insn_trans/trans_rvv.c.inc b/target/riscv/insn_trans/trans_rvv.c.inc
16
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/insn32.decode
20
--- a/target/riscv/insn_trans/trans_rvv.c.inc
18
+++ b/target/riscv/insn32.decode
21
+++ b/target/riscv/insn_trans/trans_rvv.c.inc
19
@@ -XXX,XX +XXX,XX @@ min 0000101 .......... 100 ..... 0110011 @r
22
@@ -XXX,XX +XXX,XX @@ GEN_OPIWX_WIDEN_TRANS(vwadd_wx)
20
minu 0000101 .......... 101 ..... 0110011 @r
23
GEN_OPIWX_WIDEN_TRANS(vwsubu_wx)
21
max 0000101 .......... 110 ..... 0110011 @r
24
GEN_OPIWX_WIDEN_TRANS(vwsub_wx)
22
maxu 0000101 .......... 111 ..... 0110011 @r
25
23
+bset 0010100 .......... 001 ..... 0110011 @r
26
+static bool opivv_trans(uint32_t vd, uint32_t vs1, uint32_t vs2, uint32_t vm,
24
+bclr 0100100 .......... 001 ..... 0110011 @r
27
+ gen_helper_gvec_4_ptr *fn, DisasContext *s)
25
+binv 0110100 .......... 001 ..... 0110011 @r
28
+{
26
+bext 0100100 .......... 101 ..... 0110011 @r
29
+ uint32_t data = 0;
30
+ TCGLabel *over = gen_new_label();
31
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
32
+ tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);
27
+
33
+
28
+bseti 00101. ........... 001 ..... 0010011 @sh
34
+ data = FIELD_DP32(data, VDATA, VM, vm);
29
+bclri 01001. ........... 001 ..... 0010011 @sh
35
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
30
+binvi 01101. ........... 001 ..... 0010011 @sh
36
+ data = FIELD_DP32(data, VDATA, VTA, s->vta);
31
+bexti 01001. ........... 101 ..... 0010011 @sh
37
+ data = FIELD_DP32(data, VDATA, VTA_ALL_1S, s->cfg_vta_all_1s);
32
38
+ data = FIELD_DP32(data, VDATA, VMA, s->vma);
33
# *** RV64B Standard Extension (in addition to RV32B) ***
39
+ tcg_gen_gvec_4_ptr(vreg_ofs(s, vd), vreg_ofs(s, 0), vreg_ofs(s, vs1),
34
clzw 0110000 00000 ..... 001 ..... 0011011 @r2
40
+ vreg_ofs(s, vs2), cpu_env, s->cfg_ptr->vlen / 8,
35
@@ -XXX,XX +XXX,XX @@ cpopw 0110000 00010 ..... 001 ..... 0011011 @r2
41
+ s->cfg_ptr->vlen / 8, data, fn);
36
42
+ mark_vs_dirty(s);
37
packw 0000100 .......... 100 ..... 0111011 @r
43
+ gen_set_label(over);
38
packuw 0100100 .......... 100 ..... 0111011 @r
39
+bsetw 0010100 .......... 001 ..... 0111011 @r
40
+bclrw 0100100 .......... 001 ..... 0111011 @r
41
+binvw 0110100 .......... 001 ..... 0111011 @r
42
+bextw 0100100 .......... 101 ..... 0111011 @r
43
+
44
+bsetiw 0010100 .......... 001 ..... 0011011 @sh5
45
+bclriw 0100100 .......... 001 ..... 0011011 @sh5
46
+binviw 0110100 .......... 001 ..... 0011011 @sh5
47
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
48
index XXXXXXX..XXXXXXX 100644
49
--- a/target/riscv/translate.c
50
+++ b/target/riscv/translate.c
51
@@ -XXX,XX +XXX,XX @@ static void gen_packh(TCGv ret, TCGv arg1, TCGv arg2)
52
tcg_temp_free(t);
53
}
54
55
+static void gen_sbop_mask(TCGv ret, TCGv shamt)
56
+{
57
+ tcg_gen_movi_tl(ret, 1);
58
+ tcg_gen_shl_tl(ret, ret, shamt);
59
+}
60
+
61
+static void gen_bset(TCGv ret, TCGv arg1, TCGv shamt)
62
+{
63
+ TCGv t = tcg_temp_new();
64
+
65
+ gen_sbop_mask(t, shamt);
66
+ tcg_gen_or_tl(ret, arg1, t);
67
+
68
+ tcg_temp_free(t);
69
+}
70
+
71
+static void gen_bclr(TCGv ret, TCGv arg1, TCGv shamt)
72
+{
73
+ TCGv t = tcg_temp_new();
74
+
75
+ gen_sbop_mask(t, shamt);
76
+ tcg_gen_andc_tl(ret, arg1, t);
77
+
78
+ tcg_temp_free(t);
79
+}
80
+
81
+static void gen_binv(TCGv ret, TCGv arg1, TCGv shamt)
82
+{
83
+ TCGv t = tcg_temp_new();
84
+
85
+ gen_sbop_mask(t, shamt);
86
+ tcg_gen_xor_tl(ret, arg1, t);
87
+
88
+ tcg_temp_free(t);
89
+}
90
+
91
+static void gen_bext(TCGv ret, TCGv arg1, TCGv shamt)
92
+{
93
+ tcg_gen_shr_tl(ret, arg1, shamt);
94
+ tcg_gen_andi_tl(ret, ret, 1);
95
+}
96
+
97
static void gen_ctzw(TCGv ret, TCGv arg1)
98
{
99
tcg_gen_ori_tl(ret, arg1, (target_ulong)MAKE_64BIT_MASK(32, 32));
100
@@ -XXX,XX +XXX,XX @@ static bool gen_shifti(DisasContext *ctx, arg_shift *a,
101
return true;
102
}
103
104
+static bool gen_shiftw(DisasContext *ctx, arg_r *a,
105
+ void(*func)(TCGv, TCGv, TCGv))
106
+{
107
+ TCGv source1 = tcg_temp_new();
108
+ TCGv source2 = tcg_temp_new();
109
+
110
+ gen_get_gpr(source1, a->rs1);
111
+ gen_get_gpr(source2, a->rs2);
112
+
113
+ tcg_gen_andi_tl(source2, source2, 31);
114
+ (*func)(source1, source1, source2);
115
+ tcg_gen_ext32s_tl(source1, source1);
116
+
117
+ gen_set_gpr(a->rd, source1);
118
+ tcg_temp_free(source1);
119
+ tcg_temp_free(source2);
120
+ return true;
44
+ return true;
121
+}
45
+}
122
+
46
+
123
static bool gen_shiftiw(DisasContext *ctx, arg_shift *a,
47
/* Vector Integer Add-with-Carry / Subtract-with-Borrow Instructions */
124
void(*func)(TCGv, TCGv, TCGv))
48
/* OPIVV without GVEC IR */
125
{
49
-#define GEN_OPIVV_TRANS(NAME, CHECK) \
126
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
50
-static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
127
index XXXXXXX..XXXXXXX 100644
51
-{ \
128
--- a/target/riscv/insn_trans/trans_rvb.c.inc
52
- if (CHECK(s, a)) { \
129
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
53
- uint32_t data = 0; \
130
@@ -XXX,XX +XXX,XX @@ static bool trans_sext_h(DisasContext *ctx, arg_sext_h *a)
54
- static gen_helper_gvec_4_ptr * const fns[4] = { \
131
return gen_unary(ctx, a, tcg_gen_ext16s_tl);
55
- gen_helper_##NAME##_b, gen_helper_##NAME##_h, \
56
- gen_helper_##NAME##_w, gen_helper_##NAME##_d, \
57
- }; \
58
- TCGLabel *over = gen_new_label(); \
59
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over); \
60
- tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over); \
61
- \
62
- data = FIELD_DP32(data, VDATA, VM, a->vm); \
63
- data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
64
- data = FIELD_DP32(data, VDATA, VTA, s->vta); \
65
- data = \
66
- FIELD_DP32(data, VDATA, VTA_ALL_1S, s->cfg_vta_all_1s);\
67
- data = FIELD_DP32(data, VDATA, VMA, s->vma); \
68
- tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
69
- vreg_ofs(s, a->rs1), \
70
- vreg_ofs(s, a->rs2), cpu_env, \
71
- s->cfg_ptr->vlen / 8, \
72
- s->cfg_ptr->vlen / 8, data, \
73
- fns[s->sew]); \
74
- mark_vs_dirty(s); \
75
- gen_set_label(over); \
76
- return true; \
77
- } \
78
- return false; \
79
+#define GEN_OPIVV_TRANS(NAME, CHECK) \
80
+static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
81
+{ \
82
+ if (CHECK(s, a)) { \
83
+ static gen_helper_gvec_4_ptr * const fns[4] = { \
84
+ gen_helper_##NAME##_b, gen_helper_##NAME##_h, \
85
+ gen_helper_##NAME##_w, gen_helper_##NAME##_d, \
86
+ }; \
87
+ return opivv_trans(a->rd, a->rs1, a->rs2, a->vm, fns[s->sew], s);\
88
+ } \
89
+ return false; \
132
}
90
}
133
91
134
+static bool trans_bset(DisasContext *ctx, arg_bset *a)
92
/*
135
+{
136
+ REQUIRE_EXT(ctx, RVB);
137
+ return gen_shift(ctx, a, gen_bset);
138
+}
139
+
140
+static bool trans_bseti(DisasContext *ctx, arg_bseti *a)
141
+{
142
+ REQUIRE_EXT(ctx, RVB);
143
+ return gen_shifti(ctx, a, gen_bset);
144
+}
145
+
146
+static bool trans_bclr(DisasContext *ctx, arg_bclr *a)
147
+{
148
+ REQUIRE_EXT(ctx, RVB);
149
+ return gen_shift(ctx, a, gen_bclr);
150
+}
151
+
152
+static bool trans_bclri(DisasContext *ctx, arg_bclri *a)
153
+{
154
+ REQUIRE_EXT(ctx, RVB);
155
+ return gen_shifti(ctx, a, gen_bclr);
156
+}
157
+
158
+static bool trans_binv(DisasContext *ctx, arg_binv *a)
159
+{
160
+ REQUIRE_EXT(ctx, RVB);
161
+ return gen_shift(ctx, a, gen_binv);
162
+}
163
+
164
+static bool trans_binvi(DisasContext *ctx, arg_binvi *a)
165
+{
166
+ REQUIRE_EXT(ctx, RVB);
167
+ return gen_shifti(ctx, a, gen_binv);
168
+}
169
+
170
+static bool trans_bext(DisasContext *ctx, arg_bext *a)
171
+{
172
+ REQUIRE_EXT(ctx, RVB);
173
+ return gen_shift(ctx, a, gen_bext);
174
+}
175
+
176
+static bool trans_bexti(DisasContext *ctx, arg_bexti *a)
177
+{
178
+ REQUIRE_EXT(ctx, RVB);
179
+ return gen_shifti(ctx, a, gen_bext);
180
+}
181
+
182
static bool trans_clzw(DisasContext *ctx, arg_clzw *a)
183
{
184
REQUIRE_64BIT(ctx);
185
@@ -XXX,XX +XXX,XX @@ static bool trans_packuw(DisasContext *ctx, arg_packuw *a)
186
REQUIRE_EXT(ctx, RVB);
187
return gen_arith(ctx, a, gen_packuw);
188
}
189
+
190
+static bool trans_bsetw(DisasContext *ctx, arg_bsetw *a)
191
+{
192
+ REQUIRE_64BIT(ctx);
193
+ REQUIRE_EXT(ctx, RVB);
194
+ return gen_shiftw(ctx, a, gen_bset);
195
+}
196
+
197
+static bool trans_bsetiw(DisasContext *ctx, arg_bsetiw *a)
198
+{
199
+ REQUIRE_64BIT(ctx);
200
+ REQUIRE_EXT(ctx, RVB);
201
+ return gen_shiftiw(ctx, a, gen_bset);
202
+}
203
+
204
+static bool trans_bclrw(DisasContext *ctx, arg_bclrw *a)
205
+{
206
+ REQUIRE_64BIT(ctx);
207
+ REQUIRE_EXT(ctx, RVB);
208
+ return gen_shiftw(ctx, a, gen_bclr);
209
+}
210
+
211
+static bool trans_bclriw(DisasContext *ctx, arg_bclriw *a)
212
+{
213
+ REQUIRE_64BIT(ctx);
214
+ REQUIRE_EXT(ctx, RVB);
215
+ return gen_shiftiw(ctx, a, gen_bclr);
216
+}
217
+
218
+static bool trans_binvw(DisasContext *ctx, arg_binvw *a)
219
+{
220
+ REQUIRE_64BIT(ctx);
221
+ REQUIRE_EXT(ctx, RVB);
222
+ return gen_shiftw(ctx, a, gen_binv);
223
+}
224
+
225
+static bool trans_binviw(DisasContext *ctx, arg_binviw *a)
226
+{
227
+ REQUIRE_64BIT(ctx);
228
+ REQUIRE_EXT(ctx, RVB);
229
+ return gen_shiftiw(ctx, a, gen_binv);
230
+}
231
+
232
+static bool trans_bextw(DisasContext *ctx, arg_bextw *a)
233
+{
234
+ REQUIRE_64BIT(ctx);
235
+ REQUIRE_EXT(ctx, RVB);
236
+ return gen_shiftw(ctx, a, gen_bext);
237
+}
238
--
93
--
239
2.31.1
94
2.41.0
240
241
diff view generated by jsdifflib
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
1
From: Nazar Kazakov <nazar.kazakov@codethink.co.uk>
2
2
3
Since commit e2e7168a214b0ed98dc357bba96816486a289762, if oprsz
3
Remove the redundant "vl == 0" check which is already included within the vstart >= vl check, when vl == 0.
4
is still zero(as we don't use this field), simd_desc will trigger an
5
assert.
6
4
7
Besides, tcg_gen_gvec_*_ptr calls simd_desc in it's implementation.
5
Signed-off-by: Nazar Kazakov <nazar.kazakov@codethink.co.uk>
8
Here we pass the value to maxsz and oprsz to bypass the assert.
6
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
9
7
Signed-off-by: Max Chou <max.chou@sifive.com>
10
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
8
Acked-by: Alistair Francis <alistair.francis@wdc.com>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-ID: <20230711165917.2629866-4-max.chou@sifive.com>
12
Message-id: 20210521054816.1784297-1-zhiwei_liu@c-sky.com
13
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
14
---
11
---
15
target/riscv/insn_trans/trans_rvv.c.inc | 89 ++++++++++++++-----------
12
target/riscv/insn_trans/trans_rvv.c.inc | 31 +------------------------
16
1 file changed, 50 insertions(+), 39 deletions(-)
13
1 file changed, 1 insertion(+), 30 deletions(-)
17
14
18
diff --git a/target/riscv/insn_trans/trans_rvv.c.inc b/target/riscv/insn_trans/trans_rvv.c.inc
15
diff --git a/target/riscv/insn_trans/trans_rvv.c.inc b/target/riscv/insn_trans/trans_rvv.c.inc
19
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
20
--- a/target/riscv/insn_trans/trans_rvv.c.inc
17
--- a/target/riscv/insn_trans/trans_rvv.c.inc
21
+++ b/target/riscv/insn_trans/trans_rvv.c.inc
18
+++ b/target/riscv/insn_trans/trans_rvv.c.inc
22
@@ -XXX,XX +XXX,XX @@ static bool ldst_us_trans(uint32_t vd, uint32_t rs1, uint32_t data,
19
@@ -XXX,XX +XXX,XX @@ static bool ldst_us_trans(uint32_t vd, uint32_t rs1, uint32_t data,
23
* The first part is vlen in bytes, encoded in maxsz of simd_desc.
20
TCGv_i32 desc;
24
* The second part is lmul, encoded in data of simd_desc.
21
25
*/
22
TCGLabel *over = gen_new_label();
26
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
23
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
27
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
24
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);
28
25
29
gen_get_gpr(base, rs1);
26
dest = tcg_temp_new_ptr();
30
tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, vd));
31
@@ -XXX,XX +XXX,XX @@ static bool ldst_stride_trans(uint32_t vd, uint32_t rs1, uint32_t rs2,
27
@@ -XXX,XX +XXX,XX @@ static bool ldst_stride_trans(uint32_t vd, uint32_t rs1, uint32_t rs2,
32
mask = tcg_temp_new_ptr();
28
TCGv_i32 desc;
33
base = tcg_temp_new();
29
34
stride = tcg_temp_new();
30
TCGLabel *over = gen_new_label();
35
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
31
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
36
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
32
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);
37
33
38
gen_get_gpr(base, rs1);
34
dest = tcg_temp_new_ptr();
39
gen_get_gpr(stride, rs2);
40
@@ -XXX,XX +XXX,XX @@ static bool ldst_index_trans(uint32_t vd, uint32_t rs1, uint32_t vs2,
35
@@ -XXX,XX +XXX,XX @@ static bool ldst_index_trans(uint32_t vd, uint32_t rs1, uint32_t vs2,
41
mask = tcg_temp_new_ptr();
36
TCGv_i32 desc;
42
index = tcg_temp_new_ptr();
37
43
base = tcg_temp_new();
38
TCGLabel *over = gen_new_label();
44
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
39
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
45
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
40
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);
46
41
47
gen_get_gpr(base, rs1);
42
dest = tcg_temp_new_ptr();
48
tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, vd));
49
@@ -XXX,XX +XXX,XX @@ static bool ldff_trans(uint32_t vd, uint32_t rs1, uint32_t data,
43
@@ -XXX,XX +XXX,XX @@ static bool ldff_trans(uint32_t vd, uint32_t rs1, uint32_t data,
50
dest = tcg_temp_new_ptr();
44
TCGv_i32 desc;
51
mask = tcg_temp_new_ptr();
45
52
base = tcg_temp_new();
46
TCGLabel *over = gen_new_label();
53
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
47
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
54
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
48
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);
55
49
56
gen_get_gpr(base, rs1);
50
dest = tcg_temp_new_ptr();
57
tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, vd));
58
@@ -XXX,XX +XXX,XX @@ static bool amo_trans(uint32_t vd, uint32_t rs1, uint32_t vs2,
59
mask = tcg_temp_new_ptr();
60
index = tcg_temp_new_ptr();
61
base = tcg_temp_new();
62
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
63
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
64
65
gen_get_gpr(base, rs1);
66
tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, vd));
67
@@ -XXX,XX +XXX,XX @@ do_opivv_gvec(DisasContext *s, arg_rmrr *a, GVecGen3Fn *gvec_fn,
51
@@ -XXX,XX +XXX,XX @@ do_opivv_gvec(DisasContext *s, arg_rmrr *a, GVecGen3Fn *gvec_fn,
68
data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
52
return false;
69
tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0),
70
vreg_ofs(s, a->rs1), vreg_ofs(s, a->rs2),
71
- cpu_env, 0, s->vlen / 8, data, fn);
72
+ cpu_env, s->vlen / 8, s->vlen / 8, data, fn);
73
}
53
}
74
gen_set_label(over);
54
75
return true;
55
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
56
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);
57
58
if (a->vm && s->vl_eq_vlmax && !(s->vta && s->lmul < 0)) {
76
@@ -XXX,XX +XXX,XX @@ static bool opivx_trans(uint32_t vd, uint32_t rs1, uint32_t vs2, uint32_t vm,
59
@@ -XXX,XX +XXX,XX @@ static bool opivx_trans(uint32_t vd, uint32_t rs1, uint32_t vs2, uint32_t vm,
77
data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
60
uint32_t data = 0;
61
62
TCGLabel *over = gen_new_label();
63
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
64
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);
65
66
dest = tcg_temp_new_ptr();
67
@@ -XXX,XX +XXX,XX @@ static bool opivi_trans(uint32_t vd, uint32_t imm, uint32_t vs2, uint32_t vm,
68
uint32_t data = 0;
69
70
TCGLabel *over = gen_new_label();
71
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
72
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);
73
74
dest = tcg_temp_new_ptr();
75
@@ -XXX,XX +XXX,XX @@ static bool do_opivv_widen(DisasContext *s, arg_rmrr *a,
76
if (checkfn(s, a)) {
77
uint32_t data = 0;
78
TCGLabel *over = gen_new_label();
79
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
80
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);
81
82
data = FIELD_DP32(data, VDATA, VM, a->vm);
83
@@ -XXX,XX +XXX,XX @@ static bool do_opiwv_widen(DisasContext *s, arg_rmrr *a,
84
if (opiwv_widen_check(s, a)) {
85
uint32_t data = 0;
86
TCGLabel *over = gen_new_label();
87
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
88
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);
89
90
data = FIELD_DP32(data, VDATA, VM, a->vm);
91
@@ -XXX,XX +XXX,XX @@ static bool opivv_trans(uint32_t vd, uint32_t vs1, uint32_t vs2, uint32_t vm,
92
{
93
uint32_t data = 0;
94
TCGLabel *over = gen_new_label();
95
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
96
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);
97
78
data = FIELD_DP32(data, VDATA, VM, vm);
98
data = FIELD_DP32(data, VDATA, VM, vm);
79
data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
80
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
81
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
82
83
tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, vd));
84
tcg_gen_addi_ptr(src2, cpu_env, vreg_ofs(s, vs2));
85
@@ -XXX,XX +XXX,XX @@ static bool opivi_trans(uint32_t vd, uint32_t imm, uint32_t vs2, uint32_t vm,
86
data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
87
data = FIELD_DP32(data, VDATA, VM, vm);
88
data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
89
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
90
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
91
92
tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, vd));
93
tcg_gen_addi_ptr(src2, cpu_env, vreg_ofs(s, vs2));
94
@@ -XXX,XX +XXX,XX @@ static bool do_opivv_widen(DisasContext *s, arg_rmrr *a,
95
tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0),
96
vreg_ofs(s, a->rs1),
97
vreg_ofs(s, a->rs2),
98
- cpu_env, 0, s->vlen / 8,
99
+ cpu_env, s->vlen / 8, s->vlen / 8,
100
data, fn);
101
gen_set_label(over);
102
return true;
103
@@ -XXX,XX +XXX,XX @@ static bool do_opiwv_widen(DisasContext *s, arg_rmrr *a,
104
tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0),
105
vreg_ofs(s, a->rs1),
106
vreg_ofs(s, a->rs2),
107
- cpu_env, 0, s->vlen / 8, data, fn);
108
+ cpu_env, s->vlen / 8, s->vlen / 8, data, fn);
109
gen_set_label(over);
110
return true;
111
}
112
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
99
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
100
gen_helper_##NAME##_w, \
101
}; \
102
TCGLabel *over = gen_new_label(); \
103
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over); \
104
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over); \
105
\
106
data = FIELD_DP32(data, VDATA, VM, a->vm); \
107
@@ -XXX,XX +XXX,XX @@ static bool trans_vmv_v_v(DisasContext *s, arg_vmv_v_v *a)
108
gen_helper_vmv_v_v_w, gen_helper_vmv_v_v_d,
109
};
110
TCGLabel *over = gen_new_label();
111
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
112
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);
113
114
tcg_gen_gvec_2_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, a->rs1),
115
@@ -XXX,XX +XXX,XX @@ static bool trans_vmv_v_x(DisasContext *s, arg_vmv_v_x *a)
116
vext_check_ss(s, a->rd, 0, 1)) {
117
TCGv s1;
118
TCGLabel *over = gen_new_label();
119
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
120
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);
121
122
s1 = get_gpr(s, a->rs1, EXT_SIGN);
123
@@ -XXX,XX +XXX,XX @@ static bool trans_vmv_v_i(DisasContext *s, arg_vmv_v_i *a)
124
gen_helper_vmv_v_x_w, gen_helper_vmv_v_x_d,
125
};
126
TCGLabel *over = gen_new_label();
127
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
128
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);
129
130
s1 = tcg_constant_i64(simm);
131
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
132
}; \
133
TCGLabel *over = gen_new_label(); \
134
gen_set_rm(s, RISCV_FRM_DYN); \
135
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over); \
136
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over); \
137
\
138
data = FIELD_DP32(data, VDATA, VM, a->vm); \
139
@@ -XXX,XX +XXX,XX @@ static bool opfvf_trans(uint32_t vd, uint32_t rs1, uint32_t vs2,
140
TCGv_i64 t1;
141
142
TCGLabel *over = gen_new_label();
143
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
144
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);
145
146
dest = tcg_temp_new_ptr();
147
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
148
}; \
149
TCGLabel *over = gen_new_label(); \
150
gen_set_rm(s, RISCV_FRM_DYN); \
151
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over); \
152
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);\
153
\
154
data = FIELD_DP32(data, VDATA, VM, a->vm); \
155
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
156
}; \
157
TCGLabel *over = gen_new_label(); \
158
gen_set_rm(s, RISCV_FRM_DYN); \
159
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over); \
160
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over); \
161
\
162
data = FIELD_DP32(data, VDATA, VM, a->vm); \
163
@@ -XXX,XX +XXX,XX @@ static bool do_opfv(DisasContext *s, arg_rmr *a,
164
uint32_t data = 0;
165
TCGLabel *over = gen_new_label();
166
gen_set_rm_chkfrm(s, rm);
167
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
168
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);
169
170
data = FIELD_DP32(data, VDATA, VM, a->vm);
171
@@ -XXX,XX +XXX,XX @@ static bool trans_vfmv_v_f(DisasContext *s, arg_vfmv_v_f *a)
172
gen_helper_vmv_v_x_d,
173
};
174
TCGLabel *over = gen_new_label();
175
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
176
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);
177
178
t1 = tcg_temp_new_i64();
179
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmr *a) \
180
}; \
181
TCGLabel *over = gen_new_label(); \
182
gen_set_rm_chkfrm(s, FRM); \
183
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over); \
184
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over); \
185
\
186
data = FIELD_DP32(data, VDATA, VM, a->vm); \
187
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmr *a) \
188
}; \
189
TCGLabel *over = gen_new_label(); \
190
gen_set_rm(s, RISCV_FRM_DYN); \
191
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over); \
192
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over); \
193
\
194
data = FIELD_DP32(data, VDATA, VM, a->vm); \
195
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmr *a) \
196
}; \
197
TCGLabel *over = gen_new_label(); \
198
gen_set_rm_chkfrm(s, FRM); \
199
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over); \
200
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over); \
201
\
202
data = FIELD_DP32(data, VDATA, VM, a->vm); \
203
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmr *a) \
204
}; \
205
TCGLabel *over = gen_new_label(); \
206
gen_set_rm_chkfrm(s, FRM); \
207
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over); \
208
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over); \
209
\
210
data = FIELD_DP32(data, VDATA, VM, a->vm); \
211
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_r *a) \
212
uint32_t data = 0; \
213
gen_helper_gvec_4_ptr *fn = gen_helper_##NAME; \
214
TCGLabel *over = gen_new_label(); \
215
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over); \
216
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over); \
217
\
113
data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
218
data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
114
tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
115
vreg_ofs(s, a->rs1), \
116
- vreg_ofs(s, a->rs2), cpu_env, 0, \
117
- s->vlen / 8, data, fns[s->sew]); \
118
+ vreg_ofs(s, a->rs2), cpu_env, \
119
+ s->vlen / 8, s->vlen / 8, data, \
120
+ fns[s->sew]); \
121
gen_set_label(over); \
122
return true; \
123
} \
124
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
125
data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
126
tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
127
vreg_ofs(s, a->rs1), \
128
- vreg_ofs(s, a->rs2), cpu_env, 0, \
129
- s->vlen / 8, data, fns[s->sew]); \
130
+ vreg_ofs(s, a->rs2), cpu_env, \
131
+ s->vlen / 8, s->vlen / 8, data, \
132
+ fns[s->sew]); \
133
gen_set_label(over); \
134
return true; \
135
} \
136
@@ -XXX,XX +XXX,XX @@ static bool trans_vmv_v_x(DisasContext *s, arg_vmv_v_x *a)
137
};
138
139
tcg_gen_ext_tl_i64(s1_i64, s1);
140
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
141
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
142
tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, a->rd));
143
fns[s->sew](dest, s1_i64, cpu_env, desc);
144
145
@@ -XXX,XX +XXX,XX @@ static bool trans_vmv_v_i(DisasContext *s, arg_vmv_v_i *a)
146
147
s1 = tcg_const_i64(simm);
148
dest = tcg_temp_new_ptr();
149
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
150
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
151
tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, a->rd));
152
fns[s->sew](dest, s1, cpu_env, desc);
153
154
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
155
data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
156
tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
157
vreg_ofs(s, a->rs1), \
158
- vreg_ofs(s, a->rs2), cpu_env, 0, \
159
- s->vlen / 8, data, fns[s->sew - 1]); \
160
+ vreg_ofs(s, a->rs2), cpu_env, \
161
+ s->vlen / 8, s->vlen / 8, data, \
162
+ fns[s->sew - 1]); \
163
gen_set_label(over); \
164
return true; \
165
} \
166
@@ -XXX,XX +XXX,XX @@ static bool opfvf_trans(uint32_t vd, uint32_t rs1, uint32_t vs2,
167
dest = tcg_temp_new_ptr();
168
mask = tcg_temp_new_ptr();
169
src2 = tcg_temp_new_ptr();
170
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
171
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
172
173
tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, vd));
174
tcg_gen_addi_ptr(src2, cpu_env, vreg_ofs(s, vs2));
175
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
176
data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
177
tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
178
vreg_ofs(s, a->rs1), \
179
- vreg_ofs(s, a->rs2), cpu_env, 0, \
180
- s->vlen / 8, data, fns[s->sew - 1]); \
181
+ vreg_ofs(s, a->rs2), cpu_env, \
182
+ s->vlen / 8, s->vlen / 8, data, \
183
+ fns[s->sew - 1]); \
184
gen_set_label(over); \
185
return true; \
186
} \
187
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
188
data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
189
tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
190
vreg_ofs(s, a->rs1), \
191
- vreg_ofs(s, a->rs2), cpu_env, 0, \
192
- s->vlen / 8, data, fns[s->sew - 1]); \
193
+ vreg_ofs(s, a->rs2), cpu_env, \
194
+ s->vlen / 8, s->vlen / 8, data, \
195
+ fns[s->sew - 1]); \
196
gen_set_label(over); \
197
return true; \
198
} \
199
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmr *a) \
200
data = FIELD_DP32(data, VDATA, VM, a->vm); \
201
data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
202
tcg_gen_gvec_3_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
203
- vreg_ofs(s, a->rs2), cpu_env, 0, \
204
- s->vlen / 8, data, fns[s->sew - 1]); \
205
+ vreg_ofs(s, a->rs2), cpu_env, \
206
+ s->vlen / 8, s->vlen / 8, data, \
207
+ fns[s->sew - 1]); \
208
gen_set_label(over); \
209
return true; \
210
} \
211
@@ -XXX,XX +XXX,XX @@ static bool trans_vfmv_v_f(DisasContext *s, arg_vfmv_v_f *a)
212
tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
213
214
dest = tcg_temp_new_ptr();
215
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
216
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
217
tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, a->rd));
218
fns[s->sew - 1](dest, cpu_fpr[a->rs1], cpu_env, desc);
219
220
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmr *a) \
221
data = FIELD_DP32(data, VDATA, VM, a->vm); \
222
data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
223
tcg_gen_gvec_3_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
224
- vreg_ofs(s, a->rs2), cpu_env, 0, \
225
- s->vlen / 8, data, fns[s->sew - 1]); \
226
+ vreg_ofs(s, a->rs2), cpu_env, \
227
+ s->vlen / 8, s->vlen / 8, data, \
228
+ fns[s->sew - 1]); \
229
gen_set_label(over); \
230
return true; \
231
} \
232
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmr *a) \
233
data = FIELD_DP32(data, VDATA, VM, a->vm); \
234
data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
235
tcg_gen_gvec_3_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
236
- vreg_ofs(s, a->rs2), cpu_env, 0, \
237
- s->vlen / 8, data, fns[s->sew - 1]); \
238
+ vreg_ofs(s, a->rs2), cpu_env, \
239
+ s->vlen / 8, s->vlen / 8, data, \
240
+ fns[s->sew - 1]); \
241
gen_set_label(over); \
242
return true; \
243
} \
244
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_r *a) \
245
data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
246
tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
247
vreg_ofs(s, a->rs1), \
248
- vreg_ofs(s, a->rs2), cpu_env, 0, \
249
- s->vlen / 8, data, fn); \
250
+ vreg_ofs(s, a->rs2), cpu_env, \
251
+ s->vlen / 8, s->vlen / 8, data, fn); \
252
gen_set_label(over); \
253
return true; \
254
} \
255
@@ -XXX,XX +XXX,XX @@ static bool trans_vmpopc_m(DisasContext *s, arg_rmr *a)
256
mask = tcg_temp_new_ptr();
257
src2 = tcg_temp_new_ptr();
258
dst = tcg_temp_new();
259
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
260
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
261
262
tcg_gen_addi_ptr(src2, cpu_env, vreg_ofs(s, a->rs2));
263
tcg_gen_addi_ptr(mask, cpu_env, vreg_ofs(s, 0));
264
@@ -XXX,XX +XXX,XX @@ static bool trans_vmfirst_m(DisasContext *s, arg_rmr *a)
265
mask = tcg_temp_new_ptr();
266
src2 = tcg_temp_new_ptr();
267
dst = tcg_temp_new();
268
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
269
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
270
271
tcg_gen_addi_ptr(src2, cpu_env, vreg_ofs(s, a->rs2));
272
tcg_gen_addi_ptr(mask, cpu_env, vreg_ofs(s, 0));
273
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmr *a) \
274
data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
275
tcg_gen_gvec_3_ptr(vreg_ofs(s, a->rd), \
276
vreg_ofs(s, 0), vreg_ofs(s, a->rs2), \
277
- cpu_env, 0, s->vlen / 8, data, fn); \
278
+ cpu_env, s->vlen / 8, s->vlen / 8, \
279
+ data, fn); \
280
gen_set_label(over); \
281
return true; \
282
} \
283
@@ -XXX,XX +XXX,XX @@ static bool trans_viota_m(DisasContext *s, arg_viota_m *a)
284
gen_helper_viota_m_w, gen_helper_viota_m_d,
285
};
286
tcg_gen_gvec_3_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0),
287
- vreg_ofs(s, a->rs2), cpu_env, 0,
288
- s->vlen / 8, data, fns[s->sew]);
289
+ vreg_ofs(s, a->rs2), cpu_env,
290
+ s->vlen / 8, s->vlen / 8, data, fns[s->sew]);
291
gen_set_label(over);
292
return true;
293
}
294
@@ -XXX,XX +XXX,XX @@ static bool trans_vid_v(DisasContext *s, arg_vid_v *a)
219
@@ -XXX,XX +XXX,XX @@ static bool trans_vid_v(DisasContext *s, arg_vid_v *a)
295
gen_helper_vid_v_w, gen_helper_vid_v_d,
220
require_vm(a->vm, a->rd)) {
296
};
221
uint32_t data = 0;
297
tcg_gen_gvec_2_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0),
222
TCGLabel *over = gen_new_label();
298
- cpu_env, 0, s->vlen / 8, data, fns[s->sew]);
223
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
299
+ cpu_env, s->vlen / 8, s->vlen / 8,
224
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);
300
+ data, fns[s->sew]);
225
301
gen_set_label(over);
226
data = FIELD_DP32(data, VDATA, VM, a->vm);
302
return true;
227
@@ -XXX,XX +XXX,XX @@ static bool trans_vmv_s_x(DisasContext *s, arg_vmv_s_x *a)
303
}
228
TCGv s1;
304
@@ -XXX,XX +XXX,XX @@ static bool trans_vcompress_vm(DisasContext *s, arg_r *a)
229
TCGLabel *over = gen_new_label();
305
data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
230
306
tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0),
231
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
307
vreg_ofs(s, a->rs1), vreg_ofs(s, a->rs2),
232
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);
308
- cpu_env, 0, s->vlen / 8, data, fns[s->sew]);
233
309
+ cpu_env, s->vlen / 8, s->vlen / 8, data,
234
t1 = tcg_temp_new_i64();
310
+ fns[s->sew]);
235
@@ -XXX,XX +XXX,XX @@ static bool trans_vfmv_s_f(DisasContext *s, arg_vfmv_s_f *a)
311
gen_set_label(over);
236
TCGv_i64 t1;
312
return true;
237
TCGLabel *over = gen_new_label();
313
}
238
239
- /* if vl == 0 or vstart >= vl, skip vector register write back */
240
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
241
+ /* if vstart >= vl, skip vector register write back */
242
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);
243
244
/* NaN-box f[rs1] */
245
@@ -XXX,XX +XXX,XX @@ static bool int_ext_op(DisasContext *s, arg_rmr *a, uint8_t seq)
246
uint32_t data = 0;
247
gen_helper_gvec_3_ptr *fn;
248
TCGLabel *over = gen_new_label();
249
- tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
250
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);
251
252
static gen_helper_gvec_3_ptr * const fns[6][4] = {
314
--
253
--
315
2.31.1
254
2.41.0
316
317
diff view generated by jsdifflib
1
From: Frank Chang <frank.chang@sifive.com>
1
From: Lawrence Hunter <lawrence.hunter@codethink.co.uk>
2
2
3
Signed-off-by: Frank Chang <frank.chang@sifive.com>
3
This commit adds support for the Zvbc vector-crypto extension, which
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
consists of the following instructions:
5
Message-id: 20210505160620.15723-13-frank.chang@sifive.com
5
6
* vclmulh.[vx,vv]
7
* vclmul.[vx,vv]
8
9
Translation functions are defined in
10
`target/riscv/insn_trans/trans_rvvk.c.inc` and helpers are defined in
11
`target/riscv/vcrypto_helper.c`.
12
13
Co-authored-by: Nazar Kazakov <nazar.kazakov@codethink.co.uk>
14
Co-authored-by: Max Chou <max.chou@sifive.com>
15
Signed-off-by: Nazar Kazakov <nazar.kazakov@codethink.co.uk>
16
Signed-off-by: Lawrence Hunter <lawrence.hunter@codethink.co.uk>
17
Signed-off-by: Max Chou <max.chou@sifive.com>
18
[max.chou@sifive.com: Exposed x-zvbc property]
19
Message-ID: <20230711165917.2629866-5-max.chou@sifive.com>
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
20
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
---
21
---
8
target/riscv/helper.h | 4 ++
22
target/riscv/cpu_cfg.h | 1 +
9
target/riscv/insn32.decode | 4 ++
23
target/riscv/helper.h | 6 +++
10
target/riscv/bitmanip_helper.c | 64 +++++++++++++++++++++++++
24
target/riscv/insn32.decode | 6 +++
11
target/riscv/translate.c | 28 +++++++++++
25
target/riscv/cpu.c | 9 ++++
12
target/riscv/insn_trans/trans_rvb.c.inc | 31 ++++++++++++
26
target/riscv/translate.c | 1 +
13
target/riscv/meson.build | 1 +
27
target/riscv/vcrypto_helper.c | 59 ++++++++++++++++++++++
14
6 files changed, 132 insertions(+)
28
target/riscv/insn_trans/trans_rvvk.c.inc | 62 ++++++++++++++++++++++++
15
create mode 100644 target/riscv/bitmanip_helper.c
29
target/riscv/meson.build | 3 +-
16
30
8 files changed, 146 insertions(+), 1 deletion(-)
31
create mode 100644 target/riscv/vcrypto_helper.c
32
create mode 100644 target/riscv/insn_trans/trans_rvvk.c.inc
33
34
diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h
35
index XXXXXXX..XXXXXXX 100644
36
--- a/target/riscv/cpu_cfg.h
37
+++ b/target/riscv/cpu_cfg.h
38
@@ -XXX,XX +XXX,XX @@ struct RISCVCPUConfig {
39
bool ext_zve32f;
40
bool ext_zve64f;
41
bool ext_zve64d;
42
+ bool ext_zvbc;
43
bool ext_zmmul;
44
bool ext_zvfbfmin;
45
bool ext_zvfbfwma;
17
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
46
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
18
index XXXXXXX..XXXXXXX 100644
47
index XXXXXXX..XXXXXXX 100644
19
--- a/target/riscv/helper.h
48
--- a/target/riscv/helper.h
20
+++ b/target/riscv/helper.h
49
+++ b/target/riscv/helper.h
21
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_2(fcvt_d_l, TCG_CALL_NO_RWG, i64, env, tl)
50
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_5(vfwcvtbf16_f_f_v, void, ptr, ptr, ptr, env, i32)
22
DEF_HELPER_FLAGS_2(fcvt_d_lu, TCG_CALL_NO_RWG, i64, env, tl)
51
23
DEF_HELPER_FLAGS_1(fclass_d, TCG_CALL_NO_RWG_SE, tl, i64)
52
DEF_HELPER_6(vfwmaccbf16_vv, void, ptr, ptr, ptr, ptr, env, i32)
24
53
DEF_HELPER_6(vfwmaccbf16_vf, void, ptr, ptr, i64, ptr, env, i32)
25
+/* Bitmanip */
54
+
26
+DEF_HELPER_FLAGS_2(grev, TCG_CALL_NO_RWG_SE, tl, tl, tl)
55
+/* Vector crypto functions */
27
+DEF_HELPER_FLAGS_2(grevw, TCG_CALL_NO_RWG_SE, tl, tl, tl)
56
+DEF_HELPER_6(vclmul_vv, void, ptr, ptr, ptr, ptr, env, i32)
28
+
57
+DEF_HELPER_6(vclmul_vx, void, ptr, ptr, tl, ptr, env, i32)
29
/* Special functions */
58
+DEF_HELPER_6(vclmulh_vv, void, ptr, ptr, ptr, ptr, env, i32)
30
DEF_HELPER_3(csrrw, tl, env, tl, tl)
59
+DEF_HELPER_6(vclmulh_vx, void, ptr, ptr, tl, ptr, env, i32)
31
DEF_HELPER_4(csrrs, tl, env, tl, tl, tl)
32
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
60
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
33
index XXXXXXX..XXXXXXX 100644
61
index XXXXXXX..XXXXXXX 100644
34
--- a/target/riscv/insn32.decode
62
--- a/target/riscv/insn32.decode
35
+++ b/target/riscv/insn32.decode
63
+++ b/target/riscv/insn32.decode
36
@@ -XXX,XX +XXX,XX @@ slo 0010000 .......... 001 ..... 0110011 @r
64
@@ -XXX,XX +XXX,XX @@ vfwcvtbf16_f_f_v 010010 . ..... 01101 001 ..... 1010111 @r2_vm
37
sro 0010000 .......... 101 ..... 0110011 @r
65
# *** Zvfbfwma Standard Extension ***
38
ror 0110000 .......... 101 ..... 0110011 @r
66
vfwmaccbf16_vv 111011 . ..... ..... 001 ..... 1010111 @r_vm
39
rol 0110000 .......... 001 ..... 0110011 @r
67
vfwmaccbf16_vf 111011 . ..... ..... 101 ..... 1010111 @r_vm
40
+grev 0110100 .......... 101 ..... 0110011 @r
68
+
41
69
+# *** Zvbc vector crypto extension ***
42
bseti 00101. ........... 001 ..... 0010011 @sh
70
+vclmul_vv 001100 . ..... ..... 010 ..... 1010111 @r_vm
43
bclri 01001. ........... 001 ..... 0010011 @sh
71
+vclmul_vx 001100 . ..... ..... 110 ..... 1010111 @r_vm
44
@@ -XXX,XX +XXX,XX @@ bexti 01001. ........... 101 ..... 0010011 @sh
72
+vclmulh_vv 001101 . ..... ..... 010 ..... 1010111 @r_vm
45
sloi 00100. ........... 001 ..... 0010011 @sh
73
+vclmulh_vx 001101 . ..... ..... 110 ..... 1010111 @r_vm
46
sroi 00100. ........... 101 ..... 0010011 @sh
74
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
47
rori 01100. ........... 101 ..... 0010011 @sh
75
index XXXXXXX..XXXXXXX 100644
48
+grevi 01101. ........... 101 ..... 0010011 @sh
76
--- a/target/riscv/cpu.c
49
77
+++ b/target/riscv/cpu.c
50
# *** RV64B Standard Extension (in addition to RV32B) ***
78
@@ -XXX,XX +XXX,XX @@ static const struct isa_ext_data isa_edata_arr[] = {
51
clzw 0110000 00000 ..... 001 ..... 0011011 @r2
79
ISA_EXT_DATA_ENTRY(zksed, PRIV_VERSION_1_12_0, ext_zksed),
52
@@ -XXX,XX +XXX,XX @@ slow 0010000 .......... 001 ..... 0111011 @r
80
ISA_EXT_DATA_ENTRY(zksh, PRIV_VERSION_1_12_0, ext_zksh),
53
srow 0010000 .......... 101 ..... 0111011 @r
81
ISA_EXT_DATA_ENTRY(zkt, PRIV_VERSION_1_12_0, ext_zkt),
54
rorw 0110000 .......... 101 ..... 0111011 @r
82
+ ISA_EXT_DATA_ENTRY(zvbc, PRIV_VERSION_1_12_0, ext_zvbc),
55
rolw 0110000 .......... 001 ..... 0111011 @r
83
ISA_EXT_DATA_ENTRY(zve32f, PRIV_VERSION_1_10_0, ext_zve32f),
56
+grevw 0110100 .......... 101 ..... 0111011 @r
84
ISA_EXT_DATA_ENTRY(zve64f, PRIV_VERSION_1_10_0, ext_zve64f),
57
85
ISA_EXT_DATA_ENTRY(zve64d, PRIV_VERSION_1_10_0, ext_zve64d),
58
bsetiw 0010100 .......... 001 ..... 0011011 @sh5
86
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
59
bclriw 0100100 .......... 001 ..... 0011011 @sh5
87
return;
60
@@ -XXX,XX +XXX,XX @@ binviw 0110100 .......... 001 ..... 0011011 @sh5
88
}
61
sloiw 0010000 .......... 001 ..... 0011011 @sh5
89
62
sroiw 0010000 .......... 101 ..... 0011011 @sh5
90
+ if (cpu->cfg.ext_zvbc && !cpu->cfg.ext_zve64f) {
63
roriw 0110000 .......... 101 ..... 0011011 @sh5
91
+ error_setg(errp, "Zvbc extension requires V or Zve64{f,d} extensions");
64
+greviw 0110100 .......... 101 ..... 0011011 @sh5
92
+ return;
65
diff --git a/target/riscv/bitmanip_helper.c b/target/riscv/bitmanip_helper.c
93
+ }
94
+
95
if (cpu->cfg.ext_zk) {
96
cpu->cfg.ext_zkn = true;
97
cpu->cfg.ext_zkr = true;
98
@@ -XXX,XX +XXX,XX @@ static Property riscv_cpu_extensions[] = {
99
DEFINE_PROP_BOOL("x-zvfbfmin", RISCVCPU, cfg.ext_zvfbfmin, false),
100
DEFINE_PROP_BOOL("x-zvfbfwma", RISCVCPU, cfg.ext_zvfbfwma, false),
101
102
+ /* Vector cryptography extensions */
103
+ DEFINE_PROP_BOOL("x-zvbc", RISCVCPU, cfg.ext_zvbc, false),
104
+
105
DEFINE_PROP_END_OF_LIST(),
106
};
107
108
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
109
index XXXXXXX..XXXXXXX 100644
110
--- a/target/riscv/translate.c
111
+++ b/target/riscv/translate.c
112
@@ -XXX,XX +XXX,XX @@ static uint32_t opcode_at(DisasContextBase *dcbase, target_ulong pc)
113
#include "insn_trans/trans_rvzfa.c.inc"
114
#include "insn_trans/trans_rvzfh.c.inc"
115
#include "insn_trans/trans_rvk.c.inc"
116
+#include "insn_trans/trans_rvvk.c.inc"
117
#include "insn_trans/trans_privileged.c.inc"
118
#include "insn_trans/trans_svinval.c.inc"
119
#include "insn_trans/trans_rvbf16.c.inc"
120
diff --git a/target/riscv/vcrypto_helper.c b/target/riscv/vcrypto_helper.c
66
new file mode 100644
121
new file mode 100644
67
index XXXXXXX..XXXXXXX
122
index XXXXXXX..XXXXXXX
68
--- /dev/null
123
--- /dev/null
69
+++ b/target/riscv/bitmanip_helper.c
124
+++ b/target/riscv/vcrypto_helper.c
70
@@ -XXX,XX +XXX,XX @@
125
@@ -XXX,XX +XXX,XX @@
71
+/*
126
+/*
72
+ * RISC-V Bitmanip Extension Helpers for QEMU.
127
+ * RISC-V Vector Crypto Extension Helpers for QEMU.
73
+ *
128
+ *
74
+ * Copyright (c) 2020 Kito Cheng, kito.cheng@sifive.com
129
+ * Copyright (C) 2023 SiFive, Inc.
75
+ * Copyright (c) 2020 Frank Chang, frank.chang@sifive.com
130
+ * Written by Codethink Ltd and SiFive.
76
+ *
131
+ *
77
+ * This program is free software; you can redistribute it and/or modify it
132
+ * This program is free software; you can redistribute it and/or modify it
78
+ * under the terms and conditions of the GNU General Public License,
133
+ * under the terms and conditions of the GNU General Public License,
79
+ * version 2 or later, as published by the Free Software Foundation.
134
+ * version 2 or later, as published by the Free Software Foundation.
80
+ *
135
+ *
...
...
87
+ * this program. If not, see <http://www.gnu.org/licenses/>.
142
+ * this program. If not, see <http://www.gnu.org/licenses/>.
88
+ */
143
+ */
89
+
144
+
90
+#include "qemu/osdep.h"
145
+#include "qemu/osdep.h"
91
+#include "qemu/host-utils.h"
146
+#include "qemu/host-utils.h"
147
+#include "qemu/bitops.h"
148
+#include "cpu.h"
149
+#include "exec/memop.h"
92
+#include "exec/exec-all.h"
150
+#include "exec/exec-all.h"
93
+#include "exec/helper-proto.h"
151
+#include "exec/helper-proto.h"
94
+#include "tcg/tcg.h"
152
+#include "internals.h"
95
+
153
+#include "vector_internals.h"
96
+static const uint64_t adjacent_masks[] = {
154
+
97
+ dup_const(MO_8, 0x55),
155
+static uint64_t clmul64(uint64_t y, uint64_t x)
98
+ dup_const(MO_8, 0x33),
156
+{
99
+ dup_const(MO_8, 0x0f),
157
+ uint64_t result = 0;
100
+ dup_const(MO_16, 0xff),
158
+ for (int j = 63; j >= 0; j--) {
101
+ dup_const(MO_32, 0xffff),
159
+ if ((y >> j) & 1) {
102
+ UINT32_MAX
160
+ result ^= (x << j);
103
+};
104
+
105
+static inline target_ulong do_swap(target_ulong x, uint64_t mask, int shift)
106
+{
107
+ return ((x & mask) << shift) | ((x & ~mask) >> shift);
108
+}
109
+
110
+static target_ulong do_grev(target_ulong rs1,
111
+ target_ulong rs2,
112
+ int bits)
113
+{
114
+ target_ulong x = rs1;
115
+ int i, shift;
116
+
117
+ for (i = 0, shift = 1; shift < bits; i++, shift <<= 1) {
118
+ if (rs2 & shift) {
119
+ x = do_swap(x, adjacent_masks[i], shift);
120
+ }
161
+ }
121
+ }
162
+ }
122
+
163
+ return result;
123
+ return x;
164
+}
124
+}
165
+
125
+
166
+static uint64_t clmulh64(uint64_t y, uint64_t x)
126
+target_ulong HELPER(grev)(target_ulong rs1, target_ulong rs2)
167
+{
127
+{
168
+ uint64_t result = 0;
128
+ return do_grev(rs1, rs2, TARGET_LONG_BITS);
169
+ for (int j = 63; j >= 1; j--) {
129
+}
170
+ if ((y >> j) & 1) {
130
+
171
+ result ^= (x >> (64 - j));
131
+target_ulong HELPER(grevw)(target_ulong rs1, target_ulong rs2)
172
+ }
132
+{
173
+ }
133
+ return do_grev(rs1, rs2, 32);
174
+ return result;
134
+}
175
+}
135
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
176
+
136
index XXXXXXX..XXXXXXX 100644
177
+RVVCALL(OPIVV2, vclmul_vv, OP_UUU_D, H8, H8, H8, clmul64)
137
--- a/target/riscv/translate.c
178
+GEN_VEXT_VV(vclmul_vv, 8)
138
+++ b/target/riscv/translate.c
179
+RVVCALL(OPIVX2, vclmul_vx, OP_UUU_D, H8, H8, clmul64)
139
@@ -XXX,XX +XXX,XX @@ static void gen_sro(TCGv ret, TCGv arg1, TCGv arg2)
180
+GEN_VEXT_VX(vclmul_vx, 8)
140
tcg_gen_not_tl(ret, ret);
181
+RVVCALL(OPIVV2, vclmulh_vv, OP_UUU_D, H8, H8, H8, clmulh64)
141
}
182
+GEN_VEXT_VV(vclmulh_vv, 8)
142
183
+RVVCALL(OPIVX2, vclmulh_vx, OP_UUU_D, H8, H8, clmulh64)
143
+static bool gen_grevi(DisasContext *ctx, arg_grevi *a)
184
+GEN_VEXT_VX(vclmulh_vx, 8)
144
+{
185
diff --git a/target/riscv/insn_trans/trans_rvvk.c.inc b/target/riscv/insn_trans/trans_rvvk.c.inc
145
+ TCGv source1 = tcg_temp_new();
186
new file mode 100644
146
+ TCGv source2;
187
index XXXXXXX..XXXXXXX
147
+
188
--- /dev/null
148
+ gen_get_gpr(source1, a->rs1);
189
+++ b/target/riscv/insn_trans/trans_rvvk.c.inc
149
+
190
@@ -XXX,XX +XXX,XX @@
150
+ if (a->shamt == (TARGET_LONG_BITS - 8)) {
191
+/*
151
+ /* rev8, byte swaps */
192
+ * RISC-V translation routines for the vector crypto extension.
152
+ tcg_gen_bswap_tl(source1, source1);
193
+ *
153
+ } else {
194
+ * Copyright (C) 2023 SiFive, Inc.
154
+ source2 = tcg_temp_new();
195
+ * Written by Codethink Ltd and SiFive.
155
+ tcg_gen_movi_tl(source2, a->shamt);
196
+ *
156
+ gen_helper_grev(source1, source1, source2);
197
+ * This program is free software; you can redistribute it and/or modify it
157
+ tcg_temp_free(source2);
198
+ * under the terms and conditions of the GNU General Public License,
158
+ }
199
+ * version 2 or later, as published by the Free Software Foundation.
159
+
200
+ *
160
+ gen_set_gpr(a->rd, source1);
201
+ * This program is distributed in the hope it will be useful, but WITHOUT
161
+ tcg_temp_free(source1);
202
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
162
+ return true;
203
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
163
+}
204
+ * more details.
164
+
205
+ *
165
static void gen_ctzw(TCGv ret, TCGv arg1)
206
+ * You should have received a copy of the GNU General Public License along with
166
{
207
+ * this program. If not, see <http://www.gnu.org/licenses/>.
167
tcg_gen_ori_tl(ret, arg1, (target_ulong)MAKE_64BIT_MASK(32, 32));
208
+ */
168
@@ -XXX,XX +XXX,XX @@ static void gen_rolw(TCGv ret, TCGv arg1, TCGv arg2)
209
+
169
tcg_temp_free_i32(t2);
210
+/*
170
}
211
+ * Zvbc
171
212
+ */
172
+static void gen_grevw(TCGv ret, TCGv arg1, TCGv arg2)
213
+
173
+{
214
+#define GEN_VV_MASKED_TRANS(NAME, CHECK) \
174
+ tcg_gen_ext32u_tl(arg1, arg1);
215
+ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
175
+ gen_helper_grev(ret, arg1, arg2);
216
+ { \
176
+}
217
+ if (CHECK(s, a)) { \
177
+
218
+ return opivv_trans(a->rd, a->rs1, a->rs2, a->vm, \
178
static bool gen_arith(DisasContext *ctx, arg_r *a,
219
+ gen_helper_##NAME, s); \
179
void(*func)(TCGv, TCGv, TCGv))
220
+ } \
180
{
221
+ return false; \
181
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
222
+ }
182
index XXXXXXX..XXXXXXX 100644
223
+
183
--- a/target/riscv/insn_trans/trans_rvb.c.inc
224
+static bool vclmul_vv_check(DisasContext *s, arg_rmrr *a)
184
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
225
+{
185
@@ -XXX,XX +XXX,XX @@ static bool trans_rol(DisasContext *ctx, arg_rol *a)
226
+ return opivv_check(s, a) &&
186
return gen_shift(ctx, a, tcg_gen_rotl_tl);
227
+ s->cfg_ptr->ext_zvbc == true &&
187
}
228
+ s->sew == MO_64;
188
229
+}
189
+static bool trans_grev(DisasContext *ctx, arg_grev *a)
230
+
190
+{
231
+GEN_VV_MASKED_TRANS(vclmul_vv, vclmul_vv_check)
191
+ REQUIRE_EXT(ctx, RVB);
232
+GEN_VV_MASKED_TRANS(vclmulh_vv, vclmul_vv_check)
192
+ return gen_shift(ctx, a, gen_helper_grev);
233
+
193
+}
234
+#define GEN_VX_MASKED_TRANS(NAME, CHECK) \
194
+
235
+ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
195
+static bool trans_grevi(DisasContext *ctx, arg_grevi *a)
236
+ { \
196
+{
237
+ if (CHECK(s, a)) { \
197
+ REQUIRE_EXT(ctx, RVB);
238
+ return opivx_trans(a->rd, a->rs1, a->rs2, a->vm, \
198
+
239
+ gen_helper_##NAME, s); \
199
+ if (a->shamt >= TARGET_LONG_BITS) {
240
+ } \
200
+ return false;
241
+ return false; \
201
+ }
242
+ }
202
+
243
+
203
+ return gen_grevi(ctx, a);
244
+static bool vclmul_vx_check(DisasContext *s, arg_rmrr *a)
204
+}
245
+{
205
+
246
+ return opivx_check(s, a) &&
206
static bool trans_clzw(DisasContext *ctx, arg_clzw *a)
247
+ s->cfg_ptr->ext_zvbc == true &&
207
{
248
+ s->sew == MO_64;
208
REQUIRE_64BIT(ctx);
249
+}
209
@@ -XXX,XX +XXX,XX @@ static bool trans_rolw(DisasContext *ctx, arg_rolw *a)
250
+
210
REQUIRE_EXT(ctx, RVB);
251
+GEN_VX_MASKED_TRANS(vclmul_vx, vclmul_vx_check)
211
return gen_shiftw(ctx, a, gen_rolw);
252
+GEN_VX_MASKED_TRANS(vclmulh_vx, vclmul_vx_check)
212
}
213
+
214
+static bool trans_grevw(DisasContext *ctx, arg_grevw *a)
215
+{
216
+ REQUIRE_64BIT(ctx);
217
+ REQUIRE_EXT(ctx, RVB);
218
+ return gen_shiftw(ctx, a, gen_grevw);
219
+}
220
+
221
+static bool trans_greviw(DisasContext *ctx, arg_greviw *a)
222
+{
223
+ REQUIRE_64BIT(ctx);
224
+ REQUIRE_EXT(ctx, RVB);
225
+ return gen_shiftiw(ctx, a, gen_grevw);
226
+}
227
diff --git a/target/riscv/meson.build b/target/riscv/meson.build
253
diff --git a/target/riscv/meson.build b/target/riscv/meson.build
228
index XXXXXXX..XXXXXXX 100644
254
index XXXXXXX..XXXXXXX 100644
229
--- a/target/riscv/meson.build
255
--- a/target/riscv/meson.build
230
+++ b/target/riscv/meson.build
256
+++ b/target/riscv/meson.build
231
@@ -XXX,XX +XXX,XX @@ riscv_ss.add(files(
257
@@ -XXX,XX +XXX,XX @@ riscv_ss.add(files(
232
'gdbstub.c',
233
'op_helper.c',
234
'vector_helper.c',
235
+ 'bitmanip_helper.c',
236
'translate.c',
258
'translate.c',
259
'm128_helper.c',
260
'crypto_helper.c',
261
- 'zce_helper.c'
262
+ 'zce_helper.c',
263
+ 'vcrypto_helper.c'
237
))
264
))
265
riscv_ss.add(when: 'CONFIG_KVM', if_true: files('kvm.c'), if_false: files('kvm-stub.c'))
238
266
239
--
267
--
240
2.31.1
268
2.41.0
241
242
diff view generated by jsdifflib
1
From: Frank Chang <frank.chang@sifive.com>
1
From: Nazar Kazakov <nazar.kazakov@codethink.co.uk>
2
2
3
Add gen_shifti() and gen_shiftiw() helper functions to reuse the same
3
Move the checks out of `do_opiv{v,x,i}_gvec{,_shift}` functions
4
interfaces for immediate shift instructions.
4
and into the corresponding macros. This enables the functions to be
5
reused in proceeding commits without check duplication.
5
6
6
Signed-off-by: Frank Chang <frank.chang@sifive.com>
7
Signed-off-by: Nazar Kazakov <nazar.kazakov@codethink.co.uk>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
9
Message-id: 20210505160620.15723-9-frank.chang@sifive.com
10
Signed-off-by: Max Chou <max.chou@sifive.com>
11
Message-ID: <20230711165917.2629866-6-max.chou@sifive.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
13
---
12
target/riscv/translate.c | 39 ++++++++++++++++++
14
target/riscv/insn_trans/trans_rvv.c.inc | 28 +++++++++++--------------
13
target/riscv/insn_trans/trans_rvi.c.inc | 54 ++-----------------------
15
1 file changed, 12 insertions(+), 16 deletions(-)
14
2 files changed, 43 insertions(+), 50 deletions(-)
15
16
16
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
17
diff --git a/target/riscv/insn_trans/trans_rvv.c.inc b/target/riscv/insn_trans/trans_rvv.c.inc
17
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
18
--- a/target/riscv/translate.c
19
--- a/target/riscv/insn_trans/trans_rvv.c.inc
19
+++ b/target/riscv/translate.c
20
+++ b/target/riscv/insn_trans/trans_rvv.c.inc
20
@@ -XXX,XX +XXX,XX @@ static uint32_t opcode_at(DisasContextBase *dcbase, target_ulong pc)
21
@@ -XXX,XX +XXX,XX @@ do_opivv_gvec(DisasContext *s, arg_rmrr *a, GVecGen3Fn *gvec_fn,
21
return cpu_ldl_code(env, pc);
22
gen_helper_gvec_4_ptr *fn)
23
{
24
TCGLabel *over = gen_new_label();
25
- if (!opivv_check(s, a)) {
26
- return false;
27
- }
28
29
tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);
30
31
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
32
gen_helper_##NAME##_b, gen_helper_##NAME##_h, \
33
gen_helper_##NAME##_w, gen_helper_##NAME##_d, \
34
}; \
35
+ if (!opivv_check(s, a)) { \
36
+ return false; \
37
+ } \
38
return do_opivv_gvec(s, a, tcg_gen_gvec_##SUF, fns[s->sew]); \
22
}
39
}
23
40
24
+static bool gen_shifti(DisasContext *ctx, arg_shift *a,
41
@@ -XXX,XX +XXX,XX @@ static inline bool
25
+ void(*func)(TCGv, TCGv, TCGv))
42
do_opivx_gvec(DisasContext *s, arg_rmrr *a, GVecGen2sFn *gvec_fn,
26
+{
43
gen_helper_opivx *fn)
27
+ if (a->shamt >= TARGET_LONG_BITS) {
28
+ return false;
29
+ }
30
+
31
+ TCGv source1 = tcg_temp_new();
32
+ TCGv source2 = tcg_temp_new();
33
+
34
+ gen_get_gpr(source1, a->rs1);
35
+
36
+ tcg_gen_movi_tl(source2, a->shamt);
37
+ (*func)(source1, source1, source2);
38
+
39
+ gen_set_gpr(a->rd, source1);
40
+ tcg_temp_free(source1);
41
+ tcg_temp_free(source2);
42
+ return true;
43
+}
44
+
45
+static bool gen_shiftiw(DisasContext *ctx, arg_shift *a,
46
+ void(*func)(TCGv, TCGv, TCGv))
47
+{
48
+ TCGv source1 = tcg_temp_new();
49
+ TCGv source2 = tcg_temp_new();
50
+
51
+ gen_get_gpr(source1, a->rs1);
52
+ tcg_gen_movi_tl(source2, a->shamt);
53
+
54
+ (*func)(source1, source1, source2);
55
+ tcg_gen_ext32s_tl(source1, source1);
56
+
57
+ gen_set_gpr(a->rd, source1);
58
+ tcg_temp_free(source1);
59
+ tcg_temp_free(source2);
60
+ return true;
61
+}
62
+
63
static void gen_ctz(TCGv ret, TCGv arg1)
64
{
44
{
65
tcg_gen_ctzi_tl(ret, arg1, TARGET_LONG_BITS);
45
- if (!opivx_check(s, a)) {
66
diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_trans/trans_rvi.c.inc
67
index XXXXXXX..XXXXXXX 100644
68
--- a/target/riscv/insn_trans/trans_rvi.c.inc
69
+++ b/target/riscv/insn_trans/trans_rvi.c.inc
70
@@ -XXX,XX +XXX,XX @@ static bool trans_andi(DisasContext *ctx, arg_andi *a)
71
}
72
static bool trans_slli(DisasContext *ctx, arg_slli *a)
73
{
74
- if (a->shamt >= TARGET_LONG_BITS) {
75
- return false;
46
- return false;
76
- }
47
- }
77
-
48
-
78
- if (a->rd != 0) {
49
if (a->vm && s->vl_eq_vlmax && !(s->vta && s->lmul < 0)) {
79
- TCGv t = tcg_temp_new();
50
TCGv_i64 src1 = tcg_temp_new_i64();
80
- gen_get_gpr(t, a->rs1);
51
81
-
52
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
82
- tcg_gen_shli_tl(t, t, a->shamt);
53
gen_helper_##NAME##_b, gen_helper_##NAME##_h, \
83
-
54
gen_helper_##NAME##_w, gen_helper_##NAME##_d, \
84
- gen_set_gpr(a->rd, t);
55
}; \
85
- tcg_temp_free(t);
56
+ if (!opivx_check(s, a)) { \
86
- } /* NOP otherwise */
57
+ return false; \
87
- return true;
58
+ } \
88
+ return gen_shifti(ctx, a, tcg_gen_shl_tl);
59
return do_opivx_gvec(s, a, tcg_gen_gvec_##SUF, fns[s->sew]); \
89
}
60
}
90
61
91
static bool trans_srli(DisasContext *ctx, arg_srli *a)
62
@@ -XXX,XX +XXX,XX @@ static inline bool
63
do_opivi_gvec(DisasContext *s, arg_rmrr *a, GVecGen2iFn *gvec_fn,
64
gen_helper_opivx *fn, imm_mode_t imm_mode)
92
{
65
{
93
- if (a->shamt >= TARGET_LONG_BITS) {
66
- if (!opivx_check(s, a)) {
94
- return false;
67
- return false;
95
- }
68
- }
96
-
69
-
97
- if (a->rd != 0) {
70
if (a->vm && s->vl_eq_vlmax && !(s->vta && s->lmul < 0)) {
98
- TCGv t = tcg_temp_new();
71
gvec_fn(s->sew, vreg_ofs(s, a->rd), vreg_ofs(s, a->rs2),
99
- gen_get_gpr(t, a->rs1);
72
extract_imm(s, a->rs1, imm_mode), MAXSZ(s), MAXSZ(s));
100
-
73
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
101
- tcg_gen_shri_tl(t, t, a->shamt);
74
gen_helper_##OPIVX##_b, gen_helper_##OPIVX##_h, \
102
- gen_set_gpr(a->rd, t);
75
gen_helper_##OPIVX##_w, gen_helper_##OPIVX##_d, \
103
- tcg_temp_free(t);
76
}; \
104
- } /* NOP otherwise */
77
+ if (!opivx_check(s, a)) { \
105
- return true;
78
+ return false; \
106
+ return gen_shifti(ctx, a, tcg_gen_shr_tl);
79
+ } \
80
return do_opivi_gvec(s, a, tcg_gen_gvec_##SUF, \
81
fns[s->sew], IMM_MODE); \
107
}
82
}
108
83
@@ -XXX,XX +XXX,XX @@ static inline bool
109
static bool trans_srai(DisasContext *ctx, arg_srai *a)
84
do_opivx_gvec_shift(DisasContext *s, arg_rmrr *a, GVecGen2sFn32 *gvec_fn,
85
gen_helper_opivx *fn)
110
{
86
{
111
- if (a->shamt >= TARGET_LONG_BITS) {
87
- if (!opivx_check(s, a)) {
112
- return false;
88
- return false;
113
- }
89
- }
114
-
90
-
115
- if (a->rd != 0) {
91
if (a->vm && s->vl_eq_vlmax && !(s->vta && s->lmul < 0)) {
116
- TCGv t = tcg_temp_new();
92
TCGv_i32 src1 = tcg_temp_new_i32();
117
- gen_get_gpr(t, a->rs1);
93
118
-
94
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
119
- tcg_gen_sari_tl(t, t, a->shamt);
95
gen_helper_##NAME##_b, gen_helper_##NAME##_h, \
120
- gen_set_gpr(a->rd, t);
96
gen_helper_##NAME##_w, gen_helper_##NAME##_d, \
121
- tcg_temp_free(t);
97
}; \
122
- } /* NOP otherwise */
98
- \
123
- return true;
99
+ if (!opivx_check(s, a)) { \
124
+ return gen_shifti(ctx, a, tcg_gen_sar_tl);
100
+ return false; \
101
+ } \
102
return do_opivx_gvec_shift(s, a, tcg_gen_gvec_##SUF, fns[s->sew]); \
125
}
103
}
126
104
127
static bool trans_add(DisasContext *ctx, arg_add *a)
128
@@ -XXX,XX +XXX,XX @@ static bool trans_addiw(DisasContext *ctx, arg_addiw *a)
129
static bool trans_slliw(DisasContext *ctx, arg_slliw *a)
130
{
131
REQUIRE_64BIT(ctx);
132
- TCGv source1;
133
- source1 = tcg_temp_new();
134
- gen_get_gpr(source1, a->rs1);
135
-
136
- tcg_gen_shli_tl(source1, source1, a->shamt);
137
- tcg_gen_ext32s_tl(source1, source1);
138
- gen_set_gpr(a->rd, source1);
139
-
140
- tcg_temp_free(source1);
141
- return true;
142
+ return gen_shiftiw(ctx, a, tcg_gen_shl_tl);
143
}
144
145
static bool trans_srliw(DisasContext *ctx, arg_srliw *a)
146
--
105
--
147
2.31.1
106
2.41.0
148
149
diff view generated by jsdifflib
New patch
1
From: Dickon Hood <dickon.hood@codethink.co.uk>
1
2
3
Zvbb (implemented in later commit) has a widening instruction, which
4
requires an extra check on the enabled extensions. Refactor
5
GEN_OPIVX_WIDEN_TRANS() to take a check function to avoid reimplementing
6
it.
7
8
Signed-off-by: Dickon Hood <dickon.hood@codethink.co.uk>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
11
Signed-off-by: Max Chou <max.chou@sifive.com>
12
Message-ID: <20230711165917.2629866-7-max.chou@sifive.com>
13
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
14
---
15
target/riscv/insn_trans/trans_rvv.c.inc | 52 +++++++++++--------------
16
1 file changed, 23 insertions(+), 29 deletions(-)
17
18
diff --git a/target/riscv/insn_trans/trans_rvv.c.inc b/target/riscv/insn_trans/trans_rvv.c.inc
19
index XXXXXXX..XXXXXXX 100644
20
--- a/target/riscv/insn_trans/trans_rvv.c.inc
21
+++ b/target/riscv/insn_trans/trans_rvv.c.inc
22
@@ -XXX,XX +XXX,XX @@ static bool opivx_widen_check(DisasContext *s, arg_rmrr *a)
23
vext_check_ds(s, a->rd, a->rs2, a->vm);
24
}
25
26
-static bool do_opivx_widen(DisasContext *s, arg_rmrr *a,
27
- gen_helper_opivx *fn)
28
-{
29
- if (opivx_widen_check(s, a)) {
30
- return opivx_trans(a->rd, a->rs1, a->rs2, a->vm, fn, s);
31
- }
32
- return false;
33
-}
34
-
35
-#define GEN_OPIVX_WIDEN_TRANS(NAME) \
36
-static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
37
-{ \
38
- static gen_helper_opivx * const fns[3] = { \
39
- gen_helper_##NAME##_b, \
40
- gen_helper_##NAME##_h, \
41
- gen_helper_##NAME##_w \
42
- }; \
43
- return do_opivx_widen(s, a, fns[s->sew]); \
44
+#define GEN_OPIVX_WIDEN_TRANS(NAME, CHECK) \
45
+static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
46
+{ \
47
+ if (CHECK(s, a)) { \
48
+ static gen_helper_opivx * const fns[3] = { \
49
+ gen_helper_##NAME##_b, \
50
+ gen_helper_##NAME##_h, \
51
+ gen_helper_##NAME##_w \
52
+ }; \
53
+ return opivx_trans(a->rd, a->rs1, a->rs2, a->vm, fns[s->sew], s); \
54
+ } \
55
+ return false; \
56
}
57
58
-GEN_OPIVX_WIDEN_TRANS(vwaddu_vx)
59
-GEN_OPIVX_WIDEN_TRANS(vwadd_vx)
60
-GEN_OPIVX_WIDEN_TRANS(vwsubu_vx)
61
-GEN_OPIVX_WIDEN_TRANS(vwsub_vx)
62
+GEN_OPIVX_WIDEN_TRANS(vwaddu_vx, opivx_widen_check)
63
+GEN_OPIVX_WIDEN_TRANS(vwadd_vx, opivx_widen_check)
64
+GEN_OPIVX_WIDEN_TRANS(vwsubu_vx, opivx_widen_check)
65
+GEN_OPIVX_WIDEN_TRANS(vwsub_vx, opivx_widen_check)
66
67
/* WIDEN OPIVV with WIDEN */
68
static bool opiwv_widen_check(DisasContext *s, arg_rmrr *a)
69
@@ -XXX,XX +XXX,XX @@ GEN_OPIVX_TRANS(vrem_vx, opivx_check)
70
GEN_OPIVV_WIDEN_TRANS(vwmul_vv, opivv_widen_check)
71
GEN_OPIVV_WIDEN_TRANS(vwmulu_vv, opivv_widen_check)
72
GEN_OPIVV_WIDEN_TRANS(vwmulsu_vv, opivv_widen_check)
73
-GEN_OPIVX_WIDEN_TRANS(vwmul_vx)
74
-GEN_OPIVX_WIDEN_TRANS(vwmulu_vx)
75
-GEN_OPIVX_WIDEN_TRANS(vwmulsu_vx)
76
+GEN_OPIVX_WIDEN_TRANS(vwmul_vx, opivx_widen_check)
77
+GEN_OPIVX_WIDEN_TRANS(vwmulu_vx, opivx_widen_check)
78
+GEN_OPIVX_WIDEN_TRANS(vwmulsu_vx, opivx_widen_check)
79
80
/* Vector Single-Width Integer Multiply-Add Instructions */
81
GEN_OPIVV_TRANS(vmacc_vv, opivv_check)
82
@@ -XXX,XX +XXX,XX @@ GEN_OPIVX_TRANS(vnmsub_vx, opivx_check)
83
GEN_OPIVV_WIDEN_TRANS(vwmaccu_vv, opivv_widen_check)
84
GEN_OPIVV_WIDEN_TRANS(vwmacc_vv, opivv_widen_check)
85
GEN_OPIVV_WIDEN_TRANS(vwmaccsu_vv, opivv_widen_check)
86
-GEN_OPIVX_WIDEN_TRANS(vwmaccu_vx)
87
-GEN_OPIVX_WIDEN_TRANS(vwmacc_vx)
88
-GEN_OPIVX_WIDEN_TRANS(vwmaccsu_vx)
89
-GEN_OPIVX_WIDEN_TRANS(vwmaccus_vx)
90
+GEN_OPIVX_WIDEN_TRANS(vwmaccu_vx, opivx_widen_check)
91
+GEN_OPIVX_WIDEN_TRANS(vwmacc_vx, opivx_widen_check)
92
+GEN_OPIVX_WIDEN_TRANS(vwmaccsu_vx, opivx_widen_check)
93
+GEN_OPIVX_WIDEN_TRANS(vwmaccus_vx, opivx_widen_check)
94
95
/* Vector Integer Merge and Move Instructions */
96
static bool trans_vmv_v_v(DisasContext *s, arg_vmv_v_v *a)
97
--
98
2.41.0
diff view generated by jsdifflib
New patch
1
From: Kiran Ostrolenk <kiran.ostrolenk@codethink.co.uk>
1
2
3
Move some macros out of `vector_helper` and into `vector_internals`.
4
This ensures they can be used by both vector and vector-crypto helpers
5
(latter implemented in proceeding commits).
6
7
Signed-off-by: Kiran Ostrolenk <kiran.ostrolenk@codethink.co.uk>
8
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
9
Signed-off-by: Max Chou <max.chou@sifive.com>
10
Message-ID: <20230711165917.2629866-8-max.chou@sifive.com>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
13
target/riscv/vector_internals.h | 46 +++++++++++++++++++++++++++++++++
14
target/riscv/vector_helper.c | 42 ------------------------------
15
2 files changed, 46 insertions(+), 42 deletions(-)
16
17
diff --git a/target/riscv/vector_internals.h b/target/riscv/vector_internals.h
18
index XXXXXXX..XXXXXXX 100644
19
--- a/target/riscv/vector_internals.h
20
+++ b/target/riscv/vector_internals.h
21
@@ -XXX,XX +XXX,XX @@ void vext_set_elems_1s(void *base, uint32_t is_agnostic, uint32_t cnt,
22
/* expand macro args before macro */
23
#define RVVCALL(macro, ...) macro(__VA_ARGS__)
24
25
+/* (TD, T2, TX2) */
26
+#define OP_UU_B uint8_t, uint8_t, uint8_t
27
+#define OP_UU_H uint16_t, uint16_t, uint16_t
28
+#define OP_UU_W uint32_t, uint32_t, uint32_t
29
+#define OP_UU_D uint64_t, uint64_t, uint64_t
30
+
31
/* (TD, T1, T2, TX1, TX2) */
32
#define OP_UUU_B uint8_t, uint8_t, uint8_t, uint8_t, uint8_t
33
#define OP_UUU_H uint16_t, uint16_t, uint16_t, uint16_t, uint16_t
34
#define OP_UUU_W uint32_t, uint32_t, uint32_t, uint32_t, uint32_t
35
#define OP_UUU_D uint64_t, uint64_t, uint64_t, uint64_t, uint64_t
36
37
+#define OPIVV1(NAME, TD, T2, TX2, HD, HS2, OP) \
38
+static void do_##NAME(void *vd, void *vs2, int i) \
39
+{ \
40
+ TX2 s2 = *((T2 *)vs2 + HS2(i)); \
41
+ *((TD *)vd + HD(i)) = OP(s2); \
42
+}
43
+
44
+#define GEN_VEXT_V(NAME, ESZ) \
45
+void HELPER(NAME)(void *vd, void *v0, void *vs2, \
46
+ CPURISCVState *env, uint32_t desc) \
47
+{ \
48
+ uint32_t vm = vext_vm(desc); \
49
+ uint32_t vl = env->vl; \
50
+ uint32_t total_elems = \
51
+ vext_get_total_elems(env, desc, ESZ); \
52
+ uint32_t vta = vext_vta(desc); \
53
+ uint32_t vma = vext_vma(desc); \
54
+ uint32_t i; \
55
+ \
56
+ for (i = env->vstart; i < vl; i++) { \
57
+ if (!vm && !vext_elem_mask(v0, i)) { \
58
+ /* set masked-off elements to 1s */ \
59
+ vext_set_elems_1s(vd, vma, i * ESZ, \
60
+ (i + 1) * ESZ); \
61
+ continue; \
62
+ } \
63
+ do_##NAME(vd, vs2, i); \
64
+ } \
65
+ env->vstart = 0; \
66
+ /* set tail elements to 1s */ \
67
+ vext_set_elems_1s(vd, vta, vl * ESZ, \
68
+ total_elems * ESZ); \
69
+}
70
+
71
/* operation of two vector elements */
72
typedef void opivv2_fn(void *vd, void *vs1, void *vs2, int i);
73
74
@@ -XXX,XX +XXX,XX @@ void HELPER(NAME)(void *vd, void *v0, target_ulong s1, \
75
do_##NAME, ESZ); \
76
}
77
78
+/* Three of the widening shortening macros: */
79
+/* (TD, T1, T2, TX1, TX2) */
80
+#define WOP_UUU_B uint16_t, uint8_t, uint8_t, uint16_t, uint16_t
81
+#define WOP_UUU_H uint32_t, uint16_t, uint16_t, uint32_t, uint32_t
82
+#define WOP_UUU_W uint64_t, uint32_t, uint32_t, uint64_t, uint64_t
83
+
84
#endif /* TARGET_RISCV_VECTOR_INTERNALS_H */
85
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
86
index XXXXXXX..XXXXXXX 100644
87
--- a/target/riscv/vector_helper.c
88
+++ b/target/riscv/vector_helper.c
89
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_ST_WHOLE(vs8r_v, int8_t, ste_b)
90
#define OP_SUS_H int16_t, uint16_t, int16_t, uint16_t, int16_t
91
#define OP_SUS_W int32_t, uint32_t, int32_t, uint32_t, int32_t
92
#define OP_SUS_D int64_t, uint64_t, int64_t, uint64_t, int64_t
93
-#define WOP_UUU_B uint16_t, uint8_t, uint8_t, uint16_t, uint16_t
94
-#define WOP_UUU_H uint32_t, uint16_t, uint16_t, uint32_t, uint32_t
95
-#define WOP_UUU_W uint64_t, uint32_t, uint32_t, uint64_t, uint64_t
96
#define WOP_SSS_B int16_t, int8_t, int8_t, int16_t, int16_t
97
#define WOP_SSS_H int32_t, int16_t, int16_t, int32_t, int32_t
98
#define WOP_SSS_W int64_t, int32_t, int32_t, int64_t, int64_t
99
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_VF(vfwnmsac_vf_h, 4)
100
GEN_VEXT_VF(vfwnmsac_vf_w, 8)
101
102
/* Vector Floating-Point Square-Root Instruction */
103
-/* (TD, T2, TX2) */
104
-#define OP_UU_H uint16_t, uint16_t, uint16_t
105
-#define OP_UU_W uint32_t, uint32_t, uint32_t
106
-#define OP_UU_D uint64_t, uint64_t, uint64_t
107
-
108
#define OPFVV1(NAME, TD, T2, TX2, HD, HS2, OP) \
109
static void do_##NAME(void *vd, void *vs2, int i, \
110
CPURISCVState *env) \
111
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_CMP_VF(vmfge_vf_w, uint32_t, H4, vmfge32)
112
GEN_VEXT_CMP_VF(vmfge_vf_d, uint64_t, H8, vmfge64)
113
114
/* Vector Floating-Point Classify Instruction */
115
-#define OPIVV1(NAME, TD, T2, TX2, HD, HS2, OP) \
116
-static void do_##NAME(void *vd, void *vs2, int i) \
117
-{ \
118
- TX2 s2 = *((T2 *)vs2 + HS2(i)); \
119
- *((TD *)vd + HD(i)) = OP(s2); \
120
-}
121
-
122
-#define GEN_VEXT_V(NAME, ESZ) \
123
-void HELPER(NAME)(void *vd, void *v0, void *vs2, \
124
- CPURISCVState *env, uint32_t desc) \
125
-{ \
126
- uint32_t vm = vext_vm(desc); \
127
- uint32_t vl = env->vl; \
128
- uint32_t total_elems = \
129
- vext_get_total_elems(env, desc, ESZ); \
130
- uint32_t vta = vext_vta(desc); \
131
- uint32_t vma = vext_vma(desc); \
132
- uint32_t i; \
133
- \
134
- for (i = env->vstart; i < vl; i++) { \
135
- if (!vm && !vext_elem_mask(v0, i)) { \
136
- /* set masked-off elements to 1s */ \
137
- vext_set_elems_1s(vd, vma, i * ESZ, \
138
- (i + 1) * ESZ); \
139
- continue; \
140
- } \
141
- do_##NAME(vd, vs2, i); \
142
- } \
143
- env->vstart = 0; \
144
- /* set tail elements to 1s */ \
145
- vext_set_elems_1s(vd, vta, vl * ESZ, \
146
- total_elems * ESZ); \
147
-}
148
-
149
target_ulong fclass_h(uint64_t frs1)
150
{
151
float16 f = frs1;
152
--
153
2.41.0
diff view generated by jsdifflib
1
From: Kito Cheng <kito.cheng@sifive.com>
1
From: Dickon Hood <dickon.hood@codethink.co.uk>
2
2
3
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
3
This commit adds support for the Zvbb vector-crypto extension, which
4
Signed-off-by: Frank Chang <frank.chang@sifive.com>
4
consists of the following instructions:
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
* vrol.[vv,vx]
7
Message-id: 20210505160620.15723-12-frank.chang@sifive.com
7
* vror.[vv,vx,vi]
8
* vbrev8.v
9
* vrev8.v
10
* vandn.[vv,vx]
11
* vbrev.v
12
* vclz.v
13
* vctz.v
14
* vcpop.v
15
* vwsll.[vv,vx,vi]
16
17
Translation functions are defined in
18
`target/riscv/insn_trans/trans_rvvk.c.inc` and helpers are defined in
19
`target/riscv/vcrypto_helper.c`.
20
21
Co-authored-by: Nazar Kazakov <nazar.kazakov@codethink.co.uk>
22
Co-authored-by: William Salmon <will.salmon@codethink.co.uk>
23
Co-authored-by: Kiran Ostrolenk <kiran.ostrolenk@codethink.co.uk>
24
[max.chou@sifive.com: Fix imm mode of vror.vi]
25
Signed-off-by: Nazar Kazakov <nazar.kazakov@codethink.co.uk>
26
Signed-off-by: William Salmon <will.salmon@codethink.co.uk>
27
Signed-off-by: Kiran Ostrolenk <kiran.ostrolenk@codethink.co.uk>
28
Signed-off-by: Dickon Hood <dickon.hood@codethink.co.uk>
29
Signed-off-by: Max Chou <max.chou@sifive.com>
30
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
31
[max.chou@sifive.com: Exposed x-zvbb property]
32
Message-ID: <20230711165917.2629866-9-max.chou@sifive.com>
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
33
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
---
34
---
10
target/riscv/insn32.decode | 6 ++++
35
target/riscv/cpu_cfg.h | 1 +
11
target/riscv/translate.c | 36 +++++++++++++++++++++++
36
target/riscv/helper.h | 62 +++++++++
12
target/riscv/insn_trans/trans_rvb.c.inc | 39 +++++++++++++++++++++++++
37
target/riscv/insn32.decode | 20 +++
13
3 files changed, 81 insertions(+)
38
target/riscv/cpu.c | 12 ++
39
target/riscv/vcrypto_helper.c | 138 +++++++++++++++++++
40
target/riscv/insn_trans/trans_rvvk.c.inc | 164 +++++++++++++++++++++++
41
6 files changed, 397 insertions(+)
14
42
43
diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h
44
index XXXXXXX..XXXXXXX 100644
45
--- a/target/riscv/cpu_cfg.h
46
+++ b/target/riscv/cpu_cfg.h
47
@@ -XXX,XX +XXX,XX @@ struct RISCVCPUConfig {
48
bool ext_zve32f;
49
bool ext_zve64f;
50
bool ext_zve64d;
51
+ bool ext_zvbb;
52
bool ext_zvbc;
53
bool ext_zmmul;
54
bool ext_zvfbfmin;
55
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
56
index XXXXXXX..XXXXXXX 100644
57
--- a/target/riscv/helper.h
58
+++ b/target/riscv/helper.h
59
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vclmul_vv, void, ptr, ptr, ptr, ptr, env, i32)
60
DEF_HELPER_6(vclmul_vx, void, ptr, ptr, tl, ptr, env, i32)
61
DEF_HELPER_6(vclmulh_vv, void, ptr, ptr, ptr, ptr, env, i32)
62
DEF_HELPER_6(vclmulh_vx, void, ptr, ptr, tl, ptr, env, i32)
63
+
64
+DEF_HELPER_6(vror_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
65
+DEF_HELPER_6(vror_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
66
+DEF_HELPER_6(vror_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
67
+DEF_HELPER_6(vror_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
68
+
69
+DEF_HELPER_6(vror_vx_b, void, ptr, ptr, tl, ptr, env, i32)
70
+DEF_HELPER_6(vror_vx_h, void, ptr, ptr, tl, ptr, env, i32)
71
+DEF_HELPER_6(vror_vx_w, void, ptr, ptr, tl, ptr, env, i32)
72
+DEF_HELPER_6(vror_vx_d, void, ptr, ptr, tl, ptr, env, i32)
73
+
74
+DEF_HELPER_6(vrol_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
75
+DEF_HELPER_6(vrol_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
76
+DEF_HELPER_6(vrol_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
77
+DEF_HELPER_6(vrol_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
78
+
79
+DEF_HELPER_6(vrol_vx_b, void, ptr, ptr, tl, ptr, env, i32)
80
+DEF_HELPER_6(vrol_vx_h, void, ptr, ptr, tl, ptr, env, i32)
81
+DEF_HELPER_6(vrol_vx_w, void, ptr, ptr, tl, ptr, env, i32)
82
+DEF_HELPER_6(vrol_vx_d, void, ptr, ptr, tl, ptr, env, i32)
83
+
84
+DEF_HELPER_5(vrev8_v_b, void, ptr, ptr, ptr, env, i32)
85
+DEF_HELPER_5(vrev8_v_h, void, ptr, ptr, ptr, env, i32)
86
+DEF_HELPER_5(vrev8_v_w, void, ptr, ptr, ptr, env, i32)
87
+DEF_HELPER_5(vrev8_v_d, void, ptr, ptr, ptr, env, i32)
88
+DEF_HELPER_5(vbrev8_v_b, void, ptr, ptr, ptr, env, i32)
89
+DEF_HELPER_5(vbrev8_v_h, void, ptr, ptr, ptr, env, i32)
90
+DEF_HELPER_5(vbrev8_v_w, void, ptr, ptr, ptr, env, i32)
91
+DEF_HELPER_5(vbrev8_v_d, void, ptr, ptr, ptr, env, i32)
92
+DEF_HELPER_5(vbrev_v_b, void, ptr, ptr, ptr, env, i32)
93
+DEF_HELPER_5(vbrev_v_h, void, ptr, ptr, ptr, env, i32)
94
+DEF_HELPER_5(vbrev_v_w, void, ptr, ptr, ptr, env, i32)
95
+DEF_HELPER_5(vbrev_v_d, void, ptr, ptr, ptr, env, i32)
96
+
97
+DEF_HELPER_5(vclz_v_b, void, ptr, ptr, ptr, env, i32)
98
+DEF_HELPER_5(vclz_v_h, void, ptr, ptr, ptr, env, i32)
99
+DEF_HELPER_5(vclz_v_w, void, ptr, ptr, ptr, env, i32)
100
+DEF_HELPER_5(vclz_v_d, void, ptr, ptr, ptr, env, i32)
101
+DEF_HELPER_5(vctz_v_b, void, ptr, ptr, ptr, env, i32)
102
+DEF_HELPER_5(vctz_v_h, void, ptr, ptr, ptr, env, i32)
103
+DEF_HELPER_5(vctz_v_w, void, ptr, ptr, ptr, env, i32)
104
+DEF_HELPER_5(vctz_v_d, void, ptr, ptr, ptr, env, i32)
105
+DEF_HELPER_5(vcpop_v_b, void, ptr, ptr, ptr, env, i32)
106
+DEF_HELPER_5(vcpop_v_h, void, ptr, ptr, ptr, env, i32)
107
+DEF_HELPER_5(vcpop_v_w, void, ptr, ptr, ptr, env, i32)
108
+DEF_HELPER_5(vcpop_v_d, void, ptr, ptr, ptr, env, i32)
109
+
110
+DEF_HELPER_6(vwsll_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
111
+DEF_HELPER_6(vwsll_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
112
+DEF_HELPER_6(vwsll_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
113
+DEF_HELPER_6(vwsll_vx_b, void, ptr, ptr, tl, ptr, env, i32)
114
+DEF_HELPER_6(vwsll_vx_h, void, ptr, ptr, tl, ptr, env, i32)
115
+DEF_HELPER_6(vwsll_vx_w, void, ptr, ptr, tl, ptr, env, i32)
116
+
117
+DEF_HELPER_6(vandn_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
118
+DEF_HELPER_6(vandn_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
119
+DEF_HELPER_6(vandn_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
120
+DEF_HELPER_6(vandn_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
121
+DEF_HELPER_6(vandn_vx_b, void, ptr, ptr, tl, ptr, env, i32)
122
+DEF_HELPER_6(vandn_vx_h, void, ptr, ptr, tl, ptr, env, i32)
123
+DEF_HELPER_6(vandn_vx_w, void, ptr, ptr, tl, ptr, env, i32)
124
+DEF_HELPER_6(vandn_vx_d, void, ptr, ptr, tl, ptr, env, i32)
15
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
125
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
16
index XXXXXXX..XXXXXXX 100644
126
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/insn32.decode
127
--- a/target/riscv/insn32.decode
18
+++ b/target/riscv/insn32.decode
128
+++ b/target/riscv/insn32.decode
19
@@ -XXX,XX +XXX,XX @@ binv 0110100 .......... 001 ..... 0110011 @r
129
@@ -XXX,XX +XXX,XX @@
20
bext 0100100 .......... 101 ..... 0110011 @r
130
%imm_u 12:s20 !function=ex_shift_12
21
slo 0010000 .......... 001 ..... 0110011 @r
131
%imm_bs 30:2 !function=ex_shift_3
22
sro 0010000 .......... 101 ..... 0110011 @r
132
%imm_rnum 20:4
23
+ror 0110000 .......... 101 ..... 0110011 @r
133
+%imm_z6 26:1 15:5
24
+rol 0110000 .......... 001 ..... 0110011 @r
134
25
135
# Argument sets:
26
bseti 00101. ........... 001 ..... 0010011 @sh
136
&empty
27
bclri 01001. ........... 001 ..... 0010011 @sh
137
@@ -XXX,XX +XXX,XX @@
28
@@ -XXX,XX +XXX,XX @@ binvi 01101. ........... 001 ..... 0010011 @sh
138
@r_vm ...... vm:1 ..... ..... ... ..... ....... &rmrr %rs2 %rs1 %rd
29
bexti 01001. ........... 101 ..... 0010011 @sh
139
@r_vm_1 ...... . ..... ..... ... ..... ....... &rmrr vm=1 %rs2 %rs1 %rd
30
sloi 00100. ........... 001 ..... 0010011 @sh
140
@r_vm_0 ...... . ..... ..... ... ..... ....... &rmrr vm=0 %rs2 %rs1 %rd
31
sroi 00100. ........... 101 ..... 0010011 @sh
141
+@r2_zimm6 ..... . vm:1 ..... ..... ... ..... ....... &rmrr %rs2 rs1=%imm_z6 %rd
32
+rori 01100. ........... 101 ..... 0010011 @sh
142
@r2_zimm11 . zimm:11 ..... ... ..... ....... %rs1 %rd
33
143
@r2_zimm10 .. zimm:10 ..... ... ..... ....... %rs1 %rd
34
# *** RV64B Standard Extension (in addition to RV32B) ***
144
@r2_s ....... ..... ..... ... ..... ....... %rs2 %rs1
35
clzw 0110000 00000 ..... 001 ..... 0011011 @r2
145
@@ -XXX,XX +XXX,XX @@ vclmul_vv 001100 . ..... ..... 010 ..... 1010111 @r_vm
36
@@ -XXX,XX +XXX,XX @@ binvw 0110100 .......... 001 ..... 0111011 @r
146
vclmul_vx 001100 . ..... ..... 110 ..... 1010111 @r_vm
37
bextw 0100100 .......... 101 ..... 0111011 @r
147
vclmulh_vv 001101 . ..... ..... 010 ..... 1010111 @r_vm
38
slow 0010000 .......... 001 ..... 0111011 @r
148
vclmulh_vx 001101 . ..... ..... 110 ..... 1010111 @r_vm
39
srow 0010000 .......... 101 ..... 0111011 @r
149
+
40
+rorw 0110000 .......... 101 ..... 0111011 @r
150
+# *** Zvbb vector crypto extension ***
41
+rolw 0110000 .......... 001 ..... 0111011 @r
151
+vrol_vv 010101 . ..... ..... 000 ..... 1010111 @r_vm
42
152
+vrol_vx 010101 . ..... ..... 100 ..... 1010111 @r_vm
43
bsetiw 0010100 .......... 001 ..... 0011011 @sh5
153
+vror_vv 010100 . ..... ..... 000 ..... 1010111 @r_vm
44
bclriw 0100100 .......... 001 ..... 0011011 @sh5
154
+vror_vx 010100 . ..... ..... 100 ..... 1010111 @r_vm
45
binviw 0110100 .......... 001 ..... 0011011 @sh5
155
+vror_vi 01010. . ..... ..... 011 ..... 1010111 @r2_zimm6
46
sloiw 0010000 .......... 001 ..... 0011011 @sh5
156
+vbrev8_v 010010 . ..... 01000 010 ..... 1010111 @r2_vm
47
sroiw 0010000 .......... 101 ..... 0011011 @sh5
157
+vrev8_v 010010 . ..... 01001 010 ..... 1010111 @r2_vm
48
+roriw 0110000 .......... 101 ..... 0011011 @sh5
158
+vandn_vv 000001 . ..... ..... 000 ..... 1010111 @r_vm
49
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
159
+vandn_vx 000001 . ..... ..... 100 ..... 1010111 @r_vm
160
+vbrev_v 010010 . ..... 01010 010 ..... 1010111 @r2_vm
161
+vclz_v 010010 . ..... 01100 010 ..... 1010111 @r2_vm
162
+vctz_v 010010 . ..... 01101 010 ..... 1010111 @r2_vm
163
+vcpop_v 010010 . ..... 01110 010 ..... 1010111 @r2_vm
164
+vwsll_vv 110101 . ..... ..... 000 ..... 1010111 @r_vm
165
+vwsll_vx 110101 . ..... ..... 100 ..... 1010111 @r_vm
166
+vwsll_vi 110101 . ..... ..... 011 ..... 1010111 @r_vm
167
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
50
index XXXXXXX..XXXXXXX 100644
168
index XXXXXXX..XXXXXXX 100644
51
--- a/target/riscv/translate.c
169
--- a/target/riscv/cpu.c
52
+++ b/target/riscv/translate.c
170
+++ b/target/riscv/cpu.c
53
@@ -XXX,XX +XXX,XX @@ static void gen_packuw(TCGv ret, TCGv arg1, TCGv arg2)
171
@@ -XXX,XX +XXX,XX @@ static const struct isa_ext_data isa_edata_arr[] = {
54
tcg_temp_free(t);
172
ISA_EXT_DATA_ENTRY(zksed, PRIV_VERSION_1_12_0, ext_zksed),
55
}
173
ISA_EXT_DATA_ENTRY(zksh, PRIV_VERSION_1_12_0, ext_zksh),
56
174
ISA_EXT_DATA_ENTRY(zkt, PRIV_VERSION_1_12_0, ext_zkt),
57
+static void gen_rorw(TCGv ret, TCGv arg1, TCGv arg2)
175
+ ISA_EXT_DATA_ENTRY(zvbb, PRIV_VERSION_1_12_0, ext_zvbb),
176
ISA_EXT_DATA_ENTRY(zvbc, PRIV_VERSION_1_12_0, ext_zvbc),
177
ISA_EXT_DATA_ENTRY(zve32f, PRIV_VERSION_1_10_0, ext_zve32f),
178
ISA_EXT_DATA_ENTRY(zve64f, PRIV_VERSION_1_10_0, ext_zve64f),
179
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
180
return;
181
}
182
183
+ /*
184
+ * In principle Zve*x would also suffice here, were they supported
185
+ * in qemu
186
+ */
187
+ if (cpu->cfg.ext_zvbb && !cpu->cfg.ext_zve32f) {
188
+ error_setg(errp,
189
+ "Vector crypto extensions require V or Zve* extensions");
190
+ return;
191
+ }
192
+
193
if (cpu->cfg.ext_zvbc && !cpu->cfg.ext_zve64f) {
194
error_setg(errp, "Zvbc extension requires V or Zve64{f,d} extensions");
195
return;
196
@@ -XXX,XX +XXX,XX @@ static Property riscv_cpu_extensions[] = {
197
DEFINE_PROP_BOOL("x-zvfbfwma", RISCVCPU, cfg.ext_zvfbfwma, false),
198
199
/* Vector cryptography extensions */
200
+ DEFINE_PROP_BOOL("x-zvbb", RISCVCPU, cfg.ext_zvbb, false),
201
DEFINE_PROP_BOOL("x-zvbc", RISCVCPU, cfg.ext_zvbc, false),
202
203
DEFINE_PROP_END_OF_LIST(),
204
diff --git a/target/riscv/vcrypto_helper.c b/target/riscv/vcrypto_helper.c
205
index XXXXXXX..XXXXXXX 100644
206
--- a/target/riscv/vcrypto_helper.c
207
+++ b/target/riscv/vcrypto_helper.c
208
@@ -XXX,XX +XXX,XX @@
209
#include "qemu/osdep.h"
210
#include "qemu/host-utils.h"
211
#include "qemu/bitops.h"
212
+#include "qemu/bswap.h"
213
#include "cpu.h"
214
#include "exec/memop.h"
215
#include "exec/exec-all.h"
216
@@ -XXX,XX +XXX,XX @@ RVVCALL(OPIVV2, vclmulh_vv, OP_UUU_D, H8, H8, H8, clmulh64)
217
GEN_VEXT_VV(vclmulh_vv, 8)
218
RVVCALL(OPIVX2, vclmulh_vx, OP_UUU_D, H8, H8, clmulh64)
219
GEN_VEXT_VX(vclmulh_vx, 8)
220
+
221
+RVVCALL(OPIVV2, vror_vv_b, OP_UUU_B, H1, H1, H1, ror8)
222
+RVVCALL(OPIVV2, vror_vv_h, OP_UUU_H, H2, H2, H2, ror16)
223
+RVVCALL(OPIVV2, vror_vv_w, OP_UUU_W, H4, H4, H4, ror32)
224
+RVVCALL(OPIVV2, vror_vv_d, OP_UUU_D, H8, H8, H8, ror64)
225
+GEN_VEXT_VV(vror_vv_b, 1)
226
+GEN_VEXT_VV(vror_vv_h, 2)
227
+GEN_VEXT_VV(vror_vv_w, 4)
228
+GEN_VEXT_VV(vror_vv_d, 8)
229
+
230
+RVVCALL(OPIVX2, vror_vx_b, OP_UUU_B, H1, H1, ror8)
231
+RVVCALL(OPIVX2, vror_vx_h, OP_UUU_H, H2, H2, ror16)
232
+RVVCALL(OPIVX2, vror_vx_w, OP_UUU_W, H4, H4, ror32)
233
+RVVCALL(OPIVX2, vror_vx_d, OP_UUU_D, H8, H8, ror64)
234
+GEN_VEXT_VX(vror_vx_b, 1)
235
+GEN_VEXT_VX(vror_vx_h, 2)
236
+GEN_VEXT_VX(vror_vx_w, 4)
237
+GEN_VEXT_VX(vror_vx_d, 8)
238
+
239
+RVVCALL(OPIVV2, vrol_vv_b, OP_UUU_B, H1, H1, H1, rol8)
240
+RVVCALL(OPIVV2, vrol_vv_h, OP_UUU_H, H2, H2, H2, rol16)
241
+RVVCALL(OPIVV2, vrol_vv_w, OP_UUU_W, H4, H4, H4, rol32)
242
+RVVCALL(OPIVV2, vrol_vv_d, OP_UUU_D, H8, H8, H8, rol64)
243
+GEN_VEXT_VV(vrol_vv_b, 1)
244
+GEN_VEXT_VV(vrol_vv_h, 2)
245
+GEN_VEXT_VV(vrol_vv_w, 4)
246
+GEN_VEXT_VV(vrol_vv_d, 8)
247
+
248
+RVVCALL(OPIVX2, vrol_vx_b, OP_UUU_B, H1, H1, rol8)
249
+RVVCALL(OPIVX2, vrol_vx_h, OP_UUU_H, H2, H2, rol16)
250
+RVVCALL(OPIVX2, vrol_vx_w, OP_UUU_W, H4, H4, rol32)
251
+RVVCALL(OPIVX2, vrol_vx_d, OP_UUU_D, H8, H8, rol64)
252
+GEN_VEXT_VX(vrol_vx_b, 1)
253
+GEN_VEXT_VX(vrol_vx_h, 2)
254
+GEN_VEXT_VX(vrol_vx_w, 4)
255
+GEN_VEXT_VX(vrol_vx_d, 8)
256
+
257
+static uint64_t brev8(uint64_t val)
58
+{
258
+{
59
+ TCGv_i32 t1 = tcg_temp_new_i32();
259
+ val = ((val & 0x5555555555555555ull) << 1) |
60
+ TCGv_i32 t2 = tcg_temp_new_i32();
260
+ ((val & 0xAAAAAAAAAAAAAAAAull) >> 1);
61
+
261
+ val = ((val & 0x3333333333333333ull) << 2) |
62
+ /* truncate to 32-bits */
262
+ ((val & 0xCCCCCCCCCCCCCCCCull) >> 2);
63
+ tcg_gen_trunc_tl_i32(t1, arg1);
263
+ val = ((val & 0x0F0F0F0F0F0F0F0Full) << 4) |
64
+ tcg_gen_trunc_tl_i32(t2, arg2);
264
+ ((val & 0xF0F0F0F0F0F0F0F0ull) >> 4);
65
+
265
+
66
+ tcg_gen_rotr_i32(t1, t1, t2);
266
+ return val;
67
+
68
+ /* sign-extend 64-bits */
69
+ tcg_gen_ext_i32_tl(ret, t1);
70
+
71
+ tcg_temp_free_i32(t1);
72
+ tcg_temp_free_i32(t2);
73
+}
267
+}
74
+
268
+
75
+static void gen_rolw(TCGv ret, TCGv arg1, TCGv arg2)
269
+RVVCALL(OPIVV1, vbrev8_v_b, OP_UU_B, H1, H1, brev8)
270
+RVVCALL(OPIVV1, vbrev8_v_h, OP_UU_H, H2, H2, brev8)
271
+RVVCALL(OPIVV1, vbrev8_v_w, OP_UU_W, H4, H4, brev8)
272
+RVVCALL(OPIVV1, vbrev8_v_d, OP_UU_D, H8, H8, brev8)
273
+GEN_VEXT_V(vbrev8_v_b, 1)
274
+GEN_VEXT_V(vbrev8_v_h, 2)
275
+GEN_VEXT_V(vbrev8_v_w, 4)
276
+GEN_VEXT_V(vbrev8_v_d, 8)
277
+
278
+#define DO_IDENTITY(a) (a)
279
+RVVCALL(OPIVV1, vrev8_v_b, OP_UU_B, H1, H1, DO_IDENTITY)
280
+RVVCALL(OPIVV1, vrev8_v_h, OP_UU_H, H2, H2, bswap16)
281
+RVVCALL(OPIVV1, vrev8_v_w, OP_UU_W, H4, H4, bswap32)
282
+RVVCALL(OPIVV1, vrev8_v_d, OP_UU_D, H8, H8, bswap64)
283
+GEN_VEXT_V(vrev8_v_b, 1)
284
+GEN_VEXT_V(vrev8_v_h, 2)
285
+GEN_VEXT_V(vrev8_v_w, 4)
286
+GEN_VEXT_V(vrev8_v_d, 8)
287
+
288
+#define DO_ANDN(a, b) ((a) & ~(b))
289
+RVVCALL(OPIVV2, vandn_vv_b, OP_UUU_B, H1, H1, H1, DO_ANDN)
290
+RVVCALL(OPIVV2, vandn_vv_h, OP_UUU_H, H2, H2, H2, DO_ANDN)
291
+RVVCALL(OPIVV2, vandn_vv_w, OP_UUU_W, H4, H4, H4, DO_ANDN)
292
+RVVCALL(OPIVV2, vandn_vv_d, OP_UUU_D, H8, H8, H8, DO_ANDN)
293
+GEN_VEXT_VV(vandn_vv_b, 1)
294
+GEN_VEXT_VV(vandn_vv_h, 2)
295
+GEN_VEXT_VV(vandn_vv_w, 4)
296
+GEN_VEXT_VV(vandn_vv_d, 8)
297
+
298
+RVVCALL(OPIVX2, vandn_vx_b, OP_UUU_B, H1, H1, DO_ANDN)
299
+RVVCALL(OPIVX2, vandn_vx_h, OP_UUU_H, H2, H2, DO_ANDN)
300
+RVVCALL(OPIVX2, vandn_vx_w, OP_UUU_W, H4, H4, DO_ANDN)
301
+RVVCALL(OPIVX2, vandn_vx_d, OP_UUU_D, H8, H8, DO_ANDN)
302
+GEN_VEXT_VX(vandn_vx_b, 1)
303
+GEN_VEXT_VX(vandn_vx_h, 2)
304
+GEN_VEXT_VX(vandn_vx_w, 4)
305
+GEN_VEXT_VX(vandn_vx_d, 8)
306
+
307
+RVVCALL(OPIVV1, vbrev_v_b, OP_UU_B, H1, H1, revbit8)
308
+RVVCALL(OPIVV1, vbrev_v_h, OP_UU_H, H2, H2, revbit16)
309
+RVVCALL(OPIVV1, vbrev_v_w, OP_UU_W, H4, H4, revbit32)
310
+RVVCALL(OPIVV1, vbrev_v_d, OP_UU_D, H8, H8, revbit64)
311
+GEN_VEXT_V(vbrev_v_b, 1)
312
+GEN_VEXT_V(vbrev_v_h, 2)
313
+GEN_VEXT_V(vbrev_v_w, 4)
314
+GEN_VEXT_V(vbrev_v_d, 8)
315
+
316
+RVVCALL(OPIVV1, vclz_v_b, OP_UU_B, H1, H1, clz8)
317
+RVVCALL(OPIVV1, vclz_v_h, OP_UU_H, H2, H2, clz16)
318
+RVVCALL(OPIVV1, vclz_v_w, OP_UU_W, H4, H4, clz32)
319
+RVVCALL(OPIVV1, vclz_v_d, OP_UU_D, H8, H8, clz64)
320
+GEN_VEXT_V(vclz_v_b, 1)
321
+GEN_VEXT_V(vclz_v_h, 2)
322
+GEN_VEXT_V(vclz_v_w, 4)
323
+GEN_VEXT_V(vclz_v_d, 8)
324
+
325
+RVVCALL(OPIVV1, vctz_v_b, OP_UU_B, H1, H1, ctz8)
326
+RVVCALL(OPIVV1, vctz_v_h, OP_UU_H, H2, H2, ctz16)
327
+RVVCALL(OPIVV1, vctz_v_w, OP_UU_W, H4, H4, ctz32)
328
+RVVCALL(OPIVV1, vctz_v_d, OP_UU_D, H8, H8, ctz64)
329
+GEN_VEXT_V(vctz_v_b, 1)
330
+GEN_VEXT_V(vctz_v_h, 2)
331
+GEN_VEXT_V(vctz_v_w, 4)
332
+GEN_VEXT_V(vctz_v_d, 8)
333
+
334
+RVVCALL(OPIVV1, vcpop_v_b, OP_UU_B, H1, H1, ctpop8)
335
+RVVCALL(OPIVV1, vcpop_v_h, OP_UU_H, H2, H2, ctpop16)
336
+RVVCALL(OPIVV1, vcpop_v_w, OP_UU_W, H4, H4, ctpop32)
337
+RVVCALL(OPIVV1, vcpop_v_d, OP_UU_D, H8, H8, ctpop64)
338
+GEN_VEXT_V(vcpop_v_b, 1)
339
+GEN_VEXT_V(vcpop_v_h, 2)
340
+GEN_VEXT_V(vcpop_v_w, 4)
341
+GEN_VEXT_V(vcpop_v_d, 8)
342
+
343
+#define DO_SLL(N, M) (N << (M & (sizeof(N) * 8 - 1)))
344
+RVVCALL(OPIVV2, vwsll_vv_b, WOP_UUU_B, H2, H1, H1, DO_SLL)
345
+RVVCALL(OPIVV2, vwsll_vv_h, WOP_UUU_H, H4, H2, H2, DO_SLL)
346
+RVVCALL(OPIVV2, vwsll_vv_w, WOP_UUU_W, H8, H4, H4, DO_SLL)
347
+GEN_VEXT_VV(vwsll_vv_b, 2)
348
+GEN_VEXT_VV(vwsll_vv_h, 4)
349
+GEN_VEXT_VV(vwsll_vv_w, 8)
350
+
351
+RVVCALL(OPIVX2, vwsll_vx_b, WOP_UUU_B, H2, H1, DO_SLL)
352
+RVVCALL(OPIVX2, vwsll_vx_h, WOP_UUU_H, H4, H2, DO_SLL)
353
+RVVCALL(OPIVX2, vwsll_vx_w, WOP_UUU_W, H8, H4, DO_SLL)
354
+GEN_VEXT_VX(vwsll_vx_b, 2)
355
+GEN_VEXT_VX(vwsll_vx_h, 4)
356
+GEN_VEXT_VX(vwsll_vx_w, 8)
357
diff --git a/target/riscv/insn_trans/trans_rvvk.c.inc b/target/riscv/insn_trans/trans_rvvk.c.inc
358
index XXXXXXX..XXXXXXX 100644
359
--- a/target/riscv/insn_trans/trans_rvvk.c.inc
360
+++ b/target/riscv/insn_trans/trans_rvvk.c.inc
361
@@ -XXX,XX +XXX,XX @@ static bool vclmul_vx_check(DisasContext *s, arg_rmrr *a)
362
363
GEN_VX_MASKED_TRANS(vclmul_vx, vclmul_vx_check)
364
GEN_VX_MASKED_TRANS(vclmulh_vx, vclmul_vx_check)
365
+
366
+/*
367
+ * Zvbb
368
+ */
369
+
370
+#define GEN_OPIVI_GVEC_TRANS_CHECK(NAME, IMM_MODE, OPIVX, SUF, CHECK) \
371
+ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
372
+ { \
373
+ if (CHECK(s, a)) { \
374
+ static gen_helper_opivx *const fns[4] = { \
375
+ gen_helper_##OPIVX##_b, \
376
+ gen_helper_##OPIVX##_h, \
377
+ gen_helper_##OPIVX##_w, \
378
+ gen_helper_##OPIVX##_d, \
379
+ }; \
380
+ return do_opivi_gvec(s, a, tcg_gen_gvec_##SUF, fns[s->sew], \
381
+ IMM_MODE); \
382
+ } \
383
+ return false; \
384
+ }
385
+
386
+#define GEN_OPIVV_GVEC_TRANS_CHECK(NAME, SUF, CHECK) \
387
+ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
388
+ { \
389
+ if (CHECK(s, a)) { \
390
+ static gen_helper_gvec_4_ptr *const fns[4] = { \
391
+ gen_helper_##NAME##_b, \
392
+ gen_helper_##NAME##_h, \
393
+ gen_helper_##NAME##_w, \
394
+ gen_helper_##NAME##_d, \
395
+ }; \
396
+ return do_opivv_gvec(s, a, tcg_gen_gvec_##SUF, fns[s->sew]); \
397
+ } \
398
+ return false; \
399
+ }
400
+
401
+#define GEN_OPIVX_GVEC_SHIFT_TRANS_CHECK(NAME, SUF, CHECK) \
402
+ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
403
+ { \
404
+ if (CHECK(s, a)) { \
405
+ static gen_helper_opivx *const fns[4] = { \
406
+ gen_helper_##NAME##_b, \
407
+ gen_helper_##NAME##_h, \
408
+ gen_helper_##NAME##_w, \
409
+ gen_helper_##NAME##_d, \
410
+ }; \
411
+ return do_opivx_gvec_shift(s, a, tcg_gen_gvec_##SUF, \
412
+ fns[s->sew]); \
413
+ } \
414
+ return false; \
415
+ }
416
+
417
+static bool zvbb_vv_check(DisasContext *s, arg_rmrr *a)
76
+{
418
+{
77
+ TCGv_i32 t1 = tcg_temp_new_i32();
419
+ return opivv_check(s, a) && s->cfg_ptr->ext_zvbb == true;
78
+ TCGv_i32 t2 = tcg_temp_new_i32();
79
+
80
+ /* truncate to 32-bits */
81
+ tcg_gen_trunc_tl_i32(t1, arg1);
82
+ tcg_gen_trunc_tl_i32(t2, arg2);
83
+
84
+ tcg_gen_rotl_i32(t1, t1, t2);
85
+
86
+ /* sign-extend 64-bits */
87
+ tcg_gen_ext_i32_tl(ret, t1);
88
+
89
+ tcg_temp_free_i32(t1);
90
+ tcg_temp_free_i32(t2);
91
+}
420
+}
92
+
421
+
93
static bool gen_arith(DisasContext *ctx, arg_r *a,
422
+static bool zvbb_vx_check(DisasContext *s, arg_rmrr *a)
94
void(*func)(TCGv, TCGv, TCGv))
95
{
96
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
97
index XXXXXXX..XXXXXXX 100644
98
--- a/target/riscv/insn_trans/trans_rvb.c.inc
99
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
100
@@ -XXX,XX +XXX,XX @@ static bool trans_sroi(DisasContext *ctx, arg_sroi *a)
101
return gen_shifti(ctx, a, gen_sro);
102
}
103
104
+static bool trans_ror(DisasContext *ctx, arg_ror *a)
105
+{
423
+{
106
+ REQUIRE_EXT(ctx, RVB);
424
+ return opivx_check(s, a) && s->cfg_ptr->ext_zvbb == true;
107
+ return gen_shift(ctx, a, tcg_gen_rotr_tl);
108
+}
425
+}
109
+
426
+
110
+static bool trans_rori(DisasContext *ctx, arg_rori *a)
427
+/* vrol.v[vx] */
428
+GEN_OPIVV_GVEC_TRANS_CHECK(vrol_vv, rotlv, zvbb_vv_check)
429
+GEN_OPIVX_GVEC_SHIFT_TRANS_CHECK(vrol_vx, rotls, zvbb_vx_check)
430
+
431
+/* vror.v[vxi] */
432
+GEN_OPIVV_GVEC_TRANS_CHECK(vror_vv, rotrv, zvbb_vv_check)
433
+GEN_OPIVX_GVEC_SHIFT_TRANS_CHECK(vror_vx, rotrs, zvbb_vx_check)
434
+GEN_OPIVI_GVEC_TRANS_CHECK(vror_vi, IMM_TRUNC_SEW, vror_vx, rotri, zvbb_vx_check)
435
+
436
+#define GEN_OPIVX_GVEC_TRANS_CHECK(NAME, SUF, CHECK) \
437
+ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
438
+ { \
439
+ if (CHECK(s, a)) { \
440
+ static gen_helper_opivx *const fns[4] = { \
441
+ gen_helper_##NAME##_b, \
442
+ gen_helper_##NAME##_h, \
443
+ gen_helper_##NAME##_w, \
444
+ gen_helper_##NAME##_d, \
445
+ }; \
446
+ return do_opivx_gvec(s, a, tcg_gen_gvec_##SUF, fns[s->sew]); \
447
+ } \
448
+ return false; \
449
+ }
450
+
451
+/* vandn.v[vx] */
452
+GEN_OPIVV_GVEC_TRANS_CHECK(vandn_vv, andc, zvbb_vv_check)
453
+GEN_OPIVX_GVEC_TRANS_CHECK(vandn_vx, andcs, zvbb_vx_check)
454
+
455
+#define GEN_OPIV_TRANS(NAME, CHECK) \
456
+ static bool trans_##NAME(DisasContext *s, arg_rmr *a) \
457
+ { \
458
+ if (CHECK(s, a)) { \
459
+ uint32_t data = 0; \
460
+ static gen_helper_gvec_3_ptr *const fns[4] = { \
461
+ gen_helper_##NAME##_b, \
462
+ gen_helper_##NAME##_h, \
463
+ gen_helper_##NAME##_w, \
464
+ gen_helper_##NAME##_d, \
465
+ }; \
466
+ TCGLabel *over = gen_new_label(); \
467
+ tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over); \
468
+ \
469
+ data = FIELD_DP32(data, VDATA, VM, a->vm); \
470
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
471
+ data = FIELD_DP32(data, VDATA, VTA, s->vta); \
472
+ data = FIELD_DP32(data, VDATA, VTA_ALL_1S, s->cfg_vta_all_1s); \
473
+ data = FIELD_DP32(data, VDATA, VMA, s->vma); \
474
+ tcg_gen_gvec_3_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
475
+ vreg_ofs(s, a->rs2), cpu_env, \
476
+ s->cfg_ptr->vlen / 8, s->cfg_ptr->vlen / 8, \
477
+ data, fns[s->sew]); \
478
+ mark_vs_dirty(s); \
479
+ gen_set_label(over); \
480
+ return true; \
481
+ } \
482
+ return false; \
483
+ }
484
+
485
+static bool zvbb_opiv_check(DisasContext *s, arg_rmr *a)
111
+{
486
+{
112
+ REQUIRE_EXT(ctx, RVB);
487
+ return s->cfg_ptr->ext_zvbb == true &&
113
+ return gen_shifti(ctx, a, tcg_gen_rotr_tl);
488
+ require_rvv(s) &&
489
+ vext_check_isa_ill(s) &&
490
+ vext_check_ss(s, a->rd, a->rs2, a->vm);
114
+}
491
+}
115
+
492
+
116
+static bool trans_rol(DisasContext *ctx, arg_rol *a)
493
+GEN_OPIV_TRANS(vbrev8_v, zvbb_opiv_check)
494
+GEN_OPIV_TRANS(vrev8_v, zvbb_opiv_check)
495
+GEN_OPIV_TRANS(vbrev_v, zvbb_opiv_check)
496
+GEN_OPIV_TRANS(vclz_v, zvbb_opiv_check)
497
+GEN_OPIV_TRANS(vctz_v, zvbb_opiv_check)
498
+GEN_OPIV_TRANS(vcpop_v, zvbb_opiv_check)
499
+
500
+static bool vwsll_vv_check(DisasContext *s, arg_rmrr *a)
117
+{
501
+{
118
+ REQUIRE_EXT(ctx, RVB);
502
+ return s->cfg_ptr->ext_zvbb && opivv_widen_check(s, a);
119
+ return gen_shift(ctx, a, tcg_gen_rotl_tl);
120
+}
503
+}
121
+
504
+
122
static bool trans_clzw(DisasContext *ctx, arg_clzw *a)
505
+static bool vwsll_vx_check(DisasContext *s, arg_rmrr *a)
123
{
124
REQUIRE_64BIT(ctx);
125
@@ -XXX,XX +XXX,XX @@ static bool trans_sroiw(DisasContext *ctx, arg_sroiw *a)
126
REQUIRE_EXT(ctx, RVB);
127
return gen_shiftiw(ctx, a, gen_sro);
128
}
129
+
130
+static bool trans_rorw(DisasContext *ctx, arg_rorw *a)
131
+{
506
+{
132
+ REQUIRE_64BIT(ctx);
507
+ return s->cfg_ptr->ext_zvbb && opivx_widen_check(s, a);
133
+ REQUIRE_EXT(ctx, RVB);
134
+ return gen_shiftw(ctx, a, gen_rorw);
135
+}
508
+}
136
+
509
+
137
+static bool trans_roriw(DisasContext *ctx, arg_roriw *a)
510
+/* OPIVI without GVEC IR */
138
+{
511
+#define GEN_OPIVI_WIDEN_TRANS(NAME, IMM_MODE, OPIVX, CHECK) \
139
+ REQUIRE_64BIT(ctx);
512
+ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
140
+ REQUIRE_EXT(ctx, RVB);
513
+ { \
141
+ return gen_shiftiw(ctx, a, gen_rorw);
514
+ if (CHECK(s, a)) { \
142
+}
515
+ static gen_helper_opivx *const fns[3] = { \
143
+
516
+ gen_helper_##OPIVX##_b, \
144
+static bool trans_rolw(DisasContext *ctx, arg_rolw *a)
517
+ gen_helper_##OPIVX##_h, \
145
+{
518
+ gen_helper_##OPIVX##_w, \
146
+ REQUIRE_64BIT(ctx);
519
+ }; \
147
+ REQUIRE_EXT(ctx, RVB);
520
+ return opivi_trans(a->rd, a->rs1, a->rs2, a->vm, fns[s->sew], s, \
148
+ return gen_shiftw(ctx, a, gen_rolw);
521
+ IMM_MODE); \
149
+}
522
+ } \
523
+ return false; \
524
+ }
525
+
526
+GEN_OPIVV_WIDEN_TRANS(vwsll_vv, vwsll_vv_check)
527
+GEN_OPIVX_WIDEN_TRANS(vwsll_vx, vwsll_vx_check)
528
+GEN_OPIVI_WIDEN_TRANS(vwsll_vi, IMM_ZX, vwsll_vx, vwsll_vx_check)
150
--
529
--
151
2.31.1
530
2.41.0
152
153
diff view generated by jsdifflib
1
From: Kito Cheng <kito.cheng@sifive.com>
1
From: Nazar Kazakov <nazar.kazakov@codethink.co.uk>
2
2
3
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
3
This commit adds support for the Zvkned vector-crypto extension, which
4
Signed-off-by: Frank Chang <frank.chang@sifive.com>
4
consists of the following instructions:
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
* vaesef.[vv,vs]
7
Message-id: 20210505160620.15723-2-frank.chang@sifive.com
7
* vaesdf.[vv,vs]
8
* vaesdm.[vv,vs]
9
* vaesz.vs
10
* vaesem.[vv,vs]
11
* vaeskf1.vi
12
* vaeskf2.vi
13
14
Translation functions are defined in
15
`target/riscv/insn_trans/trans_rvvk.c.inc` and helpers are defined in
16
`target/riscv/vcrypto_helper.c`.
17
18
Co-authored-by: Lawrence Hunter <lawrence.hunter@codethink.co.uk>
19
Co-authored-by: William Salmon <will.salmon@codethink.co.uk>
20
[max.chou@sifive.com: Replaced vstart checking by TCG op]
21
Signed-off-by: Lawrence Hunter <lawrence.hunter@codethink.co.uk>
22
Signed-off-by: William Salmon <will.salmon@codethink.co.uk>
23
Signed-off-by: Nazar Kazakov <nazar.kazakov@codethink.co.uk>
24
Signed-off-by: Max Chou <max.chou@sifive.com>
25
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
26
[max.chou@sifive.com: Imported aes-round.h and exposed x-zvkned
27
property]
28
[max.chou@sifive.com: Fixed endian issues and replaced the vstart & vl
29
egs checking by helper function]
30
[max.chou@sifive.com: Replaced bswap32 calls in aes key expanding]
31
Message-ID: <20230711165917.2629866-10-max.chou@sifive.com>
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
32
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
---
33
---
10
target/riscv/insn32.decode | 10 +++++-----
34
target/riscv/cpu_cfg.h | 1 +
11
1 file changed, 5 insertions(+), 5 deletions(-)
35
target/riscv/helper.h | 14 ++
36
target/riscv/insn32.decode | 14 ++
37
target/riscv/cpu.c | 4 +-
38
target/riscv/vcrypto_helper.c | 202 +++++++++++++++++++++++
39
target/riscv/insn_trans/trans_rvvk.c.inc | 147 +++++++++++++++++
40
6 files changed, 381 insertions(+), 1 deletion(-)
12
41
42
diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h
43
index XXXXXXX..XXXXXXX 100644
44
--- a/target/riscv/cpu_cfg.h
45
+++ b/target/riscv/cpu_cfg.h
46
@@ -XXX,XX +XXX,XX @@ struct RISCVCPUConfig {
47
bool ext_zve64d;
48
bool ext_zvbb;
49
bool ext_zvbc;
50
+ bool ext_zvkned;
51
bool ext_zmmul;
52
bool ext_zvfbfmin;
53
bool ext_zvfbfwma;
54
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
55
index XXXXXXX..XXXXXXX 100644
56
--- a/target/riscv/helper.h
57
+++ b/target/riscv/helper.h
58
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vandn_vx_b, void, ptr, ptr, tl, ptr, env, i32)
59
DEF_HELPER_6(vandn_vx_h, void, ptr, ptr, tl, ptr, env, i32)
60
DEF_HELPER_6(vandn_vx_w, void, ptr, ptr, tl, ptr, env, i32)
61
DEF_HELPER_6(vandn_vx_d, void, ptr, ptr, tl, ptr, env, i32)
62
+
63
+DEF_HELPER_2(egs_check, void, i32, env)
64
+
65
+DEF_HELPER_4(vaesef_vv, void, ptr, ptr, env, i32)
66
+DEF_HELPER_4(vaesef_vs, void, ptr, ptr, env, i32)
67
+DEF_HELPER_4(vaesdf_vv, void, ptr, ptr, env, i32)
68
+DEF_HELPER_4(vaesdf_vs, void, ptr, ptr, env, i32)
69
+DEF_HELPER_4(vaesem_vv, void, ptr, ptr, env, i32)
70
+DEF_HELPER_4(vaesem_vs, void, ptr, ptr, env, i32)
71
+DEF_HELPER_4(vaesdm_vv, void, ptr, ptr, env, i32)
72
+DEF_HELPER_4(vaesdm_vs, void, ptr, ptr, env, i32)
73
+DEF_HELPER_4(vaesz_vs, void, ptr, ptr, env, i32)
74
+DEF_HELPER_5(vaeskf1_vi, void, ptr, ptr, i32, env, i32)
75
+DEF_HELPER_5(vaeskf2_vi, void, ptr, ptr, i32, env, i32)
13
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
76
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
14
index XXXXXXX..XXXXXXX 100644
77
index XXXXXXX..XXXXXXX 100644
15
--- a/target/riscv/insn32.decode
78
--- a/target/riscv/insn32.decode
16
+++ b/target/riscv/insn32.decode
79
+++ b/target/riscv/insn32.decode
17
@@ -XXX,XX +XXX,XX @@
80
@@ -XXX,XX +XXX,XX @@
18
%rd 7:5
81
@r_rm ....... ..... ..... ... ..... ....... %rs2 %rs1 %rm %rd
19
%sh5 20:5
82
@r2_rm ....... ..... ..... ... ..... ....... %rs1 %rm %rd
20
83
@r2 ....... ..... ..... ... ..... ....... &r2 %rs1 %rd
21
-%sh10 20:10
84
+@r2_vm_1 ...... . ..... ..... ... ..... ....... &rmr vm=1 %rs2 %rd
22
+%sh7 20:7
85
@r2_nfvm ... ... vm:1 ..... ..... ... ..... ....... &r2nfvm %nf %rs1 %rd
23
%csr 20:12
86
@r2_vm ...... vm:1 ..... ..... ... ..... ....... &rmr %rs2 %rd
24
%rm 12:3
87
@r1_vm ...... vm:1 ..... ..... ... ..... ....... %rd
25
%nf 29:3 !function=ex_plus_1
88
@@ -XXX,XX +XXX,XX @@ vcpop_v 010010 . ..... 01110 010 ..... 1010111 @r2_vm
89
vwsll_vv 110101 . ..... ..... 000 ..... 1010111 @r_vm
90
vwsll_vx 110101 . ..... ..... 100 ..... 1010111 @r_vm
91
vwsll_vi 110101 . ..... ..... 011 ..... 1010111 @r_vm
92
+
93
+# *** Zvkned vector crypto extension ***
94
+vaesef_vv 101000 1 ..... 00011 010 ..... 1110111 @r2_vm_1
95
+vaesef_vs 101001 1 ..... 00011 010 ..... 1110111 @r2_vm_1
96
+vaesdf_vv 101000 1 ..... 00001 010 ..... 1110111 @r2_vm_1
97
+vaesdf_vs 101001 1 ..... 00001 010 ..... 1110111 @r2_vm_1
98
+vaesem_vv 101000 1 ..... 00010 010 ..... 1110111 @r2_vm_1
99
+vaesem_vs 101001 1 ..... 00010 010 ..... 1110111 @r2_vm_1
100
+vaesdm_vv 101000 1 ..... 00000 010 ..... 1110111 @r2_vm_1
101
+vaesdm_vs 101001 1 ..... 00000 010 ..... 1110111 @r2_vm_1
102
+vaesz_vs 101001 1 ..... 00111 010 ..... 1110111 @r2_vm_1
103
+vaeskf1_vi 100010 1 ..... ..... 010 ..... 1110111 @r_vm_1
104
+vaeskf2_vi 101010 1 ..... ..... 010 ..... 1110111 @r_vm_1
105
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
106
index XXXXXXX..XXXXXXX 100644
107
--- a/target/riscv/cpu.c
108
+++ b/target/riscv/cpu.c
109
@@ -XXX,XX +XXX,XX @@ static const struct isa_ext_data isa_edata_arr[] = {
110
ISA_EXT_DATA_ENTRY(zvfbfwma, PRIV_VERSION_1_12_0, ext_zvfbfwma),
111
ISA_EXT_DATA_ENTRY(zvfh, PRIV_VERSION_1_12_0, ext_zvfh),
112
ISA_EXT_DATA_ENTRY(zvfhmin, PRIV_VERSION_1_12_0, ext_zvfhmin),
113
+ ISA_EXT_DATA_ENTRY(zvkned, PRIV_VERSION_1_12_0, ext_zvkned),
114
ISA_EXT_DATA_ENTRY(zhinx, PRIV_VERSION_1_12_0, ext_zhinx),
115
ISA_EXT_DATA_ENTRY(zhinxmin, PRIV_VERSION_1_12_0, ext_zhinxmin),
116
ISA_EXT_DATA_ENTRY(smaia, PRIV_VERSION_1_12_0, ext_smaia),
117
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
118
* In principle Zve*x would also suffice here, were they supported
119
* in qemu
120
*/
121
- if (cpu->cfg.ext_zvbb && !cpu->cfg.ext_zve32f) {
122
+ if ((cpu->cfg.ext_zvbb || cpu->cfg.ext_zvkned) && !cpu->cfg.ext_zve32f) {
123
error_setg(errp,
124
"Vector crypto extensions require V or Zve* extensions");
125
return;
126
@@ -XXX,XX +XXX,XX @@ static Property riscv_cpu_extensions[] = {
127
/* Vector cryptography extensions */
128
DEFINE_PROP_BOOL("x-zvbb", RISCVCPU, cfg.ext_zvbb, false),
129
DEFINE_PROP_BOOL("x-zvbc", RISCVCPU, cfg.ext_zvbc, false),
130
+ DEFINE_PROP_BOOL("x-zvkned", RISCVCPU, cfg.ext_zvkned, false),
131
132
DEFINE_PROP_END_OF_LIST(),
133
};
134
diff --git a/target/riscv/vcrypto_helper.c b/target/riscv/vcrypto_helper.c
135
index XXXXXXX..XXXXXXX 100644
136
--- a/target/riscv/vcrypto_helper.c
137
+++ b/target/riscv/vcrypto_helper.c
26
@@ -XXX,XX +XXX,XX @@
138
@@ -XXX,XX +XXX,XX @@
27
@u .................... ..... ....... &u imm=%imm_u %rd
139
#include "qemu/bitops.h"
28
@j .................... ..... ....... &j imm=%imm_j %rd
140
#include "qemu/bswap.h"
29
141
#include "cpu.h"
30
-@sh ...... ...... ..... ... ..... ....... &shift shamt=%sh10 %rs1 %rd
142
+#include "crypto/aes.h"
31
+@sh ...... ...... ..... ... ..... ....... &shift shamt=%sh7 %rs1 %rd
143
+#include "crypto/aes-round.h"
32
@csr ............ ..... ... ..... ....... %csr %rs1 %rd
144
#include "exec/memop.h"
33
145
#include "exec/exec-all.h"
34
@atom_ld ..... aq:1 rl:1 ..... ........ ..... ....... &atomic rs2=0 %rs1 %rd
146
#include "exec/helper-proto.h"
35
@@ -XXX,XX +XXX,XX @@ sltiu ............ ..... 011 ..... 0010011 @i
147
@@ -XXX,XX +XXX,XX @@ RVVCALL(OPIVX2, vwsll_vx_w, WOP_UUU_W, H8, H4, DO_SLL)
36
xori ............ ..... 100 ..... 0010011 @i
148
GEN_VEXT_VX(vwsll_vx_b, 2)
37
ori ............ ..... 110 ..... 0010011 @i
149
GEN_VEXT_VX(vwsll_vx_h, 4)
38
andi ............ ..... 111 ..... 0010011 @i
150
GEN_VEXT_VX(vwsll_vx_w, 8)
39
-slli 00.... ...... ..... 001 ..... 0010011 @sh
151
+
40
-srli 00.... ...... ..... 101 ..... 0010011 @sh
152
+void HELPER(egs_check)(uint32_t egs, CPURISCVState *env)
41
-srai 01.... ...... ..... 101 ..... 0010011 @sh
153
+{
42
+slli 00000. ...... ..... 001 ..... 0010011 @sh
154
+ uint32_t vl = env->vl;
43
+srli 00000. ...... ..... 101 ..... 0010011 @sh
155
+ uint32_t vstart = env->vstart;
44
+srai 01000. ...... ..... 101 ..... 0010011 @sh
156
+
45
add 0000000 ..... ..... 000 ..... 0110011 @r
157
+ if (vl % egs != 0 || vstart % egs != 0) {
46
sub 0100000 ..... ..... 000 ..... 0110011 @r
158
+ riscv_raise_exception(env, RISCV_EXCP_ILLEGAL_INST, GETPC());
47
sll 0000000 ..... ..... 001 ..... 0110011 @r
159
+ }
160
+}
161
+
162
+static inline void xor_round_key(AESState *round_state, AESState *round_key)
163
+{
164
+ round_state->v = round_state->v ^ round_key->v;
165
+}
166
+
167
+#define GEN_ZVKNED_HELPER_VV(NAME, ...) \
168
+ void HELPER(NAME)(void *vd, void *vs2, CPURISCVState *env, \
169
+ uint32_t desc) \
170
+ { \
171
+ uint32_t vl = env->vl; \
172
+ uint32_t total_elems = vext_get_total_elems(env, desc, 4); \
173
+ uint32_t vta = vext_vta(desc); \
174
+ \
175
+ for (uint32_t i = env->vstart / 4; i < env->vl / 4; i++) { \
176
+ AESState round_key; \
177
+ round_key.d[0] = *((uint64_t *)vs2 + H8(i * 2 + 0)); \
178
+ round_key.d[1] = *((uint64_t *)vs2 + H8(i * 2 + 1)); \
179
+ AESState round_state; \
180
+ round_state.d[0] = *((uint64_t *)vd + H8(i * 2 + 0)); \
181
+ round_state.d[1] = *((uint64_t *)vd + H8(i * 2 + 1)); \
182
+ __VA_ARGS__; \
183
+ *((uint64_t *)vd + H8(i * 2 + 0)) = round_state.d[0]; \
184
+ *((uint64_t *)vd + H8(i * 2 + 1)) = round_state.d[1]; \
185
+ } \
186
+ env->vstart = 0; \
187
+ /* set tail elements to 1s */ \
188
+ vext_set_elems_1s(vd, vta, vl * 4, total_elems * 4); \
189
+ }
190
+
191
+#define GEN_ZVKNED_HELPER_VS(NAME, ...) \
192
+ void HELPER(NAME)(void *vd, void *vs2, CPURISCVState *env, \
193
+ uint32_t desc) \
194
+ { \
195
+ uint32_t vl = env->vl; \
196
+ uint32_t total_elems = vext_get_total_elems(env, desc, 4); \
197
+ uint32_t vta = vext_vta(desc); \
198
+ \
199
+ for (uint32_t i = env->vstart / 4; i < env->vl / 4; i++) { \
200
+ AESState round_key; \
201
+ round_key.d[0] = *((uint64_t *)vs2 + H8(0)); \
202
+ round_key.d[1] = *((uint64_t *)vs2 + H8(1)); \
203
+ AESState round_state; \
204
+ round_state.d[0] = *((uint64_t *)vd + H8(i * 2 + 0)); \
205
+ round_state.d[1] = *((uint64_t *)vd + H8(i * 2 + 1)); \
206
+ __VA_ARGS__; \
207
+ *((uint64_t *)vd + H8(i * 2 + 0)) = round_state.d[0]; \
208
+ *((uint64_t *)vd + H8(i * 2 + 1)) = round_state.d[1]; \
209
+ } \
210
+ env->vstart = 0; \
211
+ /* set tail elements to 1s */ \
212
+ vext_set_elems_1s(vd, vta, vl * 4, total_elems * 4); \
213
+ }
214
+
215
+GEN_ZVKNED_HELPER_VV(vaesef_vv, aesenc_SB_SR_AK(&round_state,
216
+ &round_state,
217
+ &round_key,
218
+ false);)
219
+GEN_ZVKNED_HELPER_VS(vaesef_vs, aesenc_SB_SR_AK(&round_state,
220
+ &round_state,
221
+ &round_key,
222
+ false);)
223
+GEN_ZVKNED_HELPER_VV(vaesdf_vv, aesdec_ISB_ISR_AK(&round_state,
224
+ &round_state,
225
+ &round_key,
226
+ false);)
227
+GEN_ZVKNED_HELPER_VS(vaesdf_vs, aesdec_ISB_ISR_AK(&round_state,
228
+ &round_state,
229
+ &round_key,
230
+ false);)
231
+GEN_ZVKNED_HELPER_VV(vaesem_vv, aesenc_SB_SR_MC_AK(&round_state,
232
+ &round_state,
233
+ &round_key,
234
+ false);)
235
+GEN_ZVKNED_HELPER_VS(vaesem_vs, aesenc_SB_SR_MC_AK(&round_state,
236
+ &round_state,
237
+ &round_key,
238
+ false);)
239
+GEN_ZVKNED_HELPER_VV(vaesdm_vv, aesdec_ISB_ISR_AK_IMC(&round_state,
240
+ &round_state,
241
+ &round_key,
242
+ false);)
243
+GEN_ZVKNED_HELPER_VS(vaesdm_vs, aesdec_ISB_ISR_AK_IMC(&round_state,
244
+ &round_state,
245
+ &round_key,
246
+ false);)
247
+GEN_ZVKNED_HELPER_VS(vaesz_vs, xor_round_key(&round_state, &round_key);)
248
+
249
+void HELPER(vaeskf1_vi)(void *vd_vptr, void *vs2_vptr, uint32_t uimm,
250
+ CPURISCVState *env, uint32_t desc)
251
+{
252
+ uint32_t *vd = vd_vptr;
253
+ uint32_t *vs2 = vs2_vptr;
254
+ uint32_t vl = env->vl;
255
+ uint32_t total_elems = vext_get_total_elems(env, desc, 4);
256
+ uint32_t vta = vext_vta(desc);
257
+
258
+ uimm &= 0b1111;
259
+ if (uimm > 10 || uimm == 0) {
260
+ uimm ^= 0b1000;
261
+ }
262
+
263
+ for (uint32_t i = env->vstart / 4; i < env->vl / 4; i++) {
264
+ uint32_t rk[8], tmp;
265
+ static const uint32_t rcon[] = {
266
+ 0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010,
267
+ 0x00000020, 0x00000040, 0x00000080, 0x0000001B, 0x00000036,
268
+ };
269
+
270
+ rk[0] = vs2[i * 4 + H4(0)];
271
+ rk[1] = vs2[i * 4 + H4(1)];
272
+ rk[2] = vs2[i * 4 + H4(2)];
273
+ rk[3] = vs2[i * 4 + H4(3)];
274
+ tmp = ror32(rk[3], 8);
275
+
276
+ rk[4] = rk[0] ^ (((uint32_t)AES_sbox[(tmp >> 24) & 0xff] << 24) |
277
+ ((uint32_t)AES_sbox[(tmp >> 16) & 0xff] << 16) |
278
+ ((uint32_t)AES_sbox[(tmp >> 8) & 0xff] << 8) |
279
+ ((uint32_t)AES_sbox[(tmp >> 0) & 0xff] << 0))
280
+ ^ rcon[uimm - 1];
281
+ rk[5] = rk[1] ^ rk[4];
282
+ rk[6] = rk[2] ^ rk[5];
283
+ rk[7] = rk[3] ^ rk[6];
284
+
285
+ vd[i * 4 + H4(0)] = rk[4];
286
+ vd[i * 4 + H4(1)] = rk[5];
287
+ vd[i * 4 + H4(2)] = rk[6];
288
+ vd[i * 4 + H4(3)] = rk[7];
289
+ }
290
+ env->vstart = 0;
291
+ /* set tail elements to 1s */
292
+ vext_set_elems_1s(vd, vta, vl * 4, total_elems * 4);
293
+}
294
+
295
+void HELPER(vaeskf2_vi)(void *vd_vptr, void *vs2_vptr, uint32_t uimm,
296
+ CPURISCVState *env, uint32_t desc)
297
+{
298
+ uint32_t *vd = vd_vptr;
299
+ uint32_t *vs2 = vs2_vptr;
300
+ uint32_t vl = env->vl;
301
+ uint32_t total_elems = vext_get_total_elems(env, desc, 4);
302
+ uint32_t vta = vext_vta(desc);
303
+
304
+ uimm &= 0b1111;
305
+ if (uimm > 14 || uimm < 2) {
306
+ uimm ^= 0b1000;
307
+ }
308
+
309
+ for (uint32_t i = env->vstart / 4; i < env->vl / 4; i++) {
310
+ uint32_t rk[12], tmp;
311
+ static const uint32_t rcon[] = {
312
+ 0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010,
313
+ 0x00000020, 0x00000040, 0x00000080, 0x0000001B, 0x00000036,
314
+ };
315
+
316
+ rk[0] = vd[i * 4 + H4(0)];
317
+ rk[1] = vd[i * 4 + H4(1)];
318
+ rk[2] = vd[i * 4 + H4(2)];
319
+ rk[3] = vd[i * 4 + H4(3)];
320
+ rk[4] = vs2[i * 4 + H4(0)];
321
+ rk[5] = vs2[i * 4 + H4(1)];
322
+ rk[6] = vs2[i * 4 + H4(2)];
323
+ rk[7] = vs2[i * 4 + H4(3)];
324
+
325
+ if (uimm % 2 == 0) {
326
+ tmp = ror32(rk[7], 8);
327
+ rk[8] = rk[0] ^ (((uint32_t)AES_sbox[(tmp >> 24) & 0xff] << 24) |
328
+ ((uint32_t)AES_sbox[(tmp >> 16) & 0xff] << 16) |
329
+ ((uint32_t)AES_sbox[(tmp >> 8) & 0xff] << 8) |
330
+ ((uint32_t)AES_sbox[(tmp >> 0) & 0xff] << 0))
331
+ ^ rcon[(uimm - 1) / 2];
332
+ } else {
333
+ rk[8] = rk[0] ^ (((uint32_t)AES_sbox[(rk[7] >> 24) & 0xff] << 24) |
334
+ ((uint32_t)AES_sbox[(rk[7] >> 16) & 0xff] << 16) |
335
+ ((uint32_t)AES_sbox[(rk[7] >> 8) & 0xff] << 8) |
336
+ ((uint32_t)AES_sbox[(rk[7] >> 0) & 0xff] << 0));
337
+ }
338
+ rk[9] = rk[1] ^ rk[8];
339
+ rk[10] = rk[2] ^ rk[9];
340
+ rk[11] = rk[3] ^ rk[10];
341
+
342
+ vd[i * 4 + H4(0)] = rk[8];
343
+ vd[i * 4 + H4(1)] = rk[9];
344
+ vd[i * 4 + H4(2)] = rk[10];
345
+ vd[i * 4 + H4(3)] = rk[11];
346
+ }
347
+ env->vstart = 0;
348
+ /* set tail elements to 1s */
349
+ vext_set_elems_1s(vd, vta, vl * 4, total_elems * 4);
350
+}
351
diff --git a/target/riscv/insn_trans/trans_rvvk.c.inc b/target/riscv/insn_trans/trans_rvvk.c.inc
352
index XXXXXXX..XXXXXXX 100644
353
--- a/target/riscv/insn_trans/trans_rvvk.c.inc
354
+++ b/target/riscv/insn_trans/trans_rvvk.c.inc
355
@@ -XXX,XX +XXX,XX @@ static bool vwsll_vx_check(DisasContext *s, arg_rmrr *a)
356
GEN_OPIVV_WIDEN_TRANS(vwsll_vv, vwsll_vv_check)
357
GEN_OPIVX_WIDEN_TRANS(vwsll_vx, vwsll_vx_check)
358
GEN_OPIVI_WIDEN_TRANS(vwsll_vi, IMM_ZX, vwsll_vx, vwsll_vx_check)
359
+
360
+/*
361
+ * Zvkned
362
+ */
363
+
364
+#define ZVKNED_EGS 4
365
+
366
+#define GEN_V_UNMASKED_TRANS(NAME, CHECK, EGS) \
367
+ static bool trans_##NAME(DisasContext *s, arg_##NAME *a) \
368
+ { \
369
+ if (CHECK(s, a)) { \
370
+ TCGv_ptr rd_v, rs2_v; \
371
+ TCGv_i32 desc, egs; \
372
+ uint32_t data = 0; \
373
+ TCGLabel *over = gen_new_label(); \
374
+ \
375
+ if (!s->vstart_eq_zero || !s->vl_eq_vlmax) { \
376
+ /* save opcode for unwinding in case we throw an exception */ \
377
+ decode_save_opc(s); \
378
+ egs = tcg_constant_i32(EGS); \
379
+ gen_helper_egs_check(egs, cpu_env); \
380
+ tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over); \
381
+ } \
382
+ \
383
+ data = FIELD_DP32(data, VDATA, VM, a->vm); \
384
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
385
+ data = FIELD_DP32(data, VDATA, VTA, s->vta); \
386
+ data = FIELD_DP32(data, VDATA, VTA_ALL_1S, s->cfg_vta_all_1s); \
387
+ data = FIELD_DP32(data, VDATA, VMA, s->vma); \
388
+ rd_v = tcg_temp_new_ptr(); \
389
+ rs2_v = tcg_temp_new_ptr(); \
390
+ desc = tcg_constant_i32( \
391
+ simd_desc(s->cfg_ptr->vlen / 8, s->cfg_ptr->vlen / 8, data)); \
392
+ tcg_gen_addi_ptr(rd_v, cpu_env, vreg_ofs(s, a->rd)); \
393
+ tcg_gen_addi_ptr(rs2_v, cpu_env, vreg_ofs(s, a->rs2)); \
394
+ gen_helper_##NAME(rd_v, rs2_v, cpu_env, desc); \
395
+ mark_vs_dirty(s); \
396
+ gen_set_label(over); \
397
+ return true; \
398
+ } \
399
+ return false; \
400
+ }
401
+
402
+static bool vaes_check_vv(DisasContext *s, arg_rmr *a)
403
+{
404
+ int egw_bytes = ZVKNED_EGS << s->sew;
405
+ return s->cfg_ptr->ext_zvkned == true &&
406
+ require_rvv(s) &&
407
+ vext_check_isa_ill(s) &&
408
+ MAXSZ(s) >= egw_bytes &&
409
+ require_align(a->rd, s->lmul) &&
410
+ require_align(a->rs2, s->lmul) &&
411
+ s->sew == MO_32;
412
+}
413
+
414
+static bool vaes_check_overlap(DisasContext *s, int vd, int vs2)
415
+{
416
+ int8_t op_size = s->lmul <= 0 ? 1 : 1 << s->lmul;
417
+ return !is_overlapped(vd, op_size, vs2, 1);
418
+}
419
+
420
+static bool vaes_check_vs(DisasContext *s, arg_rmr *a)
421
+{
422
+ int egw_bytes = ZVKNED_EGS << s->sew;
423
+ return vaes_check_overlap(s, a->rd, a->rs2) &&
424
+ MAXSZ(s) >= egw_bytes &&
425
+ s->cfg_ptr->ext_zvkned == true &&
426
+ require_rvv(s) &&
427
+ vext_check_isa_ill(s) &&
428
+ require_align(a->rd, s->lmul) &&
429
+ s->sew == MO_32;
430
+}
431
+
432
+GEN_V_UNMASKED_TRANS(vaesef_vv, vaes_check_vv, ZVKNED_EGS)
433
+GEN_V_UNMASKED_TRANS(vaesef_vs, vaes_check_vs, ZVKNED_EGS)
434
+GEN_V_UNMASKED_TRANS(vaesdf_vv, vaes_check_vv, ZVKNED_EGS)
435
+GEN_V_UNMASKED_TRANS(vaesdf_vs, vaes_check_vs, ZVKNED_EGS)
436
+GEN_V_UNMASKED_TRANS(vaesdm_vv, vaes_check_vv, ZVKNED_EGS)
437
+GEN_V_UNMASKED_TRANS(vaesdm_vs, vaes_check_vs, ZVKNED_EGS)
438
+GEN_V_UNMASKED_TRANS(vaesz_vs, vaes_check_vs, ZVKNED_EGS)
439
+GEN_V_UNMASKED_TRANS(vaesem_vv, vaes_check_vv, ZVKNED_EGS)
440
+GEN_V_UNMASKED_TRANS(vaesem_vs, vaes_check_vs, ZVKNED_EGS)
441
+
442
+#define GEN_VI_UNMASKED_TRANS(NAME, CHECK, EGS) \
443
+ static bool trans_##NAME(DisasContext *s, arg_##NAME *a) \
444
+ { \
445
+ if (CHECK(s, a)) { \
446
+ TCGv_ptr rd_v, rs2_v; \
447
+ TCGv_i32 uimm_v, desc, egs; \
448
+ uint32_t data = 0; \
449
+ TCGLabel *over = gen_new_label(); \
450
+ \
451
+ if (!s->vstart_eq_zero || !s->vl_eq_vlmax) { \
452
+ /* save opcode for unwinding in case we throw an exception */ \
453
+ decode_save_opc(s); \
454
+ egs = tcg_constant_i32(EGS); \
455
+ gen_helper_egs_check(egs, cpu_env); \
456
+ tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over); \
457
+ } \
458
+ \
459
+ data = FIELD_DP32(data, VDATA, VM, a->vm); \
460
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
461
+ data = FIELD_DP32(data, VDATA, VTA, s->vta); \
462
+ data = FIELD_DP32(data, VDATA, VTA_ALL_1S, s->cfg_vta_all_1s); \
463
+ data = FIELD_DP32(data, VDATA, VMA, s->vma); \
464
+ \
465
+ rd_v = tcg_temp_new_ptr(); \
466
+ rs2_v = tcg_temp_new_ptr(); \
467
+ uimm_v = tcg_constant_i32(a->rs1); \
468
+ desc = tcg_constant_i32( \
469
+ simd_desc(s->cfg_ptr->vlen / 8, s->cfg_ptr->vlen / 8, data)); \
470
+ tcg_gen_addi_ptr(rd_v, cpu_env, vreg_ofs(s, a->rd)); \
471
+ tcg_gen_addi_ptr(rs2_v, cpu_env, vreg_ofs(s, a->rs2)); \
472
+ gen_helper_##NAME(rd_v, rs2_v, uimm_v, cpu_env, desc); \
473
+ mark_vs_dirty(s); \
474
+ gen_set_label(over); \
475
+ return true; \
476
+ } \
477
+ return false; \
478
+ }
479
+
480
+static bool vaeskf1_check(DisasContext *s, arg_vaeskf1_vi *a)
481
+{
482
+ int egw_bytes = ZVKNED_EGS << s->sew;
483
+ return s->cfg_ptr->ext_zvkned == true &&
484
+ require_rvv(s) &&
485
+ vext_check_isa_ill(s) &&
486
+ MAXSZ(s) >= egw_bytes &&
487
+ s->sew == MO_32 &&
488
+ require_align(a->rd, s->lmul) &&
489
+ require_align(a->rs2, s->lmul);
490
+}
491
+
492
+static bool vaeskf2_check(DisasContext *s, arg_vaeskf2_vi *a)
493
+{
494
+ int egw_bytes = ZVKNED_EGS << s->sew;
495
+ return s->cfg_ptr->ext_zvkned == true &&
496
+ require_rvv(s) &&
497
+ vext_check_isa_ill(s) &&
498
+ MAXSZ(s) >= egw_bytes &&
499
+ s->sew == MO_32 &&
500
+ require_align(a->rd, s->lmul) &&
501
+ require_align(a->rs2, s->lmul);
502
+}
503
+
504
+GEN_VI_UNMASKED_TRANS(vaeskf1_vi, vaeskf1_check, ZVKNED_EGS)
505
+GEN_VI_UNMASKED_TRANS(vaeskf2_vi, vaeskf2_check, ZVKNED_EGS)
48
--
506
--
49
2.31.1
507
2.41.0
50
51
diff view generated by jsdifflib
1
From: Kito Cheng <kito.cheng@sifive.com>
1
From: Kiran Ostrolenk <kiran.ostrolenk@codethink.co.uk>
2
2
3
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
3
This commit adds support for the Zvknh vector-crypto extension, which
4
Signed-off-by: Frank Chang <frank.chang@sifive.com>
4
consists of the following instructions:
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
6
Message-id: 20210505160620.15723-16-frank.chang@sifive.com
6
* vsha2ms.vv
7
* vsha2c[hl].vv
8
9
Translation functions are defined in
10
`target/riscv/insn_trans/trans_rvvk.c.inc` and helpers are defined in
11
`target/riscv/vcrypto_helper.c`.
12
13
Co-authored-by: Nazar Kazakov <nazar.kazakov@codethink.co.uk>
14
Co-authored-by: Lawrence Hunter <lawrence.hunter@codethink.co.uk>
15
[max.chou@sifive.com: Replaced vstart checking by TCG op]
16
Signed-off-by: Nazar Kazakov <nazar.kazakov@codethink.co.uk>
17
Signed-off-by: Lawrence Hunter <lawrence.hunter@codethink.co.uk>
18
Signed-off-by: Kiran Ostrolenk <kiran.ostrolenk@codethink.co.uk>
19
Signed-off-by: Max Chou <max.chou@sifive.com>
20
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
21
[max.chou@sifive.com: Exposed x-zvknha & x-zvknhb properties]
22
[max.chou@sifive.com: Replaced SEW selection to happened during
23
translation]
24
Message-ID: <20230711165917.2629866-11-max.chou@sifive.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
25
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
26
---
9
target/riscv/insn32.decode | 3 +++
27
target/riscv/cpu_cfg.h | 2 +
10
target/riscv/translate.c | 6 ++++++
28
target/riscv/helper.h | 6 +
11
target/riscv/insn_trans/trans_rvb.c.inc | 26 +++++++++++++++++++++++++
29
target/riscv/insn32.decode | 5 +
12
3 files changed, 35 insertions(+)
30
target/riscv/cpu.c | 13 +-
31
target/riscv/vcrypto_helper.c | 238 +++++++++++++++++++++++
32
target/riscv/insn_trans/trans_rvvk.c.inc | 129 ++++++++++++
33
6 files changed, 390 insertions(+), 3 deletions(-)
13
34
35
diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h
36
index XXXXXXX..XXXXXXX 100644
37
--- a/target/riscv/cpu_cfg.h
38
+++ b/target/riscv/cpu_cfg.h
39
@@ -XXX,XX +XXX,XX @@ struct RISCVCPUConfig {
40
bool ext_zvbb;
41
bool ext_zvbc;
42
bool ext_zvkned;
43
+ bool ext_zvknha;
44
+ bool ext_zvknhb;
45
bool ext_zmmul;
46
bool ext_zvfbfmin;
47
bool ext_zvfbfwma;
48
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
49
index XXXXXXX..XXXXXXX 100644
50
--- a/target/riscv/helper.h
51
+++ b/target/riscv/helper.h
52
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_4(vaesdm_vs, void, ptr, ptr, env, i32)
53
DEF_HELPER_4(vaesz_vs, void, ptr, ptr, env, i32)
54
DEF_HELPER_5(vaeskf1_vi, void, ptr, ptr, i32, env, i32)
55
DEF_HELPER_5(vaeskf2_vi, void, ptr, ptr, i32, env, i32)
56
+
57
+DEF_HELPER_5(vsha2ms_vv, void, ptr, ptr, ptr, env, i32)
58
+DEF_HELPER_5(vsha2ch32_vv, void, ptr, ptr, ptr, env, i32)
59
+DEF_HELPER_5(vsha2ch64_vv, void, ptr, ptr, ptr, env, i32)
60
+DEF_HELPER_5(vsha2cl32_vv, void, ptr, ptr, ptr, env, i32)
61
+DEF_HELPER_5(vsha2cl64_vv, void, ptr, ptr, ptr, env, i32)
14
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
62
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
15
index XXXXXXX..XXXXXXX 100644
63
index XXXXXXX..XXXXXXX 100644
16
--- a/target/riscv/insn32.decode
64
--- a/target/riscv/insn32.decode
17
+++ b/target/riscv/insn32.decode
65
+++ b/target/riscv/insn32.decode
18
@@ -XXX,XX +XXX,XX @@ gorcw 0010100 .......... 101 ..... 0111011 @r
66
@@ -XXX,XX +XXX,XX @@ vaesdm_vs 101001 1 ..... 00000 010 ..... 1110111 @r2_vm_1
19
sh1add_uw 0010000 .......... 010 ..... 0111011 @r
67
vaesz_vs 101001 1 ..... 00111 010 ..... 1110111 @r2_vm_1
20
sh2add_uw 0010000 .......... 100 ..... 0111011 @r
68
vaeskf1_vi 100010 1 ..... ..... 010 ..... 1110111 @r_vm_1
21
sh3add_uw 0010000 .......... 110 ..... 0111011 @r
69
vaeskf2_vi 101010 1 ..... ..... 010 ..... 1110111 @r_vm_1
22
+add_uw 0000100 .......... 000 ..... 0111011 @r
70
+
23
71
+# *** Zvknh vector crypto extension ***
24
bsetiw 0010100 .......... 001 ..... 0011011 @sh5
72
+vsha2ms_vv 101101 1 ..... ..... 010 ..... 1110111 @r_vm_1
25
bclriw 0100100 .......... 001 ..... 0011011 @sh5
73
+vsha2ch_vv 101110 1 ..... ..... 010 ..... 1110111 @r_vm_1
26
@@ -XXX,XX +XXX,XX @@ sroiw 0010000 .......... 101 ..... 0011011 @sh5
74
+vsha2cl_vv 101111 1 ..... ..... 010 ..... 1110111 @r_vm_1
27
roriw 0110000 .......... 101 ..... 0011011 @sh5
75
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
28
greviw 0110100 .......... 101 ..... 0011011 @sh5
29
gorciw 0010100 .......... 101 ..... 0011011 @sh5
30
+
31
+slli_uw 00001. ........... 001 ..... 0011011 @sh
32
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
33
index XXXXXXX..XXXXXXX 100644
76
index XXXXXXX..XXXXXXX 100644
34
--- a/target/riscv/translate.c
77
--- a/target/riscv/cpu.c
35
+++ b/target/riscv/translate.c
78
+++ b/target/riscv/cpu.c
36
@@ -XXX,XX +XXX,XX @@ GEN_SHADD_UW(1)
79
@@ -XXX,XX +XXX,XX @@ static const struct isa_ext_data isa_edata_arr[] = {
37
GEN_SHADD_UW(2)
80
ISA_EXT_DATA_ENTRY(zvfh, PRIV_VERSION_1_12_0, ext_zvfh),
38
GEN_SHADD_UW(3)
81
ISA_EXT_DATA_ENTRY(zvfhmin, PRIV_VERSION_1_12_0, ext_zvfhmin),
39
82
ISA_EXT_DATA_ENTRY(zvkned, PRIV_VERSION_1_12_0, ext_zvkned),
40
+static void gen_add_uw(TCGv ret, TCGv arg1, TCGv arg2)
83
+ ISA_EXT_DATA_ENTRY(zvknha, PRIV_VERSION_1_12_0, ext_zvknha),
41
+{
84
+ ISA_EXT_DATA_ENTRY(zvknhb, PRIV_VERSION_1_12_0, ext_zvknhb),
42
+ tcg_gen_ext32u_tl(arg1, arg1);
85
ISA_EXT_DATA_ENTRY(zhinx, PRIV_VERSION_1_12_0, ext_zhinx),
43
+ tcg_gen_add_tl(ret, arg1, arg2);
86
ISA_EXT_DATA_ENTRY(zhinxmin, PRIV_VERSION_1_12_0, ext_zhinxmin),
44
+}
87
ISA_EXT_DATA_ENTRY(smaia, PRIV_VERSION_1_12_0, ext_smaia),
45
+
88
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
46
static bool gen_arith(DisasContext *ctx, arg_r *a,
89
* In principle Zve*x would also suffice here, were they supported
47
void(*func)(TCGv, TCGv, TCGv))
90
* in qemu
48
{
91
*/
49
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
92
- if ((cpu->cfg.ext_zvbb || cpu->cfg.ext_zvkned) && !cpu->cfg.ext_zve32f) {
93
+ if ((cpu->cfg.ext_zvbb || cpu->cfg.ext_zvkned || cpu->cfg.ext_zvknha) &&
94
+ !cpu->cfg.ext_zve32f) {
95
error_setg(errp,
96
"Vector crypto extensions require V or Zve* extensions");
97
return;
98
}
99
100
- if (cpu->cfg.ext_zvbc && !cpu->cfg.ext_zve64f) {
101
- error_setg(errp, "Zvbc extension requires V or Zve64{f,d} extensions");
102
+ if ((cpu->cfg.ext_zvbc || cpu->cfg.ext_zvknhb) && !cpu->cfg.ext_zve64f) {
103
+ error_setg(
104
+ errp,
105
+ "Zvbc and Zvknhb extensions require V or Zve64{f,d} extensions");
106
return;
107
}
108
109
@@ -XXX,XX +XXX,XX @@ static Property riscv_cpu_extensions[] = {
110
DEFINE_PROP_BOOL("x-zvbb", RISCVCPU, cfg.ext_zvbb, false),
111
DEFINE_PROP_BOOL("x-zvbc", RISCVCPU, cfg.ext_zvbc, false),
112
DEFINE_PROP_BOOL("x-zvkned", RISCVCPU, cfg.ext_zvkned, false),
113
+ DEFINE_PROP_BOOL("x-zvknha", RISCVCPU, cfg.ext_zvknha, false),
114
+ DEFINE_PROP_BOOL("x-zvknhb", RISCVCPU, cfg.ext_zvknhb, false),
115
116
DEFINE_PROP_END_OF_LIST(),
117
};
118
diff --git a/target/riscv/vcrypto_helper.c b/target/riscv/vcrypto_helper.c
50
index XXXXXXX..XXXXXXX 100644
119
index XXXXXXX..XXXXXXX 100644
51
--- a/target/riscv/insn_trans/trans_rvb.c.inc
120
--- a/target/riscv/vcrypto_helper.c
52
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
121
+++ b/target/riscv/vcrypto_helper.c
53
@@ -XXX,XX +XXX,XX @@ static bool trans_sh##SHAMT##add_uw(DisasContext *ctx, \
122
@@ -XXX,XX +XXX,XX @@ void HELPER(vaeskf2_vi)(void *vd_vptr, void *vs2_vptr, uint32_t uimm,
54
GEN_TRANS_SHADD_UW(1)
123
/* set tail elements to 1s */
55
GEN_TRANS_SHADD_UW(2)
124
vext_set_elems_1s(vd, vta, vl * 4, total_elems * 4);
56
GEN_TRANS_SHADD_UW(3)
125
}
57
+
126
+
58
+static bool trans_add_uw(DisasContext *ctx, arg_add_uw *a)
127
+static inline uint32_t sig0_sha256(uint32_t x)
59
+{
128
+{
60
+ REQUIRE_64BIT(ctx);
129
+ return ror32(x, 7) ^ ror32(x, 18) ^ (x >> 3);
61
+ REQUIRE_EXT(ctx, RVB);
130
+}
62
+ return gen_arith(ctx, a, gen_add_uw);
131
+
63
+}
132
+static inline uint32_t sig1_sha256(uint32_t x)
64
+
133
+{
65
+static bool trans_slli_uw(DisasContext *ctx, arg_slli_uw *a)
134
+ return ror32(x, 17) ^ ror32(x, 19) ^ (x >> 10);
66
+{
135
+}
67
+ REQUIRE_64BIT(ctx);
136
+
68
+ REQUIRE_EXT(ctx, RVB);
137
+static inline uint64_t sig0_sha512(uint64_t x)
69
+
138
+{
70
+ TCGv source1 = tcg_temp_new();
139
+ return ror64(x, 1) ^ ror64(x, 8) ^ (x >> 7);
71
+ gen_get_gpr(source1, a->rs1);
140
+}
72
+
141
+
73
+ if (a->shamt < 32) {
142
+static inline uint64_t sig1_sha512(uint64_t x)
74
+ tcg_gen_deposit_z_tl(source1, source1, a->shamt, 32);
143
+{
75
+ } else {
144
+ return ror64(x, 19) ^ ror64(x, 61) ^ (x >> 6);
76
+ tcg_gen_shli_tl(source1, source1, a->shamt);
145
+}
77
+ }
146
+
78
+
147
+static inline void vsha2ms_e32(uint32_t *vd, uint32_t *vs1, uint32_t *vs2)
79
+ gen_set_gpr(a->rd, source1);
148
+{
80
+ tcg_temp_free(source1);
149
+ uint32_t res[4];
81
+ return true;
150
+ res[0] = sig1_sha256(vs1[H4(2)]) + vs2[H4(1)] + sig0_sha256(vd[H4(1)]) +
151
+ vd[H4(0)];
152
+ res[1] = sig1_sha256(vs1[H4(3)]) + vs2[H4(2)] + sig0_sha256(vd[H4(2)]) +
153
+ vd[H4(1)];
154
+ res[2] =
155
+ sig1_sha256(res[0]) + vs2[H4(3)] + sig0_sha256(vd[H4(3)]) + vd[H4(2)];
156
+ res[3] =
157
+ sig1_sha256(res[1]) + vs1[H4(0)] + sig0_sha256(vs2[H4(0)]) + vd[H4(3)];
158
+ vd[H4(3)] = res[3];
159
+ vd[H4(2)] = res[2];
160
+ vd[H4(1)] = res[1];
161
+ vd[H4(0)] = res[0];
162
+}
163
+
164
+static inline void vsha2ms_e64(uint64_t *vd, uint64_t *vs1, uint64_t *vs2)
165
+{
166
+ uint64_t res[4];
167
+ res[0] = sig1_sha512(vs1[2]) + vs2[1] + sig0_sha512(vd[1]) + vd[0];
168
+ res[1] = sig1_sha512(vs1[3]) + vs2[2] + sig0_sha512(vd[2]) + vd[1];
169
+ res[2] = sig1_sha512(res[0]) + vs2[3] + sig0_sha512(vd[3]) + vd[2];
170
+ res[3] = sig1_sha512(res[1]) + vs1[0] + sig0_sha512(vs2[0]) + vd[3];
171
+ vd[3] = res[3];
172
+ vd[2] = res[2];
173
+ vd[1] = res[1];
174
+ vd[0] = res[0];
175
+}
176
+
177
+void HELPER(vsha2ms_vv)(void *vd, void *vs1, void *vs2, CPURISCVState *env,
178
+ uint32_t desc)
179
+{
180
+ uint32_t sew = FIELD_EX64(env->vtype, VTYPE, VSEW);
181
+ uint32_t esz = sew == MO_32 ? 4 : 8;
182
+ uint32_t total_elems;
183
+ uint32_t vta = vext_vta(desc);
184
+
185
+ for (uint32_t i = env->vstart / 4; i < env->vl / 4; i++) {
186
+ if (sew == MO_32) {
187
+ vsha2ms_e32(((uint32_t *)vd) + i * 4, ((uint32_t *)vs1) + i * 4,
188
+ ((uint32_t *)vs2) + i * 4);
189
+ } else {
190
+ /* If not 32 then SEW should be 64 */
191
+ vsha2ms_e64(((uint64_t *)vd) + i * 4, ((uint64_t *)vs1) + i * 4,
192
+ ((uint64_t *)vs2) + i * 4);
193
+ }
194
+ }
195
+ /* set tail elements to 1s */
196
+ total_elems = vext_get_total_elems(env, desc, esz);
197
+ vext_set_elems_1s(vd, vta, env->vl * esz, total_elems * esz);
198
+ env->vstart = 0;
199
+}
200
+
201
+static inline uint64_t sum0_64(uint64_t x)
202
+{
203
+ return ror64(x, 28) ^ ror64(x, 34) ^ ror64(x, 39);
204
+}
205
+
206
+static inline uint32_t sum0_32(uint32_t x)
207
+{
208
+ return ror32(x, 2) ^ ror32(x, 13) ^ ror32(x, 22);
209
+}
210
+
211
+static inline uint64_t sum1_64(uint64_t x)
212
+{
213
+ return ror64(x, 14) ^ ror64(x, 18) ^ ror64(x, 41);
214
+}
215
+
216
+static inline uint32_t sum1_32(uint32_t x)
217
+{
218
+ return ror32(x, 6) ^ ror32(x, 11) ^ ror32(x, 25);
219
+}
220
+
221
+#define ch(x, y, z) ((x & y) ^ ((~x) & z))
222
+
223
+#define maj(x, y, z) ((x & y) ^ (x & z) ^ (y & z))
224
+
225
+static void vsha2c_64(uint64_t *vs2, uint64_t *vd, uint64_t *vs1)
226
+{
227
+ uint64_t a = vs2[3], b = vs2[2], e = vs2[1], f = vs2[0];
228
+ uint64_t c = vd[3], d = vd[2], g = vd[1], h = vd[0];
229
+ uint64_t W0 = vs1[0], W1 = vs1[1];
230
+ uint64_t T1 = h + sum1_64(e) + ch(e, f, g) + W0;
231
+ uint64_t T2 = sum0_64(a) + maj(a, b, c);
232
+
233
+ h = g;
234
+ g = f;
235
+ f = e;
236
+ e = d + T1;
237
+ d = c;
238
+ c = b;
239
+ b = a;
240
+ a = T1 + T2;
241
+
242
+ T1 = h + sum1_64(e) + ch(e, f, g) + W1;
243
+ T2 = sum0_64(a) + maj(a, b, c);
244
+ h = g;
245
+ g = f;
246
+ f = e;
247
+ e = d + T1;
248
+ d = c;
249
+ c = b;
250
+ b = a;
251
+ a = T1 + T2;
252
+
253
+ vd[0] = f;
254
+ vd[1] = e;
255
+ vd[2] = b;
256
+ vd[3] = a;
257
+}
258
+
259
+static void vsha2c_32(uint32_t *vs2, uint32_t *vd, uint32_t *vs1)
260
+{
261
+ uint32_t a = vs2[H4(3)], b = vs2[H4(2)], e = vs2[H4(1)], f = vs2[H4(0)];
262
+ uint32_t c = vd[H4(3)], d = vd[H4(2)], g = vd[H4(1)], h = vd[H4(0)];
263
+ uint32_t W0 = vs1[H4(0)], W1 = vs1[H4(1)];
264
+ uint32_t T1 = h + sum1_32(e) + ch(e, f, g) + W0;
265
+ uint32_t T2 = sum0_32(a) + maj(a, b, c);
266
+
267
+ h = g;
268
+ g = f;
269
+ f = e;
270
+ e = d + T1;
271
+ d = c;
272
+ c = b;
273
+ b = a;
274
+ a = T1 + T2;
275
+
276
+ T1 = h + sum1_32(e) + ch(e, f, g) + W1;
277
+ T2 = sum0_32(a) + maj(a, b, c);
278
+ h = g;
279
+ g = f;
280
+ f = e;
281
+ e = d + T1;
282
+ d = c;
283
+ c = b;
284
+ b = a;
285
+ a = T1 + T2;
286
+
287
+ vd[H4(0)] = f;
288
+ vd[H4(1)] = e;
289
+ vd[H4(2)] = b;
290
+ vd[H4(3)] = a;
291
+}
292
+
293
+void HELPER(vsha2ch32_vv)(void *vd, void *vs1, void *vs2, CPURISCVState *env,
294
+ uint32_t desc)
295
+{
296
+ const uint32_t esz = 4;
297
+ uint32_t total_elems;
298
+ uint32_t vta = vext_vta(desc);
299
+
300
+ for (uint32_t i = env->vstart / 4; i < env->vl / 4; i++) {
301
+ vsha2c_32(((uint32_t *)vs2) + 4 * i, ((uint32_t *)vd) + 4 * i,
302
+ ((uint32_t *)vs1) + 4 * i + 2);
303
+ }
304
+
305
+ /* set tail elements to 1s */
306
+ total_elems = vext_get_total_elems(env, desc, esz);
307
+ vext_set_elems_1s(vd, vta, env->vl * esz, total_elems * esz);
308
+ env->vstart = 0;
309
+}
310
+
311
+void HELPER(vsha2ch64_vv)(void *vd, void *vs1, void *vs2, CPURISCVState *env,
312
+ uint32_t desc)
313
+{
314
+ const uint32_t esz = 8;
315
+ uint32_t total_elems;
316
+ uint32_t vta = vext_vta(desc);
317
+
318
+ for (uint32_t i = env->vstart / 4; i < env->vl / 4; i++) {
319
+ vsha2c_64(((uint64_t *)vs2) + 4 * i, ((uint64_t *)vd) + 4 * i,
320
+ ((uint64_t *)vs1) + 4 * i + 2);
321
+ }
322
+
323
+ /* set tail elements to 1s */
324
+ total_elems = vext_get_total_elems(env, desc, esz);
325
+ vext_set_elems_1s(vd, vta, env->vl * esz, total_elems * esz);
326
+ env->vstart = 0;
327
+}
328
+
329
+void HELPER(vsha2cl32_vv)(void *vd, void *vs1, void *vs2, CPURISCVState *env,
330
+ uint32_t desc)
331
+{
332
+ const uint32_t esz = 4;
333
+ uint32_t total_elems;
334
+ uint32_t vta = vext_vta(desc);
335
+
336
+ for (uint32_t i = env->vstart / 4; i < env->vl / 4; i++) {
337
+ vsha2c_32(((uint32_t *)vs2) + 4 * i, ((uint32_t *)vd) + 4 * i,
338
+ (((uint32_t *)vs1) + 4 * i));
339
+ }
340
+
341
+ /* set tail elements to 1s */
342
+ total_elems = vext_get_total_elems(env, desc, esz);
343
+ vext_set_elems_1s(vd, vta, env->vl * esz, total_elems * esz);
344
+ env->vstart = 0;
345
+}
346
+
347
+void HELPER(vsha2cl64_vv)(void *vd, void *vs1, void *vs2, CPURISCVState *env,
348
+ uint32_t desc)
349
+{
350
+ uint32_t esz = 8;
351
+ uint32_t total_elems;
352
+ uint32_t vta = vext_vta(desc);
353
+
354
+ for (uint32_t i = env->vstart / 4; i < env->vl / 4; i++) {
355
+ vsha2c_64(((uint64_t *)vs2) + 4 * i, ((uint64_t *)vd) + 4 * i,
356
+ (((uint64_t *)vs1) + 4 * i));
357
+ }
358
+
359
+ /* set tail elements to 1s */
360
+ total_elems = vext_get_total_elems(env, desc, esz);
361
+ vext_set_elems_1s(vd, vta, env->vl * esz, total_elems * esz);
362
+ env->vstart = 0;
363
+}
364
diff --git a/target/riscv/insn_trans/trans_rvvk.c.inc b/target/riscv/insn_trans/trans_rvvk.c.inc
365
index XXXXXXX..XXXXXXX 100644
366
--- a/target/riscv/insn_trans/trans_rvvk.c.inc
367
+++ b/target/riscv/insn_trans/trans_rvvk.c.inc
368
@@ -XXX,XX +XXX,XX @@ static bool vaeskf2_check(DisasContext *s, arg_vaeskf2_vi *a)
369
370
GEN_VI_UNMASKED_TRANS(vaeskf1_vi, vaeskf1_check, ZVKNED_EGS)
371
GEN_VI_UNMASKED_TRANS(vaeskf2_vi, vaeskf2_check, ZVKNED_EGS)
372
+
373
+/*
374
+ * Zvknh
375
+ */
376
+
377
+#define ZVKNH_EGS 4
378
+
379
+#define GEN_VV_UNMASKED_TRANS(NAME, CHECK, EGS) \
380
+ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
381
+ { \
382
+ if (CHECK(s, a)) { \
383
+ uint32_t data = 0; \
384
+ TCGLabel *over = gen_new_label(); \
385
+ TCGv_i32 egs; \
386
+ \
387
+ if (!s->vstart_eq_zero || !s->vl_eq_vlmax) { \
388
+ /* save opcode for unwinding in case we throw an exception */ \
389
+ decode_save_opc(s); \
390
+ egs = tcg_constant_i32(EGS); \
391
+ gen_helper_egs_check(egs, cpu_env); \
392
+ tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over); \
393
+ } \
394
+ \
395
+ data = FIELD_DP32(data, VDATA, VM, a->vm); \
396
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
397
+ data = FIELD_DP32(data, VDATA, VTA, s->vta); \
398
+ data = FIELD_DP32(data, VDATA, VTA_ALL_1S, s->cfg_vta_all_1s); \
399
+ data = FIELD_DP32(data, VDATA, VMA, s->vma); \
400
+ \
401
+ tcg_gen_gvec_3_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, a->rs1), \
402
+ vreg_ofs(s, a->rs2), cpu_env, \
403
+ s->cfg_ptr->vlen / 8, s->cfg_ptr->vlen / 8, \
404
+ data, gen_helper_##NAME); \
405
+ \
406
+ mark_vs_dirty(s); \
407
+ gen_set_label(over); \
408
+ return true; \
409
+ } \
410
+ return false; \
411
+ }
412
+
413
+static bool vsha_check_sew(DisasContext *s)
414
+{
415
+ return (s->cfg_ptr->ext_zvknha == true && s->sew == MO_32) ||
416
+ (s->cfg_ptr->ext_zvknhb == true &&
417
+ (s->sew == MO_32 || s->sew == MO_64));
418
+}
419
+
420
+static bool vsha_check(DisasContext *s, arg_rmrr *a)
421
+{
422
+ int egw_bytes = ZVKNH_EGS << s->sew;
423
+ int mult = 1 << MAX(s->lmul, 0);
424
+ return opivv_check(s, a) &&
425
+ vsha_check_sew(s) &&
426
+ MAXSZ(s) >= egw_bytes &&
427
+ !is_overlapped(a->rd, mult, a->rs1, mult) &&
428
+ !is_overlapped(a->rd, mult, a->rs2, mult) &&
429
+ s->lmul >= 0;
430
+}
431
+
432
+GEN_VV_UNMASKED_TRANS(vsha2ms_vv, vsha_check, ZVKNH_EGS)
433
+
434
+static bool trans_vsha2cl_vv(DisasContext *s, arg_rmrr *a)
435
+{
436
+ if (vsha_check(s, a)) {
437
+ uint32_t data = 0;
438
+ TCGLabel *over = gen_new_label();
439
+ TCGv_i32 egs;
440
+
441
+ if (!s->vstart_eq_zero || !s->vl_eq_vlmax) {
442
+ /* save opcode for unwinding in case we throw an exception */
443
+ decode_save_opc(s);
444
+ egs = tcg_constant_i32(ZVKNH_EGS);
445
+ gen_helper_egs_check(egs, cpu_env);
446
+ tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);
447
+ }
448
+
449
+ data = FIELD_DP32(data, VDATA, VM, a->vm);
450
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
451
+ data = FIELD_DP32(data, VDATA, VTA, s->vta);
452
+ data = FIELD_DP32(data, VDATA, VTA_ALL_1S, s->cfg_vta_all_1s);
453
+ data = FIELD_DP32(data, VDATA, VMA, s->vma);
454
+
455
+ tcg_gen_gvec_3_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, a->rs1),
456
+ vreg_ofs(s, a->rs2), cpu_env, s->cfg_ptr->vlen / 8,
457
+ s->cfg_ptr->vlen / 8, data,
458
+ s->sew == MO_32 ?
459
+ gen_helper_vsha2cl32_vv : gen_helper_vsha2cl64_vv);
460
+
461
+ mark_vs_dirty(s);
462
+ gen_set_label(over);
463
+ return true;
464
+ }
465
+ return false;
466
+}
467
+
468
+static bool trans_vsha2ch_vv(DisasContext *s, arg_rmrr *a)
469
+{
470
+ if (vsha_check(s, a)) {
471
+ uint32_t data = 0;
472
+ TCGLabel *over = gen_new_label();
473
+ TCGv_i32 egs;
474
+
475
+ if (!s->vstart_eq_zero || !s->vl_eq_vlmax) {
476
+ /* save opcode for unwinding in case we throw an exception */
477
+ decode_save_opc(s);
478
+ egs = tcg_constant_i32(ZVKNH_EGS);
479
+ gen_helper_egs_check(egs, cpu_env);
480
+ tcg_gen_brcond_tl(TCG_COND_GEU, cpu_vstart, cpu_vl, over);
481
+ }
482
+
483
+ data = FIELD_DP32(data, VDATA, VM, a->vm);
484
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
485
+ data = FIELD_DP32(data, VDATA, VTA, s->vta);
486
+ data = FIELD_DP32(data, VDATA, VTA_ALL_1S, s->cfg_vta_all_1s);
487
+ data = FIELD_DP32(data, VDATA, VMA, s->vma);
488
+
489
+ tcg_gen_gvec_3_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, a->rs1),
490
+ vreg_ofs(s, a->rs2), cpu_env, s->cfg_ptr->vlen / 8,
491
+ s->cfg_ptr->vlen / 8, data,
492
+ s->sew == MO_32 ?
493
+ gen_helper_vsha2ch32_vv : gen_helper_vsha2ch64_vv);
494
+
495
+ mark_vs_dirty(s);
496
+ gen_set_label(over);
497
+ return true;
498
+ }
499
+ return false;
82
+}
500
+}
83
--
501
--
84
2.31.1
502
2.41.0
85
86
diff view generated by jsdifflib
1
From: Frank Chang <frank.chang@sifive.com>
1
From: Lawrence Hunter <lawrence.hunter@codethink.co.uk>
2
2
3
Signed-off-by: Frank Chang <frank.chang@sifive.com>
3
This commit adds support for the Zvksh vector-crypto extension, which
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
consists of the following instructions:
5
Message-id: 20210505160620.15723-14-frank.chang@sifive.com
5
6
* vsm3me.vv
7
* vsm3c.vi
8
9
Translation functions are defined in
10
`target/riscv/insn_trans/trans_rvvk.c.inc` and helpers are defined in
11
`target/riscv/vcrypto_helper.c`.
12
13
Co-authored-by: Kiran Ostrolenk <kiran.ostrolenk@codethink.co.uk>
14
[max.chou@sifive.com: Replaced vstart checking by TCG op]
15
Signed-off-by: Kiran Ostrolenk <kiran.ostrolenk@codethink.co.uk>
16
Signed-off-by: Lawrence Hunter <lawrence.hunter@codethink.co.uk>
17
Signed-off-by: Max Chou <max.chou@sifive.com>
18
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
19
[max.chou@sifive.com: Exposed x-zvksh property]
20
Message-ID: <20230711165917.2629866-12-max.chou@sifive.com>
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
21
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
---
22
---
8
target/riscv/helper.h | 2 ++
23
target/riscv/cpu_cfg.h | 1 +
9
target/riscv/insn32.decode | 4 ++++
24
target/riscv/helper.h | 3 +
10
target/riscv/bitmanip_helper.c | 26 +++++++++++++++++++++++++
25
target/riscv/insn32.decode | 4 +
11
target/riscv/translate.c | 6 ++++++
26
target/riscv/cpu.c | 6 +-
12
target/riscv/insn_trans/trans_rvb.c.inc | 26 +++++++++++++++++++++++++
27
target/riscv/vcrypto_helper.c | 134 +++++++++++++++++++++++
13
5 files changed, 64 insertions(+)
28
target/riscv/insn_trans/trans_rvvk.c.inc | 31 ++++++
14
29
6 files changed, 177 insertions(+), 2 deletions(-)
30
31
diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h
32
index XXXXXXX..XXXXXXX 100644
33
--- a/target/riscv/cpu_cfg.h
34
+++ b/target/riscv/cpu_cfg.h
35
@@ -XXX,XX +XXX,XX @@ struct RISCVCPUConfig {
36
bool ext_zvkned;
37
bool ext_zvknha;
38
bool ext_zvknhb;
39
+ bool ext_zvksh;
40
bool ext_zmmul;
41
bool ext_zvfbfmin;
42
bool ext_zvfbfwma;
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
43
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
44
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
45
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
46
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_1(fclass_d, TCG_CALL_NO_RWG_SE, tl, i64)
47
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_5(vsha2ch32_vv, void, ptr, ptr, ptr, env, i32)
20
/* Bitmanip */
48
DEF_HELPER_5(vsha2ch64_vv, void, ptr, ptr, ptr, env, i32)
21
DEF_HELPER_FLAGS_2(grev, TCG_CALL_NO_RWG_SE, tl, tl, tl)
49
DEF_HELPER_5(vsha2cl32_vv, void, ptr, ptr, ptr, env, i32)
22
DEF_HELPER_FLAGS_2(grevw, TCG_CALL_NO_RWG_SE, tl, tl, tl)
50
DEF_HELPER_5(vsha2cl64_vv, void, ptr, ptr, ptr, env, i32)
23
+DEF_HELPER_FLAGS_2(gorc, TCG_CALL_NO_RWG_SE, tl, tl, tl)
51
+
24
+DEF_HELPER_FLAGS_2(gorcw, TCG_CALL_NO_RWG_SE, tl, tl, tl)
52
+DEF_HELPER_5(vsm3me_vv, void, ptr, ptr, ptr, env, i32)
25
53
+DEF_HELPER_5(vsm3c_vi, void, ptr, ptr, i32, env, i32)
26
/* Special functions */
27
DEF_HELPER_3(csrrw, tl, env, tl, tl)
28
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
54
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
29
index XXXXXXX..XXXXXXX 100644
55
index XXXXXXX..XXXXXXX 100644
30
--- a/target/riscv/insn32.decode
56
--- a/target/riscv/insn32.decode
31
+++ b/target/riscv/insn32.decode
57
+++ b/target/riscv/insn32.decode
32
@@ -XXX,XX +XXX,XX @@ sro 0010000 .......... 101 ..... 0110011 @r
58
@@ -XXX,XX +XXX,XX @@ vaeskf2_vi 101010 1 ..... ..... 010 ..... 1110111 @r_vm_1
33
ror 0110000 .......... 101 ..... 0110011 @r
59
vsha2ms_vv 101101 1 ..... ..... 010 ..... 1110111 @r_vm_1
34
rol 0110000 .......... 001 ..... 0110011 @r
60
vsha2ch_vv 101110 1 ..... ..... 010 ..... 1110111 @r_vm_1
35
grev 0110100 .......... 101 ..... 0110011 @r
61
vsha2cl_vv 101111 1 ..... ..... 010 ..... 1110111 @r_vm_1
36
+gorc 0010100 .......... 101 ..... 0110011 @r
62
+
37
63
+# *** Zvksh vector crypto extension ***
38
bseti 00101. ........... 001 ..... 0010011 @sh
64
+vsm3me_vv 100000 1 ..... ..... 010 ..... 1110111 @r_vm_1
39
bclri 01001. ........... 001 ..... 0010011 @sh
65
+vsm3c_vi 101011 1 ..... ..... 010 ..... 1110111 @r_vm_1
40
@@ -XXX,XX +XXX,XX @@ sloi 00100. ........... 001 ..... 0010011 @sh
66
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
41
sroi 00100. ........... 101 ..... 0010011 @sh
67
index XXXXXXX..XXXXXXX 100644
42
rori 01100. ........... 101 ..... 0010011 @sh
68
--- a/target/riscv/cpu.c
43
grevi 01101. ........... 101 ..... 0010011 @sh
69
+++ b/target/riscv/cpu.c
44
+gorci 00101. ........... 101 ..... 0010011 @sh
70
@@ -XXX,XX +XXX,XX @@ static const struct isa_ext_data isa_edata_arr[] = {
45
71
ISA_EXT_DATA_ENTRY(zvkned, PRIV_VERSION_1_12_0, ext_zvkned),
46
# *** RV64B Standard Extension (in addition to RV32B) ***
72
ISA_EXT_DATA_ENTRY(zvknha, PRIV_VERSION_1_12_0, ext_zvknha),
47
clzw 0110000 00000 ..... 001 ..... 0011011 @r2
73
ISA_EXT_DATA_ENTRY(zvknhb, PRIV_VERSION_1_12_0, ext_zvknhb),
48
@@ -XXX,XX +XXX,XX @@ srow 0010000 .......... 101 ..... 0111011 @r
74
+ ISA_EXT_DATA_ENTRY(zvksh, PRIV_VERSION_1_12_0, ext_zvksh),
49
rorw 0110000 .......... 101 ..... 0111011 @r
75
ISA_EXT_DATA_ENTRY(zhinx, PRIV_VERSION_1_12_0, ext_zhinx),
50
rolw 0110000 .......... 001 ..... 0111011 @r
76
ISA_EXT_DATA_ENTRY(zhinxmin, PRIV_VERSION_1_12_0, ext_zhinxmin),
51
grevw 0110100 .......... 101 ..... 0111011 @r
77
ISA_EXT_DATA_ENTRY(smaia, PRIV_VERSION_1_12_0, ext_smaia),
52
+gorcw 0010100 .......... 101 ..... 0111011 @r
78
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
53
79
* In principle Zve*x would also suffice here, were they supported
54
bsetiw 0010100 .......... 001 ..... 0011011 @sh5
80
* in qemu
55
bclriw 0100100 .......... 001 ..... 0011011 @sh5
81
*/
56
@@ -XXX,XX +XXX,XX @@ sloiw 0010000 .......... 001 ..... 0011011 @sh5
82
- if ((cpu->cfg.ext_zvbb || cpu->cfg.ext_zvkned || cpu->cfg.ext_zvknha) &&
57
sroiw 0010000 .......... 101 ..... 0011011 @sh5
83
- !cpu->cfg.ext_zve32f) {
58
roriw 0110000 .......... 101 ..... 0011011 @sh5
84
+ if ((cpu->cfg.ext_zvbb || cpu->cfg.ext_zvkned || cpu->cfg.ext_zvknha ||
59
greviw 0110100 .......... 101 ..... 0011011 @sh5
85
+ cpu->cfg.ext_zvksh) && !cpu->cfg.ext_zve32f) {
60
+gorciw 0010100 .......... 101 ..... 0011011 @sh5
86
error_setg(errp,
61
diff --git a/target/riscv/bitmanip_helper.c b/target/riscv/bitmanip_helper.c
87
"Vector crypto extensions require V or Zve* extensions");
62
index XXXXXXX..XXXXXXX 100644
88
return;
63
--- a/target/riscv/bitmanip_helper.c
89
@@ -XXX,XX +XXX,XX @@ static Property riscv_cpu_extensions[] = {
64
+++ b/target/riscv/bitmanip_helper.c
90
DEFINE_PROP_BOOL("x-zvkned", RISCVCPU, cfg.ext_zvkned, false),
65
@@ -XXX,XX +XXX,XX @@ target_ulong HELPER(grevw)(target_ulong rs1, target_ulong rs2)
91
DEFINE_PROP_BOOL("x-zvknha", RISCVCPU, cfg.ext_zvknha, false),
66
{
92
DEFINE_PROP_BOOL("x-zvknhb", RISCVCPU, cfg.ext_zvknhb, false),
67
return do_grev(rs1, rs2, 32);
93
+ DEFINE_PROP_BOOL("x-zvksh", RISCVCPU, cfg.ext_zvksh, false),
94
95
DEFINE_PROP_END_OF_LIST(),
96
};
97
diff --git a/target/riscv/vcrypto_helper.c b/target/riscv/vcrypto_helper.c
98
index XXXXXXX..XXXXXXX 100644
99
--- a/target/riscv/vcrypto_helper.c
100
+++ b/target/riscv/vcrypto_helper.c
101
@@ -XXX,XX +XXX,XX @@ void HELPER(vsha2cl64_vv)(void *vd, void *vs1, void *vs2, CPURISCVState *env,
102
vext_set_elems_1s(vd, vta, env->vl * esz, total_elems * esz);
103
env->vstart = 0;
68
}
104
}
69
+
105
+
70
+static target_ulong do_gorc(target_ulong rs1,
106
+static inline uint32_t p1(uint32_t x)
71
+ target_ulong rs2,
107
+{
72
+ int bits)
108
+ return x ^ rol32(x, 15) ^ rol32(x, 23);
73
+{
109
+}
74
+ target_ulong x = rs1;
110
+
75
+ int i, shift;
111
+static inline uint32_t zvksh_w(uint32_t m16, uint32_t m9, uint32_t m3,
76
+
112
+ uint32_t m13, uint32_t m6)
77
+ for (i = 0, shift = 1; shift < bits; i++, shift <<= 1) {
113
+{
78
+ if (rs2 & shift) {
114
+ return p1(m16 ^ m9 ^ rol32(m3, 15)) ^ rol32(m13, 7) ^ m6;
79
+ x |= do_swap(x, adjacent_masks[i], shift);
115
+}
116
+
117
+void HELPER(vsm3me_vv)(void *vd_vptr, void *vs1_vptr, void *vs2_vptr,
118
+ CPURISCVState *env, uint32_t desc)
119
+{
120
+ uint32_t esz = memop_size(FIELD_EX64(env->vtype, VTYPE, VSEW));
121
+ uint32_t total_elems = vext_get_total_elems(env, desc, esz);
122
+ uint32_t vta = vext_vta(desc);
123
+ uint32_t *vd = vd_vptr;
124
+ uint32_t *vs1 = vs1_vptr;
125
+ uint32_t *vs2 = vs2_vptr;
126
+
127
+ for (int i = env->vstart / 8; i < env->vl / 8; i++) {
128
+ uint32_t w[24];
129
+ for (int j = 0; j < 8; j++) {
130
+ w[j] = bswap32(vs1[H4((i * 8) + j)]);
131
+ w[j + 8] = bswap32(vs2[H4((i * 8) + j)]);
132
+ }
133
+ for (int j = 0; j < 8; j++) {
134
+ w[j + 16] =
135
+ zvksh_w(w[j], w[j + 7], w[j + 13], w[j + 3], w[j + 10]);
136
+ }
137
+ for (int j = 0; j < 8; j++) {
138
+ vd[(i * 8) + j] = bswap32(w[H4(j + 16)]);
80
+ }
139
+ }
81
+ }
140
+ }
82
+
141
+ vext_set_elems_1s(vd_vptr, vta, env->vl * esz, total_elems * esz);
83
+ return x;
142
+ env->vstart = 0;
84
+}
143
+}
85
+
144
+
86
+target_ulong HELPER(gorc)(target_ulong rs1, target_ulong rs2)
145
+static inline uint32_t ff1(uint32_t x, uint32_t y, uint32_t z)
87
+{
146
+{
88
+ return do_gorc(rs1, rs2, TARGET_LONG_BITS);
147
+ return x ^ y ^ z;
89
+}
148
+}
90
+
149
+
91
+target_ulong HELPER(gorcw)(target_ulong rs1, target_ulong rs2)
150
+static inline uint32_t ff2(uint32_t x, uint32_t y, uint32_t z)
92
+{
151
+{
93
+ return do_gorc(rs1, rs2, 32);
152
+ return (x & y) | (x & z) | (y & z);
94
+}
153
+}
95
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
154
+
96
index XXXXXXX..XXXXXXX 100644
155
+static inline uint32_t ff_j(uint32_t x, uint32_t y, uint32_t z, uint32_t j)
97
--- a/target/riscv/translate.c
156
+{
98
+++ b/target/riscv/translate.c
157
+ return (j <= 15) ? ff1(x, y, z) : ff2(x, y, z);
99
@@ -XXX,XX +XXX,XX @@ static void gen_grevw(TCGv ret, TCGv arg1, TCGv arg2)
158
+}
100
gen_helper_grev(ret, arg1, arg2);
159
+
160
+static inline uint32_t gg1(uint32_t x, uint32_t y, uint32_t z)
161
+{
162
+ return x ^ y ^ z;
163
+}
164
+
165
+static inline uint32_t gg2(uint32_t x, uint32_t y, uint32_t z)
166
+{
167
+ return (x & y) | (~x & z);
168
+}
169
+
170
+static inline uint32_t gg_j(uint32_t x, uint32_t y, uint32_t z, uint32_t j)
171
+{
172
+ return (j <= 15) ? gg1(x, y, z) : gg2(x, y, z);
173
+}
174
+
175
+static inline uint32_t t_j(uint32_t j)
176
+{
177
+ return (j <= 15) ? 0x79cc4519 : 0x7a879d8a;
178
+}
179
+
180
+static inline uint32_t p_0(uint32_t x)
181
+{
182
+ return x ^ rol32(x, 9) ^ rol32(x, 17);
183
+}
184
+
185
+static void sm3c(uint32_t *vd, uint32_t *vs1, uint32_t *vs2, uint32_t uimm)
186
+{
187
+ uint32_t x0, x1;
188
+ uint32_t j;
189
+ uint32_t ss1, ss2, tt1, tt2;
190
+ x0 = vs2[0] ^ vs2[4];
191
+ x1 = vs2[1] ^ vs2[5];
192
+ j = 2 * uimm;
193
+ ss1 = rol32(rol32(vs1[0], 12) + vs1[4] + rol32(t_j(j), j % 32), 7);
194
+ ss2 = ss1 ^ rol32(vs1[0], 12);
195
+ tt1 = ff_j(vs1[0], vs1[1], vs1[2], j) + vs1[3] + ss2 + x0;
196
+ tt2 = gg_j(vs1[4], vs1[5], vs1[6], j) + vs1[7] + ss1 + vs2[0];
197
+ vs1[3] = vs1[2];
198
+ vd[3] = rol32(vs1[1], 9);
199
+ vs1[1] = vs1[0];
200
+ vd[1] = tt1;
201
+ vs1[7] = vs1[6];
202
+ vd[7] = rol32(vs1[5], 19);
203
+ vs1[5] = vs1[4];
204
+ vd[5] = p_0(tt2);
205
+ j = 2 * uimm + 1;
206
+ ss1 = rol32(rol32(vd[1], 12) + vd[5] + rol32(t_j(j), j % 32), 7);
207
+ ss2 = ss1 ^ rol32(vd[1], 12);
208
+ tt1 = ff_j(vd[1], vs1[1], vd[3], j) + vs1[3] + ss2 + x1;
209
+ tt2 = gg_j(vd[5], vs1[5], vd[7], j) + vs1[7] + ss1 + vs2[1];
210
+ vd[2] = rol32(vs1[1], 9);
211
+ vd[0] = tt1;
212
+ vd[6] = rol32(vs1[5], 19);
213
+ vd[4] = p_0(tt2);
214
+}
215
+
216
+void HELPER(vsm3c_vi)(void *vd_vptr, void *vs2_vptr, uint32_t uimm,
217
+ CPURISCVState *env, uint32_t desc)
218
+{
219
+ uint32_t esz = memop_size(FIELD_EX64(env->vtype, VTYPE, VSEW));
220
+ uint32_t total_elems = vext_get_total_elems(env, desc, esz);
221
+ uint32_t vta = vext_vta(desc);
222
+ uint32_t *vd = vd_vptr;
223
+ uint32_t *vs2 = vs2_vptr;
224
+ uint32_t v1[8], v2[8], v3[8];
225
+
226
+ for (int i = env->vstart / 8; i < env->vl / 8; i++) {
227
+ for (int k = 0; k < 8; k++) {
228
+ v2[k] = bswap32(vd[H4(i * 8 + k)]);
229
+ v3[k] = bswap32(vs2[H4(i * 8 + k)]);
230
+ }
231
+ sm3c(v1, v2, v3, uimm);
232
+ for (int k = 0; k < 8; k++) {
233
+ vd[i * 8 + k] = bswap32(v1[H4(k)]);
234
+ }
235
+ }
236
+ vext_set_elems_1s(vd_vptr, vta, env->vl * esz, total_elems * esz);
237
+ env->vstart = 0;
238
+}
239
diff --git a/target/riscv/insn_trans/trans_rvvk.c.inc b/target/riscv/insn_trans/trans_rvvk.c.inc
240
index XXXXXXX..XXXXXXX 100644
241
--- a/target/riscv/insn_trans/trans_rvvk.c.inc
242
+++ b/target/riscv/insn_trans/trans_rvvk.c.inc
243
@@ -XXX,XX +XXX,XX @@ static bool trans_vsha2ch_vv(DisasContext *s, arg_rmrr *a)
244
}
245
return false;
101
}
246
}
102
247
+
103
+static void gen_gorcw(TCGv ret, TCGv arg1, TCGv arg2)
248
+/*
104
+{
249
+ * Zvksh
105
+ tcg_gen_ext32u_tl(arg1, arg1);
250
+ */
106
+ gen_helper_gorcw(ret, arg1, arg2);
251
+
107
+}
252
+#define ZVKSH_EGS 8
108
+
253
+
109
static bool gen_arith(DisasContext *ctx, arg_r *a,
254
+static inline bool vsm3_check(DisasContext *s, arg_rmrr *a)
110
void(*func)(TCGv, TCGv, TCGv))
255
+{
111
{
256
+ int egw_bytes = ZVKSH_EGS << s->sew;
112
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
257
+ int mult = 1 << MAX(s->lmul, 0);
113
index XXXXXXX..XXXXXXX 100644
258
+ return s->cfg_ptr->ext_zvksh == true &&
114
--- a/target/riscv/insn_trans/trans_rvb.c.inc
259
+ require_rvv(s) &&
115
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
260
+ vext_check_isa_ill(s) &&
116
@@ -XXX,XX +XXX,XX @@ static bool trans_grevi(DisasContext *ctx, arg_grevi *a)
261
+ !is_overlapped(a->rd, mult, a->rs2, mult) &&
117
return gen_grevi(ctx, a);
262
+ MAXSZ(s) >= egw_bytes &&
118
}
263
+ s->sew == MO_32;
119
264
+}
120
+static bool trans_gorc(DisasContext *ctx, arg_gorc *a)
265
+
121
+{
266
+static inline bool vsm3me_check(DisasContext *s, arg_rmrr *a)
122
+ REQUIRE_EXT(ctx, RVB);
267
+{
123
+ return gen_shift(ctx, a, gen_helper_gorc);
268
+ return vsm3_check(s, a) && vext_check_sss(s, a->rd, a->rs1, a->rs2, a->vm);
124
+}
269
+}
125
+
270
+
126
+static bool trans_gorci(DisasContext *ctx, arg_gorci *a)
271
+static inline bool vsm3c_check(DisasContext *s, arg_rmrr *a)
127
+{
272
+{
128
+ REQUIRE_EXT(ctx, RVB);
273
+ return vsm3_check(s, a) && vext_check_ss(s, a->rd, a->rs2, a->vm);
129
+ return gen_shifti(ctx, a, gen_helper_gorc);
274
+}
130
+}
275
+
131
+
276
+GEN_VV_UNMASKED_TRANS(vsm3me_vv, vsm3me_check, ZVKSH_EGS)
132
static bool trans_clzw(DisasContext *ctx, arg_clzw *a)
277
+GEN_VI_UNMASKED_TRANS(vsm3c_vi, vsm3c_check, ZVKSH_EGS)
133
{
134
REQUIRE_64BIT(ctx);
135
@@ -XXX,XX +XXX,XX @@ static bool trans_greviw(DisasContext *ctx, arg_greviw *a)
136
REQUIRE_EXT(ctx, RVB);
137
return gen_shiftiw(ctx, a, gen_grevw);
138
}
139
+
140
+static bool trans_gorcw(DisasContext *ctx, arg_gorcw *a)
141
+{
142
+ REQUIRE_64BIT(ctx);
143
+ REQUIRE_EXT(ctx, RVB);
144
+ return gen_shiftw(ctx, a, gen_gorcw);
145
+}
146
+
147
+static bool trans_gorciw(DisasContext *ctx, arg_gorciw *a)
148
+{
149
+ REQUIRE_64BIT(ctx);
150
+ REQUIRE_EXT(ctx, RVB);
151
+ return gen_shiftiw(ctx, a, gen_gorcw);
152
+}
153
--
278
--
154
2.31.1
279
2.41.0
155
156
diff view generated by jsdifflib
1
From: Kito Cheng <kito.cheng@sifive.com>
1
From: Nazar Kazakov <nazar.kazakov@codethink.co.uk>
2
2
3
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
3
This commit adds support for the Zvkg vector-crypto extension, which
4
Signed-off-by: Frank Chang <frank.chang@sifive.com>
4
consists of the following instructions:
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
* vgmul.vv
7
Message-id: 20210505160620.15723-5-frank.chang@sifive.com
7
* vghsh.vv
8
9
Translation functions are defined in
10
`target/riscv/insn_trans/trans_rvvk.c.inc` and helpers are defined in
11
`target/riscv/vcrypto_helper.c`.
12
13
Co-authored-by: Lawrence Hunter <lawrence.hunter@codethink.co.uk>
14
[max.chou@sifive.com: Replaced vstart checking by TCG op]
15
Signed-off-by: Lawrence Hunter <lawrence.hunter@codethink.co.uk>
16
Signed-off-by: Nazar Kazakov <nazar.kazakov@codethink.co.uk>
17
Signed-off-by: Max Chou <max.chou@sifive.com>
18
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
19
[max.chou@sifive.com: Exposed x-zvkg property]
20
[max.chou@sifive.com: Replaced uint by int for cross win32 build]
21
Message-ID: <20230711165917.2629866-13-max.chou@sifive.com>
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
22
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
---
23
---
10
target/riscv/insn32.decode | 3 +++
24
target/riscv/cpu_cfg.h | 1 +
11
target/riscv/insn_trans/trans_rvb.c.inc | 18 ++++++++++++++++++
25
target/riscv/helper.h | 3 +
12
2 files changed, 21 insertions(+)
26
target/riscv/insn32.decode | 4 ++
13
27
target/riscv/cpu.c | 6 +-
28
target/riscv/vcrypto_helper.c | 72 ++++++++++++++++++++++++
29
target/riscv/insn_trans/trans_rvvk.c.inc | 30 ++++++++++
30
6 files changed, 114 insertions(+), 2 deletions(-)
31
32
diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h
33
index XXXXXXX..XXXXXXX 100644
34
--- a/target/riscv/cpu_cfg.h
35
+++ b/target/riscv/cpu_cfg.h
36
@@ -XXX,XX +XXX,XX @@ struct RISCVCPUConfig {
37
bool ext_zve64d;
38
bool ext_zvbb;
39
bool ext_zvbc;
40
+ bool ext_zvkg;
41
bool ext_zvkned;
42
bool ext_zvknha;
43
bool ext_zvknhb;
44
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
45
index XXXXXXX..XXXXXXX 100644
46
--- a/target/riscv/helper.h
47
+++ b/target/riscv/helper.h
48
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_5(vsha2cl64_vv, void, ptr, ptr, ptr, env, i32)
49
50
DEF_HELPER_5(vsm3me_vv, void, ptr, ptr, ptr, env, i32)
51
DEF_HELPER_5(vsm3c_vi, void, ptr, ptr, i32, env, i32)
52
+
53
+DEF_HELPER_5(vghsh_vv, void, ptr, ptr, ptr, env, i32)
54
+DEF_HELPER_4(vgmul_vv, void, ptr, ptr, env, i32)
14
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
55
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
15
index XXXXXXX..XXXXXXX 100644
56
index XXXXXXX..XXXXXXX 100644
16
--- a/target/riscv/insn32.decode
57
--- a/target/riscv/insn32.decode
17
+++ b/target/riscv/insn32.decode
58
+++ b/target/riscv/insn32.decode
18
@@ -XXX,XX +XXX,XX @@ vamomaxud_v 11100 . . ..... ..... 111 ..... 0101111 @r_wdvm
59
@@ -XXX,XX +XXX,XX @@ vsha2cl_vv 101111 1 ..... ..... 010 ..... 1110111 @r_vm_1
19
clz 011000 000000 ..... 001 ..... 0010011 @r2
60
# *** Zvksh vector crypto extension ***
20
ctz 011000 000001 ..... 001 ..... 0010011 @r2
61
vsm3me_vv 100000 1 ..... ..... 010 ..... 1110111 @r_vm_1
21
cpop 011000 000010 ..... 001 ..... 0010011 @r2
62
vsm3c_vi 101011 1 ..... ..... 010 ..... 1110111 @r_vm_1
22
+andn 0100000 .......... 111 ..... 0110011 @r
63
+
23
+orn 0100000 .......... 110 ..... 0110011 @r
64
+# *** Zvkg vector crypto extension ***
24
+xnor 0100000 .......... 100 ..... 0110011 @r
65
+vghsh_vv 101100 1 ..... ..... 010 ..... 1110111 @r_vm_1
25
66
+vgmul_vv 101000 1 ..... 10001 010 ..... 1110111 @r2_vm_1
26
# *** RV64B Standard Extension (in addition to RV32B) ***
67
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
27
clzw 0110000 00000 ..... 001 ..... 0011011 @r2
68
index XXXXXXX..XXXXXXX 100644
28
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
69
--- a/target/riscv/cpu.c
29
index XXXXXXX..XXXXXXX 100644
70
+++ b/target/riscv/cpu.c
30
--- a/target/riscv/insn_trans/trans_rvb.c.inc
71
@@ -XXX,XX +XXX,XX @@ static const struct isa_ext_data isa_edata_arr[] = {
31
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
72
ISA_EXT_DATA_ENTRY(zvfbfwma, PRIV_VERSION_1_12_0, ext_zvfbfwma),
32
@@ -XXX,XX +XXX,XX @@ static bool trans_cpop(DisasContext *ctx, arg_cpop *a)
73
ISA_EXT_DATA_ENTRY(zvfh, PRIV_VERSION_1_12_0, ext_zvfh),
33
return gen_unary(ctx, a, tcg_gen_ctpop_tl);
74
ISA_EXT_DATA_ENTRY(zvfhmin, PRIV_VERSION_1_12_0, ext_zvfhmin),
75
+ ISA_EXT_DATA_ENTRY(zvkg, PRIV_VERSION_1_12_0, ext_zvkg),
76
ISA_EXT_DATA_ENTRY(zvkned, PRIV_VERSION_1_12_0, ext_zvkned),
77
ISA_EXT_DATA_ENTRY(zvknha, PRIV_VERSION_1_12_0, ext_zvknha),
78
ISA_EXT_DATA_ENTRY(zvknhb, PRIV_VERSION_1_12_0, ext_zvknhb),
79
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
80
* In principle Zve*x would also suffice here, were they supported
81
* in qemu
82
*/
83
- if ((cpu->cfg.ext_zvbb || cpu->cfg.ext_zvkned || cpu->cfg.ext_zvknha ||
84
- cpu->cfg.ext_zvksh) && !cpu->cfg.ext_zve32f) {
85
+ if ((cpu->cfg.ext_zvbb || cpu->cfg.ext_zvkg || cpu->cfg.ext_zvkned ||
86
+ cpu->cfg.ext_zvknha || cpu->cfg.ext_zvksh) && !cpu->cfg.ext_zve32f) {
87
error_setg(errp,
88
"Vector crypto extensions require V or Zve* extensions");
89
return;
90
@@ -XXX,XX +XXX,XX @@ static Property riscv_cpu_extensions[] = {
91
/* Vector cryptography extensions */
92
DEFINE_PROP_BOOL("x-zvbb", RISCVCPU, cfg.ext_zvbb, false),
93
DEFINE_PROP_BOOL("x-zvbc", RISCVCPU, cfg.ext_zvbc, false),
94
+ DEFINE_PROP_BOOL("x-zvkg", RISCVCPU, cfg.ext_zvkg, false),
95
DEFINE_PROP_BOOL("x-zvkned", RISCVCPU, cfg.ext_zvkned, false),
96
DEFINE_PROP_BOOL("x-zvknha", RISCVCPU, cfg.ext_zvknha, false),
97
DEFINE_PROP_BOOL("x-zvknhb", RISCVCPU, cfg.ext_zvknhb, false),
98
diff --git a/target/riscv/vcrypto_helper.c b/target/riscv/vcrypto_helper.c
99
index XXXXXXX..XXXXXXX 100644
100
--- a/target/riscv/vcrypto_helper.c
101
+++ b/target/riscv/vcrypto_helper.c
102
@@ -XXX,XX +XXX,XX @@ void HELPER(vsm3c_vi)(void *vd_vptr, void *vs2_vptr, uint32_t uimm,
103
vext_set_elems_1s(vd_vptr, vta, env->vl * esz, total_elems * esz);
104
env->vstart = 0;
34
}
105
}
35
106
+
36
+static bool trans_andn(DisasContext *ctx, arg_andn *a)
107
+void HELPER(vghsh_vv)(void *vd_vptr, void *vs1_vptr, void *vs2_vptr,
37
+{
108
+ CPURISCVState *env, uint32_t desc)
38
+ REQUIRE_EXT(ctx, RVB);
109
+{
39
+ return gen_arith(ctx, a, tcg_gen_andc_tl);
110
+ uint64_t *vd = vd_vptr;
40
+}
111
+ uint64_t *vs1 = vs1_vptr;
41
+
112
+ uint64_t *vs2 = vs2_vptr;
42
+static bool trans_orn(DisasContext *ctx, arg_orn *a)
113
+ uint32_t vta = vext_vta(desc);
43
+{
114
+ uint32_t total_elems = vext_get_total_elems(env, desc, 4);
44
+ REQUIRE_EXT(ctx, RVB);
115
+
45
+ return gen_arith(ctx, a, tcg_gen_orc_tl);
116
+ for (uint32_t i = env->vstart / 4; i < env->vl / 4; i++) {
46
+}
117
+ uint64_t Y[2] = {vd[i * 2 + 0], vd[i * 2 + 1]};
47
+
118
+ uint64_t H[2] = {brev8(vs2[i * 2 + 0]), brev8(vs2[i * 2 + 1])};
48
+static bool trans_xnor(DisasContext *ctx, arg_xnor *a)
119
+ uint64_t X[2] = {vs1[i * 2 + 0], vs1[i * 2 + 1]};
49
+{
120
+ uint64_t Z[2] = {0, 0};
50
+ REQUIRE_EXT(ctx, RVB);
121
+
51
+ return gen_arith(ctx, a, tcg_gen_eqv_tl);
122
+ uint64_t S[2] = {brev8(Y[0] ^ X[0]), brev8(Y[1] ^ X[1])};
52
+}
123
+
53
+
124
+ for (int j = 0; j < 128; j++) {
54
static bool trans_clzw(DisasContext *ctx, arg_clzw *a)
125
+ if ((S[j / 64] >> (j % 64)) & 1) {
55
{
126
+ Z[0] ^= H[0];
56
REQUIRE_64BIT(ctx);
127
+ Z[1] ^= H[1];
128
+ }
129
+ bool reduce = ((H[1] >> 63) & 1);
130
+ H[1] = H[1] << 1 | H[0] >> 63;
131
+ H[0] = H[0] << 1;
132
+ if (reduce) {
133
+ H[0] ^= 0x87;
134
+ }
135
+ }
136
+
137
+ vd[i * 2 + 0] = brev8(Z[0]);
138
+ vd[i * 2 + 1] = brev8(Z[1]);
139
+ }
140
+ /* set tail elements to 1s */
141
+ vext_set_elems_1s(vd, vta, env->vl * 4, total_elems * 4);
142
+ env->vstart = 0;
143
+}
144
+
145
+void HELPER(vgmul_vv)(void *vd_vptr, void *vs2_vptr, CPURISCVState *env,
146
+ uint32_t desc)
147
+{
148
+ uint64_t *vd = vd_vptr;
149
+ uint64_t *vs2 = vs2_vptr;
150
+ uint32_t vta = vext_vta(desc);
151
+ uint32_t total_elems = vext_get_total_elems(env, desc, 4);
152
+
153
+ for (uint32_t i = env->vstart / 4; i < env->vl / 4; i++) {
154
+ uint64_t Y[2] = {brev8(vd[i * 2 + 0]), brev8(vd[i * 2 + 1])};
155
+ uint64_t H[2] = {brev8(vs2[i * 2 + 0]), brev8(vs2[i * 2 + 1])};
156
+ uint64_t Z[2] = {0, 0};
157
+
158
+ for (int j = 0; j < 128; j++) {
159
+ if ((Y[j / 64] >> (j % 64)) & 1) {
160
+ Z[0] ^= H[0];
161
+ Z[1] ^= H[1];
162
+ }
163
+ bool reduce = ((H[1] >> 63) & 1);
164
+ H[1] = H[1] << 1 | H[0] >> 63;
165
+ H[0] = H[0] << 1;
166
+ if (reduce) {
167
+ H[0] ^= 0x87;
168
+ }
169
+ }
170
+
171
+ vd[i * 2 + 0] = brev8(Z[0]);
172
+ vd[i * 2 + 1] = brev8(Z[1]);
173
+ }
174
+ /* set tail elements to 1s */
175
+ vext_set_elems_1s(vd, vta, env->vl * 4, total_elems * 4);
176
+ env->vstart = 0;
177
+}
178
diff --git a/target/riscv/insn_trans/trans_rvvk.c.inc b/target/riscv/insn_trans/trans_rvvk.c.inc
179
index XXXXXXX..XXXXXXX 100644
180
--- a/target/riscv/insn_trans/trans_rvvk.c.inc
181
+++ b/target/riscv/insn_trans/trans_rvvk.c.inc
182
@@ -XXX,XX +XXX,XX @@ static inline bool vsm3c_check(DisasContext *s, arg_rmrr *a)
183
184
GEN_VV_UNMASKED_TRANS(vsm3me_vv, vsm3me_check, ZVKSH_EGS)
185
GEN_VI_UNMASKED_TRANS(vsm3c_vi, vsm3c_check, ZVKSH_EGS)
186
+
187
+/*
188
+ * Zvkg
189
+ */
190
+
191
+#define ZVKG_EGS 4
192
+
193
+static bool vgmul_check(DisasContext *s, arg_rmr *a)
194
+{
195
+ int egw_bytes = ZVKG_EGS << s->sew;
196
+ return s->cfg_ptr->ext_zvkg == true &&
197
+ vext_check_isa_ill(s) &&
198
+ require_rvv(s) &&
199
+ MAXSZ(s) >= egw_bytes &&
200
+ vext_check_ss(s, a->rd, a->rs2, a->vm) &&
201
+ s->sew == MO_32;
202
+}
203
+
204
+GEN_V_UNMASKED_TRANS(vgmul_vv, vgmul_check, ZVKG_EGS)
205
+
206
+static bool vghsh_check(DisasContext *s, arg_rmrr *a)
207
+{
208
+ int egw_bytes = ZVKG_EGS << s->sew;
209
+ return s->cfg_ptr->ext_zvkg == true &&
210
+ opivv_check(s, a) &&
211
+ MAXSZ(s) >= egw_bytes &&
212
+ s->sew == MO_32;
213
+}
214
+
215
+GEN_VV_UNMASKED_TRANS(vghsh_vv, vghsh_check, ZVKG_EGS)
57
--
216
--
58
2.31.1
217
2.41.0
59
60
diff view generated by jsdifflib
New patch
1
From: Max Chou <max.chou@sifive.com>
1
2
3
Allows sharing of sm4_subword between different targets.
4
5
Signed-off-by: Max Chou <max.chou@sifive.com>
6
Reviewed-by: Frank Chang <frank.chang@sifive.com>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Max Chou <max.chou@sifive.com>
9
Message-ID: <20230711165917.2629866-14-max.chou@sifive.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
include/crypto/sm4.h | 8 ++++++++
13
target/arm/tcg/crypto_helper.c | 10 ++--------
14
2 files changed, 10 insertions(+), 8 deletions(-)
15
16
diff --git a/include/crypto/sm4.h b/include/crypto/sm4.h
17
index XXXXXXX..XXXXXXX 100644
18
--- a/include/crypto/sm4.h
19
+++ b/include/crypto/sm4.h
20
@@ -XXX,XX +XXX,XX @@
21
22
extern const uint8_t sm4_sbox[256];
23
24
+static inline uint32_t sm4_subword(uint32_t word)
25
+{
26
+ return sm4_sbox[word & 0xff] |
27
+ sm4_sbox[(word >> 8) & 0xff] << 8 |
28
+ sm4_sbox[(word >> 16) & 0xff] << 16 |
29
+ sm4_sbox[(word >> 24) & 0xff] << 24;
30
+}
31
+
32
#endif
33
diff --git a/target/arm/tcg/crypto_helper.c b/target/arm/tcg/crypto_helper.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/target/arm/tcg/crypto_helper.c
36
+++ b/target/arm/tcg/crypto_helper.c
37
@@ -XXX,XX +XXX,XX @@ static void do_crypto_sm4e(uint64_t *rd, uint64_t *rn, uint64_t *rm)
38
CR_ST_WORD(d, (i + 3) % 4) ^
39
CR_ST_WORD(n, i);
40
41
- t = sm4_sbox[t & 0xff] |
42
- sm4_sbox[(t >> 8) & 0xff] << 8 |
43
- sm4_sbox[(t >> 16) & 0xff] << 16 |
44
- sm4_sbox[(t >> 24) & 0xff] << 24;
45
+ t = sm4_subword(t);
46
47
CR_ST_WORD(d, i) ^= t ^ rol32(t, 2) ^ rol32(t, 10) ^ rol32(t, 18) ^
48
rol32(t, 24);
49
@@ -XXX,XX +XXX,XX @@ static void do_crypto_sm4ekey(uint64_t *rd, uint64_t *rn, uint64_t *rm)
50
CR_ST_WORD(d, (i + 3) % 4) ^
51
CR_ST_WORD(m, i);
52
53
- t = sm4_sbox[t & 0xff] |
54
- sm4_sbox[(t >> 8) & 0xff] << 8 |
55
- sm4_sbox[(t >> 16) & 0xff] << 16 |
56
- sm4_sbox[(t >> 24) & 0xff] << 24;
57
+ t = sm4_subword(t);
58
59
CR_ST_WORD(d, i) ^= t ^ rol32(t, 13) ^ rol32(t, 23);
60
}
61
--
62
2.41.0
diff view generated by jsdifflib
New patch
1
From: Max Chou <max.chou@sifive.com>
1
2
3
Adds sm4_ck constant for use in sm4 cryptography across different targets.
4
5
Signed-off-by: Max Chou <max.chou@sifive.com>
6
Reviewed-by: Frank Chang <frank.chang@sifive.com>
7
Signed-off-by: Max Chou <max.chou@sifive.com>
8
Message-ID: <20230711165917.2629866-15-max.chou@sifive.com>
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
---
11
include/crypto/sm4.h | 1 +
12
crypto/sm4.c | 10 ++++++++++
13
2 files changed, 11 insertions(+)
14
15
diff --git a/include/crypto/sm4.h b/include/crypto/sm4.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/include/crypto/sm4.h
18
+++ b/include/crypto/sm4.h
19
@@ -XXX,XX +XXX,XX @@
20
#define QEMU_SM4_H
21
22
extern const uint8_t sm4_sbox[256];
23
+extern const uint32_t sm4_ck[32];
24
25
static inline uint32_t sm4_subword(uint32_t word)
26
{
27
diff --git a/crypto/sm4.c b/crypto/sm4.c
28
index XXXXXXX..XXXXXXX 100644
29
--- a/crypto/sm4.c
30
+++ b/crypto/sm4.c
31
@@ -XXX,XX +XXX,XX @@ uint8_t const sm4_sbox[] = {
32
0x79, 0xee, 0x5f, 0x3e, 0xd7, 0xcb, 0x39, 0x48,
33
};
34
35
+uint32_t const sm4_ck[] = {
36
+ 0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269,
37
+ 0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9,
38
+ 0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249,
39
+ 0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9,
40
+ 0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229,
41
+ 0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299,
42
+ 0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209,
43
+ 0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279
44
+};
45
--
46
2.41.0
diff view generated by jsdifflib
1
From: Kito Cheng <kito.cheng@sifive.com>
1
From: Max Chou <max.chou@sifive.com>
2
2
3
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
3
This commit adds support for the Zvksed vector-crypto extension, which
4
Signed-off-by: Frank Chang <frank.chang@sifive.com>
4
consists of the following instructions:
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
* vsm4k.vi
7
Message-id: 20210505160620.15723-11-frank.chang@sifive.com
7
* vsm4r.[vv,vs]
8
9
Translation functions are defined in
10
`target/riscv/insn_trans/trans_rvvk.c.inc` and helpers are defined in
11
`target/riscv/vcrypto_helper.c`.
12
13
Signed-off-by: Max Chou <max.chou@sifive.com>
14
Reviewed-by: Frank Chang <frank.chang@sifive.com>
15
[lawrence.hunter@codethink.co.uk: Moved SM4 functions from
16
crypto_helper.c to vcrypto_helper.c]
17
[nazar.kazakov@codethink.co.uk: Added alignment checks, refactored code to
18
use macros, and minor style changes]
19
Signed-off-by: Max Chou <max.chou@sifive.com>
20
Message-ID: <20230711165917.2629866-16-max.chou@sifive.com>
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
21
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
---
22
---
10
target/riscv/insn32.decode | 8 ++++
23
target/riscv/cpu_cfg.h | 1 +
11
target/riscv/translate.c | 14 +++++++
24
target/riscv/helper.h | 4 +
12
target/riscv/insn_trans/trans_rvb.c.inc | 52 +++++++++++++++++++++++++
25
target/riscv/insn32.decode | 5 +
13
3 files changed, 74 insertions(+)
26
target/riscv/cpu.c | 5 +-
14
27
target/riscv/vcrypto_helper.c | 127 +++++++++++++++++++++++
28
target/riscv/insn_trans/trans_rvvk.c.inc | 43 ++++++++
29
6 files changed, 184 insertions(+), 1 deletion(-)
30
31
diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h
32
index XXXXXXX..XXXXXXX 100644
33
--- a/target/riscv/cpu_cfg.h
34
+++ b/target/riscv/cpu_cfg.h
35
@@ -XXX,XX +XXX,XX @@ struct RISCVCPUConfig {
36
bool ext_zvkned;
37
bool ext_zvknha;
38
bool ext_zvknhb;
39
+ bool ext_zvksed;
40
bool ext_zvksh;
41
bool ext_zmmul;
42
bool ext_zvfbfmin;
43
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
44
index XXXXXXX..XXXXXXX 100644
45
--- a/target/riscv/helper.h
46
+++ b/target/riscv/helper.h
47
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_5(vsm3c_vi, void, ptr, ptr, i32, env, i32)
48
49
DEF_HELPER_5(vghsh_vv, void, ptr, ptr, ptr, env, i32)
50
DEF_HELPER_4(vgmul_vv, void, ptr, ptr, env, i32)
51
+
52
+DEF_HELPER_5(vsm4k_vi, void, ptr, ptr, i32, env, i32)
53
+DEF_HELPER_4(vsm4r_vv, void, ptr, ptr, env, i32)
54
+DEF_HELPER_4(vsm4r_vs, void, ptr, ptr, env, i32)
15
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
55
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
16
index XXXXXXX..XXXXXXX 100644
56
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/insn32.decode
57
--- a/target/riscv/insn32.decode
18
+++ b/target/riscv/insn32.decode
58
+++ b/target/riscv/insn32.decode
19
@@ -XXX,XX +XXX,XX @@ bset 0010100 .......... 001 ..... 0110011 @r
59
@@ -XXX,XX +XXX,XX @@ vsm3c_vi 101011 1 ..... ..... 010 ..... 1110111 @r_vm_1
20
bclr 0100100 .......... 001 ..... 0110011 @r
60
# *** Zvkg vector crypto extension ***
21
binv 0110100 .......... 001 ..... 0110011 @r
61
vghsh_vv 101100 1 ..... ..... 010 ..... 1110111 @r_vm_1
22
bext 0100100 .......... 101 ..... 0110011 @r
62
vgmul_vv 101000 1 ..... 10001 010 ..... 1110111 @r2_vm_1
23
+slo 0010000 .......... 001 ..... 0110011 @r
63
+
24
+sro 0010000 .......... 101 ..... 0110011 @r
64
+# *** Zvksed vector crypto extension ***
25
65
+vsm4k_vi 100001 1 ..... ..... 010 ..... 1110111 @r_vm_1
26
bseti 00101. ........... 001 ..... 0010011 @sh
66
+vsm4r_vv 101000 1 ..... 10000 010 ..... 1110111 @r2_vm_1
27
bclri 01001. ........... 001 ..... 0010011 @sh
67
+vsm4r_vs 101001 1 ..... 10000 010 ..... 1110111 @r2_vm_1
28
binvi 01101. ........... 001 ..... 0010011 @sh
68
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
29
bexti 01001. ........... 101 ..... 0010011 @sh
69
index XXXXXXX..XXXXXXX 100644
30
+sloi 00100. ........... 001 ..... 0010011 @sh
70
--- a/target/riscv/cpu.c
31
+sroi 00100. ........... 101 ..... 0010011 @sh
71
+++ b/target/riscv/cpu.c
32
72
@@ -XXX,XX +XXX,XX @@ static const struct isa_ext_data isa_edata_arr[] = {
33
# *** RV64B Standard Extension (in addition to RV32B) ***
73
ISA_EXT_DATA_ENTRY(zvkned, PRIV_VERSION_1_12_0, ext_zvkned),
34
clzw 0110000 00000 ..... 001 ..... 0011011 @r2
74
ISA_EXT_DATA_ENTRY(zvknha, PRIV_VERSION_1_12_0, ext_zvknha),
35
@@ -XXX,XX +XXX,XX @@ bsetw 0010100 .......... 001 ..... 0111011 @r
75
ISA_EXT_DATA_ENTRY(zvknhb, PRIV_VERSION_1_12_0, ext_zvknhb),
36
bclrw 0100100 .......... 001 ..... 0111011 @r
76
+ ISA_EXT_DATA_ENTRY(zvksed, PRIV_VERSION_1_12_0, ext_zvksed),
37
binvw 0110100 .......... 001 ..... 0111011 @r
77
ISA_EXT_DATA_ENTRY(zvksh, PRIV_VERSION_1_12_0, ext_zvksh),
38
bextw 0100100 .......... 101 ..... 0111011 @r
78
ISA_EXT_DATA_ENTRY(zhinx, PRIV_VERSION_1_12_0, ext_zhinx),
39
+slow 0010000 .......... 001 ..... 0111011 @r
79
ISA_EXT_DATA_ENTRY(zhinxmin, PRIV_VERSION_1_12_0, ext_zhinxmin),
40
+srow 0010000 .......... 101 ..... 0111011 @r
80
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
41
81
* in qemu
42
bsetiw 0010100 .......... 001 ..... 0011011 @sh5
82
*/
43
bclriw 0100100 .......... 001 ..... 0011011 @sh5
83
if ((cpu->cfg.ext_zvbb || cpu->cfg.ext_zvkg || cpu->cfg.ext_zvkned ||
44
binviw 0110100 .......... 001 ..... 0011011 @sh5
84
- cpu->cfg.ext_zvknha || cpu->cfg.ext_zvksh) && !cpu->cfg.ext_zve32f) {
45
+sloiw 0010000 .......... 001 ..... 0011011 @sh5
85
+ cpu->cfg.ext_zvknha || cpu->cfg.ext_zvksed || cpu->cfg.ext_zvksh) &&
46
+sroiw 0010000 .......... 101 ..... 0011011 @sh5
86
+ !cpu->cfg.ext_zve32f) {
47
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
87
error_setg(errp,
48
index XXXXXXX..XXXXXXX 100644
88
"Vector crypto extensions require V or Zve* extensions");
49
--- a/target/riscv/translate.c
89
return;
50
+++ b/target/riscv/translate.c
90
@@ -XXX,XX +XXX,XX @@ static Property riscv_cpu_extensions[] = {
51
@@ -XXX,XX +XXX,XX @@ static void gen_bext(TCGv ret, TCGv arg1, TCGv shamt)
91
DEFINE_PROP_BOOL("x-zvkned", RISCVCPU, cfg.ext_zvkned, false),
52
tcg_gen_andi_tl(ret, ret, 1);
92
DEFINE_PROP_BOOL("x-zvknha", RISCVCPU, cfg.ext_zvknha, false),
93
DEFINE_PROP_BOOL("x-zvknhb", RISCVCPU, cfg.ext_zvknhb, false),
94
+ DEFINE_PROP_BOOL("x-zvksed", RISCVCPU, cfg.ext_zvksed, false),
95
DEFINE_PROP_BOOL("x-zvksh", RISCVCPU, cfg.ext_zvksh, false),
96
97
DEFINE_PROP_END_OF_LIST(),
98
diff --git a/target/riscv/vcrypto_helper.c b/target/riscv/vcrypto_helper.c
99
index XXXXXXX..XXXXXXX 100644
100
--- a/target/riscv/vcrypto_helper.c
101
+++ b/target/riscv/vcrypto_helper.c
102
@@ -XXX,XX +XXX,XX @@
103
#include "cpu.h"
104
#include "crypto/aes.h"
105
#include "crypto/aes-round.h"
106
+#include "crypto/sm4.h"
107
#include "exec/memop.h"
108
#include "exec/exec-all.h"
109
#include "exec/helper-proto.h"
110
@@ -XXX,XX +XXX,XX @@ void HELPER(vgmul_vv)(void *vd_vptr, void *vs2_vptr, CPURISCVState *env,
111
vext_set_elems_1s(vd, vta, env->vl * 4, total_elems * 4);
112
env->vstart = 0;
53
}
113
}
54
114
+
55
+static void gen_slo(TCGv ret, TCGv arg1, TCGv arg2)
115
+void HELPER(vsm4k_vi)(void *vd, void *vs2, uint32_t uimm5, CPURISCVState *env,
56
+{
116
+ uint32_t desc)
57
+ tcg_gen_not_tl(ret, arg1);
117
+{
58
+ tcg_gen_shl_tl(ret, ret, arg2);
118
+ const uint32_t egs = 4;
59
+ tcg_gen_not_tl(ret, ret);
119
+ uint32_t rnd = uimm5 & 0x7;
60
+}
120
+ uint32_t group_start = env->vstart / egs;
61
+
121
+ uint32_t group_end = env->vl / egs;
62
+static void gen_sro(TCGv ret, TCGv arg1, TCGv arg2)
122
+ uint32_t esz = sizeof(uint32_t);
63
+{
123
+ uint32_t total_elems = vext_get_total_elems(env, desc, esz);
64
+ tcg_gen_not_tl(ret, arg1);
124
+
65
+ tcg_gen_shr_tl(ret, ret, arg2);
125
+ for (uint32_t i = group_start; i < group_end; ++i) {
66
+ tcg_gen_not_tl(ret, ret);
126
+ uint32_t vstart = i * egs;
67
+}
127
+ uint32_t vend = (i + 1) * egs;
68
+
128
+ uint32_t rk[4] = {0};
69
static void gen_ctzw(TCGv ret, TCGv arg1)
129
+ uint32_t tmp[8] = {0};
70
{
130
+
71
tcg_gen_ori_tl(ret, arg1, (target_ulong)MAKE_64BIT_MASK(32, 32));
131
+ for (uint32_t j = vstart; j < vend; ++j) {
72
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
132
+ rk[j - vstart] = *((uint32_t *)vs2 + H4(j));
73
index XXXXXXX..XXXXXXX 100644
133
+ }
74
--- a/target/riscv/insn_trans/trans_rvb.c.inc
134
+
75
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
135
+ for (uint32_t j = 0; j < egs; ++j) {
76
@@ -XXX,XX +XXX,XX @@ static bool trans_bexti(DisasContext *ctx, arg_bexti *a)
136
+ tmp[j] = rk[j];
77
return gen_shifti(ctx, a, gen_bext);
137
+ }
138
+
139
+ for (uint32_t j = 0; j < egs; ++j) {
140
+ uint32_t b, s;
141
+ b = tmp[j + 1] ^ tmp[j + 2] ^ tmp[j + 3] ^ sm4_ck[rnd * 4 + j];
142
+
143
+ s = sm4_subword(b);
144
+
145
+ tmp[j + 4] = tmp[j] ^ (s ^ rol32(s, 13) ^ rol32(s, 23));
146
+ }
147
+
148
+ for (uint32_t j = vstart; j < vend; ++j) {
149
+ *((uint32_t *)vd + H4(j)) = tmp[egs + (j - vstart)];
150
+ }
151
+ }
152
+
153
+ env->vstart = 0;
154
+ /* set tail elements to 1s */
155
+ vext_set_elems_1s(vd, vext_vta(desc), env->vl * esz, total_elems * esz);
156
+}
157
+
158
+static void do_sm4_round(uint32_t *rk, uint32_t *buf)
159
+{
160
+ const uint32_t egs = 4;
161
+ uint32_t s, b;
162
+
163
+ for (uint32_t j = egs; j < egs * 2; ++j) {
164
+ b = buf[j - 3] ^ buf[j - 2] ^ buf[j - 1] ^ rk[j - 4];
165
+
166
+ s = sm4_subword(b);
167
+
168
+ buf[j] = buf[j - 4] ^ (s ^ rol32(s, 2) ^ rol32(s, 10) ^ rol32(s, 18) ^
169
+ rol32(s, 24));
170
+ }
171
+}
172
+
173
+void HELPER(vsm4r_vv)(void *vd, void *vs2, CPURISCVState *env, uint32_t desc)
174
+{
175
+ const uint32_t egs = 4;
176
+ uint32_t group_start = env->vstart / egs;
177
+ uint32_t group_end = env->vl / egs;
178
+ uint32_t esz = sizeof(uint32_t);
179
+ uint32_t total_elems = vext_get_total_elems(env, desc, esz);
180
+
181
+ for (uint32_t i = group_start; i < group_end; ++i) {
182
+ uint32_t vstart = i * egs;
183
+ uint32_t vend = (i + 1) * egs;
184
+ uint32_t rk[4] = {0};
185
+ uint32_t tmp[8] = {0};
186
+
187
+ for (uint32_t j = vstart; j < vend; ++j) {
188
+ rk[j - vstart] = *((uint32_t *)vs2 + H4(j));
189
+ }
190
+
191
+ for (uint32_t j = vstart; j < vend; ++j) {
192
+ tmp[j - vstart] = *((uint32_t *)vd + H4(j));
193
+ }
194
+
195
+ do_sm4_round(rk, tmp);
196
+
197
+ for (uint32_t j = vstart; j < vend; ++j) {
198
+ *((uint32_t *)vd + H4(j)) = tmp[egs + (j - vstart)];
199
+ }
200
+ }
201
+
202
+ env->vstart = 0;
203
+ /* set tail elements to 1s */
204
+ vext_set_elems_1s(vd, vext_vta(desc), env->vl * esz, total_elems * esz);
205
+}
206
+
207
+void HELPER(vsm4r_vs)(void *vd, void *vs2, CPURISCVState *env, uint32_t desc)
208
+{
209
+ const uint32_t egs = 4;
210
+ uint32_t group_start = env->vstart / egs;
211
+ uint32_t group_end = env->vl / egs;
212
+ uint32_t esz = sizeof(uint32_t);
213
+ uint32_t total_elems = vext_get_total_elems(env, desc, esz);
214
+
215
+ for (uint32_t i = group_start; i < group_end; ++i) {
216
+ uint32_t vstart = i * egs;
217
+ uint32_t vend = (i + 1) * egs;
218
+ uint32_t rk[4] = {0};
219
+ uint32_t tmp[8] = {0};
220
+
221
+ for (uint32_t j = 0; j < egs; ++j) {
222
+ rk[j] = *((uint32_t *)vs2 + H4(j));
223
+ }
224
+
225
+ for (uint32_t j = vstart; j < vend; ++j) {
226
+ tmp[j - vstart] = *((uint32_t *)vd + H4(j));
227
+ }
228
+
229
+ do_sm4_round(rk, tmp);
230
+
231
+ for (uint32_t j = vstart; j < vend; ++j) {
232
+ *((uint32_t *)vd + H4(j)) = tmp[egs + (j - vstart)];
233
+ }
234
+ }
235
+
236
+ env->vstart = 0;
237
+ /* set tail elements to 1s */
238
+ vext_set_elems_1s(vd, vext_vta(desc), env->vl * esz, total_elems * esz);
239
+}
240
diff --git a/target/riscv/insn_trans/trans_rvvk.c.inc b/target/riscv/insn_trans/trans_rvvk.c.inc
241
index XXXXXXX..XXXXXXX 100644
242
--- a/target/riscv/insn_trans/trans_rvvk.c.inc
243
+++ b/target/riscv/insn_trans/trans_rvvk.c.inc
244
@@ -XXX,XX +XXX,XX @@ static bool vghsh_check(DisasContext *s, arg_rmrr *a)
78
}
245
}
79
246
80
+static bool trans_slo(DisasContext *ctx, arg_slo *a)
247
GEN_VV_UNMASKED_TRANS(vghsh_vv, vghsh_check, ZVKG_EGS)
81
+{
248
+
82
+ REQUIRE_EXT(ctx, RVB);
249
+/*
83
+ return gen_shift(ctx, a, gen_slo);
250
+ * Zvksed
84
+}
251
+ */
85
+
252
+
86
+static bool trans_sloi(DisasContext *ctx, arg_sloi *a)
253
+#define ZVKSED_EGS 4
87
+{
254
+
88
+ REQUIRE_EXT(ctx, RVB);
255
+static bool zvksed_check(DisasContext *s)
89
+ return gen_shifti(ctx, a, gen_slo);
256
+{
90
+}
257
+ int egw_bytes = ZVKSED_EGS << s->sew;
91
+
258
+ return s->cfg_ptr->ext_zvksed == true &&
92
+static bool trans_sro(DisasContext *ctx, arg_sro *a)
259
+ require_rvv(s) &&
93
+{
260
+ vext_check_isa_ill(s) &&
94
+ REQUIRE_EXT(ctx, RVB);
261
+ MAXSZ(s) >= egw_bytes &&
95
+ return gen_shift(ctx, a, gen_sro);
262
+ s->sew == MO_32;
96
+}
263
+}
97
+
264
+
98
+static bool trans_sroi(DisasContext *ctx, arg_sroi *a)
265
+static bool vsm4k_vi_check(DisasContext *s, arg_rmrr *a)
99
+{
266
+{
100
+ REQUIRE_EXT(ctx, RVB);
267
+ return zvksed_check(s) &&
101
+ return gen_shifti(ctx, a, gen_sro);
268
+ require_align(a->rd, s->lmul) &&
102
+}
269
+ require_align(a->rs2, s->lmul);
103
+
270
+}
104
static bool trans_clzw(DisasContext *ctx, arg_clzw *a)
271
+
105
{
272
+GEN_VI_UNMASKED_TRANS(vsm4k_vi, vsm4k_vi_check, ZVKSED_EGS)
106
REQUIRE_64BIT(ctx);
273
+
107
@@ -XXX,XX +XXX,XX @@ static bool trans_bextw(DisasContext *ctx, arg_bextw *a)
274
+static bool vsm4r_vv_check(DisasContext *s, arg_rmr *a)
108
REQUIRE_EXT(ctx, RVB);
275
+{
109
return gen_shiftw(ctx, a, gen_bext);
276
+ return zvksed_check(s) &&
110
}
277
+ require_align(a->rd, s->lmul) &&
111
+
278
+ require_align(a->rs2, s->lmul);
112
+static bool trans_slow(DisasContext *ctx, arg_slow *a)
279
+}
113
+{
280
+
114
+ REQUIRE_64BIT(ctx);
281
+GEN_V_UNMASKED_TRANS(vsm4r_vv, vsm4r_vv_check, ZVKSED_EGS)
115
+ REQUIRE_EXT(ctx, RVB);
282
+
116
+ return gen_shiftw(ctx, a, gen_slo);
283
+static bool vsm4r_vs_check(DisasContext *s, arg_rmr *a)
117
+}
284
+{
118
+
285
+ return zvksed_check(s) &&
119
+static bool trans_sloiw(DisasContext *ctx, arg_sloiw *a)
286
+ !is_overlapped(a->rd, 1 << MAX(s->lmul, 0), a->rs2, 1) &&
120
+{
287
+ require_align(a->rd, s->lmul);
121
+ REQUIRE_64BIT(ctx);
288
+}
122
+ REQUIRE_EXT(ctx, RVB);
289
+
123
+ return gen_shiftiw(ctx, a, gen_slo);
290
+GEN_V_UNMASKED_TRANS(vsm4r_vs, vsm4r_vs_check, ZVKSED_EGS)
124
+}
125
+
126
+static bool trans_srow(DisasContext *ctx, arg_srow *a)
127
+{
128
+ REQUIRE_64BIT(ctx);
129
+ REQUIRE_EXT(ctx, RVB);
130
+ return gen_shiftw(ctx, a, gen_sro);
131
+}
132
+
133
+static bool trans_sroiw(DisasContext *ctx, arg_sroiw *a)
134
+{
135
+ REQUIRE_64BIT(ctx);
136
+ REQUIRE_EXT(ctx, RVB);
137
+ return gen_shiftiw(ctx, a, gen_sro);
138
+}
139
--
291
--
140
2.31.1
292
2.41.0
141
142
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Rob Bradford <rbradford@rivosinc.com>
2
2
3
Physical Memory Protection is a system feature.
3
These are WARL fields - zero out the bits for unavailable counters and
4
Avoid polluting the user-mode emulation by its definitions.
4
special case the TM bit in mcountinhibit which is hardwired to zero.
5
This patch achieves this by modifying the value written so that any use
6
of the field will see the correctly masked bits.
5
7
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Tested by modifying OpenSBI to write max value to these CSRs and upon
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
subsequent read the appropriate number of bits for number of PMUs is
8
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
10
enabled and the TM bit is zero in mcountinhibit.
9
Message-id: 20210516205333.696094-1-f4bug@amsat.org
11
12
Signed-off-by: Rob Bradford <rbradford@rivosinc.com>
13
Acked-by: Alistair Francis <alistair.francis@wdc.com>
14
Reviewed-by: Atish Patra <atishp@rivosinc.com>
15
Message-ID: <20230802124906.24197-1-rbradford@rivosinc.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
16
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
17
---
12
target/riscv/cpu.h | 2 ++
18
target/riscv/csr.c | 11 +++++++++--
13
1 file changed, 2 insertions(+)
19
1 file changed, 9 insertions(+), 2 deletions(-)
14
20
15
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
21
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
16
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/cpu.h
23
--- a/target/riscv/csr.c
18
+++ b/target/riscv/cpu.h
24
+++ b/target/riscv/csr.c
19
@@ -XXX,XX +XXX,XX @@ enum {
25
@@ -XXX,XX +XXX,XX @@ static RISCVException write_mcountinhibit(CPURISCVState *env, int csrno,
20
26
{
21
typedef struct CPURISCVState CPURISCVState;
27
int cidx;
22
28
PMUCTRState *counter;
23
+#if !defined(CONFIG_USER_ONLY)
29
+ RISCVCPU *cpu = env_archcpu(env);
24
#include "pmp.h"
30
25
+#endif
31
- env->mcountinhibit = val;
26
32
+ /* WARL register - disable unavailable counters; TM bit is always 0 */
27
#define RV_VLEN_MAX 256
33
+ env->mcountinhibit =
34
+ val & (cpu->pmu_avail_ctrs | COUNTEREN_CY | COUNTEREN_IR);
35
36
/* Check if any other counter is also monitoring cycles/instructions */
37
for (cidx = 0; cidx < RV_MAX_MHPMCOUNTERS; cidx++) {
38
@@ -XXX,XX +XXX,XX @@ static RISCVException read_mcounteren(CPURISCVState *env, int csrno,
39
static RISCVException write_mcounteren(CPURISCVState *env, int csrno,
40
target_ulong val)
41
{
42
- env->mcounteren = val;
43
+ RISCVCPU *cpu = env_archcpu(env);
44
+
45
+ /* WARL register - disable unavailable counters */
46
+ env->mcounteren = val & (cpu->pmu_avail_ctrs | COUNTEREN_CY | COUNTEREN_TM |
47
+ COUNTEREN_IR);
48
return RISCV_EXCP_NONE;
49
}
28
50
29
--
51
--
30
2.31.1
52
2.41.0
31
32
diff view generated by jsdifflib
New patch
1
From: Jason Chien <jason.chien@sifive.com>
1
2
3
RVA23 Profiles states:
4
The RVA23 profiles are intended to be used for 64-bit application
5
processors that will run rich OS stacks from standard binary OS
6
distributions and with a substantial number of third-party binary user
7
applications that will be supported over a considerable length of time
8
in the field.
9
10
The chapter 4 of the unprivileged spec introduces the Zihintntl extension
11
and Zihintntl is a mandatory extension presented in RVA23 Profiles, whose
12
purpose is to enable application and operating system portability across
13
different implementations. Thus the DTS should contain the Zihintntl ISA
14
string in order to pass to software.
15
16
The unprivileged spec states:
17
Like any HINTs, these instructions may be freely ignored. Hence, although
18
they are described in terms of cache-based memory hierarchies, they do not
19
mandate the provision of caches.
20
21
These instructions are encoded with non-used opcode, e.g. ADD x0, x0, x2,
22
which QEMU already supports, and QEMU does not emulate cache. Therefore
23
these instructions can be considered as a no-op, and we only need to add
24
a new property for the Zihintntl extension.
25
26
Reviewed-by: Frank Chang <frank.chang@sifive.com>
27
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
28
Signed-off-by: Jason Chien <jason.chien@sifive.com>
29
Message-ID: <20230726074049.19505-2-jason.chien@sifive.com>
30
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
31
---
32
target/riscv/cpu_cfg.h | 1 +
33
target/riscv/cpu.c | 2 ++
34
2 files changed, 3 insertions(+)
35
36
diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h
37
index XXXXXXX..XXXXXXX 100644
38
--- a/target/riscv/cpu_cfg.h
39
+++ b/target/riscv/cpu_cfg.h
40
@@ -XXX,XX +XXX,XX @@ struct RISCVCPUConfig {
41
bool ext_icbom;
42
bool ext_icboz;
43
bool ext_zicond;
44
+ bool ext_zihintntl;
45
bool ext_zihintpause;
46
bool ext_smstateen;
47
bool ext_sstc;
48
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
49
index XXXXXXX..XXXXXXX 100644
50
--- a/target/riscv/cpu.c
51
+++ b/target/riscv/cpu.c
52
@@ -XXX,XX +XXX,XX @@ static const struct isa_ext_data isa_edata_arr[] = {
53
ISA_EXT_DATA_ENTRY(zicond, PRIV_VERSION_1_12_0, ext_zicond),
54
ISA_EXT_DATA_ENTRY(zicsr, PRIV_VERSION_1_10_0, ext_icsr),
55
ISA_EXT_DATA_ENTRY(zifencei, PRIV_VERSION_1_10_0, ext_ifencei),
56
+ ISA_EXT_DATA_ENTRY(zihintntl, PRIV_VERSION_1_10_0, ext_zihintntl),
57
ISA_EXT_DATA_ENTRY(zihintpause, PRIV_VERSION_1_10_0, ext_zihintpause),
58
ISA_EXT_DATA_ENTRY(zmmul, PRIV_VERSION_1_12_0, ext_zmmul),
59
ISA_EXT_DATA_ENTRY(zawrs, PRIV_VERSION_1_12_0, ext_zawrs),
60
@@ -XXX,XX +XXX,XX @@ static Property riscv_cpu_extensions[] = {
61
DEFINE_PROP_BOOL("sscofpmf", RISCVCPU, cfg.ext_sscofpmf, false),
62
DEFINE_PROP_BOOL("Zifencei", RISCVCPU, cfg.ext_ifencei, true),
63
DEFINE_PROP_BOOL("Zicsr", RISCVCPU, cfg.ext_icsr, true),
64
+ DEFINE_PROP_BOOL("Zihintntl", RISCVCPU, cfg.ext_zihintntl, true),
65
DEFINE_PROP_BOOL("Zihintpause", RISCVCPU, cfg.ext_zihintpause, true),
66
DEFINE_PROP_BOOL("Zawrs", RISCVCPU, cfg.ext_zawrs, true),
67
DEFINE_PROP_BOOL("Zfa", RISCVCPU, cfg.ext_zfa, true),
68
--
69
2.41.0
diff view generated by jsdifflib
New patch
1
From: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
1
2
3
Commit a47842d ("riscv: Add support for the Zfa extension") implemented the zfa extension.
4
However, it has some typos for fleq.d and fltq.d. Both of them misused the fltq.s
5
helper function.
6
7
Fixes: a47842d ("riscv: Add support for the Zfa extension")
8
Signed-off-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
9
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
10
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
11
Message-ID: <20230728003906.768-1-zhiwei_liu@linux.alibaba.com>
12
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
13
---
14
target/riscv/insn_trans/trans_rvzfa.c.inc | 4 ++--
15
1 file changed, 2 insertions(+), 2 deletions(-)
16
17
diff --git a/target/riscv/insn_trans/trans_rvzfa.c.inc b/target/riscv/insn_trans/trans_rvzfa.c.inc
18
index XXXXXXX..XXXXXXX 100644
19
--- a/target/riscv/insn_trans/trans_rvzfa.c.inc
20
+++ b/target/riscv/insn_trans/trans_rvzfa.c.inc
21
@@ -XXX,XX +XXX,XX @@ bool trans_fleq_d(DisasContext *ctx, arg_fleq_d *a)
22
TCGv_i64 src1 = get_fpr_hs(ctx, a->rs1);
23
TCGv_i64 src2 = get_fpr_hs(ctx, a->rs2);
24
25
- gen_helper_fltq_s(dest, cpu_env, src1, src2);
26
+ gen_helper_fleq_d(dest, cpu_env, src1, src2);
27
gen_set_gpr(ctx, a->rd, dest);
28
return true;
29
}
30
@@ -XXX,XX +XXX,XX @@ bool trans_fltq_d(DisasContext *ctx, arg_fltq_d *a)
31
TCGv_i64 src1 = get_fpr_hs(ctx, a->rs1);
32
TCGv_i64 src2 = get_fpr_hs(ctx, a->rs2);
33
34
- gen_helper_fltq_s(dest, cpu_env, src1, src2);
35
+ gen_helper_fltq_d(dest, cpu_env, src1, src2);
36
gen_set_gpr(ctx, a->rd, dest);
37
return true;
38
}
39
--
40
2.41.0
diff view generated by jsdifflib
New patch
1
From: Jason Chien <jason.chien@sifive.com>
1
2
3
When writing the upper mtime, we should keep the original lower mtime
4
whose value is given by cpu_riscv_read_rtc() instead of
5
cpu_riscv_read_rtc_raw(). The same logic applies to writes to lower mtime.
6
7
Signed-off-by: Jason Chien <jason.chien@sifive.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-ID: <20230728082502.26439-1-jason.chien@sifive.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
hw/intc/riscv_aclint.c | 5 +++--
13
1 file changed, 3 insertions(+), 2 deletions(-)
14
15
diff --git a/hw/intc/riscv_aclint.c b/hw/intc/riscv_aclint.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/intc/riscv_aclint.c
18
+++ b/hw/intc/riscv_aclint.c
19
@@ -XXX,XX +XXX,XX @@ static void riscv_aclint_mtimer_write(void *opaque, hwaddr addr,
20
return;
21
} else if (addr == mtimer->time_base || addr == mtimer->time_base + 4) {
22
uint64_t rtc_r = cpu_riscv_read_rtc_raw(mtimer->timebase_freq);
23
+ uint64_t rtc = cpu_riscv_read_rtc(mtimer);
24
25
if (addr == mtimer->time_base) {
26
if (size == 4) {
27
/* time_lo for RV32/RV64 */
28
- mtimer->time_delta = ((rtc_r & ~0xFFFFFFFFULL) | value) - rtc_r;
29
+ mtimer->time_delta = ((rtc & ~0xFFFFFFFFULL) | value) - rtc_r;
30
} else {
31
/* time for RV64 */
32
mtimer->time_delta = value - rtc_r;
33
@@ -XXX,XX +XXX,XX @@ static void riscv_aclint_mtimer_write(void *opaque, hwaddr addr,
34
} else {
35
if (size == 4) {
36
/* time_hi for RV32/RV64 */
37
- mtimer->time_delta = (value << 32 | (rtc_r & 0xFFFFFFFF)) - rtc_r;
38
+ mtimer->time_delta = (value << 32 | (rtc & 0xFFFFFFFF)) - rtc_r;
39
} else {
40
qemu_log_mask(LOG_GUEST_ERROR,
41
"aclint-mtimer: invalid time_hi write: %08x",
42
--
43
2.41.0
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: Jason Chien <jason.chien@sifive.com>
2
2
3
Since commit 78da6a1bca22 ("device_tree: add qemu_fdt_setprop_string_array helper"),
3
The variables whose values are given by cpu_riscv_read_rtc() should be named
4
we can use the new helper to set the clock name for the ethernet
4
"rtc". The variables whose value are given by cpu_riscv_read_rtc_raw()
5
controller node.
5
should be named "rtc_r".
6
6
7
Signed-off-by: Bin Meng <bin.meng@windriver.com>
7
Signed-off-by: Jason Chien <jason.chien@sifive.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 20210430071302.1489082-1-bmeng.cn@gmail.com
9
Message-ID: <20230728082502.26439-2-jason.chien@sifive.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
11
---
12
hw/riscv/sifive_u.c | 6 +++---
12
hw/intc/riscv_aclint.c | 6 +++---
13
1 file changed, 3 insertions(+), 3 deletions(-)
13
1 file changed, 3 insertions(+), 3 deletions(-)
14
14
15
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
15
diff --git a/hw/intc/riscv_aclint.c b/hw/intc/riscv_aclint.c
16
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/riscv/sifive_u.c
17
--- a/hw/intc/riscv_aclint.c
18
+++ b/hw/riscv/sifive_u.c
18
+++ b/hw/intc/riscv_aclint.c
19
@@ -XXX,XX +XXX,XX @@ static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
19
@@ -XXX,XX +XXX,XX @@ static void riscv_aclint_mtimer_write_timecmp(RISCVAclintMTimerState *mtimer,
20
int cpu;
20
uint64_t next;
21
uint32_t *cells;
21
uint64_t diff;
22
char *nodename;
22
23
- char ethclk_names[] = "pclk\0hclk";
23
- uint64_t rtc_r = cpu_riscv_read_rtc(mtimer);
24
uint32_t plic_phandle, prci_phandle, gpio_phandle, phandle = 1;
24
+ uint64_t rtc = cpu_riscv_read_rtc(mtimer);
25
uint32_t hfclk_phandle, rtcclk_phandle, phy_phandle;
25
26
+ static const char * const ethclk_names[2] = { "pclk", "hclk" };
26
/* Compute the relative hartid w.r.t the socket */
27
27
hartid = hartid - mtimer->hartid_base;
28
if (ms->dtb) {
28
29
fdt = s->fdt = load_device_tree(ms->dtb, &s->fdt_size);
29
mtimer->timecmp[hartid] = value;
30
@@ -XXX,XX +XXX,XX @@ static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
30
- if (mtimer->timecmp[hartid] <= rtc_r) {
31
qemu_fdt_setprop_cell(fdt, nodename, "interrupts", SIFIVE_U_GEM_IRQ);
31
+ if (mtimer->timecmp[hartid] <= rtc) {
32
qemu_fdt_setprop_cells(fdt, nodename, "clocks",
32
/*
33
prci_phandle, PRCI_CLK_GEMGXLPLL, prci_phandle, PRCI_CLK_GEMGXLPLL);
33
* If we're setting an MTIMECMP value in the "past",
34
- qemu_fdt_setprop(fdt, nodename, "clock-names", ethclk_names,
34
* immediately raise the timer interrupt
35
- sizeof(ethclk_names));
35
@@ -XXX,XX +XXX,XX @@ static void riscv_aclint_mtimer_write_timecmp(RISCVAclintMTimerState *mtimer,
36
+ qemu_fdt_setprop_string_array(fdt, nodename, "clock-names",
36
37
+ (char **)&ethclk_names, ARRAY_SIZE(ethclk_names));
37
/* otherwise, set up the future timer interrupt */
38
qemu_fdt_setprop(fdt, nodename, "local-mac-address",
38
qemu_irq_lower(mtimer->timer_irqs[hartid]);
39
s->soc.gem.conf.macaddr.a, ETH_ALEN);
39
- diff = mtimer->timecmp[hartid] - rtc_r;
40
qemu_fdt_setprop_cell(fdt, nodename, "#address-cells", 1);
40
+ diff = mtimer->timecmp[hartid] - rtc;
41
/* back to ns (note args switched in muldiv64) */
42
uint64_t ns_diff = muldiv64(diff, NANOSECONDS_PER_SECOND, timebase_freq);
43
41
--
44
--
42
2.31.1
45
2.41.0
43
44
diff view generated by jsdifflib
1
QEMU 5.1 changed the behaviour of the default boot for the RISC-V virt
1
From: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
2
and sifive_u machines. This patch moves that change from the
3
deprecated.rst file to the removed-features.rst file and the
4
target-riscv.rst.
5
2
3
We should not use types dependend on host arch for target_ucontext.
4
This bug is found when run rv32 applications.
5
6
Signed-off-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10
Message-ID: <20230811055438.1945-1-zhiwei_liu@linux.alibaba.com>
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
8
Message-id: 4f1c261e7f69045ab8bb8926d85fe1d35e48ea5b.1620081256.git.alistair.francis@wdc.com
9
---
12
---
10
docs/system/deprecated.rst | 19 -------------------
13
linux-user/riscv/signal.c | 4 ++--
11
docs/system/removed-features.rst | 5 +++++
14
1 file changed, 2 insertions(+), 2 deletions(-)
12
docs/system/target-riscv.rst | 13 ++++++++++++-
13
3 files changed, 17 insertions(+), 20 deletions(-)
14
15
15
diff --git a/docs/system/deprecated.rst b/docs/system/deprecated.rst
16
diff --git a/linux-user/riscv/signal.c b/linux-user/riscv/signal.c
16
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
17
--- a/docs/system/deprecated.rst
18
--- a/linux-user/riscv/signal.c
18
+++ b/docs/system/deprecated.rst
19
+++ b/linux-user/riscv/signal.c
19
@@ -XXX,XX +XXX,XX @@ pcspk-audiodev=<name>``.
20
@@ -XXX,XX +XXX,XX @@ struct target_sigcontext {
20
``tty`` and ``parport`` are aliases that will be removed. Instead, the
21
}; /* cf. riscv-linux:arch/riscv/include/uapi/asm/ptrace.h */
21
actual backend names ``serial`` and ``parallel`` should be used.
22
22
23
struct target_ucontext {
23
-RISC-V ``-bios`` (since 5.1)
24
- unsigned long uc_flags;
24
-''''''''''''''''''''''''''''
25
- struct target_ucontext *uc_link;
25
-
26
+ abi_ulong uc_flags;
26
-QEMU 4.1 introduced support for the -bios option in QEMU for RISC-V for the
27
+ abi_ptr uc_link;
27
-RISC-V virt machine and sifive_u machine. QEMU 4.1 had no changes to the
28
target_stack_t uc_stack;
28
-default behaviour to avoid breakages.
29
target_sigset_t uc_sigmask;
29
-
30
uint8_t __unused[1024 / 8 - sizeof(target_sigset_t)];
30
-QEMU 5.1 changes the default behaviour from ``-bios none`` to ``-bios default``.
31
-
32
-QEMU 5.1 has three options:
33
- 1. ``-bios default`` - This is the current default behavior if no -bios option
34
- is included. This option will load the default OpenSBI firmware automatically.
35
- The firmware is included with the QEMU release and no user interaction is
36
- required. All a user needs to do is specify the kernel they want to boot
37
- with the -kernel option
38
- 2. ``-bios none`` - QEMU will not automatically load any firmware. It is up
39
- to the user to load all the images they need.
40
- 3. ``-bios <file>`` - Tells QEMU to load the specified file as the firmwrae.
41
-
42
Short-form boolean options (since 6.0)
43
''''''''''''''''''''''''''''''''''''''
44
45
diff --git a/docs/system/removed-features.rst b/docs/system/removed-features.rst
46
index XXXXXXX..XXXXXXX 100644
47
--- a/docs/system/removed-features.rst
48
+++ b/docs/system/removed-features.rst
49
@@ -XXX,XX +XXX,XX @@ devices. Drives the board doesn't pick up can no longer be used with
50
This option was undocumented and not used in the field.
51
Use `-device usb-ccid`` instead.
52
53
+RISC-V firmware not booted by default (removed in 5.1)
54
+''''''''''''''''''''''''''''''''''''''''''''''''''''''
55
+
56
+QEMU 5.1 changes the default behaviour from ``-bios none`` to ``-bios default``
57
+for the RISC-V ``virt`` machine and ``sifive_u`` machine.
58
59
QEMU Machine Protocol (QMP) commands
60
------------------------------------
61
diff --git a/docs/system/target-riscv.rst b/docs/system/target-riscv.rst
62
index XXXXXXX..XXXXXXX 100644
63
--- a/docs/system/target-riscv.rst
64
+++ b/docs/system/target-riscv.rst
65
@@ -XXX,XX +XXX,XX @@ undocumented; you can get a complete list by running
66
riscv/shakti-c
67
riscv/sifive_u
68
69
-RISC-V CPU features
70
+RISC-V CPU firmware
71
-------------------
72
+
73
+When using the ``sifive_u`` or ``virt`` machine there are three different
74
+firmware boot options:
75
+1. ``-bios default`` - This is the default behaviour if no -bios option
76
+is included. This option will load the default OpenSBI firmware automatically.
77
+The firmware is included with the QEMU release and no user interaction is
78
+required. All a user needs to do is specify the kernel they want to boot
79
+with the -kernel option
80
+2. ``-bios none`` - QEMU will not automatically load any firmware. It is up
81
+to the user to load all the images they need.
82
+3. ``-bios <file>`` - Tells QEMU to load the specified file as the firmware.
83
--
31
--
84
2.31.1
32
2.41.0
85
33
86
34
diff view generated by jsdifflib
1
From: Kito Cheng <kito.cheng@sifive.com>
1
From: Yong-Xuan Wang <yongxuan.wang@sifive.com>
2
2
3
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
3
In this patch, we create the APLIC and IMSIC FDT helper functions and
4
Signed-off-by: Frank Chang <frank.chang@sifive.com>
4
remove M mode AIA devices when using KVM acceleration.
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
6
Message-id: 20210505160620.15723-15-frank.chang@sifive.com
6
Signed-off-by: Yong-Xuan Wang <yongxuan.wang@sifive.com>
7
Reviewed-by: Jim Shu <jim.shu@sifive.com>
8
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
9
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
10
Message-ID: <20230727102439.22554-2-yongxuan.wang@sifive.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
12
---
9
target/riscv/insn32.decode | 6 +++++
13
hw/riscv/virt.c | 290 +++++++++++++++++++++++-------------------------
10
target/riscv/translate.c | 32 +++++++++++++++++++++++++
14
1 file changed, 137 insertions(+), 153 deletions(-)
11
target/riscv/insn_trans/trans_rvb.c.inc | 24 +++++++++++++++++++
12
3 files changed, 62 insertions(+)
13
15
14
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
16
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
15
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
16
--- a/target/riscv/insn32.decode
18
--- a/hw/riscv/virt.c
17
+++ b/target/riscv/insn32.decode
19
+++ b/hw/riscv/virt.c
18
@@ -XXX,XX +XXX,XX @@ ror 0110000 .......... 101 ..... 0110011 @r
20
@@ -XXX,XX +XXX,XX @@ static uint32_t imsic_num_bits(uint32_t count)
19
rol 0110000 .......... 001 ..... 0110011 @r
21
return ret;
20
grev 0110100 .......... 101 ..... 0110011 @r
21
gorc 0010100 .......... 101 ..... 0110011 @r
22
+sh1add 0010000 .......... 010 ..... 0110011 @r
23
+sh2add 0010000 .......... 100 ..... 0110011 @r
24
+sh3add 0010000 .......... 110 ..... 0110011 @r
25
26
bseti 00101. ........... 001 ..... 0010011 @sh
27
bclri 01001. ........... 001 ..... 0010011 @sh
28
@@ -XXX,XX +XXX,XX @@ rorw 0110000 .......... 101 ..... 0111011 @r
29
rolw 0110000 .......... 001 ..... 0111011 @r
30
grevw 0110100 .......... 101 ..... 0111011 @r
31
gorcw 0010100 .......... 101 ..... 0111011 @r
32
+sh1add_uw 0010000 .......... 010 ..... 0111011 @r
33
+sh2add_uw 0010000 .......... 100 ..... 0111011 @r
34
+sh3add_uw 0010000 .......... 110 ..... 0111011 @r
35
36
bsetiw 0010100 .......... 001 ..... 0011011 @sh5
37
bclriw 0100100 .......... 001 ..... 0011011 @sh5
38
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/target/riscv/translate.c
41
+++ b/target/riscv/translate.c
42
@@ -XXX,XX +XXX,XX @@ static bool gen_grevi(DisasContext *ctx, arg_grevi *a)
43
return true;
44
}
22
}
45
23
46
+#define GEN_SHADD(SHAMT) \
24
-static void create_fdt_imsic(RISCVVirtState *s, const MemMapEntry *memmap,
47
+static void gen_sh##SHAMT##add(TCGv ret, TCGv arg1, TCGv arg2) \
25
- uint32_t *phandle, uint32_t *intc_phandles,
48
+{ \
26
- uint32_t *msi_m_phandle, uint32_t *msi_s_phandle)
49
+ TCGv t = tcg_temp_new(); \
27
+static void create_fdt_one_imsic(RISCVVirtState *s, hwaddr base_addr,
50
+ \
28
+ uint32_t *intc_phandles, uint32_t msi_phandle,
51
+ tcg_gen_shli_tl(t, arg1, SHAMT); \
29
+ bool m_mode, uint32_t imsic_guest_bits)
52
+ tcg_gen_add_tl(ret, t, arg2); \
30
{
53
+ \
31
int cpu, socket;
54
+ tcg_temp_free(t); \
32
char *imsic_name;
33
MachineState *ms = MACHINE(s);
34
int socket_count = riscv_socket_count(ms);
35
- uint32_t imsic_max_hart_per_socket, imsic_guest_bits;
36
+ uint32_t imsic_max_hart_per_socket;
37
uint32_t *imsic_cells, *imsic_regs, imsic_addr, imsic_size;
38
39
- *msi_m_phandle = (*phandle)++;
40
- *msi_s_phandle = (*phandle)++;
41
imsic_cells = g_new0(uint32_t, ms->smp.cpus * 2);
42
imsic_regs = g_new0(uint32_t, socket_count * 4);
43
44
- /* M-level IMSIC node */
45
for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
46
imsic_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]);
47
- imsic_cells[cpu * 2 + 1] = cpu_to_be32(IRQ_M_EXT);
48
+ imsic_cells[cpu * 2 + 1] = cpu_to_be32(m_mode ? IRQ_M_EXT : IRQ_S_EXT);
49
}
50
- imsic_max_hart_per_socket = 0;
51
- for (socket = 0; socket < socket_count; socket++) {
52
- imsic_addr = memmap[VIRT_IMSIC_M].base +
53
- socket * VIRT_IMSIC_GROUP_MAX_SIZE;
54
- imsic_size = IMSIC_HART_SIZE(0) * s->soc[socket].num_harts;
55
- imsic_regs[socket * 4 + 0] = 0;
56
- imsic_regs[socket * 4 + 1] = cpu_to_be32(imsic_addr);
57
- imsic_regs[socket * 4 + 2] = 0;
58
- imsic_regs[socket * 4 + 3] = cpu_to_be32(imsic_size);
59
- if (imsic_max_hart_per_socket < s->soc[socket].num_harts) {
60
- imsic_max_hart_per_socket = s->soc[socket].num_harts;
61
- }
62
- }
63
- imsic_name = g_strdup_printf("/soc/imsics@%lx",
64
- (unsigned long)memmap[VIRT_IMSIC_M].base);
65
- qemu_fdt_add_subnode(ms->fdt, imsic_name);
66
- qemu_fdt_setprop_string(ms->fdt, imsic_name, "compatible",
67
- "riscv,imsics");
68
- qemu_fdt_setprop_cell(ms->fdt, imsic_name, "#interrupt-cells",
69
- FDT_IMSIC_INT_CELLS);
70
- qemu_fdt_setprop(ms->fdt, imsic_name, "interrupt-controller",
71
- NULL, 0);
72
- qemu_fdt_setprop(ms->fdt, imsic_name, "msi-controller",
73
- NULL, 0);
74
- qemu_fdt_setprop(ms->fdt, imsic_name, "interrupts-extended",
75
- imsic_cells, ms->smp.cpus * sizeof(uint32_t) * 2);
76
- qemu_fdt_setprop(ms->fdt, imsic_name, "reg", imsic_regs,
77
- socket_count * sizeof(uint32_t) * 4);
78
- qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,num-ids",
79
- VIRT_IRQCHIP_NUM_MSIS);
80
- if (socket_count > 1) {
81
- qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,hart-index-bits",
82
- imsic_num_bits(imsic_max_hart_per_socket));
83
- qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,group-index-bits",
84
- imsic_num_bits(socket_count));
85
- qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,group-index-shift",
86
- IMSIC_MMIO_GROUP_MIN_SHIFT);
87
- }
88
- qemu_fdt_setprop_cell(ms->fdt, imsic_name, "phandle", *msi_m_phandle);
89
-
90
- g_free(imsic_name);
91
92
- /* S-level IMSIC node */
93
- for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
94
- imsic_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]);
95
- imsic_cells[cpu * 2 + 1] = cpu_to_be32(IRQ_S_EXT);
96
- }
97
- imsic_guest_bits = imsic_num_bits(s->aia_guests + 1);
98
imsic_max_hart_per_socket = 0;
99
for (socket = 0; socket < socket_count; socket++) {
100
- imsic_addr = memmap[VIRT_IMSIC_S].base +
101
- socket * VIRT_IMSIC_GROUP_MAX_SIZE;
102
+ imsic_addr = base_addr + socket * VIRT_IMSIC_GROUP_MAX_SIZE;
103
imsic_size = IMSIC_HART_SIZE(imsic_guest_bits) *
104
s->soc[socket].num_harts;
105
imsic_regs[socket * 4 + 0] = 0;
106
@@ -XXX,XX +XXX,XX @@ static void create_fdt_imsic(RISCVVirtState *s, const MemMapEntry *memmap,
107
imsic_max_hart_per_socket = s->soc[socket].num_harts;
108
}
109
}
110
- imsic_name = g_strdup_printf("/soc/imsics@%lx",
111
- (unsigned long)memmap[VIRT_IMSIC_S].base);
112
+
113
+ imsic_name = g_strdup_printf("/soc/imsics@%lx", (unsigned long)base_addr);
114
qemu_fdt_add_subnode(ms->fdt, imsic_name);
115
- qemu_fdt_setprop_string(ms->fdt, imsic_name, "compatible",
116
- "riscv,imsics");
117
+ qemu_fdt_setprop_string(ms->fdt, imsic_name, "compatible", "riscv,imsics");
118
qemu_fdt_setprop_cell(ms->fdt, imsic_name, "#interrupt-cells",
119
- FDT_IMSIC_INT_CELLS);
120
- qemu_fdt_setprop(ms->fdt, imsic_name, "interrupt-controller",
121
- NULL, 0);
122
- qemu_fdt_setprop(ms->fdt, imsic_name, "msi-controller",
123
- NULL, 0);
124
+ FDT_IMSIC_INT_CELLS);
125
+ qemu_fdt_setprop(ms->fdt, imsic_name, "interrupt-controller", NULL, 0);
126
+ qemu_fdt_setprop(ms->fdt, imsic_name, "msi-controller", NULL, 0);
127
qemu_fdt_setprop(ms->fdt, imsic_name, "interrupts-extended",
128
- imsic_cells, ms->smp.cpus * sizeof(uint32_t) * 2);
129
+ imsic_cells, ms->smp.cpus * sizeof(uint32_t) * 2);
130
qemu_fdt_setprop(ms->fdt, imsic_name, "reg", imsic_regs,
131
- socket_count * sizeof(uint32_t) * 4);
132
+ socket_count * sizeof(uint32_t) * 4);
133
qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,num-ids",
134
- VIRT_IRQCHIP_NUM_MSIS);
135
+ VIRT_IRQCHIP_NUM_MSIS);
136
+
137
if (imsic_guest_bits) {
138
qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,guest-index-bits",
139
- imsic_guest_bits);
140
+ imsic_guest_bits);
141
}
142
+
143
if (socket_count > 1) {
144
qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,hart-index-bits",
145
- imsic_num_bits(imsic_max_hart_per_socket));
146
+ imsic_num_bits(imsic_max_hart_per_socket));
147
qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,group-index-bits",
148
- imsic_num_bits(socket_count));
149
+ imsic_num_bits(socket_count));
150
qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,group-index-shift",
151
- IMSIC_MMIO_GROUP_MIN_SHIFT);
152
+ IMSIC_MMIO_GROUP_MIN_SHIFT);
153
}
154
- qemu_fdt_setprop_cell(ms->fdt, imsic_name, "phandle", *msi_s_phandle);
155
- g_free(imsic_name);
156
+ qemu_fdt_setprop_cell(ms->fdt, imsic_name, "phandle", msi_phandle);
157
158
+ g_free(imsic_name);
159
g_free(imsic_regs);
160
g_free(imsic_cells);
161
}
162
163
-static void create_fdt_socket_aplic(RISCVVirtState *s,
164
- const MemMapEntry *memmap, int socket,
165
- uint32_t msi_m_phandle,
166
- uint32_t msi_s_phandle,
167
- uint32_t *phandle,
168
- uint32_t *intc_phandles,
169
- uint32_t *aplic_phandles)
170
+static void create_fdt_imsic(RISCVVirtState *s, const MemMapEntry *memmap,
171
+ uint32_t *phandle, uint32_t *intc_phandles,
172
+ uint32_t *msi_m_phandle, uint32_t *msi_s_phandle)
173
+{
174
+ *msi_m_phandle = (*phandle)++;
175
+ *msi_s_phandle = (*phandle)++;
176
+
177
+ if (!kvm_enabled()) {
178
+ /* M-level IMSIC node */
179
+ create_fdt_one_imsic(s, memmap[VIRT_IMSIC_M].base, intc_phandles,
180
+ *msi_m_phandle, true, 0);
181
+ }
182
+
183
+ /* S-level IMSIC node */
184
+ create_fdt_one_imsic(s, memmap[VIRT_IMSIC_S].base, intc_phandles,
185
+ *msi_s_phandle, false,
186
+ imsic_num_bits(s->aia_guests + 1));
187
+
55
+}
188
+}
56
+
189
+
57
+GEN_SHADD(1)
190
+static void create_fdt_one_aplic(RISCVVirtState *s, int socket,
58
+GEN_SHADD(2)
191
+ unsigned long aplic_addr, uint32_t aplic_size,
59
+GEN_SHADD(3)
192
+ uint32_t msi_phandle,
60
+
193
+ uint32_t *intc_phandles,
61
static void gen_ctzw(TCGv ret, TCGv arg1)
194
+ uint32_t aplic_phandle,
195
+ uint32_t aplic_child_phandle,
196
+ bool m_mode)
62
{
197
{
63
tcg_gen_ori_tl(ret, arg1, (target_ulong)MAKE_64BIT_MASK(32, 32));
198
int cpu;
64
@@ -XXX,XX +XXX,XX @@ static void gen_gorcw(TCGv ret, TCGv arg1, TCGv arg2)
199
char *aplic_name;
65
gen_helper_gorcw(ret, arg1, arg2);
200
uint32_t *aplic_cells;
201
- unsigned long aplic_addr;
202
MachineState *ms = MACHINE(s);
203
- uint32_t aplic_m_phandle, aplic_s_phandle;
204
205
- aplic_m_phandle = (*phandle)++;
206
- aplic_s_phandle = (*phandle)++;
207
aplic_cells = g_new0(uint32_t, s->soc[socket].num_harts * 2);
208
209
- /* M-level APLIC node */
210
for (cpu = 0; cpu < s->soc[socket].num_harts; cpu++) {
211
aplic_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]);
212
- aplic_cells[cpu * 2 + 1] = cpu_to_be32(IRQ_M_EXT);
213
+ aplic_cells[cpu * 2 + 1] = cpu_to_be32(m_mode ? IRQ_M_EXT : IRQ_S_EXT);
214
}
215
- aplic_addr = memmap[VIRT_APLIC_M].base +
216
- (memmap[VIRT_APLIC_M].size * socket);
217
+
218
aplic_name = g_strdup_printf("/soc/aplic@%lx", aplic_addr);
219
qemu_fdt_add_subnode(ms->fdt, aplic_name);
220
qemu_fdt_setprop_string(ms->fdt, aplic_name, "compatible", "riscv,aplic");
221
qemu_fdt_setprop_cell(ms->fdt, aplic_name,
222
- "#interrupt-cells", FDT_APLIC_INT_CELLS);
223
+ "#interrupt-cells", FDT_APLIC_INT_CELLS);
224
qemu_fdt_setprop(ms->fdt, aplic_name, "interrupt-controller", NULL, 0);
225
+
226
if (s->aia_type == VIRT_AIA_TYPE_APLIC) {
227
qemu_fdt_setprop(ms->fdt, aplic_name, "interrupts-extended",
228
- aplic_cells, s->soc[socket].num_harts * sizeof(uint32_t) * 2);
229
+ aplic_cells,
230
+ s->soc[socket].num_harts * sizeof(uint32_t) * 2);
231
} else {
232
- qemu_fdt_setprop_cell(ms->fdt, aplic_name, "msi-parent",
233
- msi_m_phandle);
234
+ qemu_fdt_setprop_cell(ms->fdt, aplic_name, "msi-parent", msi_phandle);
235
}
236
+
237
qemu_fdt_setprop_cells(ms->fdt, aplic_name, "reg",
238
- 0x0, aplic_addr, 0x0, memmap[VIRT_APLIC_M].size);
239
+ 0x0, aplic_addr, 0x0, aplic_size);
240
qemu_fdt_setprop_cell(ms->fdt, aplic_name, "riscv,num-sources",
241
- VIRT_IRQCHIP_NUM_SOURCES);
242
- qemu_fdt_setprop_cell(ms->fdt, aplic_name, "riscv,children",
243
- aplic_s_phandle);
244
- qemu_fdt_setprop_cells(ms->fdt, aplic_name, "riscv,delegate",
245
- aplic_s_phandle, 0x1, VIRT_IRQCHIP_NUM_SOURCES);
246
+ VIRT_IRQCHIP_NUM_SOURCES);
247
+
248
+ if (aplic_child_phandle) {
249
+ qemu_fdt_setprop_cell(ms->fdt, aplic_name, "riscv,children",
250
+ aplic_child_phandle);
251
+ qemu_fdt_setprop_cells(ms->fdt, aplic_name, "riscv,delegate",
252
+ aplic_child_phandle, 0x1,
253
+ VIRT_IRQCHIP_NUM_SOURCES);
254
+ }
255
+
256
riscv_socket_fdt_write_id(ms, aplic_name, socket);
257
- qemu_fdt_setprop_cell(ms->fdt, aplic_name, "phandle", aplic_m_phandle);
258
+ qemu_fdt_setprop_cell(ms->fdt, aplic_name, "phandle", aplic_phandle);
259
+
260
g_free(aplic_name);
261
+ g_free(aplic_cells);
262
+}
263
264
- /* S-level APLIC node */
265
- for (cpu = 0; cpu < s->soc[socket].num_harts; cpu++) {
266
- aplic_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]);
267
- aplic_cells[cpu * 2 + 1] = cpu_to_be32(IRQ_S_EXT);
268
+static void create_fdt_socket_aplic(RISCVVirtState *s,
269
+ const MemMapEntry *memmap, int socket,
270
+ uint32_t msi_m_phandle,
271
+ uint32_t msi_s_phandle,
272
+ uint32_t *phandle,
273
+ uint32_t *intc_phandles,
274
+ uint32_t *aplic_phandles)
275
+{
276
+ char *aplic_name;
277
+ unsigned long aplic_addr;
278
+ MachineState *ms = MACHINE(s);
279
+ uint32_t aplic_m_phandle, aplic_s_phandle;
280
+
281
+ aplic_m_phandle = (*phandle)++;
282
+ aplic_s_phandle = (*phandle)++;
283
+
284
+ if (!kvm_enabled()) {
285
+ /* M-level APLIC node */
286
+ aplic_addr = memmap[VIRT_APLIC_M].base +
287
+ (memmap[VIRT_APLIC_M].size * socket);
288
+ create_fdt_one_aplic(s, socket, aplic_addr, memmap[VIRT_APLIC_M].size,
289
+ msi_m_phandle, intc_phandles,
290
+ aplic_m_phandle, aplic_s_phandle,
291
+ true);
292
}
293
+
294
+ /* S-level APLIC node */
295
aplic_addr = memmap[VIRT_APLIC_S].base +
296
(memmap[VIRT_APLIC_S].size * socket);
297
+ create_fdt_one_aplic(s, socket, aplic_addr, memmap[VIRT_APLIC_S].size,
298
+ msi_s_phandle, intc_phandles,
299
+ aplic_s_phandle, 0,
300
+ false);
301
+
302
aplic_name = g_strdup_printf("/soc/aplic@%lx", aplic_addr);
303
- qemu_fdt_add_subnode(ms->fdt, aplic_name);
304
- qemu_fdt_setprop_string(ms->fdt, aplic_name, "compatible", "riscv,aplic");
305
- qemu_fdt_setprop_cell(ms->fdt, aplic_name,
306
- "#interrupt-cells", FDT_APLIC_INT_CELLS);
307
- qemu_fdt_setprop(ms->fdt, aplic_name, "interrupt-controller", NULL, 0);
308
- if (s->aia_type == VIRT_AIA_TYPE_APLIC) {
309
- qemu_fdt_setprop(ms->fdt, aplic_name, "interrupts-extended",
310
- aplic_cells, s->soc[socket].num_harts * sizeof(uint32_t) * 2);
311
- } else {
312
- qemu_fdt_setprop_cell(ms->fdt, aplic_name, "msi-parent",
313
- msi_s_phandle);
314
- }
315
- qemu_fdt_setprop_cells(ms->fdt, aplic_name, "reg",
316
- 0x0, aplic_addr, 0x0, memmap[VIRT_APLIC_S].size);
317
- qemu_fdt_setprop_cell(ms->fdt, aplic_name, "riscv,num-sources",
318
- VIRT_IRQCHIP_NUM_SOURCES);
319
- riscv_socket_fdt_write_id(ms, aplic_name, socket);
320
- qemu_fdt_setprop_cell(ms->fdt, aplic_name, "phandle", aplic_s_phandle);
321
322
if (!socket) {
323
platform_bus_add_all_fdt_nodes(ms->fdt, aplic_name,
324
@@ -XXX,XX +XXX,XX @@ static void create_fdt_socket_aplic(RISCVVirtState *s,
325
326
g_free(aplic_name);
327
328
- g_free(aplic_cells);
329
aplic_phandles[socket] = aplic_s_phandle;
66
}
330
}
67
331
68
+#define GEN_SHADD_UW(SHAMT) \
332
@@ -XXX,XX +XXX,XX @@ static DeviceState *virt_create_aia(RISCVVirtAIAType aia_type, int aia_guests,
69
+static void gen_sh##SHAMT##add_uw(TCGv ret, TCGv arg1, TCGv arg2) \
333
int i;
70
+{ \
334
hwaddr addr;
71
+ TCGv t = tcg_temp_new(); \
335
uint32_t guest_bits;
72
+ \
336
- DeviceState *aplic_m;
73
+ tcg_gen_ext32u_tl(t, arg1); \
337
- bool msimode = (aia_type == VIRT_AIA_TYPE_APLIC_IMSIC) ? true : false;
74
+ \
338
+ DeviceState *aplic_s = NULL;
75
+ tcg_gen_shli_tl(t, t, SHAMT); \
339
+ DeviceState *aplic_m = NULL;
76
+ tcg_gen_add_tl(ret, t, arg2); \
340
+ bool msimode = aia_type == VIRT_AIA_TYPE_APLIC_IMSIC;
77
+ \
341
78
+ tcg_temp_free(t); \
342
if (msimode) {
79
+}
343
- /* Per-socket M-level IMSICs */
80
+
344
- addr = memmap[VIRT_IMSIC_M].base + socket * VIRT_IMSIC_GROUP_MAX_SIZE;
81
+GEN_SHADD_UW(1)
345
- for (i = 0; i < hart_count; i++) {
82
+GEN_SHADD_UW(2)
346
- riscv_imsic_create(addr + i * IMSIC_HART_SIZE(0),
83
+GEN_SHADD_UW(3)
347
- base_hartid + i, true, 1,
84
+
348
- VIRT_IRQCHIP_NUM_MSIS);
85
static bool gen_arith(DisasContext *ctx, arg_r *a,
349
+ if (!kvm_enabled()) {
86
void(*func)(TCGv, TCGv, TCGv))
350
+ /* Per-socket M-level IMSICs */
87
{
351
+ addr = memmap[VIRT_IMSIC_M].base +
88
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
352
+ socket * VIRT_IMSIC_GROUP_MAX_SIZE;
89
index XXXXXXX..XXXXXXX 100644
353
+ for (i = 0; i < hart_count; i++) {
90
--- a/target/riscv/insn_trans/trans_rvb.c.inc
354
+ riscv_imsic_create(addr + i * IMSIC_HART_SIZE(0),
91
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
355
+ base_hartid + i, true, 1,
92
@@ -XXX,XX +XXX,XX @@ static bool trans_gorci(DisasContext *ctx, arg_gorci *a)
356
+ VIRT_IRQCHIP_NUM_MSIS);
93
return gen_shifti(ctx, a, gen_helper_gorc);
357
+ }
358
}
359
360
/* Per-socket S-level IMSICs */
361
@@ -XXX,XX +XXX,XX @@ static DeviceState *virt_create_aia(RISCVVirtAIAType aia_type, int aia_guests,
362
}
363
}
364
365
- /* Per-socket M-level APLIC */
366
- aplic_m = riscv_aplic_create(
367
- memmap[VIRT_APLIC_M].base + socket * memmap[VIRT_APLIC_M].size,
368
- memmap[VIRT_APLIC_M].size,
369
- (msimode) ? 0 : base_hartid,
370
- (msimode) ? 0 : hart_count,
371
- VIRT_IRQCHIP_NUM_SOURCES,
372
- VIRT_IRQCHIP_NUM_PRIO_BITS,
373
- msimode, true, NULL);
374
-
375
- if (aplic_m) {
376
- /* Per-socket S-level APLIC */
377
- riscv_aplic_create(
378
- memmap[VIRT_APLIC_S].base + socket * memmap[VIRT_APLIC_S].size,
379
- memmap[VIRT_APLIC_S].size,
380
- (msimode) ? 0 : base_hartid,
381
- (msimode) ? 0 : hart_count,
382
- VIRT_IRQCHIP_NUM_SOURCES,
383
- VIRT_IRQCHIP_NUM_PRIO_BITS,
384
- msimode, false, aplic_m);
385
+ if (!kvm_enabled()) {
386
+ /* Per-socket M-level APLIC */
387
+ aplic_m = riscv_aplic_create(memmap[VIRT_APLIC_M].base +
388
+ socket * memmap[VIRT_APLIC_M].size,
389
+ memmap[VIRT_APLIC_M].size,
390
+ (msimode) ? 0 : base_hartid,
391
+ (msimode) ? 0 : hart_count,
392
+ VIRT_IRQCHIP_NUM_SOURCES,
393
+ VIRT_IRQCHIP_NUM_PRIO_BITS,
394
+ msimode, true, NULL);
395
}
396
397
- return aplic_m;
398
+ /* Per-socket S-level APLIC */
399
+ aplic_s = riscv_aplic_create(memmap[VIRT_APLIC_S].base +
400
+ socket * memmap[VIRT_APLIC_S].size,
401
+ memmap[VIRT_APLIC_S].size,
402
+ (msimode) ? 0 : base_hartid,
403
+ (msimode) ? 0 : hart_count,
404
+ VIRT_IRQCHIP_NUM_SOURCES,
405
+ VIRT_IRQCHIP_NUM_PRIO_BITS,
406
+ msimode, false, aplic_m);
407
+
408
+ return kvm_enabled() ? aplic_s : aplic_m;
94
}
409
}
95
410
96
+#define GEN_TRANS_SHADD(SHAMT) \
411
static void create_platform_bus(RISCVVirtState *s, DeviceState *irqchip)
97
+static bool trans_sh##SHAMT##add(DisasContext *ctx, arg_sh##SHAMT##add *a) \
98
+{ \
99
+ REQUIRE_EXT(ctx, RVB); \
100
+ return gen_arith(ctx, a, gen_sh##SHAMT##add); \
101
+}
102
+
103
+GEN_TRANS_SHADD(1)
104
+GEN_TRANS_SHADD(2)
105
+GEN_TRANS_SHADD(3)
106
+
107
static bool trans_clzw(DisasContext *ctx, arg_clzw *a)
108
{
109
REQUIRE_64BIT(ctx);
110
@@ -XXX,XX +XXX,XX @@ static bool trans_gorciw(DisasContext *ctx, arg_gorciw *a)
111
REQUIRE_EXT(ctx, RVB);
112
return gen_shiftiw(ctx, a, gen_gorcw);
113
}
114
+
115
+#define GEN_TRANS_SHADD_UW(SHAMT) \
116
+static bool trans_sh##SHAMT##add_uw(DisasContext *ctx, \
117
+ arg_sh##SHAMT##add_uw *a) \
118
+{ \
119
+ REQUIRE_64BIT(ctx); \
120
+ REQUIRE_EXT(ctx, RVB); \
121
+ return gen_arith(ctx, a, gen_sh##SHAMT##add_uw); \
122
+}
123
+
124
+GEN_TRANS_SHADD_UW(1)
125
+GEN_TRANS_SHADD_UW(2)
126
+GEN_TRANS_SHADD_UW(3)
127
--
412
--
128
2.31.1
413
2.41.0
129
130
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: Yong-Xuan Wang <yongxuan.wang@sifive.com>
2
2
3
At present the Microchip Icicle Kit machine only supports using
3
We check the in-kernel irqchip support when using KVM acceleration.
4
'-bios' to load the HSS, and does not support '-kernel' for direct
5
kernel booting just like other RISC-V machines do. One has to use
6
U-Boot which is chain-loaded by HSS, to load a kernel for testing.
7
This is not so convenient.
8
4
9
Adding '-kernel' support together with the existing '-bios', we
5
Signed-off-by: Yong-Xuan Wang <yongxuan.wang@sifive.com>
10
follow the following table to select which payload we execute:
6
Reviewed-by: Jim Shu <jim.shu@sifive.com>
11
7
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
12
-bios | -kernel | payload
8
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
13
------+------------+--------
9
Message-ID: <20230727102439.22554-3-yongxuan.wang@sifive.com>
14
N | N | HSS
15
Y | don't care | HSS
16
N | Y | kernel
17
18
This ensures backwards compatibility with how we used to expose
19
'-bios' to users. When '-kernel' is used for direct boot, '-dtb'
20
must be present to provide a valid device tree for the board,
21
as we don't generate device tree.
22
23
When direct kernel boot is used, the OpenSBI fw_dynamic BIOS image
24
is used to boot a payload like U-Boot or OS kernel directly.
25
26
Documentation is updated to describe the direct kernel boot. Note
27
as of today there is still no PolarFire SoC support in the upstream
28
Linux kernel hence the document does not include instructions for
29
that. It will be updated in the future.
30
31
Signed-off-by: Bin Meng <bin.meng@windriver.com>
32
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
33
Message-id: 20210430071302.1489082-8-bmeng.cn@gmail.com
34
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
35
---
11
---
36
docs/system/riscv/microchip-icicle-kit.rst | 30 ++++++--
12
target/riscv/kvm.c | 10 +++++++++-
37
hw/riscv/microchip_pfsoc.c | 81 +++++++++++++++++++++-
13
1 file changed, 9 insertions(+), 1 deletion(-)
38
2 files changed, 103 insertions(+), 8 deletions(-)
39
14
40
diff --git a/docs/system/riscv/microchip-icicle-kit.rst b/docs/system/riscv/microchip-icicle-kit.rst
15
diff --git a/target/riscv/kvm.c b/target/riscv/kvm.c
41
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
42
--- a/docs/system/riscv/microchip-icicle-kit.rst
17
--- a/target/riscv/kvm.c
43
+++ b/docs/system/riscv/microchip-icicle-kit.rst
18
+++ b/target/riscv/kvm.c
44
@@ -XXX,XX +XXX,XX @@ Boot options
19
@@ -XXX,XX +XXX,XX @@ int kvm_arch_init(MachineState *ms, KVMState *s)
45
20
46
The ``microchip-icicle-kit`` machine can start using the standard -bios
21
int kvm_arch_irqchip_create(KVMState *s)
47
functionality for loading its BIOS image, aka Hart Software Services (HSS_).
22
{
48
-HSS loads the second stage bootloader U-Boot from an SD card. It does not
23
- return 0;
49
-support direct kernel loading via the -kernel option. One has to load kernel
24
+ if (kvm_kernel_irqchip_split()) {
50
-from U-Boot.
25
+ error_report("-machine kernel_irqchip=split is not supported on RISC-V.");
51
+HSS loads the second stage bootloader U-Boot from an SD card. Then a kernel
26
+ exit(1);
52
+can be loaded from U-Boot. It also supports direct kernel booting via the
27
+ }
53
+-kernel option along with the device tree blob via -dtb. When direct kernel
54
+boot is used, the OpenSBI fw_dynamic BIOS image is used to boot a payload
55
+like U-Boot or OS kernel directly.
56
+
57
+The user provided DTB should have the following requirements:
58
+
59
+* The /cpus node should contain at least one subnode for E51 and the number
60
+ of subnodes should match QEMU's ``-smp`` option
61
+* The /memory reg size should match QEMU’s selected ram_size via ``-m``
62
+* Should contain a node for the CLINT device with a compatible string
63
+ "riscv,clint0"
64
+
65
+QEMU follows below truth table to select which payload to execute:
66
+
67
+===== ========== =======
68
+-bios -kernel payload
69
+===== ========== =======
70
+ N N HSS
71
+ Y don't care HSS
72
+ N Y kernel
73
+===== ========== =======
74
75
The memory is set to 1537 MiB by default which is the minimum required high
76
memory size by HSS. A sanity check on ram size is performed in the machine
77
init routine to prompt user to increase the RAM size to > 1537 MiB when less
78
than 1537 MiB ram is detected.
79
80
-Boot the machine
81
-----------------
82
+Running HSS
83
+-----------
84
85
HSS 2020.12 release is tested at the time of writing. To build an HSS image
86
that can be booted by the ``microchip-icicle-kit`` machine, type the following
87
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
88
index XXXXXXX..XXXXXXX 100644
89
--- a/hw/riscv/microchip_pfsoc.c
90
+++ b/hw/riscv/microchip_pfsoc.c
91
@@ -XXX,XX +XXX,XX @@
92
#include "hw/riscv/microchip_pfsoc.h"
93
#include "hw/intc/sifive_clint.h"
94
#include "hw/intc/sifive_plic.h"
95
+#include "sysemu/device_tree.h"
96
#include "sysemu/sysemu.h"
97
98
/*
99
@@ -XXX,XX +XXX,XX @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
100
MemoryRegion *mem_high = g_new(MemoryRegion, 1);
101
MemoryRegion *mem_high_alias = g_new(MemoryRegion, 1);
102
uint64_t mem_high_size;
103
+ hwaddr firmware_load_addr;
104
+ const char *firmware_name;
105
+ bool kernel_as_payload = false;
106
+ target_ulong firmware_end_addr, kernel_start_addr;
107
+ uint64_t kernel_entry;
108
+ uint32_t fdt_load_addr;
109
DriveInfo *dinfo = drive_get_next(IF_SD);
110
111
/* Sanity check on RAM size */
112
@@ -XXX,XX +XXX,XX @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
113
memmap[MICROCHIP_PFSOC_DRAM_HI_ALIAS].base,
114
mem_high_alias);
115
116
- /* Load the firmware */
117
- riscv_find_and_load_firmware(machine, BIOS_FILENAME, RESET_VECTOR, NULL);
118
-
119
/* Attach an SD card */
120
if (dinfo) {
121
CadenceSDHCIState *sdhci = &(s->soc.sdhci);
122
@@ -XXX,XX +XXX,XX @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
123
&error_fatal);
124
qdev_realize_and_unref(card, sdhci->bus, &error_fatal);
125
}
126
+
28
+
127
+ /*
29
+ /*
128
+ * We follow the following table to select which payload we execute.
30
+ * We can create the VAIA using the newer device control API.
129
+ *
130
+ * -bios | -kernel | payload
131
+ * -------+------------+--------
132
+ * N | N | HSS
133
+ * Y | don't care | HSS
134
+ * N | Y | kernel
135
+ *
136
+ * This ensures backwards compatibility with how we used to expose -bios
137
+ * to users but allows them to run through direct kernel booting as well.
138
+ *
139
+ * When -kernel is used for direct boot, -dtb must be present to provide
140
+ * a valid device tree for the board, as we don't generate device tree.
141
+ */
31
+ */
142
+
32
+ return kvm_check_extension(s, KVM_CAP_DEVICE_CTRL);
143
+ if (machine->kernel_filename && machine->dtb) {
144
+ int fdt_size;
145
+ machine->fdt = load_device_tree(machine->dtb, &fdt_size);
146
+ if (!machine->fdt) {
147
+ error_report("load_device_tree() failed");
148
+ exit(1);
149
+ }
150
+
151
+ firmware_name = RISCV64_BIOS_BIN;
152
+ firmware_load_addr = memmap[MICROCHIP_PFSOC_DRAM_LO].base;
153
+ kernel_as_payload = true;
154
+ }
155
+
156
+ if (!kernel_as_payload) {
157
+ firmware_name = BIOS_FILENAME;
158
+ firmware_load_addr = RESET_VECTOR;
159
+ }
160
+
161
+ /* Load the firmware */
162
+ firmware_end_addr = riscv_find_and_load_firmware(machine, firmware_name,
163
+ firmware_load_addr, NULL);
164
+
165
+ if (kernel_as_payload) {
166
+ kernel_start_addr = riscv_calc_kernel_start_addr(&s->soc.u_cpus,
167
+ firmware_end_addr);
168
+
169
+ kernel_entry = riscv_load_kernel(machine->kernel_filename,
170
+ kernel_start_addr, NULL);
171
+
172
+ if (machine->initrd_filename) {
173
+ hwaddr start;
174
+ hwaddr end = riscv_load_initrd(machine->initrd_filename,
175
+ machine->ram_size, kernel_entry,
176
+ &start);
177
+ qemu_fdt_setprop_cell(machine->fdt, "/chosen",
178
+ "linux,initrd-start", start);
179
+ qemu_fdt_setprop_cell(machine->fdt, "/chosen",
180
+ "linux,initrd-end", end);
181
+ }
182
+
183
+ if (machine->kernel_cmdline) {
184
+ qemu_fdt_setprop_string(machine->fdt, "/chosen",
185
+ "bootargs", machine->kernel_cmdline);
186
+ }
187
+
188
+ /* Compute the fdt load address in dram */
189
+ fdt_load_addr = riscv_load_fdt(memmap[MICROCHIP_PFSOC_DRAM_LO].base,
190
+ machine->ram_size, machine->fdt);
191
+ /* Load the reset vector */
192
+ riscv_setup_rom_reset_vec(machine, &s->soc.u_cpus, firmware_load_addr,
193
+ memmap[MICROCHIP_PFSOC_ENVM_DATA].base,
194
+ memmap[MICROCHIP_PFSOC_ENVM_DATA].size,
195
+ kernel_entry, fdt_load_addr, machine->fdt);
196
+ }
197
}
33
}
198
34
199
static void microchip_icicle_kit_machine_class_init(ObjectClass *oc, void *data)
35
int kvm_arch_process_async_events(CPUState *cs)
200
--
36
--
201
2.31.1
37
2.41.0
202
203
diff view generated by jsdifflib
1
From: Kito Cheng <kito.cheng@sifive.com>
1
From: Yong-Xuan Wang <yongxuan.wang@sifive.com>
2
2
3
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
3
We create a vAIA chip by using the KVM_DEV_TYPE_RISCV_AIA and then set up
4
Signed-off-by: Frank Chang <frank.chang@sifive.com>
4
the chip with the KVM_DEV_RISCV_AIA_GRP_* APIs.
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
We also extend KVM accelerator to specify the KVM AIA mode. The "riscv-aia"
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
parameter is passed along with --accel in QEMU command-line.
7
Message-id: 20210505160620.15723-6-frank.chang@sifive.com
7
1) "riscv-aia=emul": IMSIC is emulated by hypervisor
8
2) "riscv-aia=hwaccel": use hardware guest IMSIC
9
3) "riscv-aia=auto": use the hardware guest IMSICs whenever available
10
otherwise we fallback to software emulation.
11
12
Signed-off-by: Yong-Xuan Wang <yongxuan.wang@sifive.com>
13
Reviewed-by: Jim Shu <jim.shu@sifive.com>
14
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
15
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
16
Message-ID: <20230727102439.22554-4-yongxuan.wang@sifive.com>
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
17
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
---
18
---
10
target/riscv/insn32.decode | 6 ++++
19
target/riscv/kvm_riscv.h | 4 +
11
target/riscv/translate.c | 40 +++++++++++++++++++++++++
20
target/riscv/kvm.c | 186 +++++++++++++++++++++++++++++++++++++++
12
target/riscv/insn_trans/trans_rvb.c.inc | 32 ++++++++++++++++++++
21
2 files changed, 190 insertions(+)
13
3 files changed, 78 insertions(+)
14
22
15
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
23
diff --git a/target/riscv/kvm_riscv.h b/target/riscv/kvm_riscv.h
16
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/insn32.decode
25
--- a/target/riscv/kvm_riscv.h
18
+++ b/target/riscv/insn32.decode
26
+++ b/target/riscv/kvm_riscv.h
19
@@ -XXX,XX +XXX,XX @@ cpop 011000 000010 ..... 001 ..... 0010011 @r2
27
@@ -XXX,XX +XXX,XX @@
20
andn 0100000 .......... 111 ..... 0110011 @r
28
void kvm_riscv_init_user_properties(Object *cpu_obj);
21
orn 0100000 .......... 110 ..... 0110011 @r
29
void kvm_riscv_reset_vcpu(RISCVCPU *cpu);
22
xnor 0100000 .......... 100 ..... 0110011 @r
30
void kvm_riscv_set_irq(RISCVCPU *cpu, int irq, int level);
23
+pack 0000100 .......... 100 ..... 0110011 @r
31
+void kvm_riscv_aia_create(MachineState *machine, uint64_t group_shift,
24
+packu 0100100 .......... 100 ..... 0110011 @r
32
+ uint64_t aia_irq_num, uint64_t aia_msi_num,
25
+packh 0000100 .......... 111 ..... 0110011 @r
33
+ uint64_t aplic_base, uint64_t imsic_base,
26
34
+ uint64_t guest_num);
27
# *** RV64B Standard Extension (in addition to RV32B) ***
35
28
clzw 0110000 00000 ..... 001 ..... 0011011 @r2
36
#endif
29
ctzw 0110000 00001 ..... 001 ..... 0011011 @r2
37
diff --git a/target/riscv/kvm.c b/target/riscv/kvm.c
30
cpopw 0110000 00010 ..... 001 ..... 0011011 @r2
31
+
32
+packw 0000100 .......... 100 ..... 0111011 @r
33
+packuw 0100100 .......... 100 ..... 0111011 @r
34
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
35
index XXXXXXX..XXXXXXX 100644
38
index XXXXXXX..XXXXXXX 100644
36
--- a/target/riscv/translate.c
39
--- a/target/riscv/kvm.c
37
+++ b/target/riscv/translate.c
40
+++ b/target/riscv/kvm.c
38
@@ -XXX,XX +XXX,XX @@ static bool gen_arith_div_uw(DisasContext *ctx, arg_r *a,
41
@@ -XXX,XX +XXX,XX @@
42
#include "exec/address-spaces.h"
43
#include "hw/boards.h"
44
#include "hw/irq.h"
45
+#include "hw/intc/riscv_imsic.h"
46
#include "qemu/log.h"
47
#include "hw/loader.h"
48
#include "kvm_riscv.h"
49
@@ -XXX,XX +XXX,XX @@
50
#include "chardev/char-fe.h"
51
#include "migration/migration.h"
52
#include "sysemu/runstate.h"
53
+#include "hw/riscv/numa.h"
54
55
static uint64_t kvm_riscv_reg_id(CPURISCVState *env, uint64_t type,
56
uint64_t idx)
57
@@ -XXX,XX +XXX,XX @@ bool kvm_arch_cpu_check_are_resettable(void)
39
return true;
58
return true;
40
}
59
}
41
60
42
+static void gen_pack(TCGv ret, TCGv arg1, TCGv arg2)
61
+static int aia_mode;
43
+{
62
+
44
+ tcg_gen_deposit_tl(ret, arg1, arg2,
63
+static const char *kvm_aia_mode_str(uint64_t mode)
45
+ TARGET_LONG_BITS / 2,
64
+{
46
+ TARGET_LONG_BITS / 2);
65
+ switch (mode) {
47
+}
66
+ case KVM_DEV_RISCV_AIA_MODE_EMUL:
48
+
67
+ return "emul";
49
+static void gen_packu(TCGv ret, TCGv arg1, TCGv arg2)
68
+ case KVM_DEV_RISCV_AIA_MODE_HWACCEL:
50
+{
69
+ return "hwaccel";
51
+ TCGv t = tcg_temp_new();
70
+ case KVM_DEV_RISCV_AIA_MODE_AUTO:
52
+ tcg_gen_shri_tl(t, arg1, TARGET_LONG_BITS / 2);
71
+ default:
53
+ tcg_gen_deposit_tl(ret, arg2, t, 0, TARGET_LONG_BITS / 2);
72
+ return "auto";
54
+ tcg_temp_free(t);
73
+ };
55
+}
74
+}
56
+
75
+
57
+static void gen_packh(TCGv ret, TCGv arg1, TCGv arg2)
76
+static char *riscv_get_kvm_aia(Object *obj, Error **errp)
58
+{
77
+{
59
+ TCGv t = tcg_temp_new();
78
+ return g_strdup(kvm_aia_mode_str(aia_mode));
60
+ tcg_gen_ext8u_tl(t, arg2);
79
+}
61
+ tcg_gen_deposit_tl(ret, arg1, t, 8, TARGET_LONG_BITS - 8);
80
+
62
+ tcg_temp_free(t);
81
+static void riscv_set_kvm_aia(Object *obj, const char *val, Error **errp)
63
+}
82
+{
64
+
83
+ if (!strcmp(val, "emul")) {
65
static void gen_ctzw(TCGv ret, TCGv arg1)
84
+ aia_mode = KVM_DEV_RISCV_AIA_MODE_EMUL;
85
+ } else if (!strcmp(val, "hwaccel")) {
86
+ aia_mode = KVM_DEV_RISCV_AIA_MODE_HWACCEL;
87
+ } else if (!strcmp(val, "auto")) {
88
+ aia_mode = KVM_DEV_RISCV_AIA_MODE_AUTO;
89
+ } else {
90
+ error_setg(errp, "Invalid KVM AIA mode");
91
+ error_append_hint(errp, "Valid values are emul, hwaccel, and auto.\n");
92
+ }
93
+}
94
+
95
void kvm_arch_accel_class_init(ObjectClass *oc)
66
{
96
{
67
tcg_gen_ori_tl(ret, arg1, (target_ulong)MAKE_64BIT_MASK(32, 32));
97
+ object_class_property_add_str(oc, "riscv-aia", riscv_get_kvm_aia,
68
@@ -XXX,XX +XXX,XX @@ static void gen_cpopw(TCGv ret, TCGv arg1)
98
+ riscv_set_kvm_aia);
69
tcg_gen_ctpop_tl(ret, arg1);
99
+ object_class_property_set_description(oc, "riscv-aia",
100
+ "Set KVM AIA mode. Valid values are "
101
+ "emul, hwaccel, and auto. Default "
102
+ "is auto.");
103
+ object_property_set_default_str(object_class_property_find(oc, "riscv-aia"),
104
+ "auto");
105
+}
106
+
107
+void kvm_riscv_aia_create(MachineState *machine, uint64_t group_shift,
108
+ uint64_t aia_irq_num, uint64_t aia_msi_num,
109
+ uint64_t aplic_base, uint64_t imsic_base,
110
+ uint64_t guest_num)
111
+{
112
+ int ret, i;
113
+ int aia_fd = -1;
114
+ uint64_t default_aia_mode;
115
+ uint64_t socket_count = riscv_socket_count(machine);
116
+ uint64_t max_hart_per_socket = 0;
117
+ uint64_t socket, base_hart, hart_count, socket_imsic_base, imsic_addr;
118
+ uint64_t socket_bits, hart_bits, guest_bits;
119
+
120
+ aia_fd = kvm_create_device(kvm_state, KVM_DEV_TYPE_RISCV_AIA, false);
121
+
122
+ if (aia_fd < 0) {
123
+ error_report("Unable to create in-kernel irqchip");
124
+ exit(1);
125
+ }
126
+
127
+ ret = kvm_device_access(aia_fd, KVM_DEV_RISCV_AIA_GRP_CONFIG,
128
+ KVM_DEV_RISCV_AIA_CONFIG_MODE,
129
+ &default_aia_mode, false, NULL);
130
+ if (ret < 0) {
131
+ error_report("KVM AIA: failed to get current KVM AIA mode");
132
+ exit(1);
133
+ }
134
+ qemu_log("KVM AIA: default mode is %s\n",
135
+ kvm_aia_mode_str(default_aia_mode));
136
+
137
+ if (default_aia_mode != aia_mode) {
138
+ ret = kvm_device_access(aia_fd, KVM_DEV_RISCV_AIA_GRP_CONFIG,
139
+ KVM_DEV_RISCV_AIA_CONFIG_MODE,
140
+ &aia_mode, true, NULL);
141
+ if (ret < 0)
142
+ warn_report("KVM AIA: failed to set KVM AIA mode");
143
+ else
144
+ qemu_log("KVM AIA: set current mode to %s\n",
145
+ kvm_aia_mode_str(aia_mode));
146
+ }
147
+
148
+ ret = kvm_device_access(aia_fd, KVM_DEV_RISCV_AIA_GRP_CONFIG,
149
+ KVM_DEV_RISCV_AIA_CONFIG_SRCS,
150
+ &aia_irq_num, true, NULL);
151
+ if (ret < 0) {
152
+ error_report("KVM AIA: failed to set number of input irq lines");
153
+ exit(1);
154
+ }
155
+
156
+ ret = kvm_device_access(aia_fd, KVM_DEV_RISCV_AIA_GRP_CONFIG,
157
+ KVM_DEV_RISCV_AIA_CONFIG_IDS,
158
+ &aia_msi_num, true, NULL);
159
+ if (ret < 0) {
160
+ error_report("KVM AIA: failed to set number of msi");
161
+ exit(1);
162
+ }
163
+
164
+ socket_bits = find_last_bit(&socket_count, BITS_PER_LONG) + 1;
165
+ ret = kvm_device_access(aia_fd, KVM_DEV_RISCV_AIA_GRP_CONFIG,
166
+ KVM_DEV_RISCV_AIA_CONFIG_GROUP_BITS,
167
+ &socket_bits, true, NULL);
168
+ if (ret < 0) {
169
+ error_report("KVM AIA: failed to set group_bits");
170
+ exit(1);
171
+ }
172
+
173
+ ret = kvm_device_access(aia_fd, KVM_DEV_RISCV_AIA_GRP_CONFIG,
174
+ KVM_DEV_RISCV_AIA_CONFIG_GROUP_SHIFT,
175
+ &group_shift, true, NULL);
176
+ if (ret < 0) {
177
+ error_report("KVM AIA: failed to set group_shift");
178
+ exit(1);
179
+ }
180
+
181
+ guest_bits = guest_num == 0 ? 0 :
182
+ find_last_bit(&guest_num, BITS_PER_LONG) + 1;
183
+ ret = kvm_device_access(aia_fd, KVM_DEV_RISCV_AIA_GRP_CONFIG,
184
+ KVM_DEV_RISCV_AIA_CONFIG_GUEST_BITS,
185
+ &guest_bits, true, NULL);
186
+ if (ret < 0) {
187
+ error_report("KVM AIA: failed to set guest_bits");
188
+ exit(1);
189
+ }
190
+
191
+ ret = kvm_device_access(aia_fd, KVM_DEV_RISCV_AIA_GRP_ADDR,
192
+ KVM_DEV_RISCV_AIA_ADDR_APLIC,
193
+ &aplic_base, true, NULL);
194
+ if (ret < 0) {
195
+ error_report("KVM AIA: failed to set the base address of APLIC");
196
+ exit(1);
197
+ }
198
+
199
+ for (socket = 0; socket < socket_count; socket++) {
200
+ socket_imsic_base = imsic_base + socket * (1U << group_shift);
201
+ hart_count = riscv_socket_hart_count(machine, socket);
202
+ base_hart = riscv_socket_first_hartid(machine, socket);
203
+
204
+ if (max_hart_per_socket < hart_count) {
205
+ max_hart_per_socket = hart_count;
206
+ }
207
+
208
+ for (i = 0; i < hart_count; i++) {
209
+ imsic_addr = socket_imsic_base + i * IMSIC_HART_SIZE(guest_bits);
210
+ ret = kvm_device_access(aia_fd, KVM_DEV_RISCV_AIA_GRP_ADDR,
211
+ KVM_DEV_RISCV_AIA_ADDR_IMSIC(i + base_hart),
212
+ &imsic_addr, true, NULL);
213
+ if (ret < 0) {
214
+ error_report("KVM AIA: failed to set the IMSIC address for hart %d", i);
215
+ exit(1);
216
+ }
217
+ }
218
+ }
219
+
220
+ hart_bits = find_last_bit(&max_hart_per_socket, BITS_PER_LONG) + 1;
221
+ ret = kvm_device_access(aia_fd, KVM_DEV_RISCV_AIA_GRP_CONFIG,
222
+ KVM_DEV_RISCV_AIA_CONFIG_HART_BITS,
223
+ &hart_bits, true, NULL);
224
+ if (ret < 0) {
225
+ error_report("KVM AIA: failed to set hart_bits");
226
+ exit(1);
227
+ }
228
+
229
+ if (kvm_has_gsi_routing()) {
230
+ for (uint64_t idx = 0; idx < aia_irq_num + 1; ++idx) {
231
+ /* KVM AIA only has one APLIC instance */
232
+ kvm_irqchip_add_irq_route(kvm_state, idx, 0, idx);
233
+ }
234
+ kvm_gsi_routing_allowed = true;
235
+ kvm_irqchip_commit_routes(kvm_state);
236
+ }
237
+
238
+ ret = kvm_device_access(aia_fd, KVM_DEV_RISCV_AIA_GRP_CTRL,
239
+ KVM_DEV_RISCV_AIA_CTRL_INIT,
240
+ NULL, true, NULL);
241
+ if (ret < 0) {
242
+ error_report("KVM AIA: initialized fail");
243
+ exit(1);
244
+ }
245
+
246
+ kvm_msi_via_irqfd_allowed = kvm_irqfds_enabled();
70
}
247
}
71
72
+static void gen_packw(TCGv ret, TCGv arg1, TCGv arg2)
73
+{
74
+ TCGv t = tcg_temp_new();
75
+ tcg_gen_ext16s_tl(t, arg2);
76
+ tcg_gen_deposit_tl(ret, arg1, t, 16, 48);
77
+ tcg_temp_free(t);
78
+}
79
+
80
+static void gen_packuw(TCGv ret, TCGv arg1, TCGv arg2)
81
+{
82
+ TCGv t = tcg_temp_new();
83
+ tcg_gen_shri_tl(t, arg1, 16);
84
+ tcg_gen_deposit_tl(ret, arg2, t, 0, 16);
85
+ tcg_gen_ext32s_tl(ret, ret);
86
+ tcg_temp_free(t);
87
+}
88
+
89
static bool gen_arith(DisasContext *ctx, arg_r *a,
90
void(*func)(TCGv, TCGv, TCGv))
91
{
92
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
93
index XXXXXXX..XXXXXXX 100644
94
--- a/target/riscv/insn_trans/trans_rvb.c.inc
95
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
96
@@ -XXX,XX +XXX,XX @@ static bool trans_xnor(DisasContext *ctx, arg_xnor *a)
97
return gen_arith(ctx, a, tcg_gen_eqv_tl);
98
}
99
100
+static bool trans_pack(DisasContext *ctx, arg_pack *a)
101
+{
102
+ REQUIRE_EXT(ctx, RVB);
103
+ return gen_arith(ctx, a, gen_pack);
104
+}
105
+
106
+static bool trans_packu(DisasContext *ctx, arg_packu *a)
107
+{
108
+ REQUIRE_EXT(ctx, RVB);
109
+ return gen_arith(ctx, a, gen_packu);
110
+}
111
+
112
+static bool trans_packh(DisasContext *ctx, arg_packh *a)
113
+{
114
+ REQUIRE_EXT(ctx, RVB);
115
+ return gen_arith(ctx, a, gen_packh);
116
+}
117
+
118
static bool trans_clzw(DisasContext *ctx, arg_clzw *a)
119
{
120
REQUIRE_64BIT(ctx);
121
@@ -XXX,XX +XXX,XX @@ static bool trans_cpopw(DisasContext *ctx, arg_cpopw *a)
122
REQUIRE_EXT(ctx, RVB);
123
return gen_unary(ctx, a, gen_cpopw);
124
}
125
+
126
+static bool trans_packw(DisasContext *ctx, arg_packw *a)
127
+{
128
+ REQUIRE_64BIT(ctx);
129
+ REQUIRE_EXT(ctx, RVB);
130
+ return gen_arith(ctx, a, gen_packw);
131
+}
132
+
133
+static bool trans_packuw(DisasContext *ctx, arg_packuw *a)
134
+{
135
+ REQUIRE_64BIT(ctx);
136
+ REQUIRE_EXT(ctx, RVB);
137
+ return gen_arith(ctx, a, gen_packuw);
138
+}
139
--
248
--
140
2.31.1
249
2.41.0
141
142
diff view generated by jsdifflib
1
From: Frank Chang <frank.chang@sifive.com>
1
From: Yong-Xuan Wang <yongxuan.wang@sifive.com>
2
2
3
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
3
KVM AIA can't emulate APLIC only. When "aia=aplic" parameter is passed,
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
APLIC devices is emulated by QEMU. For "aia=aplic-imsic", remove the
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
mmio operations of APLIC when using KVM AIA and send wired interrupt
6
Signed-off-by: Frank Chang <frank.chang@sifive.com>
6
signal via KVM_IRQ_LINE API.
7
Message-id: 20210505160620.15723-4-frank.chang@sifive.com
7
After KVM AIA enabled, MSI messages are delivered by KVM_SIGNAL_MSI API
8
when the IMSICs receive mmio write requests.
9
10
Signed-off-by: Yong-Xuan Wang <yongxuan.wang@sifive.com>
11
Reviewed-by: Jim Shu <jim.shu@sifive.com>
12
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
13
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
14
Message-ID: <20230727102439.22554-5-yongxuan.wang@sifive.com>
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
15
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
---
16
---
10
target/riscv/insn32.decode | 2 ++
17
hw/intc/riscv_aplic.c | 56 ++++++++++++++++++++++++++++++-------------
11
target/riscv/translate.c | 6 ++++++
18
hw/intc/riscv_imsic.c | 25 +++++++++++++++----
12
target/riscv/insn_trans/trans_rvb.c.inc | 13 +++++++++++++
19
2 files changed, 61 insertions(+), 20 deletions(-)
13
3 files changed, 21 insertions(+)
14
20
15
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
21
diff --git a/hw/intc/riscv_aplic.c b/hw/intc/riscv_aplic.c
16
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/insn32.decode
23
--- a/hw/intc/riscv_aplic.c
18
+++ b/target/riscv/insn32.decode
24
+++ b/hw/intc/riscv_aplic.c
19
@@ -XXX,XX +XXX,XX @@ vamomaxud_v 11100 . . ..... ..... 111 ..... 0101111 @r_wdvm
25
@@ -XXX,XX +XXX,XX @@
20
# *** RV32B Standard Extension ***
26
#include "hw/irq.h"
21
clz 011000 000000 ..... 001 ..... 0010011 @r2
27
#include "target/riscv/cpu.h"
22
ctz 011000 000001 ..... 001 ..... 0010011 @r2
28
#include "sysemu/sysemu.h"
23
+cpop 011000 000010 ..... 001 ..... 0010011 @r2
29
+#include "sysemu/kvm.h"
24
30
#include "migration/vmstate.h"
25
# *** RV64B Standard Extension (in addition to RV32B) ***
31
26
clzw 0110000 00000 ..... 001 ..... 0011011 @r2
32
#define APLIC_MAX_IDC (1UL << 14)
27
ctzw 0110000 00001 ..... 001 ..... 0011011 @r2
33
@@ -XXX,XX +XXX,XX @@
28
+cpopw 0110000 00010 ..... 001 ..... 0011011 @r2
34
29
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
35
#define APLIC_IDC_CLAIMI 0x1c
30
index XXXXXXX..XXXXXXX 100644
36
31
--- a/target/riscv/translate.c
37
+/*
32
+++ b/target/riscv/translate.c
38
+ * KVM AIA only supports APLIC MSI, fallback to QEMU emulation if we want to use
33
@@ -XXX,XX +XXX,XX @@ static void gen_clzw(TCGv ret, TCGv arg1)
39
+ * APLIC Wired.
34
tcg_gen_subi_tl(ret, ret, 32);
40
+ */
35
}
41
+static bool is_kvm_aia(bool msimode)
36
37
+static void gen_cpopw(TCGv ret, TCGv arg1)
38
+{
42
+{
39
+ tcg_gen_ext32u_tl(arg1, arg1);
43
+ return kvm_irqchip_in_kernel() && msimode;
40
+ tcg_gen_ctpop_tl(ret, arg1);
41
+}
44
+}
42
+
45
+
43
static bool gen_arith(DisasContext *ctx, arg_r *a,
46
static uint32_t riscv_aplic_read_input_word(RISCVAPLICState *aplic,
44
void(*func)(TCGv, TCGv, TCGv))
47
uint32_t word)
45
{
48
{
46
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
49
@@ -XXX,XX +XXX,XX @@ static uint32_t riscv_aplic_idc_claimi(RISCVAPLICState *aplic, uint32_t idc)
47
index XXXXXXX..XXXXXXX 100644
50
return topi;
48
--- a/target/riscv/insn_trans/trans_rvb.c.inc
49
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
50
@@ -XXX,XX +XXX,XX @@ static bool trans_ctz(DisasContext *ctx, arg_ctz *a)
51
return gen_unary(ctx, a, gen_ctz);
52
}
51
}
53
52
54
+static bool trans_cpop(DisasContext *ctx, arg_cpop *a)
53
+static void riscv_kvm_aplic_request(void *opaque, int irq, int level)
55
+{
54
+{
56
+ REQUIRE_EXT(ctx, RVB);
55
+ kvm_set_irq(kvm_state, irq, !!level);
57
+ return gen_unary(ctx, a, tcg_gen_ctpop_tl);
58
+}
56
+}
59
+
57
+
60
static bool trans_clzw(DisasContext *ctx, arg_clzw *a)
58
static void riscv_aplic_request(void *opaque, int irq, int level)
61
{
59
{
62
REQUIRE_64BIT(ctx);
60
bool update = false;
63
@@ -XXX,XX +XXX,XX @@ static bool trans_ctzw(DisasContext *ctx, arg_ctzw *a)
61
@@ -XXX,XX +XXX,XX @@ static void riscv_aplic_realize(DeviceState *dev, Error **errp)
64
REQUIRE_EXT(ctx, RVB);
62
uint32_t i;
65
return gen_unary(ctx, a, gen_ctzw);
63
RISCVAPLICState *aplic = RISCV_APLIC(dev);
66
}
64
65
- aplic->bitfield_words = (aplic->num_irqs + 31) >> 5;
66
- aplic->sourcecfg = g_new0(uint32_t, aplic->num_irqs);
67
- aplic->state = g_new0(uint32_t, aplic->num_irqs);
68
- aplic->target = g_new0(uint32_t, aplic->num_irqs);
69
- if (!aplic->msimode) {
70
- for (i = 0; i < aplic->num_irqs; i++) {
71
- aplic->target[i] = 1;
72
+ if (!is_kvm_aia(aplic->msimode)) {
73
+ aplic->bitfield_words = (aplic->num_irqs + 31) >> 5;
74
+ aplic->sourcecfg = g_new0(uint32_t, aplic->num_irqs);
75
+ aplic->state = g_new0(uint32_t, aplic->num_irqs);
76
+ aplic->target = g_new0(uint32_t, aplic->num_irqs);
77
+ if (!aplic->msimode) {
78
+ for (i = 0; i < aplic->num_irqs; i++) {
79
+ aplic->target[i] = 1;
80
+ }
81
}
82
- }
83
- aplic->idelivery = g_new0(uint32_t, aplic->num_harts);
84
- aplic->iforce = g_new0(uint32_t, aplic->num_harts);
85
- aplic->ithreshold = g_new0(uint32_t, aplic->num_harts);
86
+ aplic->idelivery = g_new0(uint32_t, aplic->num_harts);
87
+ aplic->iforce = g_new0(uint32_t, aplic->num_harts);
88
+ aplic->ithreshold = g_new0(uint32_t, aplic->num_harts);
89
90
- memory_region_init_io(&aplic->mmio, OBJECT(dev), &riscv_aplic_ops, aplic,
91
- TYPE_RISCV_APLIC, aplic->aperture_size);
92
- sysbus_init_mmio(SYS_BUS_DEVICE(dev), &aplic->mmio);
93
+ memory_region_init_io(&aplic->mmio, OBJECT(dev), &riscv_aplic_ops,
94
+ aplic, TYPE_RISCV_APLIC, aplic->aperture_size);
95
+ sysbus_init_mmio(SYS_BUS_DEVICE(dev), &aplic->mmio);
96
+ }
97
98
/*
99
* Only root APLICs have hardware IRQ lines. All non-root APLICs
100
* have IRQ lines delegated by their parent APLIC.
101
*/
102
if (!aplic->parent) {
103
- qdev_init_gpio_in(dev, riscv_aplic_request, aplic->num_irqs);
104
+ if (is_kvm_aia(aplic->msimode)) {
105
+ qdev_init_gpio_in(dev, riscv_kvm_aplic_request, aplic->num_irqs);
106
+ } else {
107
+ qdev_init_gpio_in(dev, riscv_aplic_request, aplic->num_irqs);
108
+ }
109
}
110
111
/* Create output IRQ lines for non-MSI mode */
112
@@ -XXX,XX +XXX,XX @@ DeviceState *riscv_aplic_create(hwaddr addr, hwaddr size,
113
qdev_prop_set_bit(dev, "mmode", mmode);
114
115
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
116
- sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr);
67
+
117
+
68
+static bool trans_cpopw(DisasContext *ctx, arg_cpopw *a)
118
+ if (!is_kvm_aia(msimode)) {
69
+{
119
+ sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr);
70
+ REQUIRE_64BIT(ctx);
120
+ }
71
+ REQUIRE_EXT(ctx, RVB);
121
72
+ return gen_unary(ctx, a, gen_cpopw);
122
if (parent) {
73
+}
123
riscv_aplic_add_child(parent, dev);
124
diff --git a/hw/intc/riscv_imsic.c b/hw/intc/riscv_imsic.c
125
index XXXXXXX..XXXXXXX 100644
126
--- a/hw/intc/riscv_imsic.c
127
+++ b/hw/intc/riscv_imsic.c
128
@@ -XXX,XX +XXX,XX @@
129
#include "target/riscv/cpu.h"
130
#include "target/riscv/cpu_bits.h"
131
#include "sysemu/sysemu.h"
132
+#include "sysemu/kvm.h"
133
#include "migration/vmstate.h"
134
135
#define IMSIC_MMIO_PAGE_LE 0x00
136
@@ -XXX,XX +XXX,XX @@ static void riscv_imsic_write(void *opaque, hwaddr addr, uint64_t value,
137
goto err;
138
}
139
140
+#if defined(CONFIG_KVM)
141
+ if (kvm_irqchip_in_kernel()) {
142
+ struct kvm_msi msi;
143
+
144
+ msi.address_lo = extract64(imsic->mmio.addr + addr, 0, 32);
145
+ msi.address_hi = extract64(imsic->mmio.addr + addr, 32, 32);
146
+ msi.data = le32_to_cpu(value);
147
+
148
+ kvm_vm_ioctl(kvm_state, KVM_SIGNAL_MSI, &msi);
149
+
150
+ return;
151
+ }
152
+#endif
153
+
154
/* Writes only supported for MSI little-endian registers */
155
page = addr >> IMSIC_MMIO_PAGE_SHIFT;
156
if ((addr & (IMSIC_MMIO_PAGE_SZ - 1)) == IMSIC_MMIO_PAGE_LE) {
157
@@ -XXX,XX +XXX,XX @@ static void riscv_imsic_realize(DeviceState *dev, Error **errp)
158
CPUState *cpu = cpu_by_arch_id(imsic->hartid);
159
CPURISCVState *env = cpu ? cpu->env_ptr : NULL;
160
161
- imsic->num_eistate = imsic->num_pages * imsic->num_irqs;
162
- imsic->eidelivery = g_new0(uint32_t, imsic->num_pages);
163
- imsic->eithreshold = g_new0(uint32_t, imsic->num_pages);
164
- imsic->eistate = g_new0(uint32_t, imsic->num_eistate);
165
+ if (!kvm_irqchip_in_kernel()) {
166
+ imsic->num_eistate = imsic->num_pages * imsic->num_irqs;
167
+ imsic->eidelivery = g_new0(uint32_t, imsic->num_pages);
168
+ imsic->eithreshold = g_new0(uint32_t, imsic->num_pages);
169
+ imsic->eistate = g_new0(uint32_t, imsic->num_eistate);
170
+ }
171
172
memory_region_init_io(&imsic->mmio, OBJECT(dev), &riscv_imsic_ops,
173
imsic, TYPE_RISCV_IMSIC,
74
--
174
--
75
2.31.1
175
2.41.0
76
77
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: Yong-Xuan Wang <yongxuan.wang@sifive.com>
2
2
3
Since commit 78da6a1bca22 ("device_tree: add qemu_fdt_setprop_string_array helper"),
3
Select KVM AIA when the host kernel has in-kernel AIA chip support.
4
we can use the new helper to set the compatible strings for the
4
Since KVM AIA only has one APLIC instance, we map the QEMU APLIC
5
SiFive test device node.
5
devices to KVM APLIC.
6
6
7
Signed-off-by: Bin Meng <bin.meng@windriver.com>
7
Signed-off-by: Yong-Xuan Wang <yongxuan.wang@sifive.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Jim Shu <jim.shu@sifive.com>
9
Message-id: 20210430071302.1489082-2-bmeng.cn@gmail.com
9
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
10
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
11
Message-ID: <20230727102439.22554-6-yongxuan.wang@sifive.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
13
---
12
hw/riscv/virt.c | 7 +++++--
14
hw/riscv/virt.c | 94 +++++++++++++++++++++++++++++++++----------------
13
1 file changed, 5 insertions(+), 2 deletions(-)
15
1 file changed, 63 insertions(+), 31 deletions(-)
14
16
15
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
17
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
16
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/riscv/virt.c
19
--- a/hw/riscv/virt.c
18
+++ b/hw/riscv/virt.c
20
+++ b/hw/riscv/virt.c
19
@@ -XXX,XX +XXX,XX @@ static void create_fdt(RISCVVirtState *s, const MemMapEntry *memmap,
21
@@ -XXX,XX +XXX,XX @@
20
(long)memmap[VIRT_TEST].base);
22
#include "hw/riscv/virt.h"
21
qemu_fdt_add_subnode(fdt, name);
23
#include "hw/riscv/boot.h"
22
{
24
#include "hw/riscv/numa.h"
23
- const char compat[] = "sifive,test1\0sifive,test0\0syscon";
25
+#include "kvm_riscv.h"
24
- qemu_fdt_setprop(fdt, name, "compatible", compat, sizeof(compat));
26
#include "hw/intc/riscv_aclint.h"
25
+ static const char * const compat[3] = {
27
#include "hw/intc/riscv_aplic.h"
26
+ "sifive,test1", "sifive,test0", "syscon"
28
#include "hw/intc/riscv_imsic.h"
27
+ };
29
@@ -XXX,XX +XXX,XX @@
28
+ qemu_fdt_setprop_string_array(fdt, name, "compatible", (char **)&compat,
30
#error "Can't accommodate all IMSIC groups in address space"
29
+ ARRAY_SIZE(compat));
31
#endif
32
33
+/* KVM AIA only supports APLIC MSI. APLIC Wired is always emulated by QEMU. */
34
+static bool virt_use_kvm_aia(RISCVVirtState *s)
35
+{
36
+ return kvm_irqchip_in_kernel() && s->aia_type == VIRT_AIA_TYPE_APLIC_IMSIC;
37
+}
38
+
39
static const MemMapEntry virt_memmap[] = {
40
[VIRT_DEBUG] = { 0x0, 0x100 },
41
[VIRT_MROM] = { 0x1000, 0xf000 },
42
@@ -XXX,XX +XXX,XX @@ static void create_fdt_one_aplic(RISCVVirtState *s, int socket,
43
uint32_t *intc_phandles,
44
uint32_t aplic_phandle,
45
uint32_t aplic_child_phandle,
46
- bool m_mode)
47
+ bool m_mode, int num_harts)
48
{
49
int cpu;
50
char *aplic_name;
51
uint32_t *aplic_cells;
52
MachineState *ms = MACHINE(s);
53
54
- aplic_cells = g_new0(uint32_t, s->soc[socket].num_harts * 2);
55
+ aplic_cells = g_new0(uint32_t, num_harts * 2);
56
57
- for (cpu = 0; cpu < s->soc[socket].num_harts; cpu++) {
58
+ for (cpu = 0; cpu < num_harts; cpu++) {
59
aplic_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]);
60
aplic_cells[cpu * 2 + 1] = cpu_to_be32(m_mode ? IRQ_M_EXT : IRQ_S_EXT);
30
}
61
}
31
qemu_fdt_setprop_cells(fdt, name, "reg",
62
@@ -XXX,XX +XXX,XX @@ static void create_fdt_one_aplic(RISCVVirtState *s, int socket,
32
0x0, memmap[VIRT_TEST].base,
63
64
if (s->aia_type == VIRT_AIA_TYPE_APLIC) {
65
qemu_fdt_setprop(ms->fdt, aplic_name, "interrupts-extended",
66
- aplic_cells,
67
- s->soc[socket].num_harts * sizeof(uint32_t) * 2);
68
+ aplic_cells, num_harts * sizeof(uint32_t) * 2);
69
} else {
70
qemu_fdt_setprop_cell(ms->fdt, aplic_name, "msi-parent", msi_phandle);
71
}
72
@@ -XXX,XX +XXX,XX @@ static void create_fdt_socket_aplic(RISCVVirtState *s,
73
uint32_t msi_s_phandle,
74
uint32_t *phandle,
75
uint32_t *intc_phandles,
76
- uint32_t *aplic_phandles)
77
+ uint32_t *aplic_phandles,
78
+ int num_harts)
79
{
80
char *aplic_name;
81
unsigned long aplic_addr;
82
@@ -XXX,XX +XXX,XX @@ static void create_fdt_socket_aplic(RISCVVirtState *s,
83
create_fdt_one_aplic(s, socket, aplic_addr, memmap[VIRT_APLIC_M].size,
84
msi_m_phandle, intc_phandles,
85
aplic_m_phandle, aplic_s_phandle,
86
- true);
87
+ true, num_harts);
88
}
89
90
/* S-level APLIC node */
91
@@ -XXX,XX +XXX,XX @@ static void create_fdt_socket_aplic(RISCVVirtState *s,
92
create_fdt_one_aplic(s, socket, aplic_addr, memmap[VIRT_APLIC_S].size,
93
msi_s_phandle, intc_phandles,
94
aplic_s_phandle, 0,
95
- false);
96
+ false, num_harts);
97
98
aplic_name = g_strdup_printf("/soc/aplic@%lx", aplic_addr);
99
100
@@ -XXX,XX +XXX,XX @@ static void create_fdt_sockets(RISCVVirtState *s, const MemMapEntry *memmap,
101
*msi_pcie_phandle = msi_s_phandle;
102
}
103
104
- phandle_pos = ms->smp.cpus;
105
- for (socket = (socket_count - 1); socket >= 0; socket--) {
106
- phandle_pos -= s->soc[socket].num_harts;
107
-
108
- if (s->aia_type == VIRT_AIA_TYPE_NONE) {
109
- create_fdt_socket_plic(s, memmap, socket, phandle,
110
- &intc_phandles[phandle_pos], xplic_phandles);
111
- } else {
112
- create_fdt_socket_aplic(s, memmap, socket,
113
- msi_m_phandle, msi_s_phandle, phandle,
114
- &intc_phandles[phandle_pos], xplic_phandles);
115
+ /* KVM AIA only has one APLIC instance */
116
+ if (virt_use_kvm_aia(s)) {
117
+ create_fdt_socket_aplic(s, memmap, 0,
118
+ msi_m_phandle, msi_s_phandle, phandle,
119
+ &intc_phandles[0], xplic_phandles,
120
+ ms->smp.cpus);
121
+ } else {
122
+ phandle_pos = ms->smp.cpus;
123
+ for (socket = (socket_count - 1); socket >= 0; socket--) {
124
+ phandle_pos -= s->soc[socket].num_harts;
125
+
126
+ if (s->aia_type == VIRT_AIA_TYPE_NONE) {
127
+ create_fdt_socket_plic(s, memmap, socket, phandle,
128
+ &intc_phandles[phandle_pos],
129
+ xplic_phandles);
130
+ } else {
131
+ create_fdt_socket_aplic(s, memmap, socket,
132
+ msi_m_phandle, msi_s_phandle, phandle,
133
+ &intc_phandles[phandle_pos],
134
+ xplic_phandles,
135
+ s->soc[socket].num_harts);
136
+ }
137
}
138
}
139
140
g_free(intc_phandles);
141
142
- for (socket = 0; socket < socket_count; socket++) {
143
- if (socket == 0) {
144
- *irq_mmio_phandle = xplic_phandles[socket];
145
- *irq_virtio_phandle = xplic_phandles[socket];
146
- *irq_pcie_phandle = xplic_phandles[socket];
147
- }
148
- if (socket == 1) {
149
- *irq_virtio_phandle = xplic_phandles[socket];
150
- *irq_pcie_phandle = xplic_phandles[socket];
151
- }
152
- if (socket == 2) {
153
- *irq_pcie_phandle = xplic_phandles[socket];
154
+ if (virt_use_kvm_aia(s)) {
155
+ *irq_mmio_phandle = xplic_phandles[0];
156
+ *irq_virtio_phandle = xplic_phandles[0];
157
+ *irq_pcie_phandle = xplic_phandles[0];
158
+ } else {
159
+ for (socket = 0; socket < socket_count; socket++) {
160
+ if (socket == 0) {
161
+ *irq_mmio_phandle = xplic_phandles[socket];
162
+ *irq_virtio_phandle = xplic_phandles[socket];
163
+ *irq_pcie_phandle = xplic_phandles[socket];
164
+ }
165
+ if (socket == 1) {
166
+ *irq_virtio_phandle = xplic_phandles[socket];
167
+ *irq_pcie_phandle = xplic_phandles[socket];
168
+ }
169
+ if (socket == 2) {
170
+ *irq_pcie_phandle = xplic_phandles[socket];
171
+ }
172
}
173
}
174
175
@@ -XXX,XX +XXX,XX @@ static void virt_machine_init(MachineState *machine)
176
}
177
}
178
179
+ if (virt_use_kvm_aia(s)) {
180
+ kvm_riscv_aia_create(machine, IMSIC_MMIO_GROUP_MIN_SHIFT,
181
+ VIRT_IRQCHIP_NUM_SOURCES, VIRT_IRQCHIP_NUM_MSIS,
182
+ memmap[VIRT_APLIC_S].base,
183
+ memmap[VIRT_IMSIC_S].base,
184
+ s->aia_guests);
185
+ }
186
+
187
if (riscv_is_32bit(&s->soc[0])) {
188
#if HOST_LONG_BITS == 64
189
/* limit RAM size in a 32-bit system */
33
--
190
--
34
2.31.1
191
2.41.0
35
36
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: Conor Dooley <conor.dooley@microchip.com>
2
2
3
The official DT bindings of PLIC uses "sifive,plic-1.0.0" as the
3
On a dtb dumped from the virt machine, dt-validate complains:
4
compatible string in the upstream Linux kernel. "riscv,plic0" is
4
soc: pmu: {'riscv,event-to-mhpmcounters': [[1, 1, 524281], [2, 2, 524284], [65561, 65561, 524280], [65563, 65563, 524280], [65569, 65569, 524280]], 'compatible': ['riscv,pmu']} should not be valid under {'type': 'object'}
5
now legacy and has to be kept for backward compatibility of legacy
5
from schema $id: http://devicetree.org/schemas/simple-bus.yaml#
6
systems.
6
That's pretty cryptic, but running the dtb back through dtc produces
7
something a lot more reasonable:
8
Warning (simple_bus_reg): /soc/pmu: missing or empty reg/ranges property
7
9
8
Signed-off-by: Bin Meng <bin.meng@windriver.com>
10
Moving the riscv,pmu node out of the soc bus solves the problem.
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
11
10
Message-id: 20210430071302.1489082-4-bmeng.cn@gmail.com
12
Signed-off-by: Conor Dooley <conor.dooley@microchip.com>
13
Acked-by: Alistair Francis <alistair.francis@wdc.com>
14
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
15
Message-ID: <20230727-groom-decline-2c57ce42841c@spud>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
16
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
17
---
13
hw/riscv/sifive_u.c | 6 +++++-
18
hw/riscv/virt.c | 2 +-
14
hw/riscv/virt.c | 6 +++++-
19
1 file changed, 1 insertion(+), 1 deletion(-)
15
2 files changed, 10 insertions(+), 2 deletions(-)
16
20
17
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/riscv/sifive_u.c
20
+++ b/hw/riscv/sifive_u.c
21
@@ -XXX,XX +XXX,XX @@ static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
22
static const char * const clint_compat[2] = {
23
"sifive,clint0", "riscv,clint0"
24
};
25
+ static const char * const plic_compat[2] = {
26
+ "sifive,plic-1.0.0", "riscv,plic0"
27
+ };
28
29
if (ms->dtb) {
30
fdt = s->fdt = load_device_tree(ms->dtb, &s->fdt_size);
31
@@ -XXX,XX +XXX,XX @@ static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
32
(long)memmap[SIFIVE_U_DEV_PLIC].base);
33
qemu_fdt_add_subnode(fdt, nodename);
34
qemu_fdt_setprop_cell(fdt, nodename, "#interrupt-cells", 1);
35
- qemu_fdt_setprop_string(fdt, nodename, "compatible", "riscv,plic0");
36
+ qemu_fdt_setprop_string_array(fdt, nodename, "compatible",
37
+ (char **)&plic_compat, ARRAY_SIZE(plic_compat));
38
qemu_fdt_setprop(fdt, nodename, "interrupt-controller", NULL, 0);
39
qemu_fdt_setprop(fdt, nodename, "interrupts-extended",
40
cells, (ms->smp.cpus * 4 - 2) * sizeof(uint32_t));
41
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
21
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
42
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
43
--- a/hw/riscv/virt.c
23
--- a/hw/riscv/virt.c
44
+++ b/hw/riscv/virt.c
24
+++ b/hw/riscv/virt.c
45
@@ -XXX,XX +XXX,XX @@ static void create_fdt(RISCVVirtState *s, const MemMapEntry *memmap,
25
@@ -XXX,XX +XXX,XX @@ static void create_fdt_pmu(RISCVVirtState *s)
46
static const char * const clint_compat[2] = {
26
MachineState *ms = MACHINE(s);
47
"sifive,clint0", "riscv,clint0"
27
RISCVCPU hart = s->soc[0].harts[0];
48
};
28
49
+ static const char * const plic_compat[2] = {
29
- pmu_name = g_strdup_printf("/soc/pmu");
50
+ "sifive,plic-1.0.0", "riscv,plic0"
30
+ pmu_name = g_strdup_printf("/pmu");
51
+ };
31
qemu_fdt_add_subnode(ms->fdt, pmu_name);
52
32
qemu_fdt_setprop_string(ms->fdt, pmu_name, "compatible", "riscv,pmu");
53
if (mc->dtb) {
33
riscv_pmu_generate_fdt_node(ms->fdt, hart.cfg.pmu_num, pmu_name);
54
fdt = mc->fdt = load_device_tree(mc->dtb, &s->fdt_size);
55
@@ -XXX,XX +XXX,XX @@ static void create_fdt(RISCVVirtState *s, const MemMapEntry *memmap,
56
"#address-cells", FDT_PLIC_ADDR_CELLS);
57
qemu_fdt_setprop_cell(fdt, plic_name,
58
"#interrupt-cells", FDT_PLIC_INT_CELLS);
59
- qemu_fdt_setprop_string(fdt, plic_name, "compatible", "riscv,plic0");
60
+ qemu_fdt_setprop_string_array(fdt, plic_name, "compatible",
61
+ (char **)&plic_compat, ARRAY_SIZE(plic_compat));
62
qemu_fdt_setprop(fdt, plic_name, "interrupt-controller", NULL, 0);
63
qemu_fdt_setprop(fdt, plic_name, "interrupts-extended",
64
plic_cells, s->soc[socket].num_harts * sizeof(uint32_t) * 4);
65
--
34
--
66
2.31.1
35
2.41.0
67
68
diff view generated by jsdifflib
1
From: Jose Martins <josemartins90@gmail.com>
1
From: Weiwei Li <liweiwei@iscas.ac.cn>
2
2
3
The wfi exception trigger behavior should take into account user mode,
3
The Svadu specification updated the name of the *envcfg bit from
4
hstatus.vtw, and the fact the an wfi might raise different types of
4
HADE to ADUE.
5
exceptions depending on various factors:
6
5
7
If supervisor mode is not present:
6
Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
8
7
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
9
- an illegal instruction exception should be generated if user mode
8
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
10
executes and wfi instruction and mstatus.tw = 1.
9
Message-ID: <20230816141916.66898-1-liweiwei@iscas.ac.cn>
11
12
If supervisor mode is present:
13
14
- when a wfi instruction is executed, an illegal exception should be triggered
15
if either the current mode is user or the mode is supervisor and mstatus.tw is
16
set.
17
18
Plus, if the hypervisor extensions are enabled:
19
20
- a virtual instruction exception should be raised when a wfi is executed from
21
virtual-user or virtual-supervisor and hstatus.vtw is set.
22
23
Signed-off-by: Jose Martins <josemartins90@gmail.com>
24
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
25
Message-id: 20210420213656.85148-1-josemartins90@gmail.com
26
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
27
---
11
---
28
target/riscv/cpu_bits.h | 1 +
12
target/riscv/cpu_bits.h | 8 ++++----
29
target/riscv/op_helper.c | 11 ++++++++---
13
target/riscv/cpu.c | 4 ++--
30
2 files changed, 9 insertions(+), 3 deletions(-)
14
target/riscv/cpu_helper.c | 6 +++---
15
target/riscv/csr.c | 12 ++++++------
16
4 files changed, 15 insertions(+), 15 deletions(-)
31
17
32
diff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h
18
diff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h
33
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
34
--- a/target/riscv/cpu_bits.h
20
--- a/target/riscv/cpu_bits.h
35
+++ b/target/riscv/cpu_bits.h
21
+++ b/target/riscv/cpu_bits.h
36
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@ typedef enum RISCVException {
37
#define HSTATUS_HU 0x00000200
23
#define MENVCFG_CBIE (3UL << 4)
38
#define HSTATUS_VGEIN 0x0003F000
24
#define MENVCFG_CBCFE BIT(6)
39
#define HSTATUS_VTVM 0x00100000
25
#define MENVCFG_CBZE BIT(7)
40
+#define HSTATUS_VTW 0x00200000
26
-#define MENVCFG_HADE (1ULL << 61)
41
#define HSTATUS_VTSR 0x00400000
27
+#define MENVCFG_ADUE (1ULL << 61)
42
#define HSTATUS_VSXL 0x300000000
28
#define MENVCFG_PBMTE (1ULL << 62)
43
29
#define MENVCFG_STCE (1ULL << 63)
44
diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
30
31
/* For RV32 */
32
-#define MENVCFGH_HADE BIT(29)
33
+#define MENVCFGH_ADUE BIT(29)
34
#define MENVCFGH_PBMTE BIT(30)
35
#define MENVCFGH_STCE BIT(31)
36
37
@@ -XXX,XX +XXX,XX @@ typedef enum RISCVException {
38
#define HENVCFG_CBIE MENVCFG_CBIE
39
#define HENVCFG_CBCFE MENVCFG_CBCFE
40
#define HENVCFG_CBZE MENVCFG_CBZE
41
-#define HENVCFG_HADE MENVCFG_HADE
42
+#define HENVCFG_ADUE MENVCFG_ADUE
43
#define HENVCFG_PBMTE MENVCFG_PBMTE
44
#define HENVCFG_STCE MENVCFG_STCE
45
46
/* For RV32 */
47
-#define HENVCFGH_HADE MENVCFGH_HADE
48
+#define HENVCFGH_ADUE MENVCFGH_ADUE
49
#define HENVCFGH_PBMTE MENVCFGH_PBMTE
50
#define HENVCFGH_STCE MENVCFGH_STCE
51
52
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
45
index XXXXXXX..XXXXXXX 100644
53
index XXXXXXX..XXXXXXX 100644
46
--- a/target/riscv/op_helper.c
54
--- a/target/riscv/cpu.c
47
+++ b/target/riscv/op_helper.c
55
+++ b/target/riscv/cpu.c
48
@@ -XXX,XX +XXX,XX @@ target_ulong helper_mret(CPURISCVState *env, target_ulong cpu_pc_deb)
56
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_reset_hold(Object *obj)
49
void helper_wfi(CPURISCVState *env)
57
env->two_stage_lookup = false;
58
59
env->menvcfg = (cpu->cfg.ext_svpbmt ? MENVCFG_PBMTE : 0) |
60
- (cpu->cfg.ext_svadu ? MENVCFG_HADE : 0);
61
+ (cpu->cfg.ext_svadu ? MENVCFG_ADUE : 0);
62
env->henvcfg = (cpu->cfg.ext_svpbmt ? HENVCFG_PBMTE : 0) |
63
- (cpu->cfg.ext_svadu ? HENVCFG_HADE : 0);
64
+ (cpu->cfg.ext_svadu ? HENVCFG_ADUE : 0);
65
66
/* Initialized default priorities of local interrupts. */
67
for (i = 0; i < ARRAY_SIZE(env->miprio); i++) {
68
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
69
index XXXXXXX..XXXXXXX 100644
70
--- a/target/riscv/cpu_helper.c
71
+++ b/target/riscv/cpu_helper.c
72
@@ -XXX,XX +XXX,XX @@ static int get_physical_address(CPURISCVState *env, hwaddr *physical,
73
}
74
75
bool pbmte = env->menvcfg & MENVCFG_PBMTE;
76
- bool hade = env->menvcfg & MENVCFG_HADE;
77
+ bool adue = env->menvcfg & MENVCFG_ADUE;
78
79
if (first_stage && two_stage && env->virt_enabled) {
80
pbmte = pbmte && (env->henvcfg & HENVCFG_PBMTE);
81
- hade = hade && (env->henvcfg & HENVCFG_HADE);
82
+ adue = adue && (env->henvcfg & HENVCFG_ADUE);
83
}
84
85
int ptshift = (levels - 1) * ptidxbits;
86
@@ -XXX,XX +XXX,XX @@ restart:
87
88
/* Page table updates need to be atomic with MTTCG enabled */
89
if (updated_pte != pte && !is_debug) {
90
- if (!hade) {
91
+ if (!adue) {
92
return TRANSLATE_FAIL;
93
}
94
95
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
96
index XXXXXXX..XXXXXXX 100644
97
--- a/target/riscv/csr.c
98
+++ b/target/riscv/csr.c
99
@@ -XXX,XX +XXX,XX @@ static RISCVException write_menvcfg(CPURISCVState *env, int csrno,
100
if (riscv_cpu_mxl(env) == MXL_RV64) {
101
mask |= (cfg->ext_svpbmt ? MENVCFG_PBMTE : 0) |
102
(cfg->ext_sstc ? MENVCFG_STCE : 0) |
103
- (cfg->ext_svadu ? MENVCFG_HADE : 0);
104
+ (cfg->ext_svadu ? MENVCFG_ADUE : 0);
105
}
106
env->menvcfg = (env->menvcfg & ~mask) | (val & mask);
107
108
@@ -XXX,XX +XXX,XX @@ static RISCVException write_menvcfgh(CPURISCVState *env, int csrno,
109
const RISCVCPUConfig *cfg = riscv_cpu_cfg(env);
110
uint64_t mask = (cfg->ext_svpbmt ? MENVCFG_PBMTE : 0) |
111
(cfg->ext_sstc ? MENVCFG_STCE : 0) |
112
- (cfg->ext_svadu ? MENVCFG_HADE : 0);
113
+ (cfg->ext_svadu ? MENVCFG_ADUE : 0);
114
uint64_t valh = (uint64_t)val << 32;
115
116
env->menvcfg = (env->menvcfg & ~mask) | (valh & mask);
117
@@ -XXX,XX +XXX,XX @@ static RISCVException read_henvcfg(CPURISCVState *env, int csrno,
118
* henvcfg.stce is read_only 0 when menvcfg.stce = 0
119
* henvcfg.hade is read_only 0 when menvcfg.hade = 0
120
*/
121
- *val = env->henvcfg & (~(HENVCFG_PBMTE | HENVCFG_STCE | HENVCFG_HADE) |
122
+ *val = env->henvcfg & (~(HENVCFG_PBMTE | HENVCFG_STCE | HENVCFG_ADUE) |
123
env->menvcfg);
124
return RISCV_EXCP_NONE;
125
}
126
@@ -XXX,XX +XXX,XX @@ static RISCVException write_henvcfg(CPURISCVState *env, int csrno,
127
}
128
129
if (riscv_cpu_mxl(env) == MXL_RV64) {
130
- mask |= env->menvcfg & (HENVCFG_PBMTE | HENVCFG_STCE | HENVCFG_HADE);
131
+ mask |= env->menvcfg & (HENVCFG_PBMTE | HENVCFG_STCE | HENVCFG_ADUE);
132
}
133
134
env->henvcfg = (env->henvcfg & ~mask) | (val & mask);
135
@@ -XXX,XX +XXX,XX @@ static RISCVException read_henvcfgh(CPURISCVState *env, int csrno,
136
return ret;
137
}
138
139
- *val = (env->henvcfg & (~(HENVCFG_PBMTE | HENVCFG_STCE | HENVCFG_HADE) |
140
+ *val = (env->henvcfg & (~(HENVCFG_PBMTE | HENVCFG_STCE | HENVCFG_ADUE) |
141
env->menvcfg)) >> 32;
142
return RISCV_EXCP_NONE;
143
}
144
@@ -XXX,XX +XXX,XX @@ static RISCVException write_henvcfgh(CPURISCVState *env, int csrno,
145
target_ulong val)
50
{
146
{
51
CPUState *cs = env_cpu(env);
147
uint64_t mask = env->menvcfg & (HENVCFG_PBMTE | HENVCFG_STCE |
52
+ bool rvs = riscv_has_ext(env, RVS);
148
- HENVCFG_HADE);
53
+ bool prv_u = env->priv == PRV_U;
149
+ HENVCFG_ADUE);
54
+ bool prv_s = env->priv == PRV_S;
150
uint64_t valh = (uint64_t)val << 32;
55
151
RISCVException ret;
56
- if ((env->priv == PRV_S &&
152
57
- get_field(env->mstatus, MSTATUS_TW)) ||
58
- riscv_cpu_virt_enabled(env)) {
59
+ if (((prv_s || (!rvs && prv_u)) && get_field(env->mstatus, MSTATUS_TW)) ||
60
+ (rvs && prv_u && !riscv_cpu_virt_enabled(env))) {
61
+ riscv_raise_exception(env, RISCV_EXCP_ILLEGAL_INST, GETPC());
62
+ } else if (riscv_cpu_virt_enabled(env) && (prv_u ||
63
+ (prv_s && get_field(env->hstatus, HSTATUS_VTW)))) {
64
riscv_raise_exception(env, RISCV_EXCP_VIRT_INSTRUCTION_FAULT, GETPC());
65
} else {
66
cs->halted = 1;
67
--
153
--
68
2.31.1
154
2.41.0
69
70
diff view generated by jsdifflib
1
From: Bin Meng <bmeng.cn@gmail.com>
1
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
2
2
3
riscv_excp_names[] and riscv_intr_names[] are only referenced by
3
In the same emulated RISC-V host, the 'host' KVM CPU takes 4 times
4
target/riscv/cpu.c locally.
4
longer to boot than the 'rv64' KVM CPU.
5
5
6
Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
6
The reason is an unintended behavior of riscv_cpu_satp_mode_finalize()
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
when satp_mode.supported = 0, i.e. when cpu_init() does not set
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
satp_mode_max_supported(). satp_mode_max_from_map(map) does:
9
Message-id: 20210514052435.2203156-1-bmeng.cn@gmail.com
9
10
31 - __builtin_clz(map)
11
12
This means that, if satp_mode.supported = 0, satp_mode_supported_max
13
wil be '31 - 32'. But this is C, so satp_mode_supported_max will gladly
14
set it to UINT_MAX (4294967295). After that, if the user didn't set a
15
satp_mode, set_satp_mode_default_map(cpu) will make
16
17
cfg.satp_mode.map = cfg.satp_mode.supported
18
19
So satp_mode.map = 0. And then satp_mode_map_max will be set to
20
satp_mode_max_from_map(cpu->cfg.satp_mode.map), i.e. also UINT_MAX. The
21
guard "satp_mode_map_max > satp_mode_supported_max" doesn't protect us
22
here since both are UINT_MAX.
23
24
And finally we have 2 loops:
25
26
for (int i = satp_mode_map_max - 1; i >= 0; --i) {
27
28
Which are, in fact, 2 loops from UINT_MAX -1 to -1. This is where the
29
extra delay when booting the 'host' CPU is coming from.
30
31
Commit 43d1de32f8 already set a precedence for satp_mode.supported = 0
32
in a different manner. We're doing the same here. If supported == 0,
33
interpret as 'the CPU wants the OS to handle satp mode alone' and skip
34
satp_mode_finalize().
35
36
We'll also put a guard in satp_mode_max_from_map() to assert out if map
37
is 0 since the function is not ready to deal with it.
38
39
Cc: Alexandre Ghiti <alexghiti@rivosinc.com>
40
Fixes: 6f23aaeb9b ("riscv: Allow user to set the satp mode")
41
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
42
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
43
Message-ID: <20230817152903.694926-1-dbarboza@ventanamicro.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
44
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
45
---
12
target/riscv/cpu.h | 2 --
46
target/riscv/cpu.c | 23 ++++++++++++++++++++---
13
target/riscv/cpu.c | 4 ++--
47
1 file changed, 20 insertions(+), 3 deletions(-)
14
2 files changed, 2 insertions(+), 4 deletions(-)
15
48
16
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/riscv/cpu.h
19
+++ b/target/riscv/cpu.h
20
@@ -XXX,XX +XXX,XX @@ static inline bool riscv_feature(CPURISCVState *env, int feature)
21
22
extern const char * const riscv_int_regnames[];
23
extern const char * const riscv_fpr_regnames[];
24
-extern const char * const riscv_excp_names[];
25
-extern const char * const riscv_intr_names[];
26
27
const char *riscv_cpu_get_trap_name(target_ulong cause, bool async);
28
void riscv_cpu_do_interrupt(CPUState *cpu);
29
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
49
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
30
index XXXXXXX..XXXXXXX 100644
50
index XXXXXXX..XXXXXXX 100644
31
--- a/target/riscv/cpu.c
51
--- a/target/riscv/cpu.c
32
+++ b/target/riscv/cpu.c
52
+++ b/target/riscv/cpu.c
33
@@ -XXX,XX +XXX,XX @@ const char * const riscv_fpr_regnames[] = {
53
@@ -XXX,XX +XXX,XX @@ static uint8_t satp_mode_from_str(const char *satp_mode_str)
34
"f30/ft10", "f31/ft11"
54
35
};
55
uint8_t satp_mode_max_from_map(uint32_t map)
36
56
{
37
-const char * const riscv_excp_names[] = {
57
+ /*
38
+static const char * const riscv_excp_names[] = {
58
+ * 'map = 0' will make us return (31 - 32), which C will
39
"misaligned_fetch",
59
+ * happily overflow to UINT_MAX. There's no good result to
40
"fault_fetch",
60
+ * return if 'map = 0' (e.g. returning 0 will be ambiguous
41
"illegal_instruction",
61
+ * with the result for 'map = 1').
42
@@ -XXX,XX +XXX,XX @@ const char * const riscv_excp_names[] = {
62
+ *
43
"guest_store_page_fault",
63
+ * Assert out if map = 0. Callers will have to deal with
44
};
64
+ * it outside of this function.
45
65
+ */
46
-const char * const riscv_intr_names[] = {
66
+ g_assert(map > 0);
47
+static const char * const riscv_intr_names[] = {
67
+
48
"u_software",
68
/* map here has at least one bit set, so no problem with clz */
49
"s_software",
69
return 31 - __builtin_clz(map);
50
"vs_software",
70
}
71
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
72
static void riscv_cpu_satp_mode_finalize(RISCVCPU *cpu, Error **errp)
73
{
74
bool rv32 = riscv_cpu_mxl(&cpu->env) == MXL_RV32;
75
- uint8_t satp_mode_map_max;
76
- uint8_t satp_mode_supported_max =
77
- satp_mode_max_from_map(cpu->cfg.satp_mode.supported);
78
+ uint8_t satp_mode_map_max, satp_mode_supported_max;
79
+
80
+ /* The CPU wants the OS to decide which satp mode to use */
81
+ if (cpu->cfg.satp_mode.supported == 0) {
82
+ return;
83
+ }
84
+
85
+ satp_mode_supported_max =
86
+ satp_mode_max_from_map(cpu->cfg.satp_mode.supported);
87
88
if (cpu->cfg.satp_mode.map == 0) {
89
if (cpu->cfg.satp_mode.init == 0) {
51
--
90
--
52
2.31.1
91
2.41.0
53
54
diff view generated by jsdifflib
1
From: Changbin Du <changbin.du@gmail.com>
1
From: Vineet Gupta <vineetg@rivosinc.com>
2
2
3
This dumps the CSR mscratch/sscratch/satp and meanwhile aligns
3
zicond is now codegen supported in both llvm and gcc.
4
the output of CSR mtval/stval.
5
4
6
Signed-off-by: Changbin Du <changbin.du@gmail.com>
5
This change allows seamless enabling/testing of zicond in downstream
6
projects. e.g. currently riscv-gnu-toolchain parses elf attributes
7
to create a cmdline for qemu but fails short of enabling it because of
8
the "x-" prefix.
9
10
Signed-off-by: Vineet Gupta <vineetg@rivosinc.com>
11
Message-ID: <20230808181715.436395-1-vineetg@rivosinc.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
12
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
9
Message-id: 20210519155738.20486-1-changbin.du@gmail.com
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
13
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
14
---
12
target/riscv/cpu.c | 7 +++++--
15
target/riscv/cpu.c | 2 +-
13
1 file changed, 5 insertions(+), 2 deletions(-)
16
1 file changed, 1 insertion(+), 1 deletion(-)
14
17
15
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
18
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
16
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/cpu.c
20
--- a/target/riscv/cpu.c
18
+++ b/target/riscv/cpu.c
21
+++ b/target/riscv/cpu.c
19
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_dump_state(CPUState *cs, FILE *f, int flags)
22
@@ -XXX,XX +XXX,XX @@ static Property riscv_cpu_extensions[] = {
20
if (riscv_has_ext(env, RVH)) {
23
DEFINE_PROP_BOOL("zcf", RISCVCPU, cfg.ext_zcf, false),
21
qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "vscause ", env->vscause);
24
DEFINE_PROP_BOOL("zcmp", RISCVCPU, cfg.ext_zcmp, false),
22
}
25
DEFINE_PROP_BOOL("zcmt", RISCVCPU, cfg.ext_zcmt, false),
23
- qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "mtval ", env->mtval);
26
+ DEFINE_PROP_BOOL("zicond", RISCVCPU, cfg.ext_zicond, false),
24
- qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "stval ", env->stval);
27
25
+ qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "mtval ", env->mtval);
28
/* Vendor-specific custom extensions */
26
+ qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "stval ", env->stval);
29
DEFINE_PROP_BOOL("xtheadba", RISCVCPU, cfg.ext_xtheadba, false),
27
if (riscv_has_ext(env, RVH)) {
30
@@ -XXX,XX +XXX,XX @@ static Property riscv_cpu_extensions[] = {
28
qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "htval ", env->htval);
31
DEFINE_PROP_BOOL("xventanacondops", RISCVCPU, cfg.ext_XVentanaCondOps, false),
29
qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "mtval2 ", env->mtval2);
32
30
}
33
/* These are experimental so mark with 'x-' */
31
+ qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "mscratch", env->mscratch);
34
- DEFINE_PROP_BOOL("x-zicond", RISCVCPU, cfg.ext_zicond, false),
32
+ qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "sscratch", env->sscratch);
35
33
+ qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "satp ", env->satp);
36
/* ePMP 0.9.3 */
34
#endif
37
DEFINE_PROP_BOOL("x-epmp", RISCVCPU, cfg.epmp, false),
35
36
for (i = 0; i < 32; i++) {
37
--
38
--
38
2.31.1
39
2.41.0
39
40
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
2
2
3
Linux kernel commit a2770b57d083 ("dt-bindings: timer: Add CLINT bindings")
3
A build with --enable-debug and without KVM will fail as follows:
4
adds the official DT bindings for CLINT, which uses "sifive,clint0"
5
as the compatible string. "riscv,clint0" is now legacy and has to
6
be kept for backward compatibility of legacy systems.
7
4
8
Signed-off-by: Bin Meng <bin.meng@windriver.com>
5
/usr/bin/ld: libqemu-riscv64-softmmu.fa.p/hw_riscv_virt.c.o: in function `virt_machine_init':
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
./qemu/build/../hw/riscv/virt.c:1465: undefined reference to `kvm_riscv_aia_create'
10
Message-id: 20210430071302.1489082-3-bmeng.cn@gmail.com
7
8
This happens because the code block with "if virt_use_kvm_aia(s)" isn't
9
being ignored by the debug build, resulting in an undefined reference to
10
a KVM only function.
11
12
Add a 'kvm_enabled()' conditional together with virt_use_kvm_aia() will
13
make the compiler crop the kvm_riscv_aia_create() call entirely from a
14
non-KVM build. Note that adding the 'kvm_enabled()' conditional inside
15
virt_use_kvm_aia() won't fix the build because this function would need
16
to be inlined multiple times to make the compiler zero out the entire
17
block.
18
19
While we're at it, use kvm_enabled() in all instances where
20
virt_use_kvm_aia() is checked to allow the compiler to elide these other
21
kvm-only instances as well.
22
23
Suggested-by: Richard Henderson <richard.henderson@linaro.org>
24
Fixes: dbdb99948e ("target/riscv: select KVM AIA in riscv virt machine")
25
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
26
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
27
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
28
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
29
Message-ID: <20230830133503.711138-2-dbarboza@ventanamicro.com>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
30
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
31
---
13
hw/riscv/sifive_u.c | 6 +++++-
32
hw/riscv/virt.c | 6 +++---
14
hw/riscv/spike.c | 6 +++++-
33
1 file changed, 3 insertions(+), 3 deletions(-)
15
hw/riscv/virt.c | 6 +++++-
16
3 files changed, 15 insertions(+), 3 deletions(-)
17
34
18
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/riscv/sifive_u.c
21
+++ b/hw/riscv/sifive_u.c
22
@@ -XXX,XX +XXX,XX @@ static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
23
uint32_t plic_phandle, prci_phandle, gpio_phandle, phandle = 1;
24
uint32_t hfclk_phandle, rtcclk_phandle, phy_phandle;
25
static const char * const ethclk_names[2] = { "pclk", "hclk" };
26
+ static const char * const clint_compat[2] = {
27
+ "sifive,clint0", "riscv,clint0"
28
+ };
29
30
if (ms->dtb) {
31
fdt = s->fdt = load_device_tree(ms->dtb, &s->fdt_size);
32
@@ -XXX,XX +XXX,XX @@ static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
33
nodename = g_strdup_printf("/soc/clint@%lx",
34
(long)memmap[SIFIVE_U_DEV_CLINT].base);
35
qemu_fdt_add_subnode(fdt, nodename);
36
- qemu_fdt_setprop_string(fdt, nodename, "compatible", "riscv,clint0");
37
+ qemu_fdt_setprop_string_array(fdt, nodename, "compatible",
38
+ (char **)&clint_compat, ARRAY_SIZE(clint_compat));
39
qemu_fdt_setprop_cells(fdt, nodename, "reg",
40
0x0, memmap[SIFIVE_U_DEV_CLINT].base,
41
0x0, memmap[SIFIVE_U_DEV_CLINT].size);
42
diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c
43
index XXXXXXX..XXXXXXX 100644
44
--- a/hw/riscv/spike.c
45
+++ b/hw/riscv/spike.c
46
@@ -XXX,XX +XXX,XX @@ static void create_fdt(SpikeState *s, const MemMapEntry *memmap,
47
uint32_t cpu_phandle, intc_phandle, phandle = 1;
48
char *name, *mem_name, *clint_name, *clust_name;
49
char *core_name, *cpu_name, *intc_name;
50
+ static const char * const clint_compat[2] = {
51
+ "sifive,clint0", "riscv,clint0"
52
+ };
53
54
fdt = s->fdt = create_device_tree(&s->fdt_size);
55
if (!fdt) {
56
@@ -XXX,XX +XXX,XX @@ static void create_fdt(SpikeState *s, const MemMapEntry *memmap,
57
(memmap[SPIKE_CLINT].size * socket);
58
clint_name = g_strdup_printf("/soc/clint@%lx", clint_addr);
59
qemu_fdt_add_subnode(fdt, clint_name);
60
- qemu_fdt_setprop_string(fdt, clint_name, "compatible", "riscv,clint0");
61
+ qemu_fdt_setprop_string_array(fdt, clint_name, "compatible",
62
+ (char **)&clint_compat, ARRAY_SIZE(clint_compat));
63
qemu_fdt_setprop_cells(fdt, clint_name, "reg",
64
0x0, clint_addr, 0x0, memmap[SPIKE_CLINT].size);
65
qemu_fdt_setprop(fdt, clint_name, "interrupts-extended",
66
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
35
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
67
index XXXXXXX..XXXXXXX 100644
36
index XXXXXXX..XXXXXXX 100644
68
--- a/hw/riscv/virt.c
37
--- a/hw/riscv/virt.c
69
+++ b/hw/riscv/virt.c
38
+++ b/hw/riscv/virt.c
70
@@ -XXX,XX +XXX,XX @@ static void create_fdt(RISCVVirtState *s, const MemMapEntry *memmap,
39
@@ -XXX,XX +XXX,XX @@ static void create_fdt_sockets(RISCVVirtState *s, const MemMapEntry *memmap,
71
char *name, *clint_name, *plic_name, *clust_name;
40
}
72
hwaddr flashsize = virt_memmap[VIRT_FLASH].size / 2;
41
73
hwaddr flashbase = virt_memmap[VIRT_FLASH].base;
42
/* KVM AIA only has one APLIC instance */
74
+ static const char * const clint_compat[2] = {
43
- if (virt_use_kvm_aia(s)) {
75
+ "sifive,clint0", "riscv,clint0"
44
+ if (kvm_enabled() && virt_use_kvm_aia(s)) {
76
+ };
45
create_fdt_socket_aplic(s, memmap, 0,
77
46
msi_m_phandle, msi_s_phandle, phandle,
78
if (mc->dtb) {
47
&intc_phandles[0], xplic_phandles,
79
fdt = mc->fdt = load_device_tree(mc->dtb, &s->fdt_size);
48
@@ -XXX,XX +XXX,XX @@ static void create_fdt_sockets(RISCVVirtState *s, const MemMapEntry *memmap,
80
@@ -XXX,XX +XXX,XX @@ static void create_fdt(RISCVVirtState *s, const MemMapEntry *memmap,
49
81
(memmap[VIRT_CLINT].size * socket);
50
g_free(intc_phandles);
82
clint_name = g_strdup_printf("/soc/clint@%lx", clint_addr);
51
83
qemu_fdt_add_subnode(fdt, clint_name);
52
- if (virt_use_kvm_aia(s)) {
84
- qemu_fdt_setprop_string(fdt, clint_name, "compatible", "riscv,clint0");
53
+ if (kvm_enabled() && virt_use_kvm_aia(s)) {
85
+ qemu_fdt_setprop_string_array(fdt, clint_name, "compatible",
54
*irq_mmio_phandle = xplic_phandles[0];
86
+ (char **)&clint_compat, ARRAY_SIZE(clint_compat));
55
*irq_virtio_phandle = xplic_phandles[0];
87
qemu_fdt_setprop_cells(fdt, clint_name, "reg",
56
*irq_pcie_phandle = xplic_phandles[0];
88
0x0, clint_addr, 0x0, memmap[VIRT_CLINT].size);
57
@@ -XXX,XX +XXX,XX @@ static void virt_machine_init(MachineState *machine)
89
qemu_fdt_setprop(fdt, clint_name, "interrupts-extended",
58
}
59
}
60
61
- if (virt_use_kvm_aia(s)) {
62
+ if (kvm_enabled() && virt_use_kvm_aia(s)) {
63
kvm_riscv_aia_create(machine, IMSIC_MMIO_GROUP_MIN_SHIFT,
64
VIRT_IRQCHIP_NUM_SOURCES, VIRT_IRQCHIP_NUM_MSIS,
65
memmap[VIRT_APLIC_S].base,
90
--
66
--
91
2.31.1
67
2.41.0
92
68
93
69
diff view generated by jsdifflib
1
From: Kito Cheng <kito.cheng@sifive.com>
1
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
2
2
3
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
3
Commit 6df0b37e2ab breaks a --enable-debug build in a non-KVM
4
environment with the following error:
5
6
/usr/bin/ld: libqemu-riscv64-softmmu.fa.p/hw_intc_riscv_aplic.c.o: in function `riscv_kvm_aplic_request':
7
./qemu/build/../hw/intc/riscv_aplic.c:486: undefined reference to `kvm_set_irq'
8
collect2: error: ld returned 1 exit status
9
10
This happens because the debug build will poke into the
11
'if (is_kvm_aia(aplic->msimode))' block and fail to find a reference to
12
the KVM only function riscv_kvm_aplic_request().
13
14
There are multiple solutions to fix this. We'll go with the same
15
solution from the previous patch, i.e. add a kvm_enabled() conditional
16
to filter out the block. But there's a catch: riscv_kvm_aplic_request()
17
is a local function that would end up being used if the compiler crops
18
the block, and this won't work. Quoting Richard Henderson's explanation
19
in [1]:
20
21
"(...) the compiler won't eliminate entire unused functions with -O0"
22
23
We'll solve it by moving riscv_kvm_aplic_request() to kvm.c and add its
24
declaration in kvm_riscv.h, where all other KVM specific public
25
functions are already declared. Other archs handles KVM specific code in
26
this manner and we expect to do the same from now on.
27
28
[1] https://lore.kernel.org/qemu-riscv/d2f1ad02-eb03-138f-9d08-db676deeed05@linaro.org/
29
30
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
31
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
32
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
33
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
34
Message-ID: <20230830133503.711138-3-dbarboza@ventanamicro.com>
6
Signed-off-by: Frank Chang <frank.chang@sifive.com>
7
Message-id: 20210505160620.15723-8-frank.chang@sifive.com
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
35
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
---
36
---
10
target/riscv/insn32.decode | 3 +++
37
target/riscv/kvm_riscv.h | 1 +
11
target/riscv/insn_trans/trans_rvb.c.inc | 12 ++++++++++++
38
hw/intc/riscv_aplic.c | 8 ++------
12
2 files changed, 15 insertions(+)
39
target/riscv/kvm.c | 5 +++++
40
3 files changed, 8 insertions(+), 6 deletions(-)
13
41
14
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
42
diff --git a/target/riscv/kvm_riscv.h b/target/riscv/kvm_riscv.h
15
index XXXXXXX..XXXXXXX 100644
43
index XXXXXXX..XXXXXXX 100644
16
--- a/target/riscv/insn32.decode
44
--- a/target/riscv/kvm_riscv.h
17
+++ b/target/riscv/insn32.decode
45
+++ b/target/riscv/kvm_riscv.h
18
@@ -XXX,XX +XXX,XX @@ vamomaxud_v 11100 . . ..... ..... 111 ..... 0101111 @r_wdvm
46
@@ -XXX,XX +XXX,XX @@ void kvm_riscv_aia_create(MachineState *machine, uint64_t group_shift,
19
clz 011000 000000 ..... 001 ..... 0010011 @r2
47
uint64_t aia_irq_num, uint64_t aia_msi_num,
20
ctz 011000 000001 ..... 001 ..... 0010011 @r2
48
uint64_t aplic_base, uint64_t imsic_base,
21
cpop 011000 000010 ..... 001 ..... 0010011 @r2
49
uint64_t guest_num);
22
+sext_b 011000 000100 ..... 001 ..... 0010011 @r2
50
+void riscv_kvm_aplic_request(void *opaque, int irq, int level);
23
+sext_h 011000 000101 ..... 001 ..... 0010011 @r2
51
24
+
52
#endif
25
andn 0100000 .......... 111 ..... 0110011 @r
53
diff --git a/hw/intc/riscv_aplic.c b/hw/intc/riscv_aplic.c
26
orn 0100000 .......... 110 ..... 0110011 @r
27
xnor 0100000 .......... 100 ..... 0110011 @r
28
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
29
index XXXXXXX..XXXXXXX 100644
54
index XXXXXXX..XXXXXXX 100644
30
--- a/target/riscv/insn_trans/trans_rvb.c.inc
55
--- a/hw/intc/riscv_aplic.c
31
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
56
+++ b/hw/intc/riscv_aplic.c
32
@@ -XXX,XX +XXX,XX @@ static bool trans_maxu(DisasContext *ctx, arg_maxu *a)
57
@@ -XXX,XX +XXX,XX @@
33
return gen_arith(ctx, a, tcg_gen_umax_tl);
58
#include "target/riscv/cpu.h"
59
#include "sysemu/sysemu.h"
60
#include "sysemu/kvm.h"
61
+#include "kvm_riscv.h"
62
#include "migration/vmstate.h"
63
64
#define APLIC_MAX_IDC (1UL << 14)
65
@@ -XXX,XX +XXX,XX @@ static uint32_t riscv_aplic_idc_claimi(RISCVAPLICState *aplic, uint32_t idc)
66
return topi;
34
}
67
}
35
68
36
+static bool trans_sext_b(DisasContext *ctx, arg_sext_b *a)
69
-static void riscv_kvm_aplic_request(void *opaque, int irq, int level)
70
-{
71
- kvm_set_irq(kvm_state, irq, !!level);
72
-}
73
-
74
static void riscv_aplic_request(void *opaque, int irq, int level)
75
{
76
bool update = false;
77
@@ -XXX,XX +XXX,XX @@ static void riscv_aplic_realize(DeviceState *dev, Error **errp)
78
* have IRQ lines delegated by their parent APLIC.
79
*/
80
if (!aplic->parent) {
81
- if (is_kvm_aia(aplic->msimode)) {
82
+ if (kvm_enabled() && is_kvm_aia(aplic->msimode)) {
83
qdev_init_gpio_in(dev, riscv_kvm_aplic_request, aplic->num_irqs);
84
} else {
85
qdev_init_gpio_in(dev, riscv_aplic_request, aplic->num_irqs);
86
diff --git a/target/riscv/kvm.c b/target/riscv/kvm.c
87
index XXXXXXX..XXXXXXX 100644
88
--- a/target/riscv/kvm.c
89
+++ b/target/riscv/kvm.c
90
@@ -XXX,XX +XXX,XX @@
91
#include "sysemu/runstate.h"
92
#include "hw/riscv/numa.h"
93
94
+void riscv_kvm_aplic_request(void *opaque, int irq, int level)
37
+{
95
+{
38
+ REQUIRE_EXT(ctx, RVB);
96
+ kvm_set_irq(kvm_state, irq, !!level);
39
+ return gen_unary(ctx, a, tcg_gen_ext8s_tl);
40
+}
97
+}
41
+
98
+
42
+static bool trans_sext_h(DisasContext *ctx, arg_sext_h *a)
99
static uint64_t kvm_riscv_reg_id(CPURISCVState *env, uint64_t type,
43
+{
100
uint64_t idx)
44
+ REQUIRE_EXT(ctx, RVB);
45
+ return gen_unary(ctx, a, tcg_gen_ext16s_tl);
46
+}
47
+
48
static bool trans_clzw(DisasContext *ctx, arg_clzw *a)
49
{
101
{
50
REQUIRE_64BIT(ctx);
51
--
102
--
52
2.31.1
103
2.41.0
53
104
54
105
diff view generated by jsdifflib
New patch
1
From: Robbin Ehn <rehn@rivosinc.com>
1
2
3
This patch adds the new extensions in
4
linux 6.5 to the hwprobe syscall.
5
6
And fixes RVC check to OR with correct value.
7
The previous variable contains 0 therefore it
8
did work.
9
10
Signed-off-by: Robbin Ehn <rehn@rivosinc.com>
11
Acked-by: Richard Henderson <richard.henderson@linaro.org>
12
Acked-by: Alistair Francis <alistair.francis@wdc.com>
13
Message-ID: <bc82203b72d7efb30f1b4a8f9eb3d94699799dc8.camel@rivosinc.com>
14
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
15
---
16
linux-user/syscall.c | 14 +++++++++++++-
17
1 file changed, 13 insertions(+), 1 deletion(-)
18
19
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/linux-user/syscall.c
22
+++ b/linux-user/syscall.c
23
@@ -XXX,XX +XXX,XX @@ static int do_getdents64(abi_long dirfd, abi_long arg2, abi_long count)
24
#define RISCV_HWPROBE_KEY_IMA_EXT_0 4
25
#define RISCV_HWPROBE_IMA_FD (1 << 0)
26
#define RISCV_HWPROBE_IMA_C (1 << 1)
27
+#define RISCV_HWPROBE_IMA_V (1 << 2)
28
+#define RISCV_HWPROBE_EXT_ZBA (1 << 3)
29
+#define RISCV_HWPROBE_EXT_ZBB (1 << 4)
30
+#define RISCV_HWPROBE_EXT_ZBS (1 << 5)
31
32
#define RISCV_HWPROBE_KEY_CPUPERF_0 5
33
#define RISCV_HWPROBE_MISALIGNED_UNKNOWN (0 << 0)
34
@@ -XXX,XX +XXX,XX @@ static void risc_hwprobe_fill_pairs(CPURISCVState *env,
35
riscv_has_ext(env, RVD) ?
36
RISCV_HWPROBE_IMA_FD : 0;
37
value |= riscv_has_ext(env, RVC) ?
38
- RISCV_HWPROBE_IMA_C : pair->value;
39
+ RISCV_HWPROBE_IMA_C : 0;
40
+ value |= riscv_has_ext(env, RVV) ?
41
+ RISCV_HWPROBE_IMA_V : 0;
42
+ value |= cfg->ext_zba ?
43
+ RISCV_HWPROBE_EXT_ZBA : 0;
44
+ value |= cfg->ext_zbb ?
45
+ RISCV_HWPROBE_EXT_ZBB : 0;
46
+ value |= cfg->ext_zbs ?
47
+ RISCV_HWPROBE_EXT_ZBS : 0;
48
__put_user(value, &pair->value);
49
break;
50
case RISCV_HWPROBE_KEY_CPUPERF_0:
51
--
52
2.41.0
diff view generated by jsdifflib
1
From: Kito Cheng <kito.cheng@sifive.com>
1
From: Ard Biesheuvel <ardb@kernel.org>
2
2
3
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
3
Use the accelerated SubBytes/ShiftRows/AddRoundKey AES helper to
4
implement the first half of the key schedule derivation. This does not
5
actually involve shifting rows, so clone the same value into all four
6
columns of the AES vector to counter that operation.
7
8
Cc: Richard Henderson <richard.henderson@linaro.org>
9
Cc: Philippe Mathieu-Daudé <philmd@linaro.org>
10
Cc: Palmer Dabbelt <palmer@dabbelt.com>
11
Cc: Alistair Francis <alistair.francis@wdc.com>
12
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
13
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
15
Message-ID: <20230831154118.138727-1-ardb@kernel.org>
6
Signed-off-by: Frank Chang <frank.chang@sifive.com>
7
Message-id: 20210505160620.15723-7-frank.chang@sifive.com
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
16
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
---
17
---
10
target/riscv/insn32.decode | 4 ++++
18
target/riscv/crypto_helper.c | 17 +++++------------
11
target/riscv/insn_trans/trans_rvb.c.inc | 24 ++++++++++++++++++++++++
19
1 file changed, 5 insertions(+), 12 deletions(-)
12
2 files changed, 28 insertions(+)
13
20
14
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
21
diff --git a/target/riscv/crypto_helper.c b/target/riscv/crypto_helper.c
15
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
16
--- a/target/riscv/insn32.decode
23
--- a/target/riscv/crypto_helper.c
17
+++ b/target/riscv/insn32.decode
24
+++ b/target/riscv/crypto_helper.c
18
@@ -XXX,XX +XXX,XX @@ xnor 0100000 .......... 100 ..... 0110011 @r
25
@@ -XXX,XX +XXX,XX @@ target_ulong HELPER(aes64ks1i)(target_ulong rs1, target_ulong rnum)
19
pack 0000100 .......... 100 ..... 0110011 @r
26
20
packu 0100100 .......... 100 ..... 0110011 @r
27
uint8_t enc_rnum = rnum;
21
packh 0000100 .......... 111 ..... 0110011 @r
28
uint32_t temp = (RS1 >> 32) & 0xFFFFFFFF;
22
+min 0000101 .......... 100 ..... 0110011 @r
29
- uint8_t rcon_ = 0;
23
+minu 0000101 .......... 101 ..... 0110011 @r
30
- target_ulong result;
24
+max 0000101 .......... 110 ..... 0110011 @r
31
+ AESState t, rc = {};
25
+maxu 0000101 .......... 111 ..... 0110011 @r
32
26
33
if (enc_rnum != 0xA) {
27
# *** RV64B Standard Extension (in addition to RV32B) ***
34
temp = ror32(temp, 8); /* Rotate right by 8 */
28
clzw 0110000 00000 ..... 001 ..... 0011011 @r2
35
- rcon_ = round_consts[enc_rnum];
29
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
36
+ rc.w[0] = rc.w[1] = round_consts[enc_rnum];
30
index XXXXXXX..XXXXXXX 100644
37
}
31
--- a/target/riscv/insn_trans/trans_rvb.c.inc
38
32
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
39
- temp = ((uint32_t)AES_sbox[(temp >> 24) & 0xFF] << 24) |
33
@@ -XXX,XX +XXX,XX @@ static bool trans_packh(DisasContext *ctx, arg_packh *a)
40
- ((uint32_t)AES_sbox[(temp >> 16) & 0xFF] << 16) |
34
return gen_arith(ctx, a, gen_packh);
41
- ((uint32_t)AES_sbox[(temp >> 8) & 0xFF] << 8) |
42
- ((uint32_t)AES_sbox[(temp >> 0) & 0xFF] << 0);
43
+ t.w[0] = t.w[1] = t.w[2] = t.w[3] = temp;
44
+ aesenc_SB_SR_AK(&t, &t, &rc, false);
45
46
- temp ^= rcon_;
47
-
48
- result = ((uint64_t)temp << 32) | temp;
49
-
50
- return result;
51
+ return t.d[0];
35
}
52
}
36
53
37
+static bool trans_min(DisasContext *ctx, arg_min *a)
54
target_ulong HELPER(aes64im)(target_ulong rs1)
38
+{
39
+ REQUIRE_EXT(ctx, RVB);
40
+ return gen_arith(ctx, a, tcg_gen_smin_tl);
41
+}
42
+
43
+static bool trans_max(DisasContext *ctx, arg_max *a)
44
+{
45
+ REQUIRE_EXT(ctx, RVB);
46
+ return gen_arith(ctx, a, tcg_gen_smax_tl);
47
+}
48
+
49
+static bool trans_minu(DisasContext *ctx, arg_minu *a)
50
+{
51
+ REQUIRE_EXT(ctx, RVB);
52
+ return gen_arith(ctx, a, tcg_gen_umin_tl);
53
+}
54
+
55
+static bool trans_maxu(DisasContext *ctx, arg_maxu *a)
56
+{
57
+ REQUIRE_EXT(ctx, RVB);
58
+ return gen_arith(ctx, a, tcg_gen_umax_tl);
59
+}
60
+
61
static bool trans_clzw(DisasContext *ctx, arg_clzw *a)
62
{
63
REQUIRE_64BIT(ctx);
64
--
55
--
65
2.31.1
56
2.41.0
66
57
67
58
diff view generated by jsdifflib
1
From: Frank Chang <frank.chang@sifive.com>
1
From: Akihiko Odaki <akihiko.odaki@daynix.com>
2
2
3
Default b-ext version is v0.93.
3
riscv_trigger_init() had been called on reset events that can happen
4
several times for a CPU and it allocated timers for itrigger. If old
5
timers were present, they were simply overwritten by the new timers,
6
resulting in a memory leak.
4
7
5
Signed-off-by: Frank Chang <frank.chang@sifive.com>
8
Divide riscv_trigger_init() into two functions, namely
9
riscv_trigger_realize() and riscv_trigger_reset() and call them in
10
appropriate timing. The timer allocation will happen only once for a
11
CPU in riscv_trigger_realize().
12
13
Fixes: 5a4ae64cac ("target/riscv: Add itrigger support when icount is enabled")
14
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
15
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
16
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
17
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Message-id: 20210505160620.15723-18-frank.chang@sifive.com
18
Message-ID: <20230818034059.9146-1-akihiko.odaki@daynix.com>
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
19
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
---
20
---
10
target/riscv/cpu.h | 3 +++
21
target/riscv/debug.h | 3 ++-
11
target/riscv/cpu.c | 23 +++++++++++++++++++++++
22
target/riscv/cpu.c | 8 +++++++-
12
2 files changed, 26 insertions(+)
23
target/riscv/debug.c | 15 ++++++++++++---
24
3 files changed, 21 insertions(+), 5 deletions(-)
13
25
14
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
26
diff --git a/target/riscv/debug.h b/target/riscv/debug.h
15
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
16
--- a/target/riscv/cpu.h
28
--- a/target/riscv/debug.h
17
+++ b/target/riscv/cpu.h
29
+++ b/target/riscv/debug.h
18
@@ -XXX,XX +XXX,XX @@ enum {
30
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_debug_excp_handler(CPUState *cs);
19
#define PRIV_VERSION_1_10_0 0x00011000
31
bool riscv_cpu_debug_check_breakpoint(CPUState *cs);
20
#define PRIV_VERSION_1_11_0 0x00011100
32
bool riscv_cpu_debug_check_watchpoint(CPUState *cs, CPUWatchpoint *wp);
21
33
22
+#define BEXT_VERSION_0_93_0 0x00009300
34
-void riscv_trigger_init(CPURISCVState *env);
23
#define VEXT_VERSION_0_07_1 0x00000701
35
+void riscv_trigger_realize(CPURISCVState *env);
24
36
+void riscv_trigger_reset_hold(CPURISCVState *env);
25
enum {
37
26
@@ -XXX,XX +XXX,XX @@ struct CPURISCVState {
38
bool riscv_itrigger_enabled(CPURISCVState *env);
27
target_ulong guest_phys_fault_addr;
39
void riscv_itrigger_update_priv(CPURISCVState *env);
28
29
target_ulong priv_ver;
30
+ target_ulong bext_ver;
31
target_ulong vext_ver;
32
target_ulong misa;
33
target_ulong misa_mask;
34
@@ -XXX,XX +XXX,XX @@ struct RISCVCPU {
35
36
char *priv_spec;
37
char *user_spec;
38
+ char *bext_spec;
39
char *vext_spec;
40
uint16_t vlen;
41
uint16_t elen;
42
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
40
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
43
index XXXXXXX..XXXXXXX 100644
41
index XXXXXXX..XXXXXXX 100644
44
--- a/target/riscv/cpu.c
42
--- a/target/riscv/cpu.c
45
+++ b/target/riscv/cpu.c
43
+++ b/target/riscv/cpu.c
46
@@ -XXX,XX +XXX,XX @@ static void set_priv_version(CPURISCVState *env, int priv_ver)
44
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_reset_hold(Object *obj)
47
env->priv_ver = priv_ver;
45
46
#ifndef CONFIG_USER_ONLY
47
if (cpu->cfg.debug) {
48
- riscv_trigger_init(env);
49
+ riscv_trigger_reset_hold(env);
50
}
51
52
if (kvm_enabled()) {
53
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
54
55
riscv_cpu_register_gdb_regs_for_features(cs);
56
57
+#ifndef CONFIG_USER_ONLY
58
+ if (cpu->cfg.debug) {
59
+ riscv_trigger_realize(&cpu->env);
60
+ }
61
+#endif
62
+
63
qemu_init_vcpu(cs);
64
cpu_reset(cs);
65
66
diff --git a/target/riscv/debug.c b/target/riscv/debug.c
67
index XXXXXXX..XXXXXXX 100644
68
--- a/target/riscv/debug.c
69
+++ b/target/riscv/debug.c
70
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_debug_check_watchpoint(CPUState *cs, CPUWatchpoint *wp)
71
return false;
48
}
72
}
49
73
50
+static void set_bext_version(CPURISCVState *env, int bext_ver)
74
-void riscv_trigger_init(CPURISCVState *env)
75
+void riscv_trigger_realize(CPURISCVState *env)
51
+{
76
+{
52
+ env->bext_ver = bext_ver;
77
+ int i;
78
+
79
+ for (i = 0; i < RV_MAX_TRIGGERS; i++) {
80
+ env->itrigger_timer[i] = timer_new_ns(QEMU_CLOCK_VIRTUAL,
81
+ riscv_itrigger_timer_cb, env);
82
+ }
53
+}
83
+}
54
+
84
+
55
static void set_vext_version(CPURISCVState *env, int vext_ver)
85
+void riscv_trigger_reset_hold(CPURISCVState *env)
56
{
86
{
57
env->vext_ver = vext_ver;
87
target_ulong tdata1 = build_tdata1(env, TRIGGER_TYPE_AD_MATCH, 0, 0);
58
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
88
int i;
59
CPURISCVState *env = &cpu->env;
89
@@ -XXX,XX +XXX,XX @@ void riscv_trigger_init(CPURISCVState *env)
60
RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(dev);
90
env->tdata3[i] = 0;
61
int priv_version = PRIV_VERSION_1_11_0;
91
env->cpu_breakpoint[i] = NULL;
62
+ int bext_version = BEXT_VERSION_0_93_0;
92
env->cpu_watchpoint[i] = NULL;
63
int vext_version = VEXT_VERSION_0_07_1;
93
- env->itrigger_timer[i] = timer_new_ns(QEMU_CLOCK_VIRTUAL,
64
target_ulong target_misa = env->misa;
94
- riscv_itrigger_timer_cb, env);
65
Error *local_err = NULL;
95
+ timer_del(env->itrigger_timer[i]);
66
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
67
}
96
}
68
97
}
69
set_priv_version(env, priv_version);
70
+ set_bext_version(env, bext_version);
71
set_vext_version(env, vext_version);
72
73
if (cpu->cfg.mmu) {
74
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
75
}
76
if (cpu->cfg.ext_b) {
77
target_misa |= RVB;
78
+
79
+ if (cpu->cfg.bext_spec) {
80
+ if (!g_strcmp0(cpu->cfg.bext_spec, "v0.93")) {
81
+ bext_version = BEXT_VERSION_0_93_0;
82
+ } else {
83
+ error_setg(errp,
84
+ "Unsupported bitmanip spec version '%s'",
85
+ cpu->cfg.bext_spec);
86
+ return;
87
+ }
88
+ } else {
89
+ qemu_log("bitmanip version is not specified, "
90
+ "use the default value v0.93\n");
91
+ }
92
+ set_bext_version(env, bext_version);
93
}
94
if (cpu->cfg.ext_v) {
95
target_misa |= RVV;
96
@@ -XXX,XX +XXX,XX @@ static Property riscv_cpu_properties[] = {
97
DEFINE_PROP_BOOL("Zifencei", RISCVCPU, cfg.ext_ifencei, true),
98
DEFINE_PROP_BOOL("Zicsr", RISCVCPU, cfg.ext_icsr, true),
99
DEFINE_PROP_STRING("priv_spec", RISCVCPU, cfg.priv_spec),
100
+ DEFINE_PROP_STRING("bext_spec", RISCVCPU, cfg.bext_spec),
101
DEFINE_PROP_STRING("vext_spec", RISCVCPU, cfg.vext_spec),
102
DEFINE_PROP_UINT16("vlen", RISCVCPU, cfg.vlen, 128),
103
DEFINE_PROP_UINT16("elen", RISCVCPU, cfg.elen, 64),
104
--
98
--
105
2.31.1
99
2.41.0
106
100
107
101
diff view generated by jsdifflib
1
Although we construct epmp_operation in such a way that it can only be
1
From: Leon Schuermann <leons@opentitan.org>
2
between 0 and 15 Coverity complains that we don't handle the other
3
possible cases. To fix Coverity and make it easier for humans to read
4
add a default case to the switch statement that calls
5
g_assert_not_reached().
6
2
7
Fixes: CID 1453108
3
When the rule-lock bypass (RLB) bit is set in the mseccfg CSR, the PMP
4
configuration lock bits must not apply. While this behavior is
5
implemented for the pmpcfgX CSRs, this bit is not respected for
6
changes to the pmpaddrX CSRs. This patch ensures that pmpaddrX CSR
7
writes work even on locked regions when the global rule-lock bypass is
8
enabled.
9
10
Signed-off-by: Leon Schuermann <leons@opentitan.org>
11
Reviewed-by: Mayuresh Chitale <mchitale@ventanamicro.com>
12
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
13
Message-ID: <20230829215046.1430463-1-leon@is.currently.online>
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
14
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
10
Reviewed-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
11
Message-id: ec5f225928eec448278c82fcb1f6805ee61dde82.1621550996.git.alistair.francis@wdc.com
12
---
15
---
13
target/riscv/pmp.c | 4 ++++
16
target/riscv/pmp.c | 4 ++++
14
1 file changed, 4 insertions(+)
17
1 file changed, 4 insertions(+)
15
18
16
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
19
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
17
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
18
--- a/target/riscv/pmp.c
21
--- a/target/riscv/pmp.c
19
+++ b/target/riscv/pmp.c
22
+++ b/target/riscv/pmp.c
20
@@ -XXX,XX +XXX,XX @@ bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
23
@@ -XXX,XX +XXX,XX @@ static inline uint8_t pmp_get_a_field(uint8_t cfg)
21
case 15:
24
*/
22
*allowed_privs = PMP_READ;
25
static inline int pmp_is_locked(CPURISCVState *env, uint32_t pmp_index)
23
break;
26
{
24
+ default:
27
+ /* mseccfg.RLB is set */
25
+ g_assert_not_reached();
28
+ if (MSECCFG_RLB_ISSET(env)) {
26
}
29
+ return 0;
27
} else {
30
+ }
28
switch (epmp_operation) {
31
29
@@ -XXX,XX +XXX,XX @@ bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
32
if (env->pmp_state.pmp[pmp_index].cfg_reg & PMP_LOCK) {
30
case 7:
33
return 1;
31
*allowed_privs = PMP_READ | PMP_WRITE | PMP_EXEC;
32
break;
33
+ default:
34
+ g_assert_not_reached();
35
}
36
}
37
}
38
--
34
--
39
2.31.1
35
2.41.0
40
41
diff view generated by jsdifflib
New patch
1
From: Tommy Wu <tommy.wu@sifive.com>
1
2
3
According to the new spec, when vsiselect has a reserved value, attempts
4
from M-mode or HS-mode to access vsireg, or from VS-mode to access
5
sireg, should preferably raise an illegal instruction exception.
6
7
Signed-off-by: Tommy Wu <tommy.wu@sifive.com>
8
Reviewed-by: Frank Chang <frank.chang@sifive.com>
9
Message-ID: <20230816061647.600672-1-tommy.wu@sifive.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
target/riscv/csr.c | 7 +++++--
13
1 file changed, 5 insertions(+), 2 deletions(-)
14
15
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/csr.c
18
+++ b/target/riscv/csr.c
19
@@ -XXX,XX +XXX,XX @@ static int rmw_iprio(target_ulong xlen,
20
static int rmw_xireg(CPURISCVState *env, int csrno, target_ulong *val,
21
target_ulong new_val, target_ulong wr_mask)
22
{
23
- bool virt;
24
+ bool virt, isel_reserved;
25
uint8_t *iprio;
26
int ret = -EINVAL;
27
target_ulong priv, isel, vgein;
28
@@ -XXX,XX +XXX,XX @@ static int rmw_xireg(CPURISCVState *env, int csrno, target_ulong *val,
29
30
/* Decode register details from CSR number */
31
virt = false;
32
+ isel_reserved = false;
33
switch (csrno) {
34
case CSR_MIREG:
35
iprio = env->miprio;
36
@@ -XXX,XX +XXX,XX @@ static int rmw_xireg(CPURISCVState *env, int csrno, target_ulong *val,
37
riscv_cpu_mxl_bits(env)),
38
val, new_val, wr_mask);
39
}
40
+ } else {
41
+ isel_reserved = true;
42
}
43
44
done:
45
if (ret) {
46
- return (env->virt_enabled && virt) ?
47
+ return (env->virt_enabled && virt && !isel_reserved) ?
48
RISCV_EXCP_VIRT_INSTRUCTION_FAULT : RISCV_EXCP_ILLEGAL_INST;
49
}
50
return RISCV_EXCP_NONE;
51
--
52
2.41.0
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: Nikita Shubin <n.shubin@yadro.com>
2
2
3
The OpenSBI BIOS image names are used by many RISC-V machines.
3
As per ISA:
4
Let's define macros for them.
5
4
6
Signed-off-by: Bin Meng <bin.meng@windriver.com>
5
"For CSRRWI, if rd=x0, then the instruction shall not read the CSR and
6
shall not cause any of the side effects that might occur on a CSR read."
7
8
trans_csrrwi() and trans_csrrw() call do_csrw() if rd=x0, do_csrw() calls
9
riscv_csrrw_do64(), via helper_csrw() passing NULL as *ret_value.
10
11
Signed-off-by: Nikita Shubin <n.shubin@yadro.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
12
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-id: 20210430071302.1489082-7-bmeng.cn@gmail.com
13
Message-ID: <20230808090914.17634-1-nikita.shubin@maquefel.me>
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
14
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
---
15
---
11
include/hw/riscv/boot.h | 5 +++++
16
target/riscv/csr.c | 24 +++++++++++++++---------
12
hw/riscv/sifive_u.c | 6 ++----
17
1 file changed, 15 insertions(+), 9 deletions(-)
13
hw/riscv/spike.c | 6 ++----
14
hw/riscv/virt.c | 6 ++----
15
4 files changed, 11 insertions(+), 12 deletions(-)
16
18
17
diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h
19
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
18
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/riscv/boot.h
21
--- a/target/riscv/csr.c
20
+++ b/include/hw/riscv/boot.h
22
+++ b/target/riscv/csr.c
21
@@ -XXX,XX +XXX,XX @@
23
@@ -XXX,XX +XXX,XX @@ static RISCVException riscv_csrrw_do64(CPURISCVState *env, int csrno,
22
#include "hw/loader.h"
24
target_ulong write_mask)
23
#include "hw/riscv/riscv_hart.h"
25
{
24
26
RISCVException ret;
25
+#define RISCV32_BIOS_BIN "opensbi-riscv32-generic-fw_dynamic.bin"
27
- target_ulong old_value;
26
+#define RISCV32_BIOS_ELF "opensbi-riscv32-generic-fw_dynamic.elf"
28
+ target_ulong old_value = 0;
27
+#define RISCV64_BIOS_BIN "opensbi-riscv64-generic-fw_dynamic.bin"
29
28
+#define RISCV64_BIOS_ELF "opensbi-riscv64-generic-fw_dynamic.elf"
30
/* execute combined read/write operation if it exists */
29
+
31
if (csr_ops[csrno].op) {
30
bool riscv_is_32bit(RISCVHartArrayState *harts);
32
return csr_ops[csrno].op(env, csrno, ret_value, new_value, write_mask);
31
32
target_ulong riscv_calc_kernel_start_addr(RISCVHartArrayState *harts,
33
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/hw/riscv/sifive_u.c
36
+++ b/hw/riscv/sifive_u.c
37
@@ -XXX,XX +XXX,XX @@ static void sifive_u_machine_init(MachineState *machine)
38
39
if (riscv_is_32bit(&s->soc.u_cpus)) {
40
firmware_end_addr = riscv_find_and_load_firmware(machine,
41
- "opensbi-riscv32-generic-fw_dynamic.bin",
42
- start_addr, NULL);
43
+ RISCV32_BIOS_BIN, start_addr, NULL);
44
} else {
45
firmware_end_addr = riscv_find_and_load_firmware(machine,
46
- "opensbi-riscv64-generic-fw_dynamic.bin",
47
- start_addr, NULL);
48
+ RISCV64_BIOS_BIN, start_addr, NULL);
49
}
33
}
50
34
51
if (machine->kernel_filename) {
35
- /* if no accessor exists then return failure */
52
diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c
36
- if (!csr_ops[csrno].read) {
53
index XXXXXXX..XXXXXXX 100644
37
- return RISCV_EXCP_ILLEGAL_INST;
54
--- a/hw/riscv/spike.c
38
- }
55
+++ b/hw/riscv/spike.c
39
- /* read old value */
56
@@ -XXX,XX +XXX,XX @@ static void spike_board_init(MachineState *machine)
40
- ret = csr_ops[csrno].read(env, csrno, &old_value);
57
*/
41
- if (ret != RISCV_EXCP_NONE) {
58
if (riscv_is_32bit(&s->soc[0])) {
42
- return ret;
59
firmware_end_addr = riscv_find_and_load_firmware(machine,
43
+ /*
60
- "opensbi-riscv32-generic-fw_dynamic.elf",
44
+ * ret_value == NULL means that rd=x0 and we're coming from helper_csrw()
61
- memmap[SPIKE_DRAM].base,
45
+ * and we can't throw side effects caused by CSR reads.
62
+ RISCV32_BIOS_ELF, memmap[SPIKE_DRAM].base,
46
+ */
63
htif_symbol_callback);
47
+ if (ret_value) {
64
} else {
48
+ /* if no accessor exists then return failure */
65
firmware_end_addr = riscv_find_and_load_firmware(machine,
49
+ if (!csr_ops[csrno].read) {
66
- "opensbi-riscv64-generic-fw_dynamic.elf",
50
+ return RISCV_EXCP_ILLEGAL_INST;
67
- memmap[SPIKE_DRAM].base,
51
+ }
68
+ RISCV64_BIOS_ELF, memmap[SPIKE_DRAM].base,
52
+ /* read old value */
69
htif_symbol_callback);
53
+ ret = csr_ops[csrno].read(env, csrno, &old_value);
54
+ if (ret != RISCV_EXCP_NONE) {
55
+ return ret;
56
+ }
70
}
57
}
71
58
72
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
59
/* write value if writable and write mask set, otherwise drop writes */
73
index XXXXXXX..XXXXXXX 100644
74
--- a/hw/riscv/virt.c
75
+++ b/hw/riscv/virt.c
76
@@ -XXX,XX +XXX,XX @@ static void virt_machine_init(MachineState *machine)
77
78
if (riscv_is_32bit(&s->soc[0])) {
79
firmware_end_addr = riscv_find_and_load_firmware(machine,
80
- "opensbi-riscv32-generic-fw_dynamic.bin",
81
- start_addr, NULL);
82
+ RISCV32_BIOS_BIN, start_addr, NULL);
83
} else {
84
firmware_end_addr = riscv_find_and_load_firmware(machine,
85
- "opensbi-riscv64-generic-fw_dynamic.bin",
86
- start_addr, NULL);
87
+ RISCV64_BIOS_BIN, start_addr, NULL);
88
}
89
90
if (machine->kernel_filename) {
91
--
60
--
92
2.31.1
61
2.41.0
93
94
diff view generated by jsdifflib