1
The following changes since commit ad10b4badc1dd5b28305f9b9f1168cf0aa3ae946:
1
From: Alistair Francis <alistair.francis@wdc.com>
2
2
3
Merge tag 'pull-error-2024-05-27' of https://repo.or.cz/qemu/armbru into staging (2024-05-27 06:40:42 -0700)
3
The following changes since commit c52d69e7dbaaed0ffdef8125e79218672c30161d:
4
5
Merge remote-tracking branch 'remotes/cschoenebeck/tags/pull-9p-20211027' into staging (2021-10-27 11:45:18 -0700)
4
6
5
are available in the Git repository at:
7
are available in the Git repository at:
6
8
7
https://github.com/alistair23/qemu.git tags/pull-riscv-to-apply-20240528
9
git@github.com:alistair23/qemu.git tags/pull-riscv-to-apply-20211029-1
8
10
9
for you to fetch changes up to 1806da76cb81088ea026ca3441551782b850e393:
11
for you to fetch changes up to 15161e425ee1bb1180f9cec574cda44fb10c0931:
10
12
11
target/riscv: raise an exception when CSRRS/CSRRC writes a read-only CSR (2024-05-28 12:20:27 +1000)
13
target/riscv: change the api for RVF/RVD fmin/fmax (2021-10-29 16:56:12 +1000)
12
14
13
----------------------------------------------------------------
15
----------------------------------------------------------------
14
RISC-V PR for 9.1
16
Fifth RISC-V PR for QEMU 6.2
15
17
16
* APLICs add child earlier than realize
18
- Use a shared PLIC config helper function
17
* Fix exposure of Zkr
19
- Fixup the OpenTitan PLIC configuration
18
* Raise exceptions on wrs.nto
20
- Add support for the experimental J extension
19
* Implement SBI debug console (DBCN) calls for KVM
21
- Update the fmin/fmax handling
20
* Support 64-bit addresses for initrd
22
- Fixup VS interrupt forwarding
21
* Change RISCV_EXCP_SEMIHOST exception number to 63
22
* Tolerate KVM disable ext errors
23
* Set tval in breakpoints
24
* Add support for Zve32x extension
25
* Add support for Zve64x extension
26
* Relax vector register check in RISCV gdbstub
27
* Fix the element agnostic Vector function problem
28
* Fix Zvkb extension config
29
* Implement dynamic establishment of custom decoder
30
* Add th.sxstatus CSR emulation
31
* Fix Zvfhmin checking for vfwcvt.f.f.v and vfncvt.f.f.w instructions
32
* Check single width operator for vector fp widen instructions
33
* Check single width operator for vfncvt.rod.f.f.w
34
* Remove redudant SEW checking for vector fp narrow/widen instructions
35
* Prioritize pmp errors in raise_mmu_exception()
36
* Do not set mtval2 for non guest-page faults
37
* Remove experimental prefix from "B" extension
38
* Fixup CBO extension register calculation
39
* Fix the hart bit setting of AIA
40
* Fix reg_width in ricsv_gen_dynamic_vector_feature()
41
* Decode all of the pmpcfg and pmpaddr CSRs
42
* Raise an exception when CSRRS/CSRRC writes a read-only CSR
43
23
44
----------------------------------------------------------------
24
----------------------------------------------------------------
45
Alexei Filippov (1):
25
Alexey Baturo (7):
46
target/riscv: do not set mtval2 for non guest-page faults
26
target/riscv: Add J-extension into RISC-V
27
target/riscv: Add CSR defines for RISC-V PM extension
28
target/riscv: Support CSRs required for RISC-V PM extension except for the h-mode
29
target/riscv: Add J extension state description
30
target/riscv: Print new PM CSRs in QEMU logs
31
target/riscv: Support pointer masking for RISC-V for i/c/f/d/a types of instructions
32
target/riscv: Allow experimental J-ext to be turned on
47
33
48
Alistair Francis (2):
34
Alistair Francis (6):
49
target/riscv: rvzicbo: Fixup CBO extension register calculation
35
hw/riscv: virt: Don't use a macro for the PLIC configuration
50
disas/riscv: Decode all of the pmpcfg and pmpaddr CSRs
36
hw/riscv: boot: Add a PLIC config string function
37
hw/riscv: sifive_u: Use the PLIC config helper function
38
hw/riscv: microchip_pfsoc: Use the PLIC config helper function
39
hw/riscv: virt: Use the PLIC config helper function
40
hw/riscv: opentitan: Fixup the PLIC context addresses
51
41
52
Andrew Jones (2):
42
Anatoly Parshintsev (1):
53
target/riscv/kvm: Fix exposure of Zkr
43
target/riscv: Implement address masking functions required for RISC-V Pointer Masking extension
54
target/riscv: Raise exceptions on wrs.nto
55
44
56
Cheng Yang (1):
45
Chih-Min Chao (2):
57
hw/riscv/boot.c: Support 64-bit address for initrd
46
softfloat: add APIs to handle alternative sNaN propagation for fmax/fmin
47
target/riscv: change the api for RVF/RVD fmin/fmax
58
48
59
Christoph Müllner (1):
49
Jose Martins (2):
60
riscv: thead: Add th.sxstatus CSR emulation
50
target/riscv: fix VS interrupts forwarding to HS
51
target/riscv: remove force HS exception
61
52
62
Clément Léger (1):
53
include/fpu/softfloat.h | 10 ++
63
target/riscv: change RISCV_EXCP_SEMIHOST exception number to 63
54
include/hw/riscv/boot.h | 2 +
55
include/hw/riscv/microchip_pfsoc.h | 1 -
56
include/hw/riscv/sifive_u.h | 1 -
57
include/hw/riscv/virt.h | 1 -
58
target/riscv/cpu.h | 17 +-
59
target/riscv/cpu_bits.h | 102 +++++++++++-
60
fpu/softfloat.c | 19 ++-
61
hw/riscv/boot.c | 25 +++
62
hw/riscv/microchip_pfsoc.c | 14 +-
63
hw/riscv/opentitan.c | 4 +-
64
hw/riscv/sifive_u.c | 14 +-
65
hw/riscv/virt.c | 20 +--
66
target/riscv/cpu.c | 13 ++
67
target/riscv/cpu_helper.c | 72 +++-----
68
target/riscv/csr.c | 285 ++++++++++++++++++++++++++++++++
69
target/riscv/fpu_helper.c | 16 +-
70
target/riscv/machine.c | 27 +++
71
target/riscv/translate.c | 43 +++++
72
fpu/softfloat-parts.c.inc | 25 ++-
73
target/riscv/insn_trans/trans_rva.c.inc | 3 +
74
target/riscv/insn_trans/trans_rvd.c.inc | 2 +
75
target/riscv/insn_trans/trans_rvf.c.inc | 2 +
76
target/riscv/insn_trans/trans_rvi.c.inc | 2 +
77
24 files changed, 605 insertions(+), 115 deletions(-)
64
78
65
Daniel Henrique Barboza (6):
66
target/riscv/kvm: implement SBI debug console (DBCN) calls
67
target/riscv/kvm: tolerate KVM disable ext errors
68
target/riscv/debug: set tval=pc in breakpoint exceptions
69
trans_privileged.c.inc: set (m|s)tval on ebreak breakpoint
70
target/riscv: prioritize pmp errors in raise_mmu_exception()
71
riscv, gdbstub.c: fix reg_width in ricsv_gen_dynamic_vector_feature()
72
73
Huang Tao (2):
74
target/riscv: Fix the element agnostic function problem
75
target/riscv: Implement dynamic establishment of custom decoder
76
77
Jason Chien (3):
78
target/riscv: Add support for Zve32x extension
79
target/riscv: Add support for Zve64x extension
80
target/riscv: Relax vector register check in RISCV gdbstub
81
82
Max Chou (4):
83
target/riscv: rvv: Fix Zvfhmin checking for vfwcvt.f.f.v and vfncvt.f.f.w instructions
84
target/riscv: rvv: Check single width operator for vector fp widen instructions
85
target/riscv: rvv: Check single width operator for vfncvt.rod.f.f.w
86
target/riscv: rvv: Remove redudant SEW checking for vector fp narrow/widen instructions
87
88
Rob Bradford (1):
89
target/riscv: Remove experimental prefix from "B" extension
90
91
Yangyu Chen (1):
92
target/riscv/cpu.c: fix Zvkb extension config
93
94
Yong-Xuan Wang (1):
95
target/riscv/kvm.c: Fix the hart bit setting of AIA
96
97
Yu-Ming Chang (1):
98
target/riscv: raise an exception when CSRRS/CSRRC writes a read-only CSR
99
100
yang.zhang (1):
101
hw/intc/riscv_aplic: APLICs should add child earlier than realize
102
103
MAINTAINERS | 1 +
104
target/riscv/cpu.h | 11 ++
105
target/riscv/cpu_bits.h | 2 +-
106
target/riscv/cpu_cfg.h | 2 +
107
target/riscv/helper.h | 1 +
108
target/riscv/sbi_ecall_interface.h | 17 +++
109
target/riscv/tcg/tcg-cpu.h | 15 +++
110
disas/riscv.c | 65 +++++++++-
111
hw/intc/riscv_aplic.c | 8 +-
112
hw/riscv/boot.c | 4 +-
113
target/riscv/cpu.c | 10 +-
114
target/riscv/cpu_helper.c | 37 +++---
115
target/riscv/csr.c | 71 +++++++++--
116
target/riscv/debug.c | 3 +
117
target/riscv/gdbstub.c | 8 +-
118
target/riscv/kvm/kvm-cpu.c | 157 ++++++++++++++++++++++++-
119
target/riscv/op_helper.c | 17 ++-
120
target/riscv/tcg/tcg-cpu.c | 50 +++++---
121
target/riscv/th_csr.c | 79 +++++++++++++
122
target/riscv/translate.c | 31 +++--
123
target/riscv/vector_internals.c | 22 ++++
124
target/riscv/insn_trans/trans_privileged.c.inc | 2 +
125
target/riscv/insn_trans/trans_rvv.c.inc | 46 +++++---
126
target/riscv/insn_trans/trans_rvzawrs.c.inc | 29 +++--
127
target/riscv/insn_trans/trans_rvzicbo.c.inc | 16 ++-
128
target/riscv/meson.build | 1 +
129
26 files changed, 596 insertions(+), 109 deletions(-)
130
create mode 100644 target/riscv/th_csr.c
131
diff view generated by jsdifflib
Deleted patch
1
From: "yang.zhang" <yang.zhang@hexintek.com>
2
1
3
Since only root APLICs can have hw IRQ lines, aplic->parent should
4
be initialized first.
5
6
Fixes: e8f79343cf ("hw/intc: Add RISC-V AIA APLIC device emulation")
7
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
8
Signed-off-by: yang.zhang <yang.zhang@hexintek.com>
9
Cc: qemu-stable <qemu-stable@nongnu.org>
10
Message-ID: <20240409014445.278-1-gaoshanliukou@163.com>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
13
hw/intc/riscv_aplic.c | 8 ++++----
14
1 file changed, 4 insertions(+), 4 deletions(-)
15
16
diff --git a/hw/intc/riscv_aplic.c b/hw/intc/riscv_aplic.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/intc/riscv_aplic.c
19
+++ b/hw/intc/riscv_aplic.c
20
@@ -XXX,XX +XXX,XX @@ DeviceState *riscv_aplic_create(hwaddr addr, hwaddr size,
21
qdev_prop_set_bit(dev, "msimode", msimode);
22
qdev_prop_set_bit(dev, "mmode", mmode);
23
24
+ if (parent) {
25
+ riscv_aplic_add_child(parent, dev);
26
+ }
27
+
28
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
29
30
if (!is_kvm_aia(msimode)) {
31
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr);
32
}
33
34
- if (parent) {
35
- riscv_aplic_add_child(parent, dev);
36
- }
37
-
38
if (!msimode) {
39
for (i = 0; i < num_harts; i++) {
40
CPUState *cpu = cpu_by_arch_id(hartid_base + i);
41
--
42
2.45.1
diff view generated by jsdifflib
1
From: Jason Chien <jason.chien@sifive.com>
1
From: Alistair Francis <alistair.francis@wdc.com>
2
2
3
Add support for Zve64x extension. Enabling Zve64f enables Zve64x and
3
Using a macro for the PLIC configuration doesn't make the code any
4
enabling Zve64x enables Zve32x according to their dependency.
4
easier to read. Instead it makes it harder to figure out what is going
5
on, so let's remove it.
5
6
6
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2107
7
Signed-off-by: Jason Chien <jason.chien@sifive.com>
8
Reviewed-by: Frank Chang <frank.chang@sifive.com>
9
Reviewed-by: Max Chou <max.chou@sifive.com>
10
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
11
Message-ID: <20240328022343.6871-3-jason.chien@sifive.com>
12
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Message-id: 20211022060133.3045020-1-alistair.francis@opensource.wdc.com
13
---
11
---
14
target/riscv/cpu_cfg.h | 1 +
12
include/hw/riscv/virt.h | 1 -
15
target/riscv/cpu.c | 2 ++
13
hw/riscv/virt.c | 2 +-
16
target/riscv/tcg/tcg-cpu.c | 17 +++++++++++------
14
2 files changed, 1 insertion(+), 2 deletions(-)
17
3 files changed, 14 insertions(+), 6 deletions(-)
18
15
19
diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h
16
diff --git a/include/hw/riscv/virt.h b/include/hw/riscv/virt.h
20
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
21
--- a/target/riscv/cpu_cfg.h
18
--- a/include/hw/riscv/virt.h
22
+++ b/target/riscv/cpu_cfg.h
19
+++ b/include/hw/riscv/virt.h
23
@@ -XXX,XX +XXX,XX @@ struct RISCVCPUConfig {
20
@@ -XXX,XX +XXX,XX @@ enum {
24
bool ext_zve32x;
21
VIRTIO_NDEV = 0x35 /* Arbitrary maximum number of interrupts */
25
bool ext_zve64f;
22
};
26
bool ext_zve64d;
23
27
+ bool ext_zve64x;
24
-#define VIRT_PLIC_HART_CONFIG "MS"
28
bool ext_zvbb;
25
#define VIRT_PLIC_NUM_SOURCES 127
29
bool ext_zvbc;
26
#define VIRT_PLIC_NUM_PRIORITIES 7
30
bool ext_zvkb;
27
#define VIRT_PLIC_PRIORITY_BASE 0x04
31
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
28
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
32
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
33
--- a/target/riscv/cpu.c
30
--- a/hw/riscv/virt.c
34
+++ b/target/riscv/cpu.c
31
+++ b/hw/riscv/virt.c
35
@@ -XXX,XX +XXX,XX @@ const RISCVIsaExtData isa_edata_arr[] = {
32
@@ -XXX,XX +XXX,XX @@ static char *plic_hart_config_string(int hart_count)
36
ISA_EXT_DATA_ENTRY(zve32x, PRIV_VERSION_1_10_0, ext_zve32x),
33
int i;
37
ISA_EXT_DATA_ENTRY(zve64f, PRIV_VERSION_1_10_0, ext_zve64f),
34
38
ISA_EXT_DATA_ENTRY(zve64d, PRIV_VERSION_1_10_0, ext_zve64d),
35
for (i = 0; i < hart_count; i++) {
39
+ ISA_EXT_DATA_ENTRY(zve64x, PRIV_VERSION_1_10_0, ext_zve64x),
36
- vals[i] = VIRT_PLIC_HART_CONFIG;
40
ISA_EXT_DATA_ENTRY(zvfbfmin, PRIV_VERSION_1_12_0, ext_zvfbfmin),
37
+ vals[i] = "MS";
41
ISA_EXT_DATA_ENTRY(zvfbfwma, PRIV_VERSION_1_12_0, ext_zvfbfwma),
42
ISA_EXT_DATA_ENTRY(zvfh, PRIV_VERSION_1_12_0, ext_zvfh),
43
@@ -XXX,XX +XXX,XX @@ const RISCVCPUMultiExtConfig riscv_cpu_extensions[] = {
44
MULTI_EXT_CFG_BOOL("zve32x", ext_zve32x, false),
45
MULTI_EXT_CFG_BOOL("zve64f", ext_zve64f, false),
46
MULTI_EXT_CFG_BOOL("zve64d", ext_zve64d, false),
47
+ MULTI_EXT_CFG_BOOL("zve64x", ext_zve64x, false),
48
MULTI_EXT_CFG_BOOL("zvfbfmin", ext_zvfbfmin, false),
49
MULTI_EXT_CFG_BOOL("zvfbfwma", ext_zvfbfwma, false),
50
MULTI_EXT_CFG_BOOL("zvfh", ext_zvfh, false),
51
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
52
index XXXXXXX..XXXXXXX 100644
53
--- a/target/riscv/tcg/tcg-cpu.c
54
+++ b/target/riscv/tcg/tcg-cpu.c
55
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
56
57
/* The Zve64d extension depends on the Zve64f extension */
58
if (cpu->cfg.ext_zve64d) {
59
+ if (!riscv_has_ext(env, RVD)) {
60
+ error_setg(errp, "Zve64d/V extensions require D extension");
61
+ return;
62
+ }
63
cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zve64f), true);
64
}
38
}
65
39
vals[i] = NULL;
66
- /* The Zve64f extension depends on the Zve32f extension */
67
+ /* The Zve64f extension depends on the Zve64x and Zve32f extensions */
68
if (cpu->cfg.ext_zve64f) {
69
+ cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zve64x), true);
70
cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zve32f), true);
71
}
72
73
- if (cpu->cfg.ext_zve64d && !riscv_has_ext(env, RVD)) {
74
- error_setg(errp, "Zve64d/V extensions require D extension");
75
- return;
76
+ /* The Zve64x extension depends on the Zve32x extension */
77
+ if (cpu->cfg.ext_zve64x) {
78
+ cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zve32x), true);
79
}
80
81
/* The Zve32f extension depends on the Zve32x extension */
82
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
83
return;
84
}
85
86
- if ((cpu->cfg.ext_zvbc || cpu->cfg.ext_zvknhb) && !cpu->cfg.ext_zve64f) {
87
+ if ((cpu->cfg.ext_zvbc || cpu->cfg.ext_zvknhb) && !cpu->cfg.ext_zve64x) {
88
error_setg(
89
errp,
90
- "Zvbc and Zvknhb extensions require V or Zve64{f,d} extensions");
91
+ "Zvbc and Zvknhb extensions require V or Zve64x extensions");
92
return;
93
}
94
40
95
--
41
--
96
2.45.1
42
2.31.1
43
44
diff view generated by jsdifflib
1
From: Cheng Yang <yangcheng.work@foxmail.com>
1
From: Alistair Francis <alistair.francis@wdc.com>
2
2
3
Use qemu_fdt_setprop_u64() instead of qemu_fdt_setprop_cell()
3
Add a generic function that can create the PLIC strings.
4
to set the address of initrd in FDT to support 64-bit address.
5
4
6
Signed-off-by: Cheng Yang <yangcheng.work@foxmail.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-ID: <tencent_A4482251DD0890F312758FA6B33F60815609@qq.com>
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
5
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
8
Message-id: 20211022060133.3045020-2-alistair.francis@opensource.wdc.com
10
---
9
---
11
hw/riscv/boot.c | 4 ++--
10
include/hw/riscv/boot.h | 2 ++
12
1 file changed, 2 insertions(+), 2 deletions(-)
11
hw/riscv/boot.c | 25 +++++++++++++++++++++++++
12
2 files changed, 27 insertions(+)
13
13
14
diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h
15
index XXXXXXX..XXXXXXX 100644
16
--- a/include/hw/riscv/boot.h
17
+++ b/include/hw/riscv/boot.h
18
@@ -XXX,XX +XXX,XX @@
19
20
bool riscv_is_32bit(RISCVHartArrayState *harts);
21
22
+char *riscv_plic_hart_config_string(int hart_count);
23
+
24
target_ulong riscv_calc_kernel_start_addr(RISCVHartArrayState *harts,
25
target_ulong firmware_end_addr);
26
target_ulong riscv_find_and_load_firmware(MachineState *machine,
14
diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c
27
diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c
15
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/riscv/boot.c
29
--- a/hw/riscv/boot.c
17
+++ b/hw/riscv/boot.c
30
+++ b/hw/riscv/boot.c
18
@@ -XXX,XX +XXX,XX @@ static void riscv_load_initrd(MachineState *machine, uint64_t kernel_entry)
31
@@ -XXX,XX +XXX,XX @@ bool riscv_is_32bit(RISCVHartArrayState *harts)
19
/* Some RISC-V machines (e.g. opentitan) don't have a fdt. */
32
return harts->harts[0].env.misa_mxl_max == MXL_RV32;
20
if (fdt) {
21
end = start + size;
22
- qemu_fdt_setprop_cell(fdt, "/chosen", "linux,initrd-start", start);
23
- qemu_fdt_setprop_cell(fdt, "/chosen", "linux,initrd-end", end);
24
+ qemu_fdt_setprop_u64(fdt, "/chosen", "linux,initrd-start", start);
25
+ qemu_fdt_setprop_u64(fdt, "/chosen", "linux,initrd-end", end);
26
}
27
}
33
}
28
34
35
+/*
36
+ * Return the per-socket PLIC hart topology configuration string
37
+ * (caller must free with g_free())
38
+ */
39
+char *riscv_plic_hart_config_string(int hart_count)
40
+{
41
+ g_autofree const char **vals = g_new(const char *, hart_count + 1);
42
+ int i;
43
+
44
+ for (i = 0; i < hart_count; i++) {
45
+ CPUState *cs = qemu_get_cpu(i);
46
+ CPURISCVState *env = &RISCV_CPU(cs)->env;
47
+
48
+ if (riscv_has_ext(env, RVS)) {
49
+ vals[i] = "MS";
50
+ } else {
51
+ vals[i] = "M";
52
+ }
53
+ }
54
+ vals[i] = NULL;
55
+
56
+ /* g_strjoinv() obliges us to cast away const here */
57
+ return g_strjoinv(",", (char **)vals);
58
+}
59
+
60
target_ulong riscv_calc_kernel_start_addr(RISCVHartArrayState *harts,
61
target_ulong firmware_end_addr) {
62
if (riscv_is_32bit(harts)) {
29
--
63
--
30
2.45.1
64
2.31.1
65
66
diff view generated by jsdifflib
1
From: Alistair Francis <alistair23@gmail.com>
1
From: Alistair Francis <alistair.francis@wdc.com>
2
3
When running the instruction
4
5
```
6
cbo.flush 0(x0)
7
```
8
9
QEMU would segfault.
10
11
The issue was in cpu_gpr[a->rs1] as QEMU does not have cpu_gpr[0]
12
allocated.
13
14
In order to fix this let's use the existing get_address()
15
helper. This also has the benefit of performing pointer mask
16
calculations on the address specified in rs1.
17
18
The pointer masking specificiation specifically states:
19
20
"""
21
Cache Management Operations: All instructions in Zicbom, Zicbop and Zicboz
22
"""
23
24
So this is the correct behaviour and we previously have been incorrectly
25
not masking the address.
26
2
27
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
3
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
28
Reported-by: Fabian Thomas <fabian.thomas@cispa.de>
4
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
29
Fixes: e05da09b7cfd ("target/riscv: implement Zicbom extension")
5
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
30
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Tested-by: Bin Meng <bmeng.cn@gmail.com>
31
Cc: qemu-stable <qemu-stable@nongnu.org>
7
Message-id: 20211022060133.3045020-3-alistair.francis@opensource.wdc.com
32
Message-ID: <20240514023910.301766-1-alistair.francis@wdc.com>
33
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
34
---
8
---
35
target/riscv/insn_trans/trans_rvzicbo.c.inc | 16 ++++++++++++----
9
include/hw/riscv/sifive_u.h | 1 -
36
1 file changed, 12 insertions(+), 4 deletions(-)
10
hw/riscv/sifive_u.c | 14 +-------------
11
2 files changed, 1 insertion(+), 14 deletions(-)
37
12
38
diff --git a/target/riscv/insn_trans/trans_rvzicbo.c.inc b/target/riscv/insn_trans/trans_rvzicbo.c.inc
13
diff --git a/include/hw/riscv/sifive_u.h b/include/hw/riscv/sifive_u.h
39
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
40
--- a/target/riscv/insn_trans/trans_rvzicbo.c.inc
15
--- a/include/hw/riscv/sifive_u.h
41
+++ b/target/riscv/insn_trans/trans_rvzicbo.c.inc
16
+++ b/include/hw/riscv/sifive_u.h
42
@@ -XXX,XX +XXX,XX @@
17
@@ -XXX,XX +XXX,XX @@ enum {
43
static bool trans_cbo_clean(DisasContext *ctx, arg_cbo_clean *a)
18
#define SIFIVE_U_MANAGEMENT_CPU_COUNT 1
44
{
19
#define SIFIVE_U_COMPUTE_CPU_COUNT 4
45
REQUIRE_ZICBOM(ctx);
20
46
- gen_helper_cbo_clean_flush(tcg_env, cpu_gpr[a->rs1]);
21
-#define SIFIVE_U_PLIC_HART_CONFIG "MS"
47
+ TCGv src = get_address(ctx, a->rs1, 0);
22
#define SIFIVE_U_PLIC_NUM_SOURCES 54
48
+
23
#define SIFIVE_U_PLIC_NUM_PRIORITIES 7
49
+ gen_helper_cbo_clean_flush(tcg_env, src);
24
#define SIFIVE_U_PLIC_PRIORITY_BASE 0x04
50
return true;
25
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
51
}
26
index XXXXXXX..XXXXXXX 100644
52
27
--- a/hw/riscv/sifive_u.c
53
static bool trans_cbo_flush(DisasContext *ctx, arg_cbo_flush *a)
28
+++ b/hw/riscv/sifive_u.c
54
{
29
@@ -XXX,XX +XXX,XX @@ static void sifive_u_soc_realize(DeviceState *dev, Error **errp)
55
REQUIRE_ZICBOM(ctx);
30
MemoryRegion *mask_rom = g_new(MemoryRegion, 1);
56
- gen_helper_cbo_clean_flush(tcg_env, cpu_gpr[a->rs1]);
31
MemoryRegion *l2lim_mem = g_new(MemoryRegion, 1);
57
+ TCGv src = get_address(ctx, a->rs1, 0);
32
char *plic_hart_config;
58
+
33
- size_t plic_hart_config_len;
59
+ gen_helper_cbo_clean_flush(tcg_env, src);
34
int i, j;
60
return true;
35
NICInfo *nd = &nd_table[0];
61
}
36
62
37
@@ -XXX,XX +XXX,XX @@ static void sifive_u_soc_realize(DeviceState *dev, Error **errp)
63
static bool trans_cbo_inval(DisasContext *ctx, arg_cbo_inval *a)
38
l2lim_mem);
64
{
39
65
REQUIRE_ZICBOM(ctx);
40
/* create PLIC hart topology configuration string */
66
- gen_helper_cbo_inval(tcg_env, cpu_gpr[a->rs1]);
41
- plic_hart_config_len = (strlen(SIFIVE_U_PLIC_HART_CONFIG) + 1) *
67
+ TCGv src = get_address(ctx, a->rs1, 0);
42
- ms->smp.cpus;
68
+
43
- plic_hart_config = g_malloc0(plic_hart_config_len);
69
+ gen_helper_cbo_inval(tcg_env, src);
44
- for (i = 0; i < ms->smp.cpus; i++) {
70
return true;
45
- if (i != 0) {
71
}
46
- strncat(plic_hart_config, "," SIFIVE_U_PLIC_HART_CONFIG,
72
47
- plic_hart_config_len);
73
static bool trans_cbo_zero(DisasContext *ctx, arg_cbo_zero *a)
48
- } else {
74
{
49
- strncat(plic_hart_config, "M", plic_hart_config_len);
75
REQUIRE_ZICBOZ(ctx);
50
- }
76
- gen_helper_cbo_zero(tcg_env, cpu_gpr[a->rs1]);
51
- plic_hart_config_len -= (strlen(SIFIVE_U_PLIC_HART_CONFIG) + 1);
77
+ TCGv src = get_address(ctx, a->rs1, 0);
52
- }
78
+
53
+ plic_hart_config = riscv_plic_hart_config_string(ms->smp.cpus);
79
+ gen_helper_cbo_zero(tcg_env, src);
54
80
return true;
55
/* MMIO */
81
}
56
s->plic = sifive_plic_create(memmap[SIFIVE_U_DEV_PLIC].base,
82
--
57
--
83
2.45.1
58
2.31.1
59
60
diff view generated by jsdifflib
1
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
1
From: Alistair Francis <alistair.francis@wdc.com>
2
2
3
Commit 33a24910ae changed 'reg_width' to use 'vlenb', i.e. vector length
3
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
4
in bytes, when in this context we want 'reg_width' as the length in
4
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
bits.
5
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
6
Tested-by: Bin Meng <bmeng.cn@gmail.com>
7
Message-id: 20211022060133.3045020-4-alistair.francis@opensource.wdc.com
8
---
9
include/hw/riscv/microchip_pfsoc.h | 1 -
10
hw/riscv/microchip_pfsoc.c | 14 +-------------
11
2 files changed, 1 insertion(+), 14 deletions(-)
6
12
7
Fix 'reg_width' back to the value in bits like 7cb59921c05a
13
diff --git a/include/hw/riscv/microchip_pfsoc.h b/include/hw/riscv/microchip_pfsoc.h
8
("target/riscv/gdbstub.c: use 'vlenb' instead of shifting 'vlen'") set
9
beforehand.
10
11
While we're at it, rename 'reg_width' to 'bitsize' to provide a bit more
12
clarity about what the variable represents. 'bitsize' is also used in
13
riscv_gen_dynamic_csr_feature() with the same purpose, i.e. as an input to
14
gdb_feature_builder_append_reg().
15
16
Cc: Akihiko Odaki <akihiko.odaki@daynix.com>
17
Cc: Alex Bennée <alex.bennee@linaro.org>
18
Reported-by: Robin Dapp <rdapp.gcc@gmail.com>
19
Fixes: 33a24910ae ("target/riscv: Use GDBFeature for dynamic XML")
20
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
21
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
22
Acked-by: Alex Bennée <alex.bennee@linaro.org>
23
Reviewed-by: Akihiko Odaki <akihiko.odaki@daynix.com>
24
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
25
Cc: qemu-stable <qemu-stable@nongnu.org>
26
Message-ID: <20240517203054.880861-2-dbarboza@ventanamicro.com>
27
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
28
---
29
target/riscv/gdbstub.c | 6 +++---
30
1 file changed, 3 insertions(+), 3 deletions(-)
31
32
diff --git a/target/riscv/gdbstub.c b/target/riscv/gdbstub.c
33
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
34
--- a/target/riscv/gdbstub.c
15
--- a/include/hw/riscv/microchip_pfsoc.h
35
+++ b/target/riscv/gdbstub.c
16
+++ b/include/hw/riscv/microchip_pfsoc.h
36
@@ -XXX,XX +XXX,XX @@ static GDBFeature *riscv_gen_dynamic_csr_feature(CPUState *cs, int base_reg)
17
@@ -XXX,XX +XXX,XX @@ enum {
37
static GDBFeature *ricsv_gen_dynamic_vector_feature(CPUState *cs, int base_reg)
18
#define MICROCHIP_PFSOC_MANAGEMENT_CPU_COUNT 1
38
{
19
#define MICROCHIP_PFSOC_COMPUTE_CPU_COUNT 4
39
RISCVCPU *cpu = RISCV_CPU(cs);
20
40
- int reg_width = cpu->cfg.vlenb;
21
-#define MICROCHIP_PFSOC_PLIC_HART_CONFIG "MS"
41
+ int bitsize = cpu->cfg.vlenb << 3;
22
#define MICROCHIP_PFSOC_PLIC_NUM_SOURCES 185
42
GDBFeatureBuilder builder;
23
#define MICROCHIP_PFSOC_PLIC_NUM_PRIORITIES 7
24
#define MICROCHIP_PFSOC_PLIC_PRIORITY_BASE 0x04
25
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
26
index XXXXXXX..XXXXXXX 100644
27
--- a/hw/riscv/microchip_pfsoc.c
28
+++ b/hw/riscv/microchip_pfsoc.c
29
@@ -XXX,XX +XXX,XX @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
30
MemoryRegion *envm_data = g_new(MemoryRegion, 1);
31
MemoryRegion *qspi_xip_mem = g_new(MemoryRegion, 1);
32
char *plic_hart_config;
33
- size_t plic_hart_config_len;
34
NICInfo *nd;
43
int i;
35
int i;
44
36
45
@@ -XXX,XX +XXX,XX @@ static GDBFeature *ricsv_gen_dynamic_vector_feature(CPUState *cs, int base_reg)
37
@@ -XXX,XX +XXX,XX @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
46
38
l2lim_mem);
47
/* First define types and totals in a whole VL */
39
48
for (i = 0; i < ARRAY_SIZE(vec_lanes); i++) {
40
/* create PLIC hart topology configuration string */
49
- int count = reg_width / vec_lanes[i].size;
41
- plic_hart_config_len = (strlen(MICROCHIP_PFSOC_PLIC_HART_CONFIG) + 1) *
50
+ int count = bitsize / vec_lanes[i].size;
42
- ms->smp.cpus;
51
gdb_feature_builder_append_tag(
43
- plic_hart_config = g_malloc0(plic_hart_config_len);
52
&builder, "<vector id=\"%s\" type=\"%s\" count=\"%d\"/>",
44
- for (i = 0; i < ms->smp.cpus; i++) {
53
vec_lanes[i].id, vec_lanes[i].gdb_type, count);
45
- if (i != 0) {
54
@@ -XXX,XX +XXX,XX @@ static GDBFeature *ricsv_gen_dynamic_vector_feature(CPUState *cs, int base_reg)
46
- strncat(plic_hart_config, "," MICROCHIP_PFSOC_PLIC_HART_CONFIG,
55
/* Define vector registers */
47
- plic_hart_config_len);
56
for (i = 0; i < 32; i++) {
48
- } else {
57
gdb_feature_builder_append_reg(&builder, g_strdup_printf("v%d", i),
49
- strncat(plic_hart_config, "M", plic_hart_config_len);
58
- reg_width, i, "riscv_vector", "vector");
50
- }
59
+ bitsize, i, "riscv_vector", "vector");
51
- plic_hart_config_len -= (strlen(MICROCHIP_PFSOC_PLIC_HART_CONFIG) + 1);
60
}
52
- }
61
53
+ plic_hart_config = riscv_plic_hart_config_string(ms->smp.cpus);
62
gdb_feature_builder_end(&builder);
54
55
/* PLIC */
56
s->plic = sifive_plic_create(memmap[MICROCHIP_PFSOC_PLIC].base,
63
--
57
--
64
2.45.1
58
2.31.1
65
59
66
60
diff view generated by jsdifflib
1
From: Andrew Jones <ajones@ventanamicro.com>
1
From: Alistair Francis <alistair.francis@wdc.com>
2
2
3
Implementing wrs.nto to always just return is consistent with the
3
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
4
specification, as the instruction is permitted to terminate the
4
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
stall for any reason, but it's not useful for virtualization, where
5
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
6
we'd like the guest to trap to the hypervisor in order to allow
6
Tested-by: Bin Meng <bmeng.cn@gmail.com>
7
scheduling of the lock holding VCPU. Change to always immediately
7
Message-id: 20211022060133.3045020-5-alistair.francis@opensource.wdc.com
8
raise exceptions when the appropriate conditions are present,
8
---
9
otherwise continue to just return. Note, immediately raising
9
hw/riscv/virt.c | 20 +-------------------
10
exceptions is also consistent with the specification since the
10
1 file changed, 1 insertion(+), 19 deletions(-)
11
time limit that should expire prior to the exception is
12
implementation-specific.
13
11
14
Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
12
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
15
Reviewed-by: Christoph Müllner <christoph.muellner@vrull.eu>
16
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
17
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
18
Message-ID: <20240424142808.62936-2-ajones@ventanamicro.com>
19
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
20
---
21
target/riscv/helper.h | 1 +
22
target/riscv/op_helper.c | 11 ++++++++
23
target/riscv/insn_trans/trans_rvzawrs.c.inc | 29 ++++++++++++++-------
24
3 files changed, 32 insertions(+), 9 deletions(-)
25
26
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
27
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
28
--- a/target/riscv/helper.h
14
--- a/hw/riscv/virt.c
29
+++ b/target/riscv/helper.h
15
+++ b/hw/riscv/virt.c
30
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(csrrw_i128, tl, env, int, tl, tl, tl, tl)
16
@@ -XXX,XX +XXX,XX @@ static FWCfgState *create_fw_cfg(const MachineState *mc)
31
DEF_HELPER_1(sret, tl, env)
17
return fw_cfg;
32
DEF_HELPER_1(mret, tl, env)
33
DEF_HELPER_1(wfi, void, env)
34
+DEF_HELPER_1(wrs_nto, void, env)
35
DEF_HELPER_1(tlb_flush, void, env)
36
DEF_HELPER_1(tlb_flush_all, void, env)
37
/* Native Debug */
38
diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/target/riscv/op_helper.c
41
+++ b/target/riscv/op_helper.c
42
@@ -XXX,XX +XXX,XX @@ void helper_wfi(CPURISCVState *env)
43
}
44
}
18
}
45
19
46
+void helper_wrs_nto(CPURISCVState *env)
20
-/*
47
+{
21
- * Return the per-socket PLIC hart topology configuration string
48
+ if (env->virt_enabled && (env->priv == PRV_S || env->priv == PRV_U) &&
22
- * (caller must free with g_free())
49
+ get_field(env->hstatus, HSTATUS_VTW) &&
23
- */
50
+ !get_field(env->mstatus, MSTATUS_TW)) {
24
-static char *plic_hart_config_string(int hart_count)
51
+ riscv_raise_exception(env, RISCV_EXCP_VIRT_INSTRUCTION_FAULT, GETPC());
25
-{
52
+ } else if (env->priv != PRV_M && get_field(env->mstatus, MSTATUS_TW)) {
26
- g_autofree const char **vals = g_new(const char *, hart_count + 1);
53
+ riscv_raise_exception(env, RISCV_EXCP_ILLEGAL_INST, GETPC());
27
- int i;
54
+ }
28
-
55
+}
29
- for (i = 0; i < hart_count; i++) {
56
+
30
- vals[i] = "MS";
57
void helper_tlb_flush(CPURISCVState *env)
31
- }
32
- vals[i] = NULL;
33
-
34
- /* g_strjoinv() obliges us to cast away const here */
35
- return g_strjoinv(",", (char **)vals);
36
-}
37
-
38
static void virt_machine_init(MachineState *machine)
58
{
39
{
59
CPUState *cs = env_cpu(env);
40
const MemMapEntry *memmap = virt_memmap;
60
diff --git a/target/riscv/insn_trans/trans_rvzawrs.c.inc b/target/riscv/insn_trans/trans_rvzawrs.c.inc
41
@@ -XXX,XX +XXX,XX @@ static void virt_machine_init(MachineState *machine)
61
index XXXXXXX..XXXXXXX 100644
42
}
62
--- a/target/riscv/insn_trans/trans_rvzawrs.c.inc
43
63
+++ b/target/riscv/insn_trans/trans_rvzawrs.c.inc
44
/* Per-socket PLIC hart topology configuration string */
64
@@ -XXX,XX +XXX,XX @@
45
- plic_hart_config = plic_hart_config_string(hart_count);
65
* this program. If not, see <http://www.gnu.org/licenses/>.
46
+ plic_hart_config = riscv_plic_hart_config_string(hart_count);
66
*/
47
67
48
/* Per-socket PLIC */
68
-static bool trans_wrs(DisasContext *ctx)
49
s->plic[i] = sifive_plic_create(
69
+static bool trans_wrs_sto(DisasContext *ctx, arg_wrs_sto *a)
70
{
71
if (!ctx->cfg_ptr->ext_zawrs) {
72
return false;
73
@@ -XXX,XX +XXX,XX @@ static bool trans_wrs(DisasContext *ctx)
74
return true;
75
}
76
77
-#define GEN_TRANS_WRS(insn) \
78
-static bool trans_ ## insn(DisasContext *ctx, arg_ ## insn *a) \
79
-{ \
80
- (void)a; \
81
- return trans_wrs(ctx); \
82
-}
83
+static bool trans_wrs_nto(DisasContext *ctx, arg_wrs_nto *a)
84
+{
85
+ if (!ctx->cfg_ptr->ext_zawrs) {
86
+ return false;
87
+ }
88
89
-GEN_TRANS_WRS(wrs_nto)
90
-GEN_TRANS_WRS(wrs_sto)
91
+ /*
92
+ * Depending on the mode of execution, mstatus.TW and hstatus.VTW, wrs.nto
93
+ * should raise an exception when the implementation-specific bounded time
94
+ * limit has expired. Our time limit is zero, so we either return
95
+ * immediately, as does our implementation of wrs.sto, or raise an
96
+ * exception, as handled by the wrs.nto helper.
97
+ */
98
+#ifndef CONFIG_USER_ONLY
99
+ gen_helper_wrs_nto(tcg_env);
100
+#endif
101
+
102
+ /* We only get here when helper_wrs_nto() doesn't raise an exception. */
103
+ return trans_wrs_sto(ctx, NULL);
104
+}
105
--
50
--
106
2.45.1
51
2.31.1
107
52
108
53
diff view generated by jsdifflib
1
From: Max Chou <max.chou@sifive.com>
1
From: Alistair Francis <alistair.francis@wdc.com>
2
2
3
The require_scale_rvf function only checks the double width operator for
3
Fixup the PLIC context address to correctly support the threshold and
4
the vector floating point widen instructions, so most of the widen
4
claim register.
5
checking functions need to add require_rvf for single width operator.
6
5
7
The vfwcvt.f.x.v and vfwcvt.f.xu.v instructions convert single width
6
Fixes: ef63100648 ("hw/riscv: opentitan: Update to the latest build")
8
integer to double width float, so the opfxv_widen_check function doesn’t
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
need require_rvf for the single width operator(integer).
8
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
9
Message-id: 20211025040657.262696-1-alistair.francis@opensource.wdc.com
10
---
11
hw/riscv/opentitan.c | 4 ++--
12
1 file changed, 2 insertions(+), 2 deletions(-)
10
13
11
Signed-off-by: Max Chou <max.chou@sifive.com>
14
diff --git a/hw/riscv/opentitan.c b/hw/riscv/opentitan.c
12
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
13
Cc: qemu-stable <qemu-stable@nongnu.org>
14
Message-ID: <20240322092600.1198921-3-max.chou@sifive.com>
15
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
16
---
17
target/riscv/insn_trans/trans_rvv.c.inc | 5 +++++
18
1 file changed, 5 insertions(+)
19
20
diff --git a/target/riscv/insn_trans/trans_rvv.c.inc b/target/riscv/insn_trans/trans_rvv.c.inc
21
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
22
--- a/target/riscv/insn_trans/trans_rvv.c.inc
16
--- a/hw/riscv/opentitan.c
23
+++ b/target/riscv/insn_trans/trans_rvv.c.inc
17
+++ b/hw/riscv/opentitan.c
24
@@ -XXX,XX +XXX,XX @@ GEN_OPFVF_TRANS(vfrsub_vf, opfvf_check)
18
@@ -XXX,XX +XXX,XX @@ static void lowrisc_ibex_soc_realize(DeviceState *dev_soc, Error **errp)
25
static bool opfvv_widen_check(DisasContext *s, arg_rmrr *a)
19
qdev_prop_set_uint32(DEVICE(&s->plic), "pending-base", 0x1000);
26
{
20
qdev_prop_set_uint32(DEVICE(&s->plic), "enable-base", 0x2000);
27
return require_rvv(s) &&
21
qdev_prop_set_uint32(DEVICE(&s->plic), "enable-stride", 0x18);
28
+ require_rvf(s) &&
22
- qdev_prop_set_uint32(DEVICE(&s->plic), "context-base", 0x200004);
29
require_scale_rvf(s) &&
23
- qdev_prop_set_uint32(DEVICE(&s->plic), "context-stride", 4);
30
(s->sew != MO_8) &&
24
+ qdev_prop_set_uint32(DEVICE(&s->plic), "context-base", 0x200000);
31
vext_check_isa_ill(s) &&
25
+ qdev_prop_set_uint32(DEVICE(&s->plic), "context-stride", 8);
32
@@ -XXX,XX +XXX,XX @@ GEN_OPFVV_WIDEN_TRANS(vfwsub_vv, opfvv_widen_check)
26
qdev_prop_set_uint32(DEVICE(&s->plic), "aperture-size", memmap[IBEX_DEV_PLIC].size);
33
static bool opfvf_widen_check(DisasContext *s, arg_rmrr *a)
27
34
{
28
if (!sysbus_realize(SYS_BUS_DEVICE(&s->plic), errp)) {
35
return require_rvv(s) &&
36
+ require_rvf(s) &&
37
require_scale_rvf(s) &&
38
(s->sew != MO_8) &&
39
vext_check_isa_ill(s) &&
40
@@ -XXX,XX +XXX,XX @@ GEN_OPFVF_WIDEN_TRANS(vfwsub_vf)
41
static bool opfwv_widen_check(DisasContext *s, arg_rmrr *a)
42
{
43
return require_rvv(s) &&
44
+ require_rvf(s) &&
45
require_scale_rvf(s) &&
46
(s->sew != MO_8) &&
47
vext_check_isa_ill(s) &&
48
@@ -XXX,XX +XXX,XX @@ GEN_OPFWV_WIDEN_TRANS(vfwsub_wv)
49
static bool opfwf_widen_check(DisasContext *s, arg_rmrr *a)
50
{
51
return require_rvv(s) &&
52
+ require_rvf(s) &&
53
require_scale_rvf(s) &&
54
(s->sew != MO_8) &&
55
vext_check_isa_ill(s) &&
56
@@ -XXX,XX +XXX,XX @@ GEN_OPFVV_TRANS(vfredmin_vs, freduction_check)
57
static bool freduction_widen_check(DisasContext *s, arg_rmrr *a)
58
{
59
return reduction_widen_check(s, a) &&
60
+ require_rvf(s) &&
61
require_scale_rvf(s) &&
62
(s->sew != MO_8);
63
}
64
--
29
--
65
2.45.1
30
2.31.1
66
31
67
32
diff view generated by jsdifflib
1
From: Andrew Jones <ajones@ventanamicro.com>
1
From: Alexey Baturo <baturo.alexey@gmail.com>
2
2
3
The Zkr extension may only be exposed to KVM guests if the VMM
3
Signed-off-by: Alexey Baturo <space.monkey.delivers@gmail.com>
4
implements the SEED CSR. Use the same implementation as TCG.
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Without this patch, running with a KVM which does not forward the
6
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
7
SEED CSR access to QEMU will result in an ILL exception being
7
Message-id: 20211025173609.2724490-2-space.monkey.delivers@gmail.com
8
injected into the guest (this results in Linux guests crashing on
9
boot). And, when running with a KVM which does forward the access,
10
QEMU will crash, since QEMU doesn't know what to do with the exit.
11
12
Fixes: 3108e2f1c69d ("target/riscv/kvm: update KVM exts to Linux 6.8")
13
Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
14
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
15
Cc: qemu-stable <qemu-stable@nongnu.org>
16
Message-ID: <20240422134605.534207-2-ajones@ventanamicro.com>
17
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
18
---
9
---
19
target/riscv/cpu.h | 3 +++
10
target/riscv/cpu.h | 2 ++
20
target/riscv/csr.c | 18 ++++++++++++++----
11
1 file changed, 2 insertions(+)
21
target/riscv/kvm/kvm-cpu.c | 25 +++++++++++++++++++++++++
22
3 files changed, 42 insertions(+), 4 deletions(-)
23
12
24
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
13
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
25
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
26
--- a/target/riscv/cpu.h
15
--- a/target/riscv/cpu.h
27
+++ b/target/riscv/cpu.h
16
+++ b/target/riscv/cpu.h
28
@@ -XXX,XX +XXX,XX @@ void riscv_set_csr_ops(int csrno, riscv_csr_operations *ops);
17
@@ -XXX,XX +XXX,XX @@
29
18
#define RVS RV('S')
30
void riscv_cpu_register_gdb_regs_for_features(CPUState *cs);
19
#define RVU RV('U')
31
20
#define RVH RV('H')
32
+target_ulong riscv_new_csr_seed(target_ulong new_value,
21
+#define RVJ RV('J')
33
+ target_ulong write_mask);
22
34
+
23
/* S extension denotes that Supervisor mode exists, however it is possible
35
uint8_t satp_mode_max_from_map(uint32_t map);
24
to have a core that support S mode but does not have an MMU and there
36
const char *satp_mode_str(uint8_t satp_mode, bool is_32_bit);
25
@@ -XXX,XX +XXX,XX @@ struct RISCVCPU {
37
26
bool ext_s;
38
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
27
bool ext_u;
39
index XXXXXXX..XXXXXXX 100644
28
bool ext_h;
40
--- a/target/riscv/csr.c
29
+ bool ext_j;
41
+++ b/target/riscv/csr.c
30
bool ext_v;
42
@@ -XXX,XX +XXX,XX @@ static RISCVException write_upmbase(CPURISCVState *env, int csrno,
31
bool ext_zba;
43
#endif
32
bool ext_zbb;
44
45
/* Crypto Extension */
46
-static RISCVException rmw_seed(CPURISCVState *env, int csrno,
47
- target_ulong *ret_value,
48
- target_ulong new_value,
49
- target_ulong write_mask)
50
+target_ulong riscv_new_csr_seed(target_ulong new_value,
51
+ target_ulong write_mask)
52
{
53
uint16_t random_v;
54
Error *random_e = NULL;
55
@@ -XXX,XX +XXX,XX @@ static RISCVException rmw_seed(CPURISCVState *env, int csrno,
56
rval = random_v | SEED_OPST_ES16;
57
}
58
59
+ return rval;
60
+}
61
+
62
+static RISCVException rmw_seed(CPURISCVState *env, int csrno,
63
+ target_ulong *ret_value,
64
+ target_ulong new_value,
65
+ target_ulong write_mask)
66
+{
67
+ target_ulong rval;
68
+
69
+ rval = riscv_new_csr_seed(new_value, write_mask);
70
+
71
if (ret_value) {
72
*ret_value = rval;
73
}
74
diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c
75
index XXXXXXX..XXXXXXX 100644
76
--- a/target/riscv/kvm/kvm-cpu.c
77
+++ b/target/riscv/kvm/kvm-cpu.c
78
@@ -XXX,XX +XXX,XX @@ static int kvm_riscv_handle_sbi(CPUState *cs, struct kvm_run *run)
79
return ret;
80
}
81
82
+static int kvm_riscv_handle_csr(CPUState *cs, struct kvm_run *run)
83
+{
84
+ target_ulong csr_num = run->riscv_csr.csr_num;
85
+ target_ulong new_value = run->riscv_csr.new_value;
86
+ target_ulong write_mask = run->riscv_csr.write_mask;
87
+ int ret = 0;
88
+
89
+ switch (csr_num) {
90
+ case CSR_SEED:
91
+ run->riscv_csr.ret_value = riscv_new_csr_seed(new_value, write_mask);
92
+ break;
93
+ default:
94
+ qemu_log_mask(LOG_UNIMP,
95
+ "%s: un-handled CSR EXIT for CSR %lx\n",
96
+ __func__, csr_num);
97
+ ret = -1;
98
+ break;
99
+ }
100
+
101
+ return ret;
102
+}
103
+
104
int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
105
{
106
int ret = 0;
107
@@ -XXX,XX +XXX,XX @@ int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
108
case KVM_EXIT_RISCV_SBI:
109
ret = kvm_riscv_handle_sbi(cs, run);
110
break;
111
+ case KVM_EXIT_RISCV_CSR:
112
+ ret = kvm_riscv_handle_csr(cs, run);
113
+ break;
114
default:
115
qemu_log_mask(LOG_UNIMP, "%s: un-handled exit reason %d\n",
116
__func__, run->exit_reason);
117
--
33
--
118
2.45.1
34
2.31.1
35
36
diff view generated by jsdifflib
1
From: Clément Léger <cleger@rivosinc.com>
1
From: Alexey Baturo <baturo.alexey@gmail.com>
2
2
3
The current semihost exception number (16) is a reserved number (range
3
Signed-off-by: Alexey Baturo <space.monkey.delivers@gmail.com>
4
[16-17]). The upcoming double trap specification uses that number for
5
the double trap exception. Since the privileged spec (Table 22) defines
6
ranges for custom uses change the semihosting exception number to 63
7
which belongs to the range [48-63] in order to avoid any future
8
collisions with reserved exception.
9
10
Signed-off-by: Clément Léger <cleger@rivosinc.com>
11
12
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
13
Message-ID: <20240422135840.1959967-1-cleger@rivosinc.com>
5
Message-id: 20211025173609.2724490-3-space.monkey.delivers@gmail.com
14
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
15
---
7
---
16
target/riscv/cpu_bits.h | 2 +-
8
target/riscv/cpu_bits.h | 96 +++++++++++++++++++++++++++++++++++++++++
17
1 file changed, 1 insertion(+), 1 deletion(-)
9
1 file changed, 96 insertions(+)
18
10
19
diff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h
11
diff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h
20
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
21
--- a/target/riscv/cpu_bits.h
13
--- a/target/riscv/cpu_bits.h
22
+++ b/target/riscv/cpu_bits.h
14
+++ b/target/riscv/cpu_bits.h
15
@@ -XXX,XX +XXX,XX @@
16
#define CSR_MHPMCOUNTER30H 0xb9e
17
#define CSR_MHPMCOUNTER31H 0xb9f
18
19
+/*
20
+ * User PointerMasking registers
21
+ * NB: actual CSR numbers might be changed in future
22
+ */
23
+#define CSR_UMTE 0x4c0
24
+#define CSR_UPMMASK 0x4c1
25
+#define CSR_UPMBASE 0x4c2
26
+
27
+/*
28
+ * Machine PointerMasking registers
29
+ * NB: actual CSR numbers might be changed in future
30
+ */
31
+#define CSR_MMTE 0x3c0
32
+#define CSR_MPMMASK 0x3c1
33
+#define CSR_MPMBASE 0x3c2
34
+
35
+/*
36
+ * Supervisor PointerMaster registers
37
+ * NB: actual CSR numbers might be changed in future
38
+ */
39
+#define CSR_SMTE 0x1c0
40
+#define CSR_SPMMASK 0x1c1
41
+#define CSR_SPMBASE 0x1c2
42
+
43
+/*
44
+ * Hypervisor PointerMaster registers
45
+ * NB: actual CSR numbers might be changed in future
46
+ */
47
+#define CSR_VSMTE 0x2c0
48
+#define CSR_VSPMMASK 0x2c1
49
+#define CSR_VSPMBASE 0x2c2
50
+
51
/* mstatus CSR bits */
52
#define MSTATUS_UIE 0x00000001
53
#define MSTATUS_SIE 0x00000002
23
@@ -XXX,XX +XXX,XX @@ typedef enum RISCVException {
54
@@ -XXX,XX +XXX,XX @@ typedef enum RISCVException {
24
RISCV_EXCP_INST_PAGE_FAULT = 0xc, /* since: priv-1.10.0 */
55
#define MIE_UTIE (1 << IRQ_U_TIMER)
25
RISCV_EXCP_LOAD_PAGE_FAULT = 0xd, /* since: priv-1.10.0 */
56
#define MIE_SSIE (1 << IRQ_S_SOFT)
26
RISCV_EXCP_STORE_PAGE_FAULT = 0xf, /* since: priv-1.10.0 */
57
#define MIE_USIE (1 << IRQ_U_SOFT)
27
- RISCV_EXCP_SEMIHOST = 0x10,
58
+
28
RISCV_EXCP_INST_GUEST_PAGE_FAULT = 0x14,
59
+/* General PointerMasking CSR bits*/
29
RISCV_EXCP_LOAD_GUEST_ACCESS_FAULT = 0x15,
60
+#define PM_ENABLE 0x00000001ULL
30
RISCV_EXCP_VIRT_INSTRUCTION_FAULT = 0x16,
61
+#define PM_CURRENT 0x00000002ULL
31
RISCV_EXCP_STORE_GUEST_AMO_ACCESS_FAULT = 0x17,
62
+#define PM_INSN 0x00000004ULL
32
+ RISCV_EXCP_SEMIHOST = 0x3f,
63
+#define PM_XS_MASK 0x00000003ULL
33
} RISCVException;
64
+
34
65
+/* PointerMasking XS bits values */
35
#define RISCV_EXCP_INT_FLAG 0x80000000
66
+#define PM_EXT_DISABLE 0x00000000ULL
67
+#define PM_EXT_INITIAL 0x00000001ULL
68
+#define PM_EXT_CLEAN 0x00000002ULL
69
+#define PM_EXT_DIRTY 0x00000003ULL
70
+
71
+/* Offsets for every pair of control bits per each priv level */
72
+#define XS_OFFSET 0ULL
73
+#define U_OFFSET 2ULL
74
+#define S_OFFSET 5ULL
75
+#define M_OFFSET 8ULL
76
+
77
+#define PM_XS_BITS (PM_XS_MASK << XS_OFFSET)
78
+#define U_PM_ENABLE (PM_ENABLE << U_OFFSET)
79
+#define U_PM_CURRENT (PM_CURRENT << U_OFFSET)
80
+#define U_PM_INSN (PM_INSN << U_OFFSET)
81
+#define S_PM_ENABLE (PM_ENABLE << S_OFFSET)
82
+#define S_PM_CURRENT (PM_CURRENT << S_OFFSET)
83
+#define S_PM_INSN (PM_INSN << S_OFFSET)
84
+#define M_PM_ENABLE (PM_ENABLE << M_OFFSET)
85
+#define M_PM_CURRENT (PM_CURRENT << M_OFFSET)
86
+#define M_PM_INSN (PM_INSN << M_OFFSET)
87
+
88
+/* mmte CSR bits */
89
+#define MMTE_PM_XS_BITS PM_XS_BITS
90
+#define MMTE_U_PM_ENABLE U_PM_ENABLE
91
+#define MMTE_U_PM_CURRENT U_PM_CURRENT
92
+#define MMTE_U_PM_INSN U_PM_INSN
93
+#define MMTE_S_PM_ENABLE S_PM_ENABLE
94
+#define MMTE_S_PM_CURRENT S_PM_CURRENT
95
+#define MMTE_S_PM_INSN S_PM_INSN
96
+#define MMTE_M_PM_ENABLE M_PM_ENABLE
97
+#define MMTE_M_PM_CURRENT M_PM_CURRENT
98
+#define MMTE_M_PM_INSN M_PM_INSN
99
+#define MMTE_MASK (MMTE_U_PM_ENABLE | MMTE_U_PM_CURRENT | MMTE_U_PM_INSN | \
100
+ MMTE_S_PM_ENABLE | MMTE_S_PM_CURRENT | MMTE_S_PM_INSN | \
101
+ MMTE_M_PM_ENABLE | MMTE_M_PM_CURRENT | MMTE_M_PM_INSN | \
102
+ MMTE_PM_XS_BITS)
103
+
104
+/* (v)smte CSR bits */
105
+#define SMTE_PM_XS_BITS PM_XS_BITS
106
+#define SMTE_U_PM_ENABLE U_PM_ENABLE
107
+#define SMTE_U_PM_CURRENT U_PM_CURRENT
108
+#define SMTE_U_PM_INSN U_PM_INSN
109
+#define SMTE_S_PM_ENABLE S_PM_ENABLE
110
+#define SMTE_S_PM_CURRENT S_PM_CURRENT
111
+#define SMTE_S_PM_INSN S_PM_INSN
112
+#define SMTE_MASK (SMTE_U_PM_ENABLE | SMTE_U_PM_CURRENT | SMTE_U_PM_INSN | \
113
+ SMTE_S_PM_ENABLE | SMTE_S_PM_CURRENT | SMTE_S_PM_INSN | \
114
+ SMTE_PM_XS_BITS)
115
+
116
+/* umte CSR bits */
117
+#define UMTE_U_PM_ENABLE U_PM_ENABLE
118
+#define UMTE_U_PM_CURRENT U_PM_CURRENT
119
+#define UMTE_U_PM_INSN U_PM_INSN
120
+#define UMTE_MASK (UMTE_U_PM_ENABLE | MMTE_U_PM_CURRENT | UMTE_U_PM_INSN)
121
+
122
#endif
36
--
123
--
37
2.45.1
124
2.31.1
38
125
39
126
diff view generated by jsdifflib
1
From: Yu-Ming Chang <yumin686@andestech.com>
1
From: Alexey Baturo <baturo.alexey@gmail.com>
2
2
3
Both CSRRS and CSRRC always read the addressed CSR and cause any read side
3
Signed-off-by: Alexey Baturo <space.monkey.delivers@gmail.com>
4
effects regardless of rs1 and rd fields. Note that if rs1 specifies a register
5
holding a zero value other than x0, the instruction will still attempt to write
6
the unmodified value back to the CSR and will cause any attendant side effects.
7
8
So if CSRRS or CSRRC tries to write a read-only CSR with rs1 which specifies
9
a register holding a zero value, an illegal instruction exception should be
10
raised.
11
12
Signed-off-by: Yu-Ming Chang <yumin686@andestech.com>
13
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
14
Message-ID: <20240403070823.80897-1-yumin686@andestech.com>
5
Message-id: 20211025173609.2724490-4-space.monkey.delivers@gmail.com
15
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
16
---
7
---
17
target/riscv/cpu.h | 4 ++++
8
target/riscv/cpu.h | 11 ++
18
target/riscv/csr.c | 51 ++++++++++++++++++++++++++++++++++++----
9
target/riscv/cpu.c | 2 +
19
target/riscv/op_helper.c | 6 ++---
10
target/riscv/csr.c | 285 +++++++++++++++++++++++++++++++++++++++++++++
20
3 files changed, 53 insertions(+), 8 deletions(-)
11
3 files changed, 298 insertions(+)
21
12
22
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
13
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
23
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
24
--- a/target/riscv/cpu.h
15
--- a/target/riscv/cpu.h
25
+++ b/target/riscv/cpu.h
16
+++ b/target/riscv/cpu.h
26
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPURISCVState *env, vaddr *pc,
17
@@ -XXX,XX +XXX,XX @@ struct CPURISCVState {
27
void riscv_cpu_update_mask(CPURISCVState *env);
18
28
bool riscv_cpu_is_32bit(RISCVCPU *cpu);
19
/* True if in debugger mode. */
29
20
bool debugger;
30
+RISCVException riscv_csrr(CPURISCVState *env, int csrno,
21
+
31
+ target_ulong *ret_value);
22
+ /*
32
RISCVException riscv_csrrw(CPURISCVState *env, int csrno,
23
+ * CSRs for PointerMasking extension
33
target_ulong *ret_value,
24
+ */
34
target_ulong new_value, target_ulong write_mask);
25
+ target_ulong mmte;
35
@@ -XXX,XX +XXX,XX @@ typedef RISCVException (*riscv_csr_op_fn)(CPURISCVState *env, int csrno,
26
+ target_ulong mpmmask;
36
target_ulong new_value,
27
+ target_ulong mpmbase;
37
target_ulong write_mask);
28
+ target_ulong spmmask;
38
29
+ target_ulong spmbase;
39
+RISCVException riscv_csrr_i128(CPURISCVState *env, int csrno,
30
+ target_ulong upmmask;
40
+ Int128 *ret_value);
31
+ target_ulong upmbase;
41
RISCVException riscv_csrrw_i128(CPURISCVState *env, int csrno,
32
#endif
42
Int128 *ret_value,
33
43
Int128 new_value, Int128 write_mask);
34
float_status fp_status;
35
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
36
index XXXXXXX..XXXXXXX 100644
37
--- a/target/riscv/cpu.c
38
+++ b/target/riscv/cpu.c
39
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_reset(DeviceState *dev)
40
env->mcause = 0;
41
env->pc = env->resetvec;
42
env->two_stage_lookup = false;
43
+ /* mmte is supposed to have pm.current hardwired to 1 */
44
+ env->mmte |= (PM_EXT_INITIAL | MMTE_M_PM_CURRENT);
45
#endif
46
cs->exception_index = RISCV_EXCP_NONE;
47
env->load_res = -1;
44
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
48
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
45
index XXXXXXX..XXXXXXX 100644
49
index XXXXXXX..XXXXXXX 100644
46
--- a/target/riscv/csr.c
50
--- a/target/riscv/csr.c
47
+++ b/target/riscv/csr.c
51
+++ b/target/riscv/csr.c
48
@@ -XXX,XX +XXX,XX @@ static RISCVException rmw_seed(CPURISCVState *env, int csrno,
52
@@ -XXX,XX +XXX,XX @@ static RISCVException hmode32(CPURISCVState *env, int csrno)
49
53
50
static inline RISCVException riscv_csrrw_check(CPURISCVState *env,
54
}
51
int csrno,
55
52
- bool write_mask)
56
+/* Checks if PointerMasking registers could be accessed */
53
+ bool write)
57
+static RISCVException pointer_masking(CPURISCVState *env, int csrno)
58
+{
59
+ /* Check if j-ext is present */
60
+ if (riscv_has_ext(env, RVJ)) {
61
+ return RISCV_EXCP_NONE;
62
+ }
63
+ return RISCV_EXCP_ILLEGAL_INST;
64
+}
65
+
66
static RISCVException pmp(CPURISCVState *env, int csrno)
54
{
67
{
55
/* check privileges and return RISCV_EXCP_ILLEGAL_INST if check fails */
68
if (riscv_feature(env, RISCV_FEATURE_PMP)) {
56
bool read_only = get_field(csrno, 0xC00) == 3;
69
@@ -XXX,XX +XXX,XX @@ static RISCVException write_pmpaddr(CPURISCVState *env, int csrno,
57
@@ -XXX,XX +XXX,XX @@ static inline RISCVException riscv_csrrw_check(CPURISCVState *env,
58
}
59
60
/* read / write check */
61
- if (write_mask && read_only) {
62
+ if (write && read_only) {
63
return RISCV_EXCP_ILLEGAL_INST;
64
}
65
66
@@ -XXX,XX +XXX,XX @@ static RISCVException riscv_csrrw_do64(CPURISCVState *env, int csrno,
67
return RISCV_EXCP_NONE;
70
return RISCV_EXCP_NONE;
68
}
71
}
69
72
70
+RISCVException riscv_csrr(CPURISCVState *env, int csrno,
73
+/*
71
+ target_ulong *ret_value)
74
+ * Functions to access Pointer Masking feature registers
72
+{
75
+ * We have to check if current priv lvl could modify
73
+ RISCVException ret = riscv_csrrw_check(env, csrno, false);
76
+ * csr in given mode
74
+ if (ret != RISCV_EXCP_NONE) {
77
+ */
75
+ return ret;
78
+static bool check_pm_current_disabled(CPURISCVState *env, int csrno)
76
+ }
79
+{
77
+
80
+ int csr_priv = get_field(csrno, 0x300);
78
+ return riscv_csrrw_do64(env, csrno, ret_value, 0, 0);
81
+ int pm_current;
79
+}
80
+
81
RISCVException riscv_csrrw(CPURISCVState *env, int csrno,
82
target_ulong *ret_value,
83
target_ulong new_value, target_ulong write_mask)
84
{
85
- RISCVException ret = riscv_csrrw_check(env, csrno, write_mask);
86
+ RISCVException ret = riscv_csrrw_check(env, csrno, true);
87
if (ret != RISCV_EXCP_NONE) {
88
return ret;
89
}
90
@@ -XXX,XX +XXX,XX @@ static RISCVException riscv_csrrw_do128(CPURISCVState *env, int csrno,
91
return RISCV_EXCP_NONE;
92
}
93
94
+RISCVException riscv_csrr_i128(CPURISCVState *env, int csrno,
95
+ Int128 *ret_value)
96
+{
97
+ RISCVException ret;
98
+
99
+ ret = riscv_csrrw_check(env, csrno, false);
100
+ if (ret != RISCV_EXCP_NONE) {
101
+ return ret;
102
+ }
103
+
104
+ if (csr_ops[csrno].read128) {
105
+ return riscv_csrrw_do128(env, csrno, ret_value,
106
+ int128_zero(), int128_zero());
107
+ }
108
+
82
+
109
+ /*
83
+ /*
110
+ * Fall back to 64-bit version for now, if the 128-bit alternative isn't
84
+ * If priv lvls differ that means we're accessing csr from higher priv lvl,
111
+ * at all defined.
85
+ * so allow the access
112
+ * Note, some CSRs don't need to extend to MXLEN (64 upper bits non
113
+ * significant), for those, this fallback is correctly handling the
114
+ * accesses
115
+ */
86
+ */
116
+ target_ulong old_value;
87
+ if (env->priv != csr_priv) {
117
+ ret = riscv_csrrw_do64(env, csrno, &old_value,
88
+ return false;
118
+ (target_ulong)0,
89
+ }
119
+ (target_ulong)0);
90
+ switch (env->priv) {
120
+ if (ret == RISCV_EXCP_NONE && ret_value) {
91
+ case PRV_M:
121
+ *ret_value = int128_make64(old_value);
92
+ pm_current = get_field(env->mmte, M_PM_CURRENT);
122
+ }
93
+ break;
123
+ return ret;
94
+ case PRV_S:
124
+}
95
+ pm_current = get_field(env->mmte, S_PM_CURRENT);
125
+
96
+ break;
126
RISCVException riscv_csrrw_i128(CPURISCVState *env, int csrno,
97
+ case PRV_U:
127
Int128 *ret_value,
98
+ pm_current = get_field(env->mmte, U_PM_CURRENT);
128
Int128 new_value, Int128 write_mask)
99
+ break;
129
{
100
+ default:
130
RISCVException ret;
101
+ g_assert_not_reached();
131
102
+ }
132
- ret = riscv_csrrw_check(env, csrno, int128_nz(write_mask));
103
+ /* It's same priv lvl, so we allow to modify csr only if pm.current==1 */
133
+ ret = riscv_csrrw_check(env, csrno, true);
104
+ return !pm_current;
134
if (ret != RISCV_EXCP_NONE) {
105
+}
135
return ret;
106
+
136
}
107
+static RISCVException read_mmte(CPURISCVState *env, int csrno,
137
diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
108
+ target_ulong *val)
138
index XXXXXXX..XXXXXXX 100644
109
+{
139
--- a/target/riscv/op_helper.c
110
+ *val = env->mmte & MMTE_MASK;
140
+++ b/target/riscv/op_helper.c
111
+ return RISCV_EXCP_NONE;
141
@@ -XXX,XX +XXX,XX @@ target_ulong helper_csrr(CPURISCVState *env, int csr)
112
+}
142
}
113
+
143
114
+static RISCVException write_mmte(CPURISCVState *env, int csrno,
144
target_ulong val = 0;
115
+ target_ulong val)
145
- RISCVException ret = riscv_csrrw(env, csr, &val, 0, 0);
116
+{
146
+ RISCVException ret = riscv_csrr(env, csr, &val);
117
+ uint64_t mstatus;
147
118
+ target_ulong wpri_val = val & MMTE_MASK;
148
if (ret != RISCV_EXCP_NONE) {
119
+
149
riscv_raise_exception(env, ret, GETPC());
120
+ if (val != wpri_val) {
150
@@ -XXX,XX +XXX,XX @@ target_ulong helper_csrrw(CPURISCVState *env, int csr,
121
+ qemu_log_mask(LOG_GUEST_ERROR, "%s" TARGET_FMT_lx " %s" TARGET_FMT_lx "\n",
151
target_ulong helper_csrr_i128(CPURISCVState *env, int csr)
122
+ "MMTE: WPRI violation written 0x", val,
152
{
123
+ "vs expected 0x", wpri_val);
153
Int128 rv = int128_zero();
124
+ }
154
- RISCVException ret = riscv_csrrw_i128(env, csr, &rv,
125
+ /* for machine mode pm.current is hardwired to 1 */
155
- int128_zero(),
126
+ wpri_val |= MMTE_M_PM_CURRENT;
156
- int128_zero());
127
+
157
+ RISCVException ret = riscv_csrr_i128(env, csr, &rv);
128
+ /* hardwiring pm.instruction bit to 0, since it's not supported yet */
158
129
+ wpri_val &= ~(MMTE_M_PM_INSN | MMTE_S_PM_INSN | MMTE_U_PM_INSN);
159
if (ret != RISCV_EXCP_NONE) {
130
+ env->mmte = wpri_val | PM_EXT_DIRTY;
160
riscv_raise_exception(env, ret, GETPC());
131
+
132
+ /* Set XS and SD bits, since PM CSRs are dirty */
133
+ mstatus = env->mstatus | MSTATUS_XS;
134
+ write_mstatus(env, csrno, mstatus);
135
+ return RISCV_EXCP_NONE;
136
+}
137
+
138
+static RISCVException read_smte(CPURISCVState *env, int csrno,
139
+ target_ulong *val)
140
+{
141
+ *val = env->mmte & SMTE_MASK;
142
+ return RISCV_EXCP_NONE;
143
+}
144
+
145
+static RISCVException write_smte(CPURISCVState *env, int csrno,
146
+ target_ulong val)
147
+{
148
+ target_ulong wpri_val = val & SMTE_MASK;
149
+
150
+ if (val != wpri_val) {
151
+ qemu_log_mask(LOG_GUEST_ERROR, "%s" TARGET_FMT_lx " %s" TARGET_FMT_lx "\n",
152
+ "SMTE: WPRI violation written 0x", val,
153
+ "vs expected 0x", wpri_val);
154
+ }
155
+
156
+ /* if pm.current==0 we can't modify current PM CSRs */
157
+ if (check_pm_current_disabled(env, csrno)) {
158
+ return RISCV_EXCP_NONE;
159
+ }
160
+
161
+ wpri_val |= (env->mmte & ~SMTE_MASK);
162
+ write_mmte(env, csrno, wpri_val);
163
+ return RISCV_EXCP_NONE;
164
+}
165
+
166
+static RISCVException read_umte(CPURISCVState *env, int csrno,
167
+ target_ulong *val)
168
+{
169
+ *val = env->mmte & UMTE_MASK;
170
+ return RISCV_EXCP_NONE;
171
+}
172
+
173
+static RISCVException write_umte(CPURISCVState *env, int csrno,
174
+ target_ulong val)
175
+{
176
+ target_ulong wpri_val = val & UMTE_MASK;
177
+
178
+ if (val != wpri_val) {
179
+ qemu_log_mask(LOG_GUEST_ERROR, "%s" TARGET_FMT_lx " %s" TARGET_FMT_lx "\n",
180
+ "UMTE: WPRI violation written 0x", val,
181
+ "vs expected 0x", wpri_val);
182
+ }
183
+
184
+ if (check_pm_current_disabled(env, csrno)) {
185
+ return RISCV_EXCP_NONE;
186
+ }
187
+
188
+ wpri_val |= (env->mmte & ~UMTE_MASK);
189
+ write_mmte(env, csrno, wpri_val);
190
+ return RISCV_EXCP_NONE;
191
+}
192
+
193
+static RISCVException read_mpmmask(CPURISCVState *env, int csrno,
194
+ target_ulong *val)
195
+{
196
+ *val = env->mpmmask;
197
+ return RISCV_EXCP_NONE;
198
+}
199
+
200
+static RISCVException write_mpmmask(CPURISCVState *env, int csrno,
201
+ target_ulong val)
202
+{
203
+ uint64_t mstatus;
204
+
205
+ env->mpmmask = val;
206
+ env->mmte |= PM_EXT_DIRTY;
207
+
208
+ /* Set XS and SD bits, since PM CSRs are dirty */
209
+ mstatus = env->mstatus | MSTATUS_XS;
210
+ write_mstatus(env, csrno, mstatus);
211
+ return RISCV_EXCP_NONE;
212
+}
213
+
214
+static RISCVException read_spmmask(CPURISCVState *env, int csrno,
215
+ target_ulong *val)
216
+{
217
+ *val = env->spmmask;
218
+ return RISCV_EXCP_NONE;
219
+}
220
+
221
+static RISCVException write_spmmask(CPURISCVState *env, int csrno,
222
+ target_ulong val)
223
+{
224
+ uint64_t mstatus;
225
+
226
+ /* if pm.current==0 we can't modify current PM CSRs */
227
+ if (check_pm_current_disabled(env, csrno)) {
228
+ return RISCV_EXCP_NONE;
229
+ }
230
+ env->spmmask = val;
231
+ env->mmte |= PM_EXT_DIRTY;
232
+
233
+ /* Set XS and SD bits, since PM CSRs are dirty */
234
+ mstatus = env->mstatus | MSTATUS_XS;
235
+ write_mstatus(env, csrno, mstatus);
236
+ return RISCV_EXCP_NONE;
237
+}
238
+
239
+static RISCVException read_upmmask(CPURISCVState *env, int csrno,
240
+ target_ulong *val)
241
+{
242
+ *val = env->upmmask;
243
+ return RISCV_EXCP_NONE;
244
+}
245
+
246
+static RISCVException write_upmmask(CPURISCVState *env, int csrno,
247
+ target_ulong val)
248
+{
249
+ uint64_t mstatus;
250
+
251
+ /* if pm.current==0 we can't modify current PM CSRs */
252
+ if (check_pm_current_disabled(env, csrno)) {
253
+ return RISCV_EXCP_NONE;
254
+ }
255
+ env->upmmask = val;
256
+ env->mmte |= PM_EXT_DIRTY;
257
+
258
+ /* Set XS and SD bits, since PM CSRs are dirty */
259
+ mstatus = env->mstatus | MSTATUS_XS;
260
+ write_mstatus(env, csrno, mstatus);
261
+ return RISCV_EXCP_NONE;
262
+}
263
+
264
+static RISCVException read_mpmbase(CPURISCVState *env, int csrno,
265
+ target_ulong *val)
266
+{
267
+ *val = env->mpmbase;
268
+ return RISCV_EXCP_NONE;
269
+}
270
+
271
+static RISCVException write_mpmbase(CPURISCVState *env, int csrno,
272
+ target_ulong val)
273
+{
274
+ uint64_t mstatus;
275
+
276
+ env->mpmbase = val;
277
+ env->mmte |= PM_EXT_DIRTY;
278
+
279
+ /* Set XS and SD bits, since PM CSRs are dirty */
280
+ mstatus = env->mstatus | MSTATUS_XS;
281
+ write_mstatus(env, csrno, mstatus);
282
+ return RISCV_EXCP_NONE;
283
+}
284
+
285
+static RISCVException read_spmbase(CPURISCVState *env, int csrno,
286
+ target_ulong *val)
287
+{
288
+ *val = env->spmbase;
289
+ return RISCV_EXCP_NONE;
290
+}
291
+
292
+static RISCVException write_spmbase(CPURISCVState *env, int csrno,
293
+ target_ulong val)
294
+{
295
+ uint64_t mstatus;
296
+
297
+ /* if pm.current==0 we can't modify current PM CSRs */
298
+ if (check_pm_current_disabled(env, csrno)) {
299
+ return RISCV_EXCP_NONE;
300
+ }
301
+ env->spmbase = val;
302
+ env->mmte |= PM_EXT_DIRTY;
303
+
304
+ /* Set XS and SD bits, since PM CSRs are dirty */
305
+ mstatus = env->mstatus | MSTATUS_XS;
306
+ write_mstatus(env, csrno, mstatus);
307
+ return RISCV_EXCP_NONE;
308
+}
309
+
310
+static RISCVException read_upmbase(CPURISCVState *env, int csrno,
311
+ target_ulong *val)
312
+{
313
+ *val = env->upmbase;
314
+ return RISCV_EXCP_NONE;
315
+}
316
+
317
+static RISCVException write_upmbase(CPURISCVState *env, int csrno,
318
+ target_ulong val)
319
+{
320
+ uint64_t mstatus;
321
+
322
+ /* if pm.current==0 we can't modify current PM CSRs */
323
+ if (check_pm_current_disabled(env, csrno)) {
324
+ return RISCV_EXCP_NONE;
325
+ }
326
+ env->upmbase = val;
327
+ env->mmte |= PM_EXT_DIRTY;
328
+
329
+ /* Set XS and SD bits, since PM CSRs are dirty */
330
+ mstatus = env->mstatus | MSTATUS_XS;
331
+ write_mstatus(env, csrno, mstatus);
332
+ return RISCV_EXCP_NONE;
333
+}
334
+
335
#endif
336
337
/*
338
@@ -XXX,XX +XXX,XX @@ riscv_csr_operations csr_ops[CSR_TABLE_SIZE] = {
339
[CSR_PMPADDR14] = { "pmpaddr14", pmp, read_pmpaddr, write_pmpaddr },
340
[CSR_PMPADDR15] = { "pmpaddr15", pmp, read_pmpaddr, write_pmpaddr },
341
342
+ /* User Pointer Masking */
343
+ [CSR_UMTE] = { "umte", pointer_masking, read_umte, write_umte },
344
+ [CSR_UPMMASK] = { "upmmask", pointer_masking, read_upmmask, write_upmmask },
345
+ [CSR_UPMBASE] = { "upmbase", pointer_masking, read_upmbase, write_upmbase },
346
+ /* Machine Pointer Masking */
347
+ [CSR_MMTE] = { "mmte", pointer_masking, read_mmte, write_mmte },
348
+ [CSR_MPMMASK] = { "mpmmask", pointer_masking, read_mpmmask, write_mpmmask },
349
+ [CSR_MPMBASE] = { "mpmbase", pointer_masking, read_mpmbase, write_mpmbase },
350
+ /* Supervisor Pointer Masking */
351
+ [CSR_SMTE] = { "smte", pointer_masking, read_smte, write_smte },
352
+ [CSR_SPMMASK] = { "spmmask", pointer_masking, read_spmmask, write_spmmask },
353
+ [CSR_SPMBASE] = { "spmbase", pointer_masking, read_spmbase, write_spmbase },
354
+
355
/* Performance Counters */
356
[CSR_HPMCOUNTER3] = { "hpmcounter3", ctr, read_zero },
357
[CSR_HPMCOUNTER4] = { "hpmcounter4", ctr, read_zero },
161
--
358
--
162
2.45.1
359
2.31.1
360
361
diff view generated by jsdifflib
1
From: Christoph Müllner <christoph.muellner@vrull.eu>
1
From: Alexey Baturo <baturo.alexey@gmail.com>
2
2
3
The th.sxstatus CSR can be used to identify available custom extension
3
Signed-off-by: Alexey Baturo <space.monkey.delivers@gmail.com>
4
on T-Head CPUs. The CSR is documented here:
5
https://github.com/T-head-Semi/thead-extension-spec/blob/master/xtheadsxstatus.adoc
6
7
An important property of this patch is, that the th.sxstatus MAEE field
8
is not set (indicating that XTheadMae is not available).
9
XTheadMae is a memory attribute extension (similar to Svpbmt) which is
10
implemented in many T-Head CPUs (C906, C910, etc.) and utilizes bits
11
in PTEs that are marked as reserved. QEMU maintainers prefer to not
12
implement XTheadMae, so we need give kernels a mechanism to identify
13
if XTheadMae is available in a system or not. And this patch introduces
14
this mechanism in QEMU in a way that's compatible with real HW
15
(i.e., probing the th.sxstatus.MAEE bit).
16
17
Further context can be found on the list:
18
https://lists.gnu.org/archive/html/qemu-devel/2024-02/msg00775.html
19
20
Reviewed-by: LIU Zhiwei <zhiwe_liu@linux.alibaba.com>
21
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
22
Signed-off-by: Christoph Müllner <christoph.muellner@vrull.eu>
5
Message-id: 20211025173609.2724490-5-space.monkey.delivers@gmail.com
23
Message-ID: <20240429073656.2486732-1-christoph.muellner@vrull.eu>
24
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
25
---
7
---
26
MAINTAINERS | 1 +
8
target/riscv/machine.c | 27 +++++++++++++++++++++++++++
27
target/riscv/cpu.h | 3 ++
9
1 file changed, 27 insertions(+)
28
target/riscv/cpu.c | 1 +
29
target/riscv/th_csr.c | 79 ++++++++++++++++++++++++++++++++++++++++
30
target/riscv/meson.build | 1 +
31
5 files changed, 85 insertions(+)
32
create mode 100644 target/riscv/th_csr.c
33
10
34
diff --git a/MAINTAINERS b/MAINTAINERS
11
diff --git a/target/riscv/machine.c b/target/riscv/machine.c
35
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
36
--- a/MAINTAINERS
13
--- a/target/riscv/machine.c
37
+++ b/MAINTAINERS
14
+++ b/target/riscv/machine.c
38
@@ -XXX,XX +XXX,XX @@ L: qemu-riscv@nongnu.org
15
@@ -XXX,XX +XXX,XX @@ static bool vector_needed(void *opaque)
39
S: Supported
16
return riscv_has_ext(env, RVV);
40
F: target/riscv/insn_trans/trans_xthead.c.inc
17
}
41
F: target/riscv/xthead*.decode
18
42
+F: target/riscv/th_*
19
+static bool pointermasking_needed(void *opaque)
43
F: disas/riscv-xthead*
20
+{
44
21
+ RISCVCPU *cpu = opaque;
45
RISC-V XVentanaCondOps extension
22
+ CPURISCVState *env = &cpu->env;
46
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
47
index XXXXXXX..XXXXXXX 100644
48
--- a/target/riscv/cpu.h
49
+++ b/target/riscv/cpu.h
50
@@ -XXX,XX +XXX,XX @@ target_ulong riscv_new_csr_seed(target_ulong new_value,
51
uint8_t satp_mode_max_from_map(uint32_t map);
52
const char *satp_mode_str(uint8_t satp_mode, bool is_32_bit);
53
54
+/* Implemented in th_csr.c */
55
+void th_register_custom_csrs(RISCVCPU *cpu);
56
+
23
+
57
#endif /* RISCV_CPU_H */
24
+ return riscv_has_ext(env, RVJ);
58
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
59
index XXXXXXX..XXXXXXX 100644
60
--- a/target/riscv/cpu.c
61
+++ b/target/riscv/cpu.c
62
@@ -XXX,XX +XXX,XX @@ static void rv64_thead_c906_cpu_init(Object *obj)
63
cpu->cfg.mvendorid = THEAD_VENDOR_ID;
64
#ifndef CONFIG_USER_ONLY
65
set_satp_mode_max_supported(cpu, VM_1_10_SV39);
66
+ th_register_custom_csrs(cpu);
67
#endif
68
69
/* inherited from parent obj via riscv_cpu_init() */
70
diff --git a/target/riscv/th_csr.c b/target/riscv/th_csr.c
71
new file mode 100644
72
index XXXXXXX..XXXXXXX
73
--- /dev/null
74
+++ b/target/riscv/th_csr.c
75
@@ -XXX,XX +XXX,XX @@
76
+/*
77
+ * T-Head-specific CSRs.
78
+ *
79
+ * Copyright (c) 2024 VRULL GmbH
80
+ *
81
+ * This program is free software; you can redistribute it and/or modify it
82
+ * under the terms and conditions of the GNU General Public License,
83
+ * version 2 or later, as published by the Free Software Foundation.
84
+ *
85
+ * This program is distributed in the hope it will be useful, but WITHOUT
86
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
87
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
88
+ * more details.
89
+ *
90
+ * You should have received a copy of the GNU General Public License along with
91
+ * this program. If not, see <http://www.gnu.org/licenses/>.
92
+ */
93
+
94
+#include "qemu/osdep.h"
95
+#include "cpu.h"
96
+#include "cpu_vendorid.h"
97
+
98
+#define CSR_TH_SXSTATUS 0x5c0
99
+
100
+/* TH_SXSTATUS bits */
101
+#define TH_SXSTATUS_UCME BIT(16)
102
+#define TH_SXSTATUS_MAEE BIT(21)
103
+#define TH_SXSTATUS_THEADISAEE BIT(22)
104
+
105
+typedef struct {
106
+ int csrno;
107
+ int (*insertion_test)(RISCVCPU *cpu);
108
+ riscv_csr_operations csr_ops;
109
+} riscv_csr;
110
+
111
+static RISCVException smode(CPURISCVState *env, int csrno)
112
+{
113
+ if (riscv_has_ext(env, RVS)) {
114
+ return RISCV_EXCP_NONE;
115
+ }
116
+
117
+ return RISCV_EXCP_ILLEGAL_INST;
118
+}
25
+}
119
+
26
+
120
+static int test_thead_mvendorid(RISCVCPU *cpu)
27
static const VMStateDescription vmstate_vector = {
121
+{
28
.name = "cpu/vector",
122
+ if (cpu->cfg.mvendorid != THEAD_VENDOR_ID) {
29
.version_id = 1,
123
+ return -1;
30
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_vector = {
124
+ }
31
}
32
};
33
34
+static const VMStateDescription vmstate_pointermasking = {
35
+ .name = "cpu/pointer_masking",
36
+ .version_id = 1,
37
+ .minimum_version_id = 1,
38
+ .needed = pointermasking_needed,
39
+ .fields = (VMStateField[]) {
40
+ VMSTATE_UINTTL(env.mmte, RISCVCPU),
41
+ VMSTATE_UINTTL(env.mpmmask, RISCVCPU),
42
+ VMSTATE_UINTTL(env.mpmbase, RISCVCPU),
43
+ VMSTATE_UINTTL(env.spmmask, RISCVCPU),
44
+ VMSTATE_UINTTL(env.spmbase, RISCVCPU),
45
+ VMSTATE_UINTTL(env.upmmask, RISCVCPU),
46
+ VMSTATE_UINTTL(env.upmbase, RISCVCPU),
125
+
47
+
126
+ return 0;
48
+ VMSTATE_END_OF_LIST()
127
+}
128
+
129
+static RISCVException read_th_sxstatus(CPURISCVState *env, int csrno,
130
+ target_ulong *val)
131
+{
132
+ /* We don't set MAEE here, because QEMU does not implement MAEE. */
133
+ *val = TH_SXSTATUS_UCME | TH_SXSTATUS_THEADISAEE;
134
+ return RISCV_EXCP_NONE;
135
+}
136
+
137
+static riscv_csr th_csr_list[] = {
138
+ {
139
+ .csrno = CSR_TH_SXSTATUS,
140
+ .insertion_test = test_thead_mvendorid,
141
+ .csr_ops = { "th.sxstatus", smode, read_th_sxstatus }
142
+ }
49
+ }
143
+};
50
+};
144
+
51
+
145
+void th_register_custom_csrs(RISCVCPU *cpu)
52
static const VMStateDescription vmstate_hyper = {
146
+{
53
.name = "cpu/hyper",
147
+ for (size_t i = 0; i < ARRAY_SIZE(th_csr_list); i++) {
54
.version_id = 1,
148
+ int csrno = th_csr_list[i].csrno;
55
@@ -XXX,XX +XXX,XX @@ const VMStateDescription vmstate_riscv_cpu = {
149
+ riscv_csr_operations *csr_ops = &th_csr_list[i].csr_ops;
56
&vmstate_pmp,
150
+ if (!th_csr_list[i].insertion_test(cpu)) {
57
&vmstate_hyper,
151
+ riscv_set_csr_ops(csrno, csr_ops);
58
&vmstate_vector,
152
+ }
59
+ &vmstate_pointermasking,
153
+ }
60
NULL
154
+}
61
}
155
diff --git a/target/riscv/meson.build b/target/riscv/meson.build
62
};
156
index XXXXXXX..XXXXXXX 100644
157
--- a/target/riscv/meson.build
158
+++ b/target/riscv/meson.build
159
@@ -XXX,XX +XXX,XX @@ riscv_system_ss.add(files(
160
'monitor.c',
161
'machine.c',
162
'pmu.c',
163
+ 'th_csr.c',
164
'time_helper.c',
165
'riscv-qmp-cmds.c',
166
))
167
--
63
--
168
2.45.1
64
2.31.1
169
65
170
66
diff view generated by jsdifflib
1
From: Rob Bradford <rbradford@rivosinc.com>
1
From: Alexey Baturo <baturo.alexey@gmail.com>
2
2
3
This extension has now been ratified:
3
Signed-off-by: Alexey Baturo <space.monkey.delivers@gmail.com>
4
https://jira.riscv.org/browse/RVS-2006 so the "x-" prefix can be
5
removed.
6
7
Since this is now a ratified extension add it to the list of extensions
8
included in the "max" CPU variant.
9
10
Signed-off-by: Rob Bradford <rbradford@rivosinc.com>
11
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
12
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
13
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
5
Message-id: 20211025173609.2724490-6-space.monkey.delivers@gmail.com
14
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
15
Message-ID: <20240514110217.22516-1-rbradford@rivosinc.com>
16
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
17
---
7
---
18
target/riscv/cpu.c | 2 +-
8
target/riscv/cpu.c | 7 +++++++
19
target/riscv/tcg/tcg-cpu.c | 2 +-
9
1 file changed, 7 insertions(+)
20
2 files changed, 2 insertions(+), 2 deletions(-)
21
10
22
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
11
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
23
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
24
--- a/target/riscv/cpu.c
13
--- a/target/riscv/cpu.c
25
+++ b/target/riscv/cpu.c
14
+++ b/target/riscv/cpu.c
26
@@ -XXX,XX +XXX,XX @@ static const MISAExtInfo misa_ext_info_arr[] = {
15
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_dump_state(CPUState *cs, FILE *f, int flags)
27
MISA_EXT_INFO(RVJ, "x-j", "Dynamic translated languages"),
16
CSR_MSCRATCH,
28
MISA_EXT_INFO(RVV, "v", "Vector operations"),
17
CSR_SSCRATCH,
29
MISA_EXT_INFO(RVG, "g", "General purpose (IMAFD_Zicsr_Zifencei)"),
18
CSR_SATP,
30
- MISA_EXT_INFO(RVB, "x-b", "Bit manipulation (Zba_Zbb_Zbs)")
19
+ CSR_MMTE,
31
+ MISA_EXT_INFO(RVB, "b", "Bit manipulation (Zba_Zbb_Zbs)")
20
+ CSR_UPMBASE,
32
};
21
+ CSR_UPMMASK,
33
22
+ CSR_SPMBASE,
34
static void riscv_cpu_validate_misa_mxl(RISCVCPUClass *mcc)
23
+ CSR_SPMMASK,
35
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
24
+ CSR_MPMBASE,
36
index XXXXXXX..XXXXXXX 100644
25
+ CSR_MPMMASK,
37
--- a/target/riscv/tcg/tcg-cpu.c
26
};
38
+++ b/target/riscv/tcg/tcg-cpu.c
27
39
@@ -XXX,XX +XXX,XX @@ static void riscv_init_max_cpu_extensions(Object *obj)
28
for (int i = 0; i < ARRAY_SIZE(dump_csrs); ++i) {
40
const RISCVCPUMultiExtConfig *prop;
41
42
/* Enable RVG, RVJ and RVV that are disabled by default */
43
- riscv_cpu_set_misa_ext(env, env->misa_ext | RVG | RVJ | RVV);
44
+ riscv_cpu_set_misa_ext(env, env->misa_ext | RVB | RVG | RVJ | RVV);
45
46
for (prop = riscv_cpu_extensions; prop && prop->name; prop++) {
47
isa_ext_update_enabled(cpu, prop->offset, true);
48
--
29
--
49
2.45.1
30
2.31.1
31
32
diff view generated by jsdifflib
1
From: Max Chou <max.chou@sifive.com>
1
From: Alexey Baturo <baturo.alexey@gmail.com>
2
2
3
According v spec 18.4, only the vfwcvt.f.f.v and vfncvt.f.f.w
3
Signed-off-by: Alexey Baturo <space.monkey.delivers@gmail.com>
4
instructions will be affected by Zvfhmin extension.
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
And the vfwcvt.f.f.v and vfncvt.f.f.w instructions only support the
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
conversions of
6
Message-id: 20211025173609.2724490-7-space.monkey.delivers@gmail.com
7
8
* From 1*SEW(16/32) to 2*SEW(32/64)
9
* From 2*SEW(32/64) to 1*SEW(16/32)
10
11
Signed-off-by: Max Chou <max.chou@sifive.com>
12
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
13
Cc: qemu-stable <qemu-stable@nongnu.org>
14
Message-ID: <20240322092600.1198921-2-max.chou@sifive.com>
15
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
16
---
8
---
17
target/riscv/insn_trans/trans_rvv.c.inc | 20 ++++++++++++++++++--
9
target/riscv/translate.c | 8 ++++++++
18
1 file changed, 18 insertions(+), 2 deletions(-)
10
target/riscv/insn_trans/trans_rva.c.inc | 3 +++
11
target/riscv/insn_trans/trans_rvd.c.inc | 2 ++
12
target/riscv/insn_trans/trans_rvf.c.inc | 2 ++
13
target/riscv/insn_trans/trans_rvi.c.inc | 2 ++
14
5 files changed, 17 insertions(+)
19
15
20
diff --git a/target/riscv/insn_trans/trans_rvv.c.inc b/target/riscv/insn_trans/trans_rvv.c.inc
16
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
21
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
22
--- a/target/riscv/insn_trans/trans_rvv.c.inc
18
--- a/target/riscv/translate.c
23
+++ b/target/riscv/insn_trans/trans_rvv.c.inc
19
+++ b/target/riscv/translate.c
24
@@ -XXX,XX +XXX,XX @@ static bool require_rvf(DisasContext *s)
20
@@ -XXX,XX +XXX,XX @@ static void gen_jal(DisasContext *ctx, int rd, target_ulong imm)
25
}
21
ctx->base.is_jmp = DISAS_NORETURN;
26
}
22
}
27
23
28
+static bool require_rvfmin(DisasContext *s)
24
+/*
25
+ * Temp stub: generates address adjustment for PointerMasking
26
+ */
27
+static TCGv gen_pm_adjust_address(DisasContext *s, TCGv src)
29
+{
28
+{
30
+ if (s->mstatus_fs == EXT_STATUS_DISABLED) {
29
+ return src;
31
+ return false;
32
+ }
33
+
34
+ switch (s->sew) {
35
+ case MO_16:
36
+ return s->cfg_ptr->ext_zvfhmin;
37
+ case MO_32:
38
+ return s->cfg_ptr->ext_zve32f;
39
+ default:
40
+ return false;
41
+ }
42
+}
30
+}
43
+
31
+
44
static bool require_scale_rvf(DisasContext *s)
32
#ifndef CONFIG_USER_ONLY
45
{
33
/* The states of mstatus_fs are:
46
if (s->mstatus_fs == EXT_STATUS_DISABLED) {
34
* 0 = disabled, 1 = initial, 2 = clean, 3 = dirty
47
@@ -XXX,XX +XXX,XX @@ static bool require_scale_rvfmin(DisasContext *s)
35
diff --git a/target/riscv/insn_trans/trans_rva.c.inc b/target/riscv/insn_trans/trans_rva.c.inc
36
index XXXXXXX..XXXXXXX 100644
37
--- a/target/riscv/insn_trans/trans_rva.c.inc
38
+++ b/target/riscv/insn_trans/trans_rva.c.inc
39
@@ -XXX,XX +XXX,XX @@ static bool gen_lr(DisasContext *ctx, arg_atomic *a, MemOp mop)
40
if (a->rl) {
41
tcg_gen_mb(TCG_MO_ALL | TCG_BAR_STRL);
48
}
42
}
49
43
+ src1 = gen_pm_adjust_address(ctx, src1);
50
switch (s->sew) {
44
tcg_gen_qemu_ld_tl(load_val, src1, ctx->mem_idx, mop);
51
- case MO_8:
45
if (a->aq) {
52
- return s->cfg_ptr->ext_zvfhmin;
46
tcg_gen_mb(TCG_MO_ALL | TCG_BAR_LDAQ);
53
case MO_16:
47
@@ -XXX,XX +XXX,XX @@ static bool gen_sc(DisasContext *ctx, arg_atomic *a, MemOp mop)
54
return s->cfg_ptr->ext_zve32f;
48
TCGLabel *l2 = gen_new_label();
55
case MO_32:
49
56
@@ -XXX,XX +XXX,XX @@ static bool opxfv_widen_check(DisasContext *s, arg_rmr *a)
50
src1 = get_gpr(ctx, a->rs1, EXT_ZERO);
57
static bool opffv_widen_check(DisasContext *s, arg_rmr *a)
51
+ src1 = gen_pm_adjust_address(ctx, src1);
58
{
52
tcg_gen_brcond_tl(TCG_COND_NE, load_res, src1, l1);
59
return opfv_widen_check(s, a) &&
53
60
+ require_rvfmin(s) &&
54
/*
61
require_scale_rvfmin(s) &&
55
@@ -XXX,XX +XXX,XX @@ static bool gen_amo(DisasContext *ctx, arg_atomic *a,
62
(s->sew != MO_8);
56
TCGv src1 = get_gpr(ctx, a->rs1, EXT_NONE);
63
}
57
TCGv src2 = get_gpr(ctx, a->rs2, EXT_NONE);
64
@@ -XXX,XX +XXX,XX @@ static bool opfxv_narrow_check(DisasContext *s, arg_rmr *a)
58
65
static bool opffv_narrow_check(DisasContext *s, arg_rmr *a)
59
+ src1 = gen_pm_adjust_address(ctx, src1);
66
{
60
func(dest, src1, src2, ctx->mem_idx, mop);
67
return opfv_narrow_check(s, a) &&
61
68
+ require_rvfmin(s) &&
62
gen_set_gpr(ctx, a->rd, dest);
69
require_scale_rvfmin(s) &&
63
diff --git a/target/riscv/insn_trans/trans_rvd.c.inc b/target/riscv/insn_trans/trans_rvd.c.inc
70
(s->sew != MO_8);
64
index XXXXXXX..XXXXXXX 100644
71
}
65
--- a/target/riscv/insn_trans/trans_rvd.c.inc
66
+++ b/target/riscv/insn_trans/trans_rvd.c.inc
67
@@ -XXX,XX +XXX,XX @@ static bool trans_fld(DisasContext *ctx, arg_fld *a)
68
tcg_gen_addi_tl(temp, addr, a->imm);
69
addr = temp;
70
}
71
+ addr = gen_pm_adjust_address(ctx, addr);
72
73
tcg_gen_qemu_ld_i64(cpu_fpr[a->rd], addr, ctx->mem_idx, MO_TEQ);
74
75
@@ -XXX,XX +XXX,XX @@ static bool trans_fsd(DisasContext *ctx, arg_fsd *a)
76
tcg_gen_addi_tl(temp, addr, a->imm);
77
addr = temp;
78
}
79
+ addr = gen_pm_adjust_address(ctx, addr);
80
81
tcg_gen_qemu_st_i64(cpu_fpr[a->rs2], addr, ctx->mem_idx, MO_TEQ);
82
83
diff --git a/target/riscv/insn_trans/trans_rvf.c.inc b/target/riscv/insn_trans/trans_rvf.c.inc
84
index XXXXXXX..XXXXXXX 100644
85
--- a/target/riscv/insn_trans/trans_rvf.c.inc
86
+++ b/target/riscv/insn_trans/trans_rvf.c.inc
87
@@ -XXX,XX +XXX,XX @@ static bool trans_flw(DisasContext *ctx, arg_flw *a)
88
tcg_gen_addi_tl(temp, addr, a->imm);
89
addr = temp;
90
}
91
+ addr = gen_pm_adjust_address(ctx, addr);
92
93
dest = cpu_fpr[a->rd];
94
tcg_gen_qemu_ld_i64(dest, addr, ctx->mem_idx, MO_TEUL);
95
@@ -XXX,XX +XXX,XX @@ static bool trans_fsw(DisasContext *ctx, arg_fsw *a)
96
tcg_gen_addi_tl(temp, addr, a->imm);
97
addr = temp;
98
}
99
+ addr = gen_pm_adjust_address(ctx, addr);
100
101
tcg_gen_qemu_st_i64(cpu_fpr[a->rs2], addr, ctx->mem_idx, MO_TEUL);
102
103
diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_trans/trans_rvi.c.inc
104
index XXXXXXX..XXXXXXX 100644
105
--- a/target/riscv/insn_trans/trans_rvi.c.inc
106
+++ b/target/riscv/insn_trans/trans_rvi.c.inc
107
@@ -XXX,XX +XXX,XX @@ static bool gen_load(DisasContext *ctx, arg_lb *a, MemOp memop)
108
tcg_gen_addi_tl(temp, addr, a->imm);
109
addr = temp;
110
}
111
+ addr = gen_pm_adjust_address(ctx, addr);
112
113
tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, memop);
114
gen_set_gpr(ctx, a->rd, dest);
115
@@ -XXX,XX +XXX,XX @@ static bool gen_store(DisasContext *ctx, arg_sb *a, MemOp memop)
116
tcg_gen_addi_tl(temp, addr, a->imm);
117
addr = temp;
118
}
119
+ addr = gen_pm_adjust_address(ctx, addr);
120
121
tcg_gen_qemu_st_tl(data, addr, ctx->mem_idx, memop);
122
return true;
72
--
123
--
73
2.45.1
124
2.31.1
125
126
diff view generated by jsdifflib
1
From: Huang Tao <eric.huang@linux.alibaba.com>
1
From: Anatoly Parshintsev <kupokupokupopo@gmail.com>
2
2
3
In this patch, we modify the decoder to be a freely composable data
3
Signed-off-by: Anatoly Parshintsev <kupokupokupopo@gmail.com>
4
structure instead of a hardcoded one. It can be dynamically builded up
5
according to the extensions.
6
This approach has several benefits:
7
1. Provides support for heterogeneous cpu architectures. As we add decoder in
8
RISCVCPU, each cpu can have their own decoder, and the decoders can be
9
different due to cpu's features.
10
2. Improve the decoding efficiency. We run the guard_func to see if the decoder
11
can be added to the dynamic_decoder when building up the decoder. Therefore,
12
there is no need to run the guard_func when decoding each instruction. It can
13
improve the decoding efficiency
14
3. For vendor or dynamic cpus, it allows them to customize their own decoder
15
functions to improve decoding efficiency, especially when vendor-defined
16
instruction sets increase. Because of dynamic building up, it can skip the other
17
decoder guard functions when decoding.
18
4. Pre patch for allowing adding a vendor decoder before decode_insn32() with minimal
19
overhead for users that don't need this particular vendor decoder.
20
21
Signed-off-by: Huang Tao <eric.huang@linux.alibaba.com>
22
Suggested-by: Christoph Muellner <christoph.muellner@vrull.eu>
23
Co-authored-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
24
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
25
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
26
Message-ID: <20240506023607.29544-1-eric.huang@linux.alibaba.com>
6
Message-id: 20211025173609.2724490-8-space.monkey.delivers@gmail.com
27
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
28
---
8
---
29
target/riscv/cpu.h | 1 +
9
target/riscv/cpu.h | 2 ++
30
target/riscv/tcg/tcg-cpu.h | 15 +++++++++++++++
10
target/riscv/cpu_helper.c | 18 ++++++++++++++++++
31
target/riscv/cpu.c | 1 +
11
target/riscv/translate.c | 39 +++++++++++++++++++++++++++++++++++++--
32
target/riscv/tcg/tcg-cpu.c | 15 +++++++++++++++
12
3 files changed, 57 insertions(+), 2 deletions(-)
33
target/riscv/translate.c | 31 +++++++++++++++----------------
34
5 files changed, 47 insertions(+), 16 deletions(-)
35
13
36
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
14
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
37
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
38
--- a/target/riscv/cpu.h
16
--- a/target/riscv/cpu.h
39
+++ b/target/riscv/cpu.h
17
+++ b/target/riscv/cpu.h
40
@@ -XXX,XX +XXX,XX @@ struct ArchCPU {
18
@@ -XXX,XX +XXX,XX @@ FIELD(TB_FLAGS, HLSX, 10, 1)
41
uint32_t pmu_avail_ctrs;
19
FIELD(TB_FLAGS, MSTATUS_HS_FS, 11, 2)
42
/* Mapping of events to counters */
20
/* The combination of MXL/SXL/UXL that applies to the current cpu mode. */
43
GHashTable *pmu_event_ctr_map;
21
FIELD(TB_FLAGS, XL, 13, 2)
44
+ const GPtrArray *decoders;
22
+/* If PointerMasking should be applied */
45
};
23
+FIELD(TB_FLAGS, PM_ENABLED, 15, 1)
46
24
47
/**
25
#ifdef TARGET_RISCV32
48
diff --git a/target/riscv/tcg/tcg-cpu.h b/target/riscv/tcg/tcg-cpu.h
26
#define riscv_cpu_mxl(env) ((void)(env), MXL_RV32)
27
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
49
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
50
--- a/target/riscv/tcg/tcg-cpu.h
29
--- a/target/riscv/cpu_helper.c
51
+++ b/target/riscv/tcg/tcg-cpu.h
30
+++ b/target/riscv/cpu_helper.c
52
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp);
31
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPURISCVState *env, target_ulong *pc,
53
void riscv_tcg_cpu_finalize_features(RISCVCPU *cpu, Error **errp);
32
flags = FIELD_DP32(flags, TB_FLAGS, MSTATUS_HS_FS,
54
bool riscv_cpu_tcg_compatible(RISCVCPU *cpu);
33
get_field(env->mstatus_hs, MSTATUS_FS));
55
34
}
56
+struct DisasContext;
35
+ if (riscv_has_ext(env, RVJ)) {
57
+struct RISCVCPUConfig;
36
+ int priv = flags & TB_FLAGS_PRIV_MMU_MASK;
58
+typedef struct RISCVDecoder {
37
+ bool pm_enabled = false;
59
+ bool (*guard_func)(const struct RISCVCPUConfig *);
38
+ switch (priv) {
60
+ bool (*riscv_cpu_decode_fn)(struct DisasContext *, uint32_t);
39
+ case PRV_U:
61
+} RISCVDecoder;
40
+ pm_enabled = env->mmte & U_PM_ENABLE;
62
+
41
+ break;
63
+typedef bool (*riscv_cpu_decode_fn)(struct DisasContext *, uint32_t);
42
+ case PRV_S:
64
+
43
+ pm_enabled = env->mmte & S_PM_ENABLE;
65
+extern const size_t decoder_table_size;
44
+ break;
66
+
45
+ case PRV_M:
67
+extern const RISCVDecoder decoder_table[];
46
+ pm_enabled = env->mmte & M_PM_ENABLE;
68
+
47
+ break;
69
+void riscv_tcg_cpu_finalize_dynamic_decoder(RISCVCPU *cpu);
48
+ default:
70
+
49
+ g_assert_not_reached();
50
+ }
51
+ flags = FIELD_DP32(flags, TB_FLAGS, PM_ENABLED, pm_enabled);
52
+ }
71
#endif
53
#endif
72
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
54
73
index XXXXXXX..XXXXXXX 100644
55
flags = FIELD_DP32(flags, TB_FLAGS, XL, cpu_get_xl(env));
74
--- a/target/riscv/cpu.c
75
+++ b/target/riscv/cpu.c
76
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_finalize_features(RISCVCPU *cpu, Error **errp)
77
error_propagate(errp, local_err);
78
return;
79
}
80
+ riscv_tcg_cpu_finalize_dynamic_decoder(cpu);
81
} else if (kvm_enabled()) {
82
riscv_kvm_cpu_finalize_features(cpu, &local_err);
83
if (local_err != NULL) {
84
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
85
index XXXXXXX..XXXXXXX 100644
86
--- a/target/riscv/tcg/tcg-cpu.c
87
+++ b/target/riscv/tcg/tcg-cpu.c
88
@@ -XXX,XX +XXX,XX @@ void riscv_tcg_cpu_finalize_features(RISCVCPU *cpu, Error **errp)
89
}
90
}
91
92
+void riscv_tcg_cpu_finalize_dynamic_decoder(RISCVCPU *cpu)
93
+{
94
+ GPtrArray *dynamic_decoders;
95
+ dynamic_decoders = g_ptr_array_sized_new(decoder_table_size);
96
+ for (size_t i = 0; i < decoder_table_size; ++i) {
97
+ if (decoder_table[i].guard_func &&
98
+ decoder_table[i].guard_func(&cpu->cfg)) {
99
+ g_ptr_array_add(dynamic_decoders,
100
+ (gpointer)decoder_table[i].riscv_cpu_decode_fn);
101
+ }
102
+ }
103
+
104
+ cpu->decoders = dynamic_decoders;
105
+}
106
+
107
bool riscv_cpu_tcg_compatible(RISCVCPU *cpu)
108
{
109
return object_dynamic_cast(OBJECT(cpu), TYPE_RISCV_CPU_HOST) == NULL;
110
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
56
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
111
index XXXXXXX..XXXXXXX 100644
57
index XXXXXXX..XXXXXXX 100644
112
--- a/target/riscv/translate.c
58
--- a/target/riscv/translate.c
113
+++ b/target/riscv/translate.c
59
+++ b/target/riscv/translate.c
114
@@ -XXX,XX +XXX,XX @@
60
@@ -XXX,XX +XXX,XX @@ static TCGv cpu_gpr[32], cpu_pc, cpu_vl;
115
#include "exec/helper-info.c.inc"
116
#undef HELPER_H
117
118
+#include "tcg/tcg-cpu.h"
119
+
120
/* global register indices */
121
static TCGv cpu_gpr[32], cpu_gprh[32], cpu_pc, cpu_vl, cpu_vstart;
122
static TCGv_i64 cpu_fpr[32]; /* assume F and D extensions */
61
static TCGv_i64 cpu_fpr[32]; /* assume F and D extensions */
62
static TCGv load_res;
63
static TCGv load_val;
64
+/* globals for PM CSRs */
65
+static TCGv pm_mask[4];
66
+static TCGv pm_base[4];
67
68
#include "exec/gen-icount.h"
69
123
@@ -XXX,XX +XXX,XX @@ typedef struct DisasContext {
70
@@ -XXX,XX +XXX,XX @@ typedef struct DisasContext {
124
/* FRM is known to contain a valid value. */
71
TCGv zero;
125
bool frm_valid;
72
/* Space for 3 operands plus 1 extra for address computation. */
126
bool insn_start_updated;
73
TCGv temp[4];
127
+ const GPtrArray *decoders;
74
+ /* PointerMasking extension */
75
+ bool pm_enabled;
76
+ TCGv pm_mask;
77
+ TCGv pm_base;
128
} DisasContext;
78
} DisasContext;
129
79
130
static inline bool has_ext(DisasContext *ctx, uint32_t ext)
80
static inline bool has_ext(DisasContext *ctx, uint32_t ext)
131
@@ -XXX,XX +XXX,XX @@ static inline int insn_len(uint16_t first_word)
81
@@ -XXX,XX +XXX,XX @@ static void gen_jal(DisasContext *ctx, int rd, target_ulong imm)
132
return (first_word & 3) == 3 ? 4 : 2;
133
}
82
}
134
83
135
+const RISCVDecoder decoder_table[] = {
84
/*
136
+ { always_true_p, decode_insn32 },
85
- * Temp stub: generates address adjustment for PointerMasking
137
+ { has_xthead_p, decode_xthead},
86
+ * Generates address adjustment for PointerMasking
138
+ { has_XVentanaCondOps_p, decode_XVentanaCodeOps},
87
*/
139
+};
88
static TCGv gen_pm_adjust_address(DisasContext *s, TCGv src)
140
+
141
+const size_t decoder_table_size = ARRAY_SIZE(decoder_table);
142
+
143
static void decode_opc(CPURISCVState *env, DisasContext *ctx, uint16_t opcode)
144
{
89
{
145
- /*
90
- return src;
146
- * A table with predicate (i.e., guard) functions and decoder functions
91
+ TCGv temp;
147
- * that are tested in-order until a decoder matches onto the opcode.
92
+ if (!s->pm_enabled) {
148
- */
93
+ /* Load unmodified address */
149
- static const struct {
94
+ return src;
150
- bool (*guard_func)(const RISCVCPUConfig *);
95
+ } else {
151
- bool (*decode_func)(DisasContext *, uint32_t);
96
+ temp = temp_new(s);
152
- } decoders[] = {
97
+ tcg_gen_andc_tl(temp, src, s->pm_mask);
153
- { always_true_p, decode_insn32 },
98
+ tcg_gen_or_tl(temp, temp, s->pm_base);
154
- { has_xthead_p, decode_xthead },
99
+ return temp;
155
- { has_XVentanaCondOps_p, decode_XVentanaCodeOps },
100
+ }
156
- };
101
}
157
-
102
158
ctx->virt_inst_excp = false;
103
#ifndef CONFIG_USER_ONLY
159
ctx->cur_insn_len = insn_len(opcode);
160
/* Check for compressed insn */
161
@@ -XXX,XX +XXX,XX @@ static void decode_opc(CPURISCVState *env, DisasContext *ctx, uint16_t opcode)
162
ctx->base.pc_next + 2));
163
ctx->opcode = opcode32;
164
165
- for (size_t i = 0; i < ARRAY_SIZE(decoders); ++i) {
166
- if (decoders[i].guard_func(ctx->cfg_ptr) &&
167
- decoders[i].decode_func(ctx, opcode32)) {
168
+ for (guint i = 0; i < ctx->decoders->len; ++i) {
169
+ riscv_cpu_decode_fn func = g_ptr_array_index(ctx->decoders, i);
170
+ if (func(ctx, opcode32)) {
171
return;
172
}
173
}
174
@@ -XXX,XX +XXX,XX @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
104
@@ -XXX,XX +XXX,XX @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
175
ctx->itrigger = FIELD_EX32(tb_flags, TB_FLAGS, ITRIGGER);
105
ctx->cs = cs;
106
ctx->ntemp = 0;
107
memset(ctx->temp, 0, sizeof(ctx->temp));
108
+ ctx->pm_enabled = FIELD_EX32(tb_flags, TB_FLAGS, PM_ENABLED);
109
+ int priv = tb_flags & TB_FLAGS_PRIV_MMU_MASK;
110
+ ctx->pm_mask = pm_mask[priv];
111
+ ctx->pm_base = pm_base[priv];
112
176
ctx->zero = tcg_constant_tl(0);
113
ctx->zero = tcg_constant_tl(0);
177
ctx->virt_inst_excp = false;
178
+ ctx->decoders = cpu->decoders;
179
}
114
}
180
115
@@ -XXX,XX +XXX,XX @@ void riscv_translate_init(void)
181
static void riscv_tr_tb_start(DisasContextBase *db, CPUState *cpu)
116
"load_res");
117
load_val = tcg_global_mem_new(cpu_env, offsetof(CPURISCVState, load_val),
118
"load_val");
119
+#ifndef CONFIG_USER_ONLY
120
+ /* Assign PM CSRs to tcg globals */
121
+ pm_mask[PRV_U] =
122
+ tcg_global_mem_new(cpu_env, offsetof(CPURISCVState, upmmask), "upmmask");
123
+ pm_base[PRV_U] =
124
+ tcg_global_mem_new(cpu_env, offsetof(CPURISCVState, upmbase), "upmbase");
125
+ pm_mask[PRV_S] =
126
+ tcg_global_mem_new(cpu_env, offsetof(CPURISCVState, spmmask), "spmmask");
127
+ pm_base[PRV_S] =
128
+ tcg_global_mem_new(cpu_env, offsetof(CPURISCVState, spmbase), "spmbase");
129
+ pm_mask[PRV_M] =
130
+ tcg_global_mem_new(cpu_env, offsetof(CPURISCVState, mpmmask), "mpmmask");
131
+ pm_base[PRV_M] =
132
+ tcg_global_mem_new(cpu_env, offsetof(CPURISCVState, mpmbase), "mpmbase");
133
+#endif
134
}
182
--
135
--
183
2.45.1
136
2.31.1
137
138
diff view generated by jsdifflib
1
From: Yangyu Chen <cyy@cyyself.name>
1
From: Alexey Baturo <baturo.alexey@gmail.com>
2
2
3
This code has a typo that writes zvkb to zvkg, causing users can't
3
Signed-off-by: Alexey Baturo <space.monkey.delivers@gmail.com>
4
enable zvkb through the config. This patch gets this fixed.
5
6
Signed-off-by: Yangyu Chen <cyy@cyyself.name>
7
Fixes: ea61ef7097d0 ("target/riscv: Move vector crypto extensions to riscv_cpu_extensions")
8
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Reviewed-by: Max Chou <max.chou@sifive.com>
5
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
11
Reviewed-by:  Weiwei Li <liwei1518@gmail.com>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Message-ID: <tencent_7E34EEF0F90B9A68BF38BEE09EC6D4877C0A@qq.com>
7
Message-id: 20211025173609.2724490-9-space.monkey.delivers@gmail.com
13
Cc: qemu-stable <qemu-stable@nongnu.org>
14
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
15
---
9
---
16
target/riscv/cpu.c | 2 +-
10
target/riscv/cpu.c | 4 ++++
17
1 file changed, 1 insertion(+), 1 deletion(-)
11
1 file changed, 4 insertions(+)
18
12
19
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
13
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
20
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
21
--- a/target/riscv/cpu.c
15
--- a/target/riscv/cpu.c
22
+++ b/target/riscv/cpu.c
16
+++ b/target/riscv/cpu.c
23
@@ -XXX,XX +XXX,XX @@ const RISCVCPUMultiExtConfig riscv_cpu_extensions[] = {
17
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
24
/* Vector cryptography extensions */
18
}
25
MULTI_EXT_CFG_BOOL("zvbb", ext_zvbb, false),
19
set_vext_version(env, vext_version);
26
MULTI_EXT_CFG_BOOL("zvbc", ext_zvbc, false),
20
}
27
- MULTI_EXT_CFG_BOOL("zvkb", ext_zvkg, false),
21
+ if (cpu->cfg.ext_j) {
28
+ MULTI_EXT_CFG_BOOL("zvkb", ext_zvkb, false),
22
+ ext |= RVJ;
29
MULTI_EXT_CFG_BOOL("zvkg", ext_zvkg, false),
23
+ }
30
MULTI_EXT_CFG_BOOL("zvkned", ext_zvkned, false),
24
31
MULTI_EXT_CFG_BOOL("zvknha", ext_zvknha, false),
25
set_misa(env, env->misa_mxl, ext);
26
}
27
@@ -XXX,XX +XXX,XX @@ static Property riscv_cpu_properties[] = {
28
DEFINE_PROP_BOOL("x-zbc", RISCVCPU, cfg.ext_zbc, false),
29
DEFINE_PROP_BOOL("x-zbs", RISCVCPU, cfg.ext_zbs, false),
30
DEFINE_PROP_BOOL("x-h", RISCVCPU, cfg.ext_h, false),
31
+ DEFINE_PROP_BOOL("x-j", RISCVCPU, cfg.ext_j, false),
32
DEFINE_PROP_BOOL("x-v", RISCVCPU, cfg.ext_v, false),
33
DEFINE_PROP_STRING("vext_spec", RISCVCPU, cfg.vext_spec),
34
DEFINE_PROP_UINT16("vlen", RISCVCPU, cfg.vlen, 128),
32
--
35
--
33
2.45.1
36
2.31.1
34
37
35
38
diff view generated by jsdifflib
1
From: Alexei Filippov <alexei.filippov@syntacore.com>
1
From: Jose Martins <josemartins90@gmail.com>
2
2
3
Previous patch fixed the PMP priority in raise_mmu_exception() but we're still
3
VS interrupts (2, 6, 10) were not correctly forwarded to hs-mode when
4
setting mtval2 incorrectly. In riscv_cpu_tlb_fill(), after pmp check in 2 stage
4
not delegated in hideleg (which was not being taken into account). This
5
translation part, mtval2 will be set in case of successes 2 stage translation but
5
was mainly because hs level sie was not always considered enabled when
6
failed pmp check.
6
it should. The spec states that "Interrupts for higher-privilege modes,
7
y>x, are always globally enabled regardless of the setting of the global
8
yIE bit for the higher-privilege mode." and also "For purposes of
9
interrupt global enables, HS-mode is considered more privileged than
10
VS-mode, and VS-mode is considered more privileged than VU-mode". Also,
11
vs-level interrupts were not being taken into account unless V=1, but
12
should be unless delegated.
7
13
8
In this case we gonna set mtval2 via env->guest_phys_fault_addr in context of
14
Finally, there is no need for a special case for to handle vs interrupts
9
riscv_cpu_tlb_fill(), as this was a guest-page-fault, but it didn't and mtval2
15
as the current privilege level, the state of the global ie and of the
10
should be zero, according to RISCV privileged spec sect. 9.4.4: When a guest
16
delegation registers should be enough to route all interrupts to the
11
page-fault is taken into M-mode, mtval2 is written with either zero or guest
17
appropriate privilege level in riscv_cpu_do_interrupt.
12
physical address that faulted, shifted by 2 bits. *For other traps, mtval2
13
is set to zero...*
14
18
15
Signed-off-by: Alexei Filippov <alexei.filippov@syntacore.com>
19
Signed-off-by: Jose Martins <josemartins90@gmail.com>
16
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
17
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
20
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
18
Message-ID: <20240503103052.6819-1-alexei.filippov@syntacore.com>
21
Message-id: 20211026145126.11025-2-josemartins90@gmail.com
19
Cc: qemu-stable <qemu-stable@nongnu.org>
20
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
22
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
21
---
23
---
22
target/riscv/cpu_helper.c | 12 ++++++------
24
target/riscv/cpu_helper.c | 28 ++++++++--------------------
23
1 file changed, 6 insertions(+), 6 deletions(-)
25
1 file changed, 8 insertions(+), 20 deletions(-)
24
26
25
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
27
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
26
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
27
--- a/target/riscv/cpu_helper.c
29
--- a/target/riscv/cpu_helper.c
28
+++ b/target/riscv/cpu_helper.c
30
+++ b/target/riscv/cpu_helper.c
29
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
31
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPURISCVState *env, target_ulong *pc,
30
__func__, pa, ret, prot_pmp, tlb_size);
32
#ifndef CONFIG_USER_ONLY
31
33
static int riscv_cpu_local_irq_pending(CPURISCVState *env)
32
prot &= prot_pmp;
34
{
33
- }
35
- target_ulong irqs;
36
+ target_ulong virt_enabled = riscv_cpu_virt_enabled(env);
37
38
target_ulong mstatus_mie = get_field(env->mstatus, MSTATUS_MIE);
39
target_ulong mstatus_sie = get_field(env->mstatus, MSTATUS_SIE);
40
- target_ulong hs_mstatus_sie = get_field(env->mstatus_hs, MSTATUS_SIE);
41
42
- target_ulong pending = env->mip & env->mie &
43
- ~(MIP_VSSIP | MIP_VSTIP | MIP_VSEIP);
44
- target_ulong vspending = (env->mip & env->mie &
45
- (MIP_VSSIP | MIP_VSTIP | MIP_VSEIP));
46
+ target_ulong pending = env->mip & env->mie;
47
48
target_ulong mie = env->priv < PRV_M ||
49
(env->priv == PRV_M && mstatus_mie);
50
target_ulong sie = env->priv < PRV_S ||
51
(env->priv == PRV_S && mstatus_sie);
52
- target_ulong hs_sie = env->priv < PRV_S ||
53
- (env->priv == PRV_S && hs_mstatus_sie);
54
+ target_ulong hsie = virt_enabled || sie;
55
+ target_ulong vsie = virt_enabled && sie;
56
57
- if (riscv_cpu_virt_enabled(env)) {
58
- target_ulong pending_hs_irq = pending & -hs_sie;
34
-
59
-
35
- if (ret != TRANSLATE_SUCCESS) {
60
- if (pending_hs_irq) {
36
+ } else {
61
- riscv_cpu_set_force_hs_excep(env, FORCE_HS_EXCEP);
37
/*
62
- return ctz64(pending_hs_irq);
38
* Guest physical address translation failed, this is a HS
63
- }
39
* level exception
64
-
40
*/
65
- pending = vspending;
41
first_stage_error = false;
66
- }
42
- env->guest_phys_fault_addr = (im_address |
67
-
43
- (address &
68
- irqs = (pending & ~env->mideleg & -mie) | (pending & env->mideleg & -sie);
44
- (TARGET_PAGE_SIZE - 1))) >> 2;
69
+ target_ulong irqs =
45
+ if (ret != TRANSLATE_PMP_FAIL) {
70
+ (pending & ~env->mideleg & -mie) |
46
+ env->guest_phys_fault_addr = (im_address |
71
+ (pending & env->mideleg & ~env->hideleg & -hsie) |
47
+ (address &
72
+ (pending & env->mideleg & env->hideleg & -vsie);
48
+ (TARGET_PAGE_SIZE - 1))) >> 2;
73
49
+ }
74
if (irqs) {
50
}
75
return ctz64(irqs); /* since non-zero */
51
}
52
} else {
53
--
76
--
54
2.45.1
77
2.31.1
78
79
diff view generated by jsdifflib
1
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
1
From: Jose Martins <josemartins90@gmail.com>
2
2
3
raise_mmu_exception(), as is today, is prioritizing guest page faults by
3
There is no need to "force an hs exception" as the current privilege
4
checking first if virt_enabled && !first_stage, and then considering the
4
level, the state of the global ie and of the delegation registers should
5
regular inst/load/store faults.
5
be enough to route the interrupt to the appropriate privilege level in
6
riscv_cpu_do_interrupt. The is true for both asynchronous and
7
synchronous exceptions, specifically, guest page faults which must be
8
hardwired to zero hedeleg. As such the hs_force_except mechanism can be
9
removed.
6
10
7
There's no mention in the spec about guest page fault being a higher
11
Signed-off-by: Jose Martins <josemartins90@gmail.com>
8
priority that PMP faults. In fact, privileged spec section 3.7.1 says:
9
10
"Attempting to fetch an instruction from a PMP region that does not have
11
execute permissions raises an instruction access-fault exception.
12
Attempting to execute a load or load-reserved instruction which accesses
13
a physical address within a PMP region without read permissions raises a
14
load access-fault exception. Attempting to execute a store,
15
store-conditional, or AMO instruction which accesses a physical address
16
within a PMP region without write permissions raises a store
17
access-fault exception."
18
19
So, in fact, we're doing it wrong - PMP faults should always be thrown,
20
regardless of also being a first or second stage fault.
21
22
The way riscv_cpu_tlb_fill() and get_physical_address() work is
23
adequate: a TRANSLATE_PMP_FAIL error is immediately reported and
24
reflected in the 'pmp_violation' flag. What we need is to change
25
raise_mmu_exception() to prioritize it.
26
27
Reported-by: Joseph Chan <jchan@ventanamicro.com>
28
Fixes: 82d53adfbb ("target/riscv/cpu_helper.c: Invalid exception on MMU translation stage")
29
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
30
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
12
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
31
Message-ID: <20240413105929.7030-1-alexei.filippov@syntacore.com>
13
Message-id: 20211026145126.11025-3-josemartins90@gmail.com
32
Cc: qemu-stable <qemu-stable@nongnu.org>
33
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
14
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
34
---
15
---
35
target/riscv/cpu_helper.c | 22 ++++++++++++----------
16
target/riscv/cpu.h | 2 --
36
1 file changed, 12 insertions(+), 10 deletions(-)
17
target/riscv/cpu_bits.h | 6 ------
18
target/riscv/cpu_helper.c | 26 +-------------------------
19
3 files changed, 1 insertion(+), 33 deletions(-)
37
20
21
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
22
index XXXXXXX..XXXXXXX 100644
23
--- a/target/riscv/cpu.h
24
+++ b/target/riscv/cpu.h
25
@@ -XXX,XX +XXX,XX @@ int riscv_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
26
bool riscv_cpu_fp_enabled(CPURISCVState *env);
27
bool riscv_cpu_virt_enabled(CPURISCVState *env);
28
void riscv_cpu_set_virt_enabled(CPURISCVState *env, bool enable);
29
-bool riscv_cpu_force_hs_excep_enabled(CPURISCVState *env);
30
-void riscv_cpu_set_force_hs_excep(CPURISCVState *env, bool enable);
31
bool riscv_cpu_two_stage_lookup(int mmu_idx);
32
int riscv_cpu_mmu_index(CPURISCVState *env, bool ifetch);
33
hwaddr riscv_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
34
diff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h
35
index XXXXXXX..XXXXXXX 100644
36
--- a/target/riscv/cpu_bits.h
37
+++ b/target/riscv/cpu_bits.h
38
@@ -XXX,XX +XXX,XX @@ typedef enum {
39
40
/* Virtulisation Register Fields */
41
#define VIRT_ONOFF 1
42
-/* This is used to save state for when we take an exception. If this is set
43
- * that means that we want to force a HS level exception (no matter what the
44
- * delegation is set to). This will occur for things such as a second level
45
- * page table fault.
46
- */
47
-#define FORCE_HS_EXCEP 2
48
49
/* RV32 satp CSR field masks */
50
#define SATP32_MODE 0x80000000
38
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
51
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
39
index XXXXXXX..XXXXXXX 100644
52
index XXXXXXX..XXXXXXX 100644
40
--- a/target/riscv/cpu_helper.c
53
--- a/target/riscv/cpu_helper.c
41
+++ b/target/riscv/cpu_helper.c
54
+++ b/target/riscv/cpu_helper.c
42
@@ -XXX,XX +XXX,XX @@ static void raise_mmu_exception(CPURISCVState *env, target_ulong address,
55
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_set_virt_enabled(CPURISCVState *env, bool enable)
43
56
env->virt = set_field(env->virt, VIRT_ONOFF, enable);
44
switch (access_type) {
57
}
45
case MMU_INST_FETCH:
58
46
- if (env->virt_enabled && !first_stage) {
59
-bool riscv_cpu_force_hs_excep_enabled(CPURISCVState *env)
47
+ if (pmp_violation) {
60
-{
48
+ cs->exception_index = RISCV_EXCP_INST_ACCESS_FAULT;
61
- if (!riscv_has_ext(env, RVH)) {
49
+ } else if (env->virt_enabled && !first_stage) {
62
- return false;
50
cs->exception_index = RISCV_EXCP_INST_GUEST_PAGE_FAULT;
63
- }
51
} else {
64
-
52
- cs->exception_index = pmp_violation ?
65
- return get_field(env->virt, FORCE_HS_EXCEP);
53
- RISCV_EXCP_INST_ACCESS_FAULT : RISCV_EXCP_INST_PAGE_FAULT;
66
-}
54
+ cs->exception_index = RISCV_EXCP_INST_PAGE_FAULT;
67
-
68
-void riscv_cpu_set_force_hs_excep(CPURISCVState *env, bool enable)
69
-{
70
- if (!riscv_has_ext(env, RVH)) {
71
- return;
72
- }
73
-
74
- env->virt = set_field(env->virt, FORCE_HS_EXCEP, enable);
75
-}
76
-
77
bool riscv_cpu_two_stage_lookup(int mmu_idx)
78
{
79
return mmu_idx & TB_FLAGS_PRIV_HYP_ACCESS_MASK;
80
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_do_interrupt(CPUState *cs)
81
82
RISCVCPU *cpu = RISCV_CPU(cs);
83
CPURISCVState *env = &cpu->env;
84
- bool force_hs_execp = riscv_cpu_force_hs_excep_enabled(env);
85
uint64_t s;
86
87
/* cs->exception is 32-bits wide unlike mcause which is XLEN-bits wide
88
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_do_interrupt(CPUState *cs)
89
case RISCV_EXCP_INST_GUEST_PAGE_FAULT:
90
case RISCV_EXCP_LOAD_GUEST_ACCESS_FAULT:
91
case RISCV_EXCP_STORE_GUEST_AMO_ACCESS_FAULT:
92
- force_hs_execp = true;
93
- /* fallthrough */
94
case RISCV_EXCP_INST_ADDR_MIS:
95
case RISCV_EXCP_INST_ACCESS_FAULT:
96
case RISCV_EXCP_LOAD_ADDR_MIS:
97
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_do_interrupt(CPUState *cs)
98
env->hstatus = set_field(env->hstatus, HSTATUS_GVA, 0);
99
}
100
101
- if (riscv_cpu_virt_enabled(env) && ((hdeleg >> cause) & 1) &&
102
- !force_hs_execp) {
103
+ if (riscv_cpu_virt_enabled(env) && ((hdeleg >> cause) & 1)) {
104
/* Trap to VS mode */
105
/*
106
* See if we need to adjust cause. Yes if its VS mode interrupt
107
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_do_interrupt(CPUState *cs)
108
htval = env->guest_phys_fault_addr;
109
110
riscv_cpu_set_virt_enabled(env, 0);
111
- riscv_cpu_set_force_hs_excep(env, 0);
112
} else {
113
/* Trap into HS mode */
114
env->hstatus = set_field(env->hstatus, HSTATUS_SPV, false);
115
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_do_interrupt(CPUState *cs)
116
117
/* Trapping to M mode, virt is disabled */
118
riscv_cpu_set_virt_enabled(env, 0);
119
- riscv_cpu_set_force_hs_excep(env, 0);
55
}
120
}
56
break;
121
57
case MMU_DATA_LOAD:
122
s = env->mstatus;
58
- if (two_stage && !first_stage) {
59
+ if (pmp_violation) {
60
+ cs->exception_index = RISCV_EXCP_LOAD_ACCESS_FAULT;
61
+ } else if (two_stage && !first_stage) {
62
cs->exception_index = RISCV_EXCP_LOAD_GUEST_ACCESS_FAULT;
63
} else {
64
- cs->exception_index = pmp_violation ?
65
- RISCV_EXCP_LOAD_ACCESS_FAULT : RISCV_EXCP_LOAD_PAGE_FAULT;
66
+ cs->exception_index = RISCV_EXCP_LOAD_PAGE_FAULT;
67
}
68
break;
69
case MMU_DATA_STORE:
70
- if (two_stage && !first_stage) {
71
+ if (pmp_violation) {
72
+ cs->exception_index = RISCV_EXCP_STORE_AMO_ACCESS_FAULT;
73
+ } else if (two_stage && !first_stage) {
74
cs->exception_index = RISCV_EXCP_STORE_GUEST_AMO_ACCESS_FAULT;
75
} else {
76
- cs->exception_index = pmp_violation ?
77
- RISCV_EXCP_STORE_AMO_ACCESS_FAULT :
78
- RISCV_EXCP_STORE_PAGE_FAULT;
79
+ cs->exception_index = RISCV_EXCP_STORE_PAGE_FAULT;
80
}
81
break;
82
default:
83
--
123
--
84
2.45.1
124
2.31.1
125
126
diff view generated by jsdifflib
1
From: Yong-Xuan Wang <yongxuan.wang@sifive.com>
1
From: Chih-Min Chao <chihmin.chao@sifive.com>
2
2
3
In AIA spec, each hart (or each hart within a group) has a unique hart
3
For "fmax/fmin ft0, ft1, ft2" and if one of the inputs is sNaN,
4
number to locate the memory pages of interrupt files in the address
5
space. The number of bits required to represent any hart number is equal
6
to ceil(log2(hmax + 1)), where hmax is the largest hart number among
7
groups.
8
4
9
However, if the largest hart number among groups is a power of 2, QEMU
5
The original logic:
10
will pass an inaccurate hart-index-bit setting to Linux. For example, when
6
Return NaN and set invalid flag if ft1 == sNaN || ft2 == sNan.
11
the guest OS has 4 harts, only ceil(log2(3 + 1)) = 2 bits are sufficient
12
to represent 4 harts, but we passes 3 to Linux. The code needs to be
13
updated to ensure accurate hart-index-bit settings.
14
7
15
Additionally, a Linux patch[1] is necessary to correctly recover the hart
8
The alternative path:
16
index when the guest OS has only 1 hart, where the hart-index-bit is 0.
9
Set invalid flag if ft1 == sNaN || ft2 == sNaN.
10
Return NaN only if ft1 == NaN && ft2 == NaN.
17
11
18
[1] https://lore.kernel.org/lkml/20240415064905.25184-1-yongxuan.wang@sifive.com/t/
12
The IEEE 754 spec allows both implementation and some architecture such
13
as riscv choose different defintions in two spec versions.
14
(riscv-spec-v2.2 use original version, riscv-spec-20191213 changes to
15
alternative)
19
16
20
Signed-off-by: Yong-Xuan Wang <yongxuan.wang@sifive.com>
17
Signed-off-by: Chih-Min Chao <chihmin.chao@sifive.com>
21
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
18
Signed-off-by: Frank Chang <frank.chang@sifive.com>
22
Cc: qemu-stable <qemu-stable@nongnu.org>
19
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
23
Message-ID: <20240515091129.28116-1-yongxuan.wang@sifive.com>
20
Message-Id: <20211021160847.2748577-2-frank.chang@sifive.com>
24
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
21
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
25
---
22
---
26
target/riscv/kvm/kvm-cpu.c | 9 ++++++++-
23
include/fpu/softfloat.h | 10 ++++++++++
27
1 file changed, 8 insertions(+), 1 deletion(-)
24
fpu/softfloat.c | 19 +++++++++++++------
25
fpu/softfloat-parts.c.inc | 25 +++++++++++++++++++++++--
26
3 files changed, 46 insertions(+), 8 deletions(-)
28
27
29
diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c
28
diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h
30
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
31
--- a/target/riscv/kvm/kvm-cpu.c
30
--- a/include/fpu/softfloat.h
32
+++ b/target/riscv/kvm/kvm-cpu.c
31
+++ b/include/fpu/softfloat.h
33
@@ -XXX,XX +XXX,XX @@ void kvm_riscv_aia_create(MachineState *machine, uint64_t group_shift,
32
@@ -XXX,XX +XXX,XX @@ float16 float16_minnum(float16, float16, float_status *status);
33
float16 float16_maxnum(float16, float16, float_status *status);
34
float16 float16_minnummag(float16, float16, float_status *status);
35
float16 float16_maxnummag(float16, float16, float_status *status);
36
+float16 float16_minimum_number(float16, float16, float_status *status);
37
+float16 float16_maximum_number(float16, float16, float_status *status);
38
float16 float16_sqrt(float16, float_status *status);
39
FloatRelation float16_compare(float16, float16, float_status *status);
40
FloatRelation float16_compare_quiet(float16, float16, float_status *status);
41
@@ -XXX,XX +XXX,XX @@ bfloat16 bfloat16_minnum(bfloat16, bfloat16, float_status *status);
42
bfloat16 bfloat16_maxnum(bfloat16, bfloat16, float_status *status);
43
bfloat16 bfloat16_minnummag(bfloat16, bfloat16, float_status *status);
44
bfloat16 bfloat16_maxnummag(bfloat16, bfloat16, float_status *status);
45
+bfloat16 bfloat16_minimum_number(bfloat16, bfloat16, float_status *status);
46
+bfloat16 bfloat16_maximum_number(bfloat16, bfloat16, float_status *status);
47
bfloat16 bfloat16_sqrt(bfloat16, float_status *status);
48
FloatRelation bfloat16_compare(bfloat16, bfloat16, float_status *status);
49
FloatRelation bfloat16_compare_quiet(bfloat16, bfloat16, float_status *status);
50
@@ -XXX,XX +XXX,XX @@ float32 float32_minnum(float32, float32, float_status *status);
51
float32 float32_maxnum(float32, float32, float_status *status);
52
float32 float32_minnummag(float32, float32, float_status *status);
53
float32 float32_maxnummag(float32, float32, float_status *status);
54
+float32 float32_minimum_number(float32, float32, float_status *status);
55
+float32 float32_maximum_number(float32, float32, float_status *status);
56
bool float32_is_quiet_nan(float32, float_status *status);
57
bool float32_is_signaling_nan(float32, float_status *status);
58
float32 float32_silence_nan(float32, float_status *status);
59
@@ -XXX,XX +XXX,XX @@ float64 float64_minnum(float64, float64, float_status *status);
60
float64 float64_maxnum(float64, float64, float_status *status);
61
float64 float64_minnummag(float64, float64, float_status *status);
62
float64 float64_maxnummag(float64, float64, float_status *status);
63
+float64 float64_minimum_number(float64, float64, float_status *status);
64
+float64 float64_maximum_number(float64, float64, float_status *status);
65
bool float64_is_quiet_nan(float64 a, float_status *status);
66
bool float64_is_signaling_nan(float64, float_status *status);
67
float64 float64_silence_nan(float64, float_status *status);
68
@@ -XXX,XX +XXX,XX @@ float128 float128_minnum(float128, float128, float_status *status);
69
float128 float128_maxnum(float128, float128, float_status *status);
70
float128 float128_minnummag(float128, float128, float_status *status);
71
float128 float128_maxnummag(float128, float128, float_status *status);
72
+float128 float128_minimum_number(float128, float128, float_status *status);
73
+float128 float128_maximum_number(float128, float128, float_status *status);
74
bool float128_is_quiet_nan(float128, float_status *status);
75
bool float128_is_signaling_nan(float128, float_status *status);
76
float128 float128_silence_nan(float128, float_status *status);
77
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
78
index XXXXXXX..XXXXXXX 100644
79
--- a/fpu/softfloat.c
80
+++ b/fpu/softfloat.c
81
@@ -XXX,XX +XXX,XX @@ enum {
82
minmax_isnum = 2,
83
/* Set for the IEEE 754-2008 minNumMag() and minNumMag() operations. */
84
minmax_ismag = 4,
85
+ /*
86
+ * Set for the IEEE 754-2019 minimumNumber() and maximumNumber()
87
+ * operations.
88
+ */
89
+ minmax_isnumber = 8,
90
};
91
92
/* Simple helpers for checking if, or what kind of, NaN we have */
93
@@ -XXX,XX +XXX,XX @@ static float128 float128_minmax(float128 a, float128 b,
94
{ return type##_minmax(a, b, s, flags); }
95
96
#define MINMAX_2(type) \
97
- MINMAX_1(type, max, 0) \
98
- MINMAX_1(type, maxnum, minmax_isnum) \
99
- MINMAX_1(type, maxnummag, minmax_isnum | minmax_ismag) \
100
- MINMAX_1(type, min, minmax_ismin) \
101
- MINMAX_1(type, minnum, minmax_ismin | minmax_isnum) \
102
- MINMAX_1(type, minnummag, minmax_ismin | minmax_isnum | minmax_ismag)
103
+ MINMAX_1(type, max, 0) \
104
+ MINMAX_1(type, maxnum, minmax_isnum) \
105
+ MINMAX_1(type, maxnummag, minmax_isnum | minmax_ismag) \
106
+ MINMAX_1(type, maximum_number, minmax_isnumber) \
107
+ MINMAX_1(type, min, minmax_ismin) \
108
+ MINMAX_1(type, minnum, minmax_ismin | minmax_isnum) \
109
+ MINMAX_1(type, minnummag, minmax_ismin | minmax_isnum | minmax_ismag) \
110
+ MINMAX_1(type, minimum_number, minmax_ismin | minmax_isnumber) \
111
112
MINMAX_2(float16)
113
MINMAX_2(bfloat16)
114
diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc
115
index XXXXXXX..XXXXXXX 100644
116
--- a/fpu/softfloat-parts.c.inc
117
+++ b/fpu/softfloat-parts.c.inc
118
@@ -XXX,XX +XXX,XX @@ static FloatPartsN *partsN(minmax)(FloatPartsN *a, FloatPartsN *b,
119
120
if (unlikely(ab_mask & float_cmask_anynan)) {
121
/*
122
- * For minnum/maxnum, if one operand is a QNaN, and the other
123
+ * For minNum/maxNum (IEEE 754-2008)
124
+ * or minimumNumber/maximumNumber (IEEE 754-2019),
125
+ * if one operand is a QNaN, and the other
126
* operand is numerical, then return numerical argument.
127
*/
128
- if ((flags & minmax_isnum)
129
+ if ((flags & (minmax_isnum | minmax_isnumber))
130
&& !(ab_mask & float_cmask_snan)
131
&& (ab_mask & ~float_cmask_qnan)) {
132
return is_nan(a->cls) ? b : a;
34
}
133
}
134
+
135
+ /*
136
+ * In IEEE 754-2019, minNum, maxNum, minNumMag and maxNumMag
137
+ * are removed and replaced with minimum, minimumNumber, maximum
138
+ * and maximumNumber.
139
+ * minimumNumber/maximumNumber behavior for SNaN is changed to:
140
+ * If both operands are NaNs, a QNaN is returned.
141
+ * If either operand is a SNaN,
142
+ * an invalid operation exception is signaled,
143
+ * but unless both operands are NaNs,
144
+ * the SNaN is otherwise ignored and not converted to a QNaN.
145
+ */
146
+ if ((flags & minmax_isnumber)
147
+ && (ab_mask & float_cmask_snan)
148
+ && (ab_mask & ~float_cmask_anynan)) {
149
+ float_raise(float_flag_invalid, s);
150
+ return is_nan(a->cls) ? b : a;
151
+ }
152
+
153
return parts_pick_nan(a, b, s);
35
}
154
}
36
155
37
- hart_bits = find_last_bit(&max_hart_per_socket, BITS_PER_LONG) + 1;
38
+
39
+ if (max_hart_per_socket > 1) {
40
+ max_hart_per_socket--;
41
+ hart_bits = find_last_bit(&max_hart_per_socket, BITS_PER_LONG) + 1;
42
+ } else {
43
+ hart_bits = 0;
44
+ }
45
+
46
ret = kvm_device_access(aia_fd, KVM_DEV_RISCV_AIA_GRP_CONFIG,
47
KVM_DEV_RISCV_AIA_CONFIG_HART_BITS,
48
&hart_bits, true, NULL);
49
--
156
--
50
2.45.1
157
2.31.1
158
159
diff view generated by jsdifflib
1
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
1
From: Chih-Min Chao <chihmin.chao@sifive.com>
2
2
3
SBI defines a Debug Console extension "DBCN" that will, in time, replace
3
The sNaN propagation behavior has been changed since cd20cee7 in
4
the legacy console putchar and getchar SBI extensions.
4
https://github.com/riscv/riscv-isa-manual.
5
5
6
The appeal of the DBCN extension is that it allows multiple bytes to be
6
In Priv spec v1.10, RVF is v2.0. fmin.s and fmax.s are implemented with
7
read/written in the SBI console in a single SBI call.
7
IEEE 754-2008 minNum and maxNum operations.
8
8
9
As far as KVM goes, the DBCN calls are forwarded by an in-kernel KVM
9
In Priv spec v1.11, RVF is v2.2. fmin.s and fmax.s are amended to
10
module to userspace. But this will only happens if the KVM module
10
implement IEEE 754-2019 minimumNumber and maximumNumber operations.
11
actually supports this SBI extension and we activate it.
12
11
13
We'll check for DBCN support during init time, checking if get-reg-list
12
Therefore, to prevent the risk of having too many version variables.
14
is advertising KVM_RISCV_SBI_EXT_DBCN. In that case, we'll enable it via
13
Instead of introducing an extra *fext_ver* variable, we tie RVF version
15
kvm_set_one_reg() during kvm_arch_init_vcpu().
14
to Priv version. Though it's not completely accurate but is close enough.
16
15
17
Finally, change kvm_riscv_handle_sbi() to handle the incoming calls for
16
Signed-off-by: Chih-Min Chao <chihmin.chao@sifive.com>
18
SBI_EXT_DBCN, reading and writing as required.
17
Signed-off-by: Frank Chang <frank.chang@sifive.com>
19
18
Acked-by: Alistair Francis <alistair.francis@wdc.com>
20
A simple KVM guest with 'earlycon=sbi', running in an emulated RISC-V
19
Message-Id: <20211021160847.2748577-3-frank.chang@sifive.com>
21
host, takes around 20 seconds to boot without using DBCN. With this
22
patch we're taking around 14 seconds to boot due to the speed-up in the
23
terminal output. There's no change in boot time if the guest isn't
24
using earlycon.
25
26
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
27
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
28
Message-ID: <20240425155012.581366-1-dbarboza@ventanamicro.com>
29
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
20
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
30
---
21
---
31
target/riscv/sbi_ecall_interface.h | 17 +++++
22
target/riscv/fpu_helper.c | 16 ++++++++++++----
32
target/riscv/kvm/kvm-cpu.c | 111 +++++++++++++++++++++++++++++
23
1 file changed, 12 insertions(+), 4 deletions(-)
33
2 files changed, 128 insertions(+)
34
24
35
diff --git a/target/riscv/sbi_ecall_interface.h b/target/riscv/sbi_ecall_interface.h
25
diff --git a/target/riscv/fpu_helper.c b/target/riscv/fpu_helper.c
36
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
37
--- a/target/riscv/sbi_ecall_interface.h
27
--- a/target/riscv/fpu_helper.c
38
+++ b/target/riscv/sbi_ecall_interface.h
28
+++ b/target/riscv/fpu_helper.c
39
@@ -XXX,XX +XXX,XX @@
29
@@ -XXX,XX +XXX,XX @@ uint64_t helper_fmin_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
40
41
/* clang-format off */
42
43
+#define SBI_SUCCESS 0
44
+#define SBI_ERR_FAILED -1
45
+#define SBI_ERR_NOT_SUPPORTED -2
46
+#define SBI_ERR_INVALID_PARAM -3
47
+#define SBI_ERR_DENIED -4
48
+#define SBI_ERR_INVALID_ADDRESS -5
49
+#define SBI_ERR_ALREADY_AVAILABLE -6
50
+#define SBI_ERR_ALREADY_STARTED -7
51
+#define SBI_ERR_ALREADY_STOPPED -8
52
+#define SBI_ERR_NO_SHMEM -9
53
+
54
/* SBI Extension IDs */
55
#define SBI_EXT_0_1_SET_TIMER 0x0
56
#define SBI_EXT_0_1_CONSOLE_PUTCHAR 0x1
57
@@ -XXX,XX +XXX,XX @@
58
#define SBI_EXT_IPI 0x735049
59
#define SBI_EXT_RFENCE 0x52464E43
60
#define SBI_EXT_HSM 0x48534D
61
+#define SBI_EXT_DBCN 0x4442434E
62
63
/* SBI function IDs for BASE extension */
64
#define SBI_EXT_BASE_GET_SPEC_VERSION 0x0
65
@@ -XXX,XX +XXX,XX @@
66
#define SBI_EXT_HSM_HART_STOP 0x1
67
#define SBI_EXT_HSM_HART_GET_STATUS 0x2
68
69
+/* SBI function IDs for DBCN extension */
70
+#define SBI_EXT_DBCN_CONSOLE_WRITE 0x0
71
+#define SBI_EXT_DBCN_CONSOLE_READ 0x1
72
+#define SBI_EXT_DBCN_CONSOLE_WRITE_BYTE 0x2
73
+
74
#define SBI_HSM_HART_STATUS_STARTED 0x0
75
#define SBI_HSM_HART_STATUS_STOPPED 0x1
76
#define SBI_HSM_HART_STATUS_START_PENDING 0x2
77
diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c
78
index XXXXXXX..XXXXXXX 100644
79
--- a/target/riscv/kvm/kvm-cpu.c
80
+++ b/target/riscv/kvm/kvm-cpu.c
81
@@ -XXX,XX +XXX,XX @@ static KVMCPUConfig kvm_v_vlenb = {
82
KVM_REG_RISCV_VECTOR_CSR_REG(vlenb)
83
};
84
85
+static KVMCPUConfig kvm_sbi_dbcn = {
86
+ .name = "sbi_dbcn",
87
+ .kvm_reg_id = KVM_REG_RISCV | KVM_REG_SIZE_U64 |
88
+ KVM_REG_RISCV_SBI_EXT | KVM_RISCV_SBI_EXT_DBCN
89
+};
90
+
91
static void kvm_riscv_update_cpu_cfg_isa_ext(RISCVCPU *cpu, CPUState *cs)
92
{
30
{
93
CPURISCVState *env = &cpu->env;
31
float32 frs1 = check_nanbox_s(rs1);
94
@@ -XXX,XX +XXX,XX @@ static int uint64_cmp(const void *a, const void *b)
32
float32 frs2 = check_nanbox_s(rs2);
95
return 0;
33
- return nanbox_s(float32_minnum(frs1, frs2, &env->fp_status));
34
+ return nanbox_s(env->priv_ver < PRIV_VERSION_1_11_0 ?
35
+ float32_minnum(frs1, frs2, &env->fp_status) :
36
+ float32_minimum_number(frs1, frs2, &env->fp_status));
96
}
37
}
97
38
98
+static void kvm_riscv_check_sbi_dbcn_support(RISCVCPU *cpu,
39
uint64_t helper_fmax_s(CPURISCVState *env, uint64_t rs1, uint64_t rs2)
99
+ KVMScratchCPU *kvmcpu,
100
+ struct kvm_reg_list *reglist)
101
+{
102
+ struct kvm_reg_list *reg_search;
103
+
104
+ reg_search = bsearch(&kvm_sbi_dbcn.kvm_reg_id, reglist->reg, reglist->n,
105
+ sizeof(uint64_t), uint64_cmp);
106
+
107
+ if (reg_search) {
108
+ kvm_sbi_dbcn.supported = true;
109
+ }
110
+}
111
+
112
static void kvm_riscv_read_vlenb(RISCVCPU *cpu, KVMScratchCPU *kvmcpu,
113
struct kvm_reg_list *reglist)
114
{
40
{
115
@@ -XXX,XX +XXX,XX @@ static void kvm_riscv_init_multiext_cfg(RISCVCPU *cpu, KVMScratchCPU *kvmcpu)
41
float32 frs1 = check_nanbox_s(rs1);
116
if (riscv_has_ext(&cpu->env, RVV)) {
42
float32 frs2 = check_nanbox_s(rs2);
117
kvm_riscv_read_vlenb(cpu, kvmcpu, reglist);
43
- return nanbox_s(float32_maxnum(frs1, frs2, &env->fp_status));
118
}
44
+ return nanbox_s(env->priv_ver < PRIV_VERSION_1_11_0 ?
119
+
45
+ float32_maxnum(frs1, frs2, &env->fp_status) :
120
+ kvm_riscv_check_sbi_dbcn_support(cpu, kvmcpu, reglist);
46
+ float32_maximum_number(frs1, frs2, &env->fp_status));
121
}
47
}
122
48
123
static void riscv_init_kvm_registers(Object *cpu_obj)
49
uint64_t helper_fsqrt_s(CPURISCVState *env, uint64_t rs1)
124
@@ -XXX,XX +XXX,XX @@ static int kvm_vcpu_set_machine_ids(RISCVCPU *cpu, CPUState *cs)
50
@@ -XXX,XX +XXX,XX @@ uint64_t helper_fdiv_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2)
125
return ret;
51
52
uint64_t helper_fmin_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2)
53
{
54
- return float64_minnum(frs1, frs2, &env->fp_status);
55
+ return env->priv_ver < PRIV_VERSION_1_11_0 ?
56
+ float64_minnum(frs1, frs2, &env->fp_status) :
57
+ float64_minimum_number(frs1, frs2, &env->fp_status);
126
}
58
}
127
59
128
+static int kvm_vcpu_enable_sbi_dbcn(RISCVCPU *cpu, CPUState *cs)
60
uint64_t helper_fmax_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2)
129
+{
130
+ target_ulong reg = 1;
131
+
132
+ if (!kvm_sbi_dbcn.supported) {
133
+ return 0;
134
+ }
135
+
136
+ return kvm_set_one_reg(cs, kvm_sbi_dbcn.kvm_reg_id, &reg);
137
+}
138
+
139
int kvm_arch_init_vcpu(CPUState *cs)
140
{
61
{
141
int ret = 0;
62
- return float64_maxnum(frs1, frs2, &env->fp_status);
142
@@ -XXX,XX +XXX,XX @@ int kvm_arch_init_vcpu(CPUState *cs)
63
+ return env->priv_ver < PRIV_VERSION_1_11_0 ?
143
kvm_riscv_update_cpu_misa_ext(cpu, cs);
64
+ float64_maxnum(frs1, frs2, &env->fp_status) :
144
kvm_riscv_update_cpu_cfg_isa_ext(cpu, cs);
65
+ float64_maximum_number(frs1, frs2, &env->fp_status);
145
146
+ ret = kvm_vcpu_enable_sbi_dbcn(cpu, cs);
147
+
148
return ret;
149
}
66
}
150
67
151
@@ -XXX,XX +XXX,XX @@ bool kvm_arch_stop_on_emulation_error(CPUState *cs)
68
uint64_t helper_fcvt_s_d(CPURISCVState *env, uint64_t rs1)
152
return true;
153
}
154
155
+static void kvm_riscv_handle_sbi_dbcn(CPUState *cs, struct kvm_run *run)
156
+{
157
+ g_autofree uint8_t *buf = NULL;
158
+ RISCVCPU *cpu = RISCV_CPU(cs);
159
+ target_ulong num_bytes;
160
+ uint64_t addr;
161
+ unsigned char ch;
162
+ int ret;
163
+
164
+ switch (run->riscv_sbi.function_id) {
165
+ case SBI_EXT_DBCN_CONSOLE_READ:
166
+ case SBI_EXT_DBCN_CONSOLE_WRITE:
167
+ num_bytes = run->riscv_sbi.args[0];
168
+
169
+ if (num_bytes == 0) {
170
+ run->riscv_sbi.ret[0] = SBI_SUCCESS;
171
+ run->riscv_sbi.ret[1] = 0;
172
+ break;
173
+ }
174
+
175
+ addr = run->riscv_sbi.args[1];
176
+
177
+ /*
178
+ * Handle the case where a 32 bit CPU is running in a
179
+ * 64 bit addressing env.
180
+ */
181
+ if (riscv_cpu_mxl(&cpu->env) == MXL_RV32) {
182
+ addr |= (uint64_t)run->riscv_sbi.args[2] << 32;
183
+ }
184
+
185
+ buf = g_malloc0(num_bytes);
186
+
187
+ if (run->riscv_sbi.function_id == SBI_EXT_DBCN_CONSOLE_READ) {
188
+ ret = qemu_chr_fe_read_all(serial_hd(0)->be, buf, num_bytes);
189
+ if (ret < 0) {
190
+ error_report("SBI_EXT_DBCN_CONSOLE_READ: error when "
191
+ "reading chardev");
192
+ exit(1);
193
+ }
194
+
195
+ cpu_physical_memory_write(addr, buf, ret);
196
+ } else {
197
+ cpu_physical_memory_read(addr, buf, num_bytes);
198
+
199
+ ret = qemu_chr_fe_write_all(serial_hd(0)->be, buf, num_bytes);
200
+ if (ret < 0) {
201
+ error_report("SBI_EXT_DBCN_CONSOLE_WRITE: error when "
202
+ "writing chardev");
203
+ exit(1);
204
+ }
205
+ }
206
+
207
+ run->riscv_sbi.ret[0] = SBI_SUCCESS;
208
+ run->riscv_sbi.ret[1] = ret;
209
+ break;
210
+ case SBI_EXT_DBCN_CONSOLE_WRITE_BYTE:
211
+ ch = run->riscv_sbi.args[0];
212
+ ret = qemu_chr_fe_write(serial_hd(0)->be, &ch, sizeof(ch));
213
+
214
+ if (ret < 0) {
215
+ error_report("SBI_EXT_DBCN_CONSOLE_WRITE_BYTE: error when "
216
+ "writing chardev");
217
+ exit(1);
218
+ }
219
+
220
+ run->riscv_sbi.ret[0] = SBI_SUCCESS;
221
+ run->riscv_sbi.ret[1] = 0;
222
+ break;
223
+ default:
224
+ run->riscv_sbi.ret[0] = SBI_ERR_NOT_SUPPORTED;
225
+ }
226
+}
227
+
228
static int kvm_riscv_handle_sbi(CPUState *cs, struct kvm_run *run)
229
{
230
int ret = 0;
231
@@ -XXX,XX +XXX,XX @@ static int kvm_riscv_handle_sbi(CPUState *cs, struct kvm_run *run)
232
}
233
ret = 0;
234
break;
235
+ case SBI_EXT_DBCN:
236
+ kvm_riscv_handle_sbi_dbcn(cs, run);
237
+ break;
238
default:
239
qemu_log_mask(LOG_UNIMP,
240
"%s: un-handled SBI EXIT, specific reasons is %lu\n",
241
--
69
--
242
2.45.1
70
2.31.1
71
72
diff view generated by jsdifflib
Deleted patch
1
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
2
1
3
Running a KVM guest using a 6.9-rc3 kernel, in a 6.8 host that has zkr
4
enabled, will fail with a kernel oops SIGILL right at the start. The
5
reason is that we can't expose zkr without implementing the SEED CSR.
6
Disabling zkr in the guest would be a workaround, but if the KVM doesn't
7
allow it we'll error out and never boot.
8
9
In hindsight this is too strict. If we keep proceeding, despite not
10
disabling the extension in the KVM vcpu, we'll not add the extension in
11
the riscv,isa. The guest kernel will be unaware of the extension, i.e.
12
it doesn't matter if the KVM vcpu has it enabled underneath or not. So
13
it's ok to keep booting in this case.
14
15
Change our current logic to not error out if we fail to disable an
16
extension in kvm_set_one_reg(), but show a warning and keep booting. It
17
is important to throw a warning because we must make the user aware that
18
the extension is still available in the vcpu, meaning that an
19
ill-behaved guest can ignore the riscv,isa settings and use the
20
extension.
21
22
The case we're handling happens with an EINVAL error code. If we fail to
23
disable the extension in KVM for any other reason, error out.
24
25
We'll also keep erroring out when we fail to enable an extension in KVM,
26
since adding the extension in riscv,isa at this point will cause a guest
27
malfunction because the extension isn't enabled in the vcpu.
28
29
Suggested-by: Andrew Jones <ajones@ventanamicro.com>
30
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
31
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
32
Cc: qemu-stable <qemu-stable@nongnu.org>
33
Message-ID: <20240422171425.333037-2-dbarboza@ventanamicro.com>
34
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
35
---
36
target/riscv/kvm/kvm-cpu.c | 12 ++++++++----
37
1 file changed, 8 insertions(+), 4 deletions(-)
38
39
diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c
40
index XXXXXXX..XXXXXXX 100644
41
--- a/target/riscv/kvm/kvm-cpu.c
42
+++ b/target/riscv/kvm/kvm-cpu.c
43
@@ -XXX,XX +XXX,XX @@ static void kvm_riscv_update_cpu_cfg_isa_ext(RISCVCPU *cpu, CPUState *cs)
44
reg = kvm_cpu_cfg_get(cpu, multi_ext_cfg);
45
ret = kvm_set_one_reg(cs, id, &reg);
46
if (ret != 0) {
47
- error_report("Unable to %s extension %s in KVM, error %d",
48
- reg ? "enable" : "disable",
49
- multi_ext_cfg->name, ret);
50
- exit(EXIT_FAILURE);
51
+ if (!reg && ret == -EINVAL) {
52
+ warn_report("KVM cannot disable extension %s",
53
+ multi_ext_cfg->name);
54
+ } else {
55
+ error_report("Unable to enable extension %s in KVM, error %d",
56
+ multi_ext_cfg->name, ret);
57
+ exit(EXIT_FAILURE);
58
+ }
59
}
60
}
61
}
62
--
63
2.45.1
diff view generated by jsdifflib
Deleted patch
1
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
2
1
3
We're not setting (s/m)tval when triggering breakpoints of type 2
4
(mcontrol) and 6 (mcontrol6). According to the debug spec section
5
5.7.12, "Match Control Type 6":
6
7
"The Privileged Spec says that breakpoint exceptions that occur on
8
instruction fetches, loads, or stores update the tval CSR with either
9
zero or the faulting virtual address. The faulting virtual address for
10
an mcontrol6 trigger with action = 0 is the address being accessed and
11
which caused that trigger to fire."
12
13
A similar text is also found in the Debug spec section 5.7.11 w.r.t.
14
mcontrol.
15
16
Note that what we're doing ATM is not violating the spec, but it's
17
simple enough to set mtval/stval and it makes life easier for any
18
software that relies on this info.
19
20
Given that we always use action = 0, save the faulting address for the
21
mcontrol and mcontrol6 trigger breakpoints into env->badaddr, which is
22
used as as scratch area for traps with address information. 'tval' is
23
then set during riscv_cpu_do_interrupt().
24
25
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
26
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
27
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
28
Message-ID: <20240416230437.1869024-2-dbarboza@ventanamicro.com>
29
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
30
---
31
target/riscv/cpu_helper.c | 1 +
32
target/riscv/debug.c | 3 +++
33
2 files changed, 4 insertions(+)
34
35
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
36
index XXXXXXX..XXXXXXX 100644
37
--- a/target/riscv/cpu_helper.c
38
+++ b/target/riscv/cpu_helper.c
39
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_do_interrupt(CPUState *cs)
40
tval = env->bins;
41
break;
42
case RISCV_EXCP_BREAKPOINT:
43
+ tval = env->badaddr;
44
if (cs->watchpoint_hit) {
45
tval = cs->watchpoint_hit->hitaddr;
46
cs->watchpoint_hit = NULL;
47
diff --git a/target/riscv/debug.c b/target/riscv/debug.c
48
index XXXXXXX..XXXXXXX 100644
49
--- a/target/riscv/debug.c
50
+++ b/target/riscv/debug.c
51
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_debug_check_breakpoint(CPUState *cs)
52
if ((ctrl & TYPE2_EXEC) && (bp->pc == pc)) {
53
/* check U/S/M bit against current privilege level */
54
if ((ctrl >> 3) & BIT(env->priv)) {
55
+ env->badaddr = pc;
56
return true;
57
}
58
}
59
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_debug_check_breakpoint(CPUState *cs)
60
if (env->virt_enabled) {
61
/* check VU/VS bit against current privilege level */
62
if ((ctrl >> 23) & BIT(env->priv)) {
63
+ env->badaddr = pc;
64
return true;
65
}
66
} else {
67
/* check U/S/M bit against current privilege level */
68
if ((ctrl >> 3) & BIT(env->priv)) {
69
+ env->badaddr = pc;
70
return true;
71
}
72
}
73
--
74
2.45.1
diff view generated by jsdifflib
Deleted patch
1
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
2
1
3
Privileged spec section 4.1.9 mentions:
4
5
"When a trap is taken into S-mode, stval is written with
6
exception-specific information to assist software in handling the trap.
7
(...)
8
9
If stval is written with a nonzero value when a breakpoint,
10
address-misaligned, access-fault, or page-fault exception occurs on an
11
instruction fetch, load, or store, then stval will contain the faulting
12
virtual address."
13
14
A similar text is found for mtval in section 3.1.16.
15
16
Setting mtval/stval in this scenario is optional, but some softwares read
17
these regs when handling ebreaks.
18
19
Write 'badaddr' in all ebreak breakpoints to write the appropriate
20
'tval' during riscv_do_cpu_interrrupt().
21
22
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
23
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
24
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
25
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
26
Message-ID: <20240416230437.1869024-3-dbarboza@ventanamicro.com>
27
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
28
---
29
target/riscv/insn_trans/trans_privileged.c.inc | 2 ++
30
1 file changed, 2 insertions(+)
31
32
diff --git a/target/riscv/insn_trans/trans_privileged.c.inc b/target/riscv/insn_trans/trans_privileged.c.inc
33
index XXXXXXX..XXXXXXX 100644
34
--- a/target/riscv/insn_trans/trans_privileged.c.inc
35
+++ b/target/riscv/insn_trans/trans_privileged.c.inc
36
@@ -XXX,XX +XXX,XX @@ static bool trans_ebreak(DisasContext *ctx, arg_ebreak *a)
37
if (pre == 0x01f01013 && ebreak == 0x00100073 && post == 0x40705013) {
38
generate_exception(ctx, RISCV_EXCP_SEMIHOST);
39
} else {
40
+ tcg_gen_st_tl(tcg_constant_tl(ebreak_addr), tcg_env,
41
+ offsetof(CPURISCVState, badaddr));
42
generate_exception(ctx, RISCV_EXCP_BREAKPOINT);
43
}
44
return true;
45
--
46
2.45.1
diff view generated by jsdifflib
Deleted patch
1
From: Jason Chien <jason.chien@sifive.com>
2
1
3
Add support for Zve32x extension and replace some checks for Zve32f with
4
Zve32x, since Zve32f depends on Zve32x.
5
6
Signed-off-by: Jason Chien <jason.chien@sifive.com>
7
Reviewed-by: Frank Chang <frank.chang@sifive.com>
8
Reviewed-by: Max Chou <max.chou@sifive.com>
9
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
10
Message-ID: <20240328022343.6871-2-jason.chien@sifive.com>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
13
target/riscv/cpu_cfg.h | 1 +
14
target/riscv/cpu.c | 2 ++
15
target/riscv/cpu_helper.c | 2 +-
16
target/riscv/csr.c | 2 +-
17
target/riscv/tcg/tcg-cpu.c | 16 ++++++++--------
18
target/riscv/insn_trans/trans_rvv.c.inc | 4 ++--
19
6 files changed, 15 insertions(+), 12 deletions(-)
20
21
diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h
22
index XXXXXXX..XXXXXXX 100644
23
--- a/target/riscv/cpu_cfg.h
24
+++ b/target/riscv/cpu_cfg.h
25
@@ -XXX,XX +XXX,XX @@ struct RISCVCPUConfig {
26
bool ext_zhinx;
27
bool ext_zhinxmin;
28
bool ext_zve32f;
29
+ bool ext_zve32x;
30
bool ext_zve64f;
31
bool ext_zve64d;
32
bool ext_zvbb;
33
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/target/riscv/cpu.c
36
+++ b/target/riscv/cpu.c
37
@@ -XXX,XX +XXX,XX @@ const RISCVIsaExtData isa_edata_arr[] = {
38
ISA_EXT_DATA_ENTRY(zvbb, PRIV_VERSION_1_12_0, ext_zvbb),
39
ISA_EXT_DATA_ENTRY(zvbc, PRIV_VERSION_1_12_0, ext_zvbc),
40
ISA_EXT_DATA_ENTRY(zve32f, PRIV_VERSION_1_10_0, ext_zve32f),
41
+ ISA_EXT_DATA_ENTRY(zve32x, PRIV_VERSION_1_10_0, ext_zve32x),
42
ISA_EXT_DATA_ENTRY(zve64f, PRIV_VERSION_1_10_0, ext_zve64f),
43
ISA_EXT_DATA_ENTRY(zve64d, PRIV_VERSION_1_10_0, ext_zve64d),
44
ISA_EXT_DATA_ENTRY(zvfbfmin, PRIV_VERSION_1_12_0, ext_zvfbfmin),
45
@@ -XXX,XX +XXX,XX @@ const RISCVCPUMultiExtConfig riscv_cpu_extensions[] = {
46
MULTI_EXT_CFG_BOOL("zfh", ext_zfh, false),
47
MULTI_EXT_CFG_BOOL("zfhmin", ext_zfhmin, false),
48
MULTI_EXT_CFG_BOOL("zve32f", ext_zve32f, false),
49
+ MULTI_EXT_CFG_BOOL("zve32x", ext_zve32x, false),
50
MULTI_EXT_CFG_BOOL("zve64f", ext_zve64f, false),
51
MULTI_EXT_CFG_BOOL("zve64d", ext_zve64d, false),
52
MULTI_EXT_CFG_BOOL("zvfbfmin", ext_zvfbfmin, false),
53
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
54
index XXXXXXX..XXXXXXX 100644
55
--- a/target/riscv/cpu_helper.c
56
+++ b/target/riscv/cpu_helper.c
57
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPURISCVState *env, vaddr *pc,
58
*pc = env->xl == MXL_RV32 ? env->pc & UINT32_MAX : env->pc;
59
*cs_base = 0;
60
61
- if (cpu->cfg.ext_zve32f) {
62
+ if (cpu->cfg.ext_zve32x) {
63
/*
64
* If env->vl equals to VLMAX, we can use generic vector operation
65
* expanders (GVEC) to accerlate the vector operations.
66
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
67
index XXXXXXX..XXXXXXX 100644
68
--- a/target/riscv/csr.c
69
+++ b/target/riscv/csr.c
70
@@ -XXX,XX +XXX,XX @@ static RISCVException fs(CPURISCVState *env, int csrno)
71
72
static RISCVException vs(CPURISCVState *env, int csrno)
73
{
74
- if (riscv_cpu_cfg(env)->ext_zve32f) {
75
+ if (riscv_cpu_cfg(env)->ext_zve32x) {
76
#if !defined(CONFIG_USER_ONLY)
77
if (!env->debugger && !riscv_cpu_vector_enabled(env)) {
78
return RISCV_EXCP_ILLEGAL_INST;
79
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
80
index XXXXXXX..XXXXXXX 100644
81
--- a/target/riscv/tcg/tcg-cpu.c
82
+++ b/target/riscv/tcg/tcg-cpu.c
83
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
84
return;
85
}
86
87
- if (cpu->cfg.ext_zve32f && !riscv_has_ext(env, RVF)) {
88
- error_setg(errp, "Zve32f/Zve64f extensions require F extension");
89
- return;
90
+ /* The Zve32f extension depends on the Zve32x extension */
91
+ if (cpu->cfg.ext_zve32f) {
92
+ if (!riscv_has_ext(env, RVF)) {
93
+ error_setg(errp, "Zve32f/Zve64f extensions require F extension");
94
+ return;
95
+ }
96
+ cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zve32x), true);
97
}
98
99
if (cpu->cfg.ext_zvfh) {
100
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
101
cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zvbc), true);
102
}
103
104
- /*
105
- * In principle Zve*x would also suffice here, were they supported
106
- * in qemu
107
- */
108
if ((cpu->cfg.ext_zvbb || cpu->cfg.ext_zvkb || cpu->cfg.ext_zvkg ||
109
cpu->cfg.ext_zvkned || cpu->cfg.ext_zvknha || cpu->cfg.ext_zvksed ||
110
- cpu->cfg.ext_zvksh) && !cpu->cfg.ext_zve32f) {
111
+ cpu->cfg.ext_zvksh) && !cpu->cfg.ext_zve32x) {
112
error_setg(errp,
113
"Vector crypto extensions require V or Zve* extensions");
114
return;
115
diff --git a/target/riscv/insn_trans/trans_rvv.c.inc b/target/riscv/insn_trans/trans_rvv.c.inc
116
index XXXXXXX..XXXXXXX 100644
117
--- a/target/riscv/insn_trans/trans_rvv.c.inc
118
+++ b/target/riscv/insn_trans/trans_rvv.c.inc
119
@@ -XXX,XX +XXX,XX @@ static bool do_vsetvl(DisasContext *s, int rd, int rs1, TCGv s2)
120
{
121
TCGv s1, dst;
122
123
- if (!require_rvv(s) || !s->cfg_ptr->ext_zve32f) {
124
+ if (!require_rvv(s) || !s->cfg_ptr->ext_zve32x) {
125
return false;
126
}
127
128
@@ -XXX,XX +XXX,XX @@ static bool do_vsetivli(DisasContext *s, int rd, TCGv s1, TCGv s2)
129
{
130
TCGv dst;
131
132
- if (!require_rvv(s) || !s->cfg_ptr->ext_zve32f) {
133
+ if (!require_rvv(s) || !s->cfg_ptr->ext_zve32x) {
134
return false;
135
}
136
137
--
138
2.45.1
diff view generated by jsdifflib
Deleted patch
1
From: Jason Chien <jason.chien@sifive.com>
2
1
3
In current implementation, the gdbstub allows reading vector registers
4
only if V extension is supported. However, all vector extensions and
5
vector crypto extensions have the vector registers and they all depend
6
on Zve32x. The gdbstub should check for Zve32x instead.
7
8
Signed-off-by: Jason Chien <jason.chien@sifive.com>
9
Reviewed-by: Frank Chang <frank.chang@sifive.com>
10
Reviewed-by: Max Chou <max.chou@sifive.com>
11
Message-ID: <20240328022343.6871-4-jason.chien@sifive.com>
12
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
13
---
14
target/riscv/gdbstub.c | 2 +-
15
1 file changed, 1 insertion(+), 1 deletion(-)
16
17
diff --git a/target/riscv/gdbstub.c b/target/riscv/gdbstub.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/target/riscv/gdbstub.c
20
+++ b/target/riscv/gdbstub.c
21
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_register_gdb_regs_for_features(CPUState *cs)
22
gdb_find_static_feature("riscv-32bit-fpu.xml"),
23
0);
24
}
25
- if (env->misa_ext & RVV) {
26
+ if (cpu->cfg.ext_zve32x) {
27
gdb_register_coprocessor(cs, riscv_gdb_get_vector,
28
riscv_gdb_set_vector,
29
ricsv_gen_dynamic_vector_feature(cs, cs->gdb_num_regs),
30
--
31
2.45.1
diff view generated by jsdifflib
Deleted patch
1
From: Huang Tao <eric.huang@linux.alibaba.com>
2
1
3
In RVV and vcrypto instructions, the masked and tail elements are set to 1s
4
using vext_set_elems_1s function if the vma/vta bit is set. It is the element
5
agnostic policy.
6
7
However, this function can't deal the big endian situation. This patch fixes
8
the problem by adding handling of such case.
9
10
Signed-off-by: Huang Tao <eric.huang@linux.alibaba.com>
11
Suggested-by: Richard Henderson <richard.henderson@linaro.org>
12
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
13
Cc: qemu-stable <qemu-stable@nongnu.org>
14
Message-ID: <20240325021654.6594-1-eric.huang@linux.alibaba.com>
15
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
16
---
17
target/riscv/vector_internals.c | 22 ++++++++++++++++++++++
18
1 file changed, 22 insertions(+)
19
20
diff --git a/target/riscv/vector_internals.c b/target/riscv/vector_internals.c
21
index XXXXXXX..XXXXXXX 100644
22
--- a/target/riscv/vector_internals.c
23
+++ b/target/riscv/vector_internals.c
24
@@ -XXX,XX +XXX,XX @@ void vext_set_elems_1s(void *base, uint32_t is_agnostic, uint32_t cnt,
25
if (tot - cnt == 0) {
26
return ;
27
}
28
+
29
+ if (HOST_BIG_ENDIAN) {
30
+ /*
31
+ * Deal the situation when the elements are insdie
32
+ * only one uint64 block including setting the
33
+ * masked-off element.
34
+ */
35
+ if (((tot - 1) ^ cnt) < 8) {
36
+ memset(base + H1(tot - 1), -1, tot - cnt);
37
+ return;
38
+ }
39
+ /*
40
+ * Otherwise, at least cross two uint64_t blocks.
41
+ * Set first unaligned block.
42
+ */
43
+ if (cnt % 8 != 0) {
44
+ uint32_t j = ROUND_UP(cnt, 8);
45
+ memset(base + H1(j - 1), -1, j - cnt);
46
+ cnt = j;
47
+ }
48
+ /* Set other 64bit aligend blocks */
49
+ }
50
memset(base + cnt, -1, tot - cnt);
51
}
52
53
--
54
2.45.1
diff view generated by jsdifflib
Deleted patch
1
From: Max Chou <max.chou@sifive.com>
2
1
3
The opfv_narrow_check needs to check the single width float operator by
4
require_rvf.
5
6
Signed-off-by: Max Chou <max.chou@sifive.com>
7
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
8
Cc: qemu-stable <qemu-stable@nongnu.org>
9
Message-ID: <20240322092600.1198921-4-max.chou@sifive.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
target/riscv/insn_trans/trans_rvv.c.inc | 1 +
13
1 file changed, 1 insertion(+)
14
15
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
17
--- a/target/riscv/insn_trans/trans_rvv.c.inc
18
+++ b/target/riscv/insn_trans/trans_rvv.c.inc
19
@@ -XXX,XX +XXX,XX @@ static bool opffv_narrow_check(DisasContext *s, arg_rmr *a)
20
static bool opffv_rod_narrow_check(DisasContext *s, arg_rmr *a)
21
{
22
return opfv_narrow_check(s, a) &&
23
+ require_rvf(s) &&
24
require_scale_rvf(s) &&
25
(s->sew != MO_8);
26
}
27
--
28
2.45.1
diff view generated by jsdifflib
Deleted patch
1
From: Max Chou <max.chou@sifive.com>
2
1
3
If the checking functions check both the single and double width
4
operators at the same time, then the single width operator checking
5
functions (require_rvf[min]) will check whether the SEW is 8.
6
7
Signed-off-by: Max Chou <max.chou@sifive.com>
8
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
9
Cc: qemu-stable <qemu-stable@nongnu.org>
10
Message-ID: <20240322092600.1198921-5-max.chou@sifive.com>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
13
target/riscv/insn_trans/trans_rvv.c.inc | 16 ++++------------
14
1 file changed, 4 insertions(+), 12 deletions(-)
15
16
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
--- a/target/riscv/insn_trans/trans_rvv.c.inc
19
+++ b/target/riscv/insn_trans/trans_rvv.c.inc
20
@@ -XXX,XX +XXX,XX @@ static bool opfvv_widen_check(DisasContext *s, arg_rmrr *a)
21
return require_rvv(s) &&
22
require_rvf(s) &&
23
require_scale_rvf(s) &&
24
- (s->sew != MO_8) &&
25
vext_check_isa_ill(s) &&
26
vext_check_dss(s, a->rd, a->rs1, a->rs2, a->vm);
27
}
28
@@ -XXX,XX +XXX,XX @@ static bool opfvf_widen_check(DisasContext *s, arg_rmrr *a)
29
return require_rvv(s) &&
30
require_rvf(s) &&
31
require_scale_rvf(s) &&
32
- (s->sew != MO_8) &&
33
vext_check_isa_ill(s) &&
34
vext_check_ds(s, a->rd, a->rs2, a->vm);
35
}
36
@@ -XXX,XX +XXX,XX @@ static bool opfwv_widen_check(DisasContext *s, arg_rmrr *a)
37
return require_rvv(s) &&
38
require_rvf(s) &&
39
require_scale_rvf(s) &&
40
- (s->sew != MO_8) &&
41
vext_check_isa_ill(s) &&
42
vext_check_dds(s, a->rd, a->rs1, a->rs2, a->vm);
43
}
44
@@ -XXX,XX +XXX,XX @@ static bool opfwf_widen_check(DisasContext *s, arg_rmrr *a)
45
return require_rvv(s) &&
46
require_rvf(s) &&
47
require_scale_rvf(s) &&
48
- (s->sew != MO_8) &&
49
vext_check_isa_ill(s) &&
50
vext_check_dd(s, a->rd, a->rs2, a->vm);
51
}
52
@@ -XXX,XX +XXX,XX @@ static bool opffv_widen_check(DisasContext *s, arg_rmr *a)
53
{
54
return opfv_widen_check(s, a) &&
55
require_rvfmin(s) &&
56
- require_scale_rvfmin(s) &&
57
- (s->sew != MO_8);
58
+ require_scale_rvfmin(s);
59
}
60
61
#define GEN_OPFV_WIDEN_TRANS(NAME, CHECK, HELPER, FRM) \
62
@@ -XXX,XX +XXX,XX @@ static bool opffv_narrow_check(DisasContext *s, arg_rmr *a)
63
{
64
return opfv_narrow_check(s, a) &&
65
require_rvfmin(s) &&
66
- require_scale_rvfmin(s) &&
67
- (s->sew != MO_8);
68
+ require_scale_rvfmin(s);
69
}
70
71
static bool opffv_rod_narrow_check(DisasContext *s, arg_rmr *a)
72
{
73
return opfv_narrow_check(s, a) &&
74
require_rvf(s) &&
75
- require_scale_rvf(s) &&
76
- (s->sew != MO_8);
77
+ require_scale_rvf(s);
78
}
79
80
#define GEN_OPFV_NARROW_TRANS(NAME, CHECK, HELPER, FRM) \
81
@@ -XXX,XX +XXX,XX @@ static bool freduction_widen_check(DisasContext *s, arg_rmrr *a)
82
{
83
return reduction_widen_check(s, a) &&
84
require_rvf(s) &&
85
- require_scale_rvf(s) &&
86
- (s->sew != MO_8);
87
+ require_scale_rvf(s);
88
}
89
90
GEN_OPFVV_WIDEN_TRANS(vfwredusum_vs, freduction_widen_check)
91
--
92
2.45.1
diff view generated by jsdifflib
Deleted patch
1
From: Alistair Francis <alistair23@gmail.com>
2
1
3
Previously we only listed a single pmpcfg CSR and the first 16 pmpaddr
4
CSRs. This patch fixes this to list all 16 pmpcfg and all 64 pmpaddr
5
CSRs are part of the disassembly.
6
7
Reported-by: Eric DeVolder <eric_devolder@yahoo.com>
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
Fixes: ea10325917 ("RISC-V Disassembler")
10
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
11
Cc: qemu-stable <qemu-stable@nongnu.org>
12
Message-ID: <20240514051615.330979-1-alistair.francis@wdc.com>
13
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
14
---
15
disas/riscv.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++-
16
1 file changed, 64 insertions(+), 1 deletion(-)
17
18
diff --git a/disas/riscv.c b/disas/riscv.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/disas/riscv.c
21
+++ b/disas/riscv.c
22
@@ -XXX,XX +XXX,XX @@ static const char *csr_name(int csrno)
23
case 0x0383: return "mibound";
24
case 0x0384: return "mdbase";
25
case 0x0385: return "mdbound";
26
- case 0x03a0: return "pmpcfg3";
27
+ case 0x03a0: return "pmpcfg0";
28
+ case 0x03a1: return "pmpcfg1";
29
+ case 0x03a2: return "pmpcfg2";
30
+ case 0x03a3: return "pmpcfg3";
31
+ case 0x03a4: return "pmpcfg4";
32
+ case 0x03a5: return "pmpcfg5";
33
+ case 0x03a6: return "pmpcfg6";
34
+ case 0x03a7: return "pmpcfg7";
35
+ case 0x03a8: return "pmpcfg8";
36
+ case 0x03a9: return "pmpcfg9";
37
+ case 0x03aa: return "pmpcfg10";
38
+ case 0x03ab: return "pmpcfg11";
39
+ case 0x03ac: return "pmpcfg12";
40
+ case 0x03ad: return "pmpcfg13";
41
+ case 0x03ae: return "pmpcfg14";
42
+ case 0x03af: return "pmpcfg15";
43
case 0x03b0: return "pmpaddr0";
44
case 0x03b1: return "pmpaddr1";
45
case 0x03b2: return "pmpaddr2";
46
@@ -XXX,XX +XXX,XX @@ static const char *csr_name(int csrno)
47
case 0x03bd: return "pmpaddr13";
48
case 0x03be: return "pmpaddr14";
49
case 0x03bf: return "pmpaddr15";
50
+ case 0x03c0: return "pmpaddr16";
51
+ case 0x03c1: return "pmpaddr17";
52
+ case 0x03c2: return "pmpaddr18";
53
+ case 0x03c3: return "pmpaddr19";
54
+ case 0x03c4: return "pmpaddr20";
55
+ case 0x03c5: return "pmpaddr21";
56
+ case 0x03c6: return "pmpaddr22";
57
+ case 0x03c7: return "pmpaddr23";
58
+ case 0x03c8: return "pmpaddr24";
59
+ case 0x03c9: return "pmpaddr25";
60
+ case 0x03ca: return "pmpaddr26";
61
+ case 0x03cb: return "pmpaddr27";
62
+ case 0x03cc: return "pmpaddr28";
63
+ case 0x03cd: return "pmpaddr29";
64
+ case 0x03ce: return "pmpaddr30";
65
+ case 0x03cf: return "pmpaddr31";
66
+ case 0x03d0: return "pmpaddr32";
67
+ case 0x03d1: return "pmpaddr33";
68
+ case 0x03d2: return "pmpaddr34";
69
+ case 0x03d3: return "pmpaddr35";
70
+ case 0x03d4: return "pmpaddr36";
71
+ case 0x03d5: return "pmpaddr37";
72
+ case 0x03d6: return "pmpaddr38";
73
+ case 0x03d7: return "pmpaddr39";
74
+ case 0x03d8: return "pmpaddr40";
75
+ case 0x03d9: return "pmpaddr41";
76
+ case 0x03da: return "pmpaddr42";
77
+ case 0x03db: return "pmpaddr43";
78
+ case 0x03dc: return "pmpaddr44";
79
+ case 0x03dd: return "pmpaddr45";
80
+ case 0x03de: return "pmpaddr46";
81
+ case 0x03df: return "pmpaddr47";
82
+ case 0x03e0: return "pmpaddr48";
83
+ case 0x03e1: return "pmpaddr49";
84
+ case 0x03e2: return "pmpaddr50";
85
+ case 0x03e3: return "pmpaddr51";
86
+ case 0x03e4: return "pmpaddr52";
87
+ case 0x03e5: return "pmpaddr53";
88
+ case 0x03e6: return "pmpaddr54";
89
+ case 0x03e7: return "pmpaddr55";
90
+ case 0x03e8: return "pmpaddr56";
91
+ case 0x03e9: return "pmpaddr57";
92
+ case 0x03ea: return "pmpaddr58";
93
+ case 0x03eb: return "pmpaddr59";
94
+ case 0x03ec: return "pmpaddr60";
95
+ case 0x03ed: return "pmpaddr61";
96
+ case 0x03ee: return "pmpaddr62";
97
+ case 0x03ef: return "pmpaddr63";
98
case 0x0780: return "mtohost";
99
case 0x0781: return "mfromhost";
100
case 0x0782: return "mreset";
101
--
102
2.45.1
diff view generated by jsdifflib