1
The following changes since commit c95bd5ff1660883d15ad6e0005e4c8571604f51a:
1
The following changes since commit a35947f15c0ee695eba3c55248ec8ac3e4e23cca:
2
2
3
Merge remote-tracking branch 'remotes/philmd/tags/mips-fixes-20210322' into staging (2021-03-22 14:26:13 +0000)
3
Merge remote-tracking branch 'remotes/stsquad/tags/pull-testing-updates-070621-2' into staging (2021-06-07 15:45:48 +0100)
4
4
5
are available in the Git repository at:
5
are available in the Git repository at:
6
6
7
git@github.com:alistair23/qemu.git tags/pull-riscv-to-apply-20210322-2
7
git@github.com:alistair23/qemu.git tags/pull-riscv-to-apply-20210608-1
8
8
9
for you to fetch changes up to 9a27f69bd668d9d71674407badc412ce1231c7d5:
9
for you to fetch changes up to d2c1a177b138be35cb96216baa870c3564b123e4:
10
10
11
target/riscv: Prevent lost illegal instruction exceptions (2021-03-22 21:54:40 -0400)
11
target/riscv: rvb: add b-ext version cpu option (2021-06-08 09:59:46 +1000)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
RISC-V PR for 6.0
14
Second RISC-V PR for QEMU 6.1
15
15
16
This PR includes:
16
- Update the PLIC and CLINT DT bindings
17
- Fix for vector CSR access
17
- Improve documentation for RISC-V machines
18
- Improvements to the Ibex UART device
18
- Support direct kernel boot for microchip_pfsoc
19
- PMP improvements and bug fixes
19
- Fix WFI exception behaviour
20
- Hypervisor extension bug fixes
20
- Improve CSR printing
21
- ramfb support for the virt machine
21
- Initial support for the experimental Bit Manip extension
22
- Fast read support for SST flash
23
- Improvements to the microchip_pfsoc machine
24
22
25
----------------------------------------------------------------
23
----------------------------------------------------------------
26
Alexander Wagner (1):
24
Alistair Francis (2):
27
hw/char: disable ibex uart receive if the buffer is full
25
docs/system: Move the RISC-V -bios information to removed
26
target/riscv/pmp: Add assert for ePMP operations
28
27
29
Asherah Connor (2):
28
Bin Meng (9):
30
hw/riscv: Add fw_cfg support to virt
29
hw/riscv: sifive_u: Switch to use qemu_fdt_setprop_string_array() helper
31
hw/riscv: allow ramfb on virt
30
hw/riscv: virt: Switch to use qemu_fdt_setprop_string_array() helper
31
hw/riscv: Support the official CLINT DT bindings
32
hw/riscv: Support the official PLIC DT bindings
33
docs/system/riscv: Correct the indentation level of supported devices
34
docs/system/riscv: sifive_u: Document '-dtb' usage
35
hw/riscv: Use macros for BIOS image names
36
hw/riscv: microchip_pfsoc: Support direct kernel boot
37
target/riscv: Remove unnecessary riscv_*_names[] declaration
32
38
33
Bin Meng (3):
39
Changbin Du (1):
34
hw/block: m25p80: Support fast read for SST flashes
40
target/riscv: Dump CSR mscratch/sscratch/satp
35
hw/riscv: microchip_pfsoc: Map EMMC/SD mux register
36
docs/system: riscv: Add documentation for 'microchip-icicle-kit' machine
37
41
38
Frank Chang (1):
42
Frank Chang (6):
39
target/riscv: fix vs() to return proper error code
43
target/riscv: rvb: count bits set
44
target/riscv: add gen_shifti() and gen_shiftiw() helper functions
45
target/riscv: rvb: single-bit instructions
46
target/riscv: rvb: generalized reverse
47
target/riscv: rvb: generalized or-combine
48
target/riscv: rvb: add b-ext version cpu option
40
49
41
Georg Kotheimer (6):
50
Jose Martins (1):
42
target/riscv: Adjust privilege level for HLV(X)/HSV instructions
51
target/riscv: fix wfi exception behavior
43
target/riscv: Make VSTIP and VSEIP read-only in hip
44
target/riscv: Use background registers also for MSTATUS_MPV
45
target/riscv: Fix read and write accesses to vsip and vsie
46
target/riscv: Add proper two-stage lookup exception detection
47
target/riscv: Prevent lost illegal instruction exceptions
48
52
49
Jim Shu (3):
53
Kito Cheng (11):
50
target/riscv: propagate PMP permission to TLB page
54
target/riscv: reformat @sh format encoding for B-extension
51
target/riscv: add log of PMP permission checking
55
target/riscv: rvb: count leading/trailing zeros
52
target/riscv: flush TLB pages if PMP permission has been changed
56
target/riscv: rvb: logic-with-negate
57
target/riscv: rvb: pack two words into one register
58
target/riscv: rvb: min/max instructions
59
target/riscv: rvb: sign-extend instructions
60
target/riscv: rvb: shift ones
61
target/riscv: rvb: rotate (left/right)
62
target/riscv: rvb: address calculation
63
target/riscv: rvb: add/shift with prefix zero-extend
64
target/riscv: rvb: support and turn on B-extension from command line
53
65
54
docs/system/riscv/microchip-icicle-kit.rst | 89 ++++++++++++++
66
LIU Zhiwei (1):
55
docs/system/target-riscv.rst | 1 +
67
target/riscv: Pass the same value to oprsz and maxsz.
56
include/hw/char/ibex_uart.h | 4 +
57
include/hw/riscv/microchip_pfsoc.h | 1 +
58
include/hw/riscv/virt.h | 2 +
59
target/riscv/cpu.h | 4 +
60
target/riscv/pmp.h | 4 +-
61
hw/block/m25p80.c | 3 +
62
hw/char/ibex_uart.c | 23 +++-
63
hw/riscv/microchip_pfsoc.c | 6 +
64
hw/riscv/virt.c | 33 ++++++
65
target/riscv/cpu.c | 1 +
66
target/riscv/cpu_helper.c | 144 +++++++++++++++--------
67
target/riscv/csr.c | 77 +++++++------
68
target/riscv/pmp.c | 84 ++++++++++----
69
target/riscv/translate.c | 179 +----------------------------
70
hw/riscv/Kconfig | 1 +
71
17 files changed, 367 insertions(+), 289 deletions(-)
72
create mode 100644 docs/system/riscv/microchip-icicle-kit.rst
73
68
69
Philippe Mathieu-Daudé (1):
70
target/riscv: Do not include 'pmp.h' in user emulation
71
72
docs/system/deprecated.rst | 19 --
73
docs/system/removed-features.rst | 5 +
74
docs/system/riscv/microchip-icicle-kit.rst | 50 +++-
75
docs/system/riscv/sifive_u.rst | 77 +++--
76
docs/system/target-riscv.rst | 13 +-
77
include/hw/riscv/boot.h | 5 +
78
target/riscv/cpu.h | 9 +-
79
target/riscv/cpu_bits.h | 1 +
80
target/riscv/helper.h | 6 +
81
target/riscv/insn32.decode | 87 +++++-
82
hw/riscv/microchip_pfsoc.c | 81 +++++-
83
hw/riscv/sifive_u.c | 24 +-
84
hw/riscv/spike.c | 12 +-
85
hw/riscv/virt.c | 25 +-
86
target/riscv/bitmanip_helper.c | 90 ++++++
87
target/riscv/cpu.c | 38 ++-
88
target/riscv/op_helper.c | 11 +-
89
target/riscv/pmp.c | 4 +
90
target/riscv/translate.c | 306 ++++++++++++++++++++
91
target/riscv/insn_trans/trans_rvb.c.inc | 438 +++++++++++++++++++++++++++++
92
target/riscv/insn_trans/trans_rvi.c.inc | 54 +---
93
target/riscv/insn_trans/trans_rvv.c.inc | 89 +++---
94
target/riscv/meson.build | 1 +
95
23 files changed, 1260 insertions(+), 185 deletions(-)
96
create mode 100644 target/riscv/bitmanip_helper.c
97
create mode 100644 target/riscv/insn_trans/trans_rvb.c.inc
98
diff view generated by jsdifflib
New patch
1
From: Bin Meng <bin.meng@windriver.com>
1
2
3
Since commit 78da6a1bca22 ("device_tree: add qemu_fdt_setprop_string_array helper"),
4
we can use the new helper to set the clock name for the ethernet
5
controller node.
6
7
Signed-off-by: Bin Meng <bin.meng@windriver.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 20210430071302.1489082-1-bmeng.cn@gmail.com
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
hw/riscv/sifive_u.c | 6 +++---
13
1 file changed, 3 insertions(+), 3 deletions(-)
14
15
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/riscv/sifive_u.c
18
+++ b/hw/riscv/sifive_u.c
19
@@ -XXX,XX +XXX,XX @@ static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
20
int cpu;
21
uint32_t *cells;
22
char *nodename;
23
- char ethclk_names[] = "pclk\0hclk";
24
uint32_t plic_phandle, prci_phandle, gpio_phandle, phandle = 1;
25
uint32_t hfclk_phandle, rtcclk_phandle, phy_phandle;
26
+ static const char * const ethclk_names[2] = { "pclk", "hclk" };
27
28
if (ms->dtb) {
29
fdt = s->fdt = load_device_tree(ms->dtb, &s->fdt_size);
30
@@ -XXX,XX +XXX,XX @@ static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
31
qemu_fdt_setprop_cell(fdt, nodename, "interrupts", SIFIVE_U_GEM_IRQ);
32
qemu_fdt_setprop_cells(fdt, nodename, "clocks",
33
prci_phandle, PRCI_CLK_GEMGXLPLL, prci_phandle, PRCI_CLK_GEMGXLPLL);
34
- qemu_fdt_setprop(fdt, nodename, "clock-names", ethclk_names,
35
- sizeof(ethclk_names));
36
+ qemu_fdt_setprop_string_array(fdt, nodename, "clock-names",
37
+ (char **)&ethclk_names, ARRAY_SIZE(ethclk_names));
38
qemu_fdt_setprop(fdt, nodename, "local-mac-address",
39
s->soc.gem.conf.macaddr.a, ETH_ALEN);
40
qemu_fdt_setprop_cell(fdt, nodename, "#address-cells", 1);
41
--
42
2.31.1
43
44
diff view generated by jsdifflib
1
From: Asherah Connor <ashe@kivikakk.ee>
1
From: Bin Meng <bin.meng@windriver.com>
2
2
3
Allow ramfb on virt. This lets `-device ramfb' work.
3
Since commit 78da6a1bca22 ("device_tree: add qemu_fdt_setprop_string_array helper"),
4
we can use the new helper to set the compatible strings for the
5
SiFive test device node.
4
6
5
Signed-off-by: Asherah Connor <ashe@kivikakk.ee>
7
Signed-off-by: Bin Meng <bin.meng@windriver.com>
6
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-id: 20210318235041.17175-3-ashe@kivikakk.ee
9
Message-id: 20210430071302.1489082-2-bmeng.cn@gmail.com
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
---
11
---
11
hw/riscv/virt.c | 3 +++
12
hw/riscv/virt.c | 7 +++++--
12
1 file changed, 3 insertions(+)
13
1 file changed, 5 insertions(+), 2 deletions(-)
13
14
14
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
15
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/riscv/virt.c
17
--- a/hw/riscv/virt.c
17
+++ b/hw/riscv/virt.c
18
+++ b/hw/riscv/virt.c
18
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ static void create_fdt(RISCVVirtState *s, const MemMapEntry *memmap,
19
#include "sysemu/sysemu.h"
20
(long)memmap[VIRT_TEST].base);
20
#include "hw/pci/pci.h"
21
qemu_fdt_add_subnode(fdt, name);
21
#include "hw/pci-host/gpex.h"
22
{
22
+#include "hw/display/ramfb.h"
23
- const char compat[] = "sifive,test1\0sifive,test0\0syscon";
23
24
- qemu_fdt_setprop(fdt, name, "compatible", compat, sizeof(compat));
24
static const MemMapEntry virt_memmap[] = {
25
+ static const char * const compat[3] = {
25
[VIRT_DEBUG] = { 0x0, 0x100 },
26
+ "sifive,test1", "sifive,test0", "syscon"
26
@@ -XXX,XX +XXX,XX @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
27
+ };
27
mc->cpu_index_to_instance_props = riscv_numa_cpu_index_to_props;
28
+ qemu_fdt_setprop_string_array(fdt, name, "compatible", (char **)&compat,
28
mc->get_default_cpu_node_id = riscv_numa_get_default_cpu_node_id;
29
+ ARRAY_SIZE(compat));
29
mc->numa_mem_supported = true;
30
}
30
+
31
qemu_fdt_setprop_cells(fdt, name, "reg",
31
+ machine_class_allow_dynamic_sysbus_dev(mc, TYPE_RAMFB_DEVICE);
32
0x0, memmap[VIRT_TEST].base,
32
}
33
34
static const TypeInfo virt_machine_typeinfo = {
35
--
33
--
36
2.30.1
34
2.31.1
37
35
38
36
diff view generated by jsdifflib
New patch
1
From: Bin Meng <bin.meng@windriver.com>
1
2
3
Linux kernel commit a2770b57d083 ("dt-bindings: timer: Add CLINT bindings")
4
adds the official DT bindings for CLINT, which uses "sifive,clint0"
5
as the compatible string. "riscv,clint0" is now legacy and has to
6
be kept for backward compatibility of legacy systems.
7
8
Signed-off-by: Bin Meng <bin.meng@windriver.com>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-id: 20210430071302.1489082-3-bmeng.cn@gmail.com
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
13
hw/riscv/sifive_u.c | 6 +++++-
14
hw/riscv/spike.c | 6 +++++-
15
hw/riscv/virt.c | 6 +++++-
16
3 files changed, 15 insertions(+), 3 deletions(-)
17
18
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/riscv/sifive_u.c
21
+++ b/hw/riscv/sifive_u.c
22
@@ -XXX,XX +XXX,XX @@ static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
23
uint32_t plic_phandle, prci_phandle, gpio_phandle, phandle = 1;
24
uint32_t hfclk_phandle, rtcclk_phandle, phy_phandle;
25
static const char * const ethclk_names[2] = { "pclk", "hclk" };
26
+ static const char * const clint_compat[2] = {
27
+ "sifive,clint0", "riscv,clint0"
28
+ };
29
30
if (ms->dtb) {
31
fdt = s->fdt = load_device_tree(ms->dtb, &s->fdt_size);
32
@@ -XXX,XX +XXX,XX @@ static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
33
nodename = g_strdup_printf("/soc/clint@%lx",
34
(long)memmap[SIFIVE_U_DEV_CLINT].base);
35
qemu_fdt_add_subnode(fdt, nodename);
36
- qemu_fdt_setprop_string(fdt, nodename, "compatible", "riscv,clint0");
37
+ qemu_fdt_setprop_string_array(fdt, nodename, "compatible",
38
+ (char **)&clint_compat, ARRAY_SIZE(clint_compat));
39
qemu_fdt_setprop_cells(fdt, nodename, "reg",
40
0x0, memmap[SIFIVE_U_DEV_CLINT].base,
41
0x0, memmap[SIFIVE_U_DEV_CLINT].size);
42
diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c
43
index XXXXXXX..XXXXXXX 100644
44
--- a/hw/riscv/spike.c
45
+++ b/hw/riscv/spike.c
46
@@ -XXX,XX +XXX,XX @@ static void create_fdt(SpikeState *s, const MemMapEntry *memmap,
47
uint32_t cpu_phandle, intc_phandle, phandle = 1;
48
char *name, *mem_name, *clint_name, *clust_name;
49
char *core_name, *cpu_name, *intc_name;
50
+ static const char * const clint_compat[2] = {
51
+ "sifive,clint0", "riscv,clint0"
52
+ };
53
54
fdt = s->fdt = create_device_tree(&s->fdt_size);
55
if (!fdt) {
56
@@ -XXX,XX +XXX,XX @@ static void create_fdt(SpikeState *s, const MemMapEntry *memmap,
57
(memmap[SPIKE_CLINT].size * socket);
58
clint_name = g_strdup_printf("/soc/clint@%lx", clint_addr);
59
qemu_fdt_add_subnode(fdt, clint_name);
60
- qemu_fdt_setprop_string(fdt, clint_name, "compatible", "riscv,clint0");
61
+ qemu_fdt_setprop_string_array(fdt, clint_name, "compatible",
62
+ (char **)&clint_compat, ARRAY_SIZE(clint_compat));
63
qemu_fdt_setprop_cells(fdt, clint_name, "reg",
64
0x0, clint_addr, 0x0, memmap[SPIKE_CLINT].size);
65
qemu_fdt_setprop(fdt, clint_name, "interrupts-extended",
66
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
67
index XXXXXXX..XXXXXXX 100644
68
--- a/hw/riscv/virt.c
69
+++ b/hw/riscv/virt.c
70
@@ -XXX,XX +XXX,XX @@ static void create_fdt(RISCVVirtState *s, const MemMapEntry *memmap,
71
char *name, *clint_name, *plic_name, *clust_name;
72
hwaddr flashsize = virt_memmap[VIRT_FLASH].size / 2;
73
hwaddr flashbase = virt_memmap[VIRT_FLASH].base;
74
+ static const char * const clint_compat[2] = {
75
+ "sifive,clint0", "riscv,clint0"
76
+ };
77
78
if (mc->dtb) {
79
fdt = mc->fdt = load_device_tree(mc->dtb, &s->fdt_size);
80
@@ -XXX,XX +XXX,XX @@ static void create_fdt(RISCVVirtState *s, const MemMapEntry *memmap,
81
(memmap[VIRT_CLINT].size * socket);
82
clint_name = g_strdup_printf("/soc/clint@%lx", clint_addr);
83
qemu_fdt_add_subnode(fdt, clint_name);
84
- qemu_fdt_setprop_string(fdt, clint_name, "compatible", "riscv,clint0");
85
+ qemu_fdt_setprop_string_array(fdt, clint_name, "compatible",
86
+ (char **)&clint_compat, ARRAY_SIZE(clint_compat));
87
qemu_fdt_setprop_cells(fdt, clint_name, "reg",
88
0x0, clint_addr, 0x0, memmap[VIRT_CLINT].size);
89
qemu_fdt_setprop(fdt, clint_name, "interrupts-extended",
90
--
91
2.31.1
92
93
diff view generated by jsdifflib
1
From: Asherah Connor <ashe@kivikakk.ee>
1
From: Bin Meng <bin.meng@windriver.com>
2
2
3
Provides fw_cfg for the virt machine on riscv. This enables
3
The official DT bindings of PLIC uses "sifive,plic-1.0.0" as the
4
using e.g. ramfb later.
4
compatible string in the upstream Linux kernel. "riscv,plic0" is
5
now legacy and has to be kept for backward compatibility of legacy
6
systems.
5
7
6
Signed-off-by: Asherah Connor <ashe@kivikakk.ee>
8
Signed-off-by: Bin Meng <bin.meng@windriver.com>
7
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 20210318235041.17175-2-ashe@kivikakk.ee
10
Message-id: 20210430071302.1489082-4-bmeng.cn@gmail.com
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
---
12
include/hw/riscv/virt.h | 2 ++
13
hw/riscv/sifive_u.c | 6 +++++-
13
hw/riscv/virt.c | 30 ++++++++++++++++++++++++++++++
14
hw/riscv/virt.c | 6 +++++-
14
hw/riscv/Kconfig | 1 +
15
2 files changed, 10 insertions(+), 2 deletions(-)
15
3 files changed, 33 insertions(+)
16
16
17
diff --git a/include/hw/riscv/virt.h b/include/hw/riscv/virt.h
17
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
18
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/riscv/virt.h
19
--- a/hw/riscv/sifive_u.c
20
+++ b/include/hw/riscv/virt.h
20
+++ b/hw/riscv/sifive_u.c
21
@@ -XXX,XX +XXX,XX @@ struct RISCVVirtState {
21
@@ -XXX,XX +XXX,XX @@ static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
22
RISCVHartArrayState soc[VIRT_SOCKETS_MAX];
22
static const char * const clint_compat[2] = {
23
DeviceState *plic[VIRT_SOCKETS_MAX];
23
"sifive,clint0", "riscv,clint0"
24
PFlashCFI01 *flash[2];
24
};
25
+ FWCfgState *fw_cfg;
25
+ static const char * const plic_compat[2] = {
26
26
+ "sifive,plic-1.0.0", "riscv,plic0"
27
int fdt_size;
27
+ };
28
};
28
29
@@ -XXX,XX +XXX,XX @@ enum {
29
if (ms->dtb) {
30
VIRT_PLIC,
30
fdt = s->fdt = load_device_tree(ms->dtb, &s->fdt_size);
31
VIRT_UART0,
31
@@ -XXX,XX +XXX,XX @@ static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
32
VIRT_VIRTIO,
32
(long)memmap[SIFIVE_U_DEV_PLIC].base);
33
+ VIRT_FW_CFG,
33
qemu_fdt_add_subnode(fdt, nodename);
34
VIRT_FLASH,
34
qemu_fdt_setprop_cell(fdt, nodename, "#interrupt-cells", 1);
35
VIRT_DRAM,
35
- qemu_fdt_setprop_string(fdt, nodename, "compatible", "riscv,plic0");
36
VIRT_PCIE_MMIO,
36
+ qemu_fdt_setprop_string_array(fdt, nodename, "compatible",
37
+ (char **)&plic_compat, ARRAY_SIZE(plic_compat));
38
qemu_fdt_setprop(fdt, nodename, "interrupt-controller", NULL, 0);
39
qemu_fdt_setprop(fdt, nodename, "interrupts-extended",
40
cells, (ms->smp.cpus * 4 - 2) * sizeof(uint32_t));
37
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
41
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
38
index XXXXXXX..XXXXXXX 100644
42
index XXXXXXX..XXXXXXX 100644
39
--- a/hw/riscv/virt.c
43
--- a/hw/riscv/virt.c
40
+++ b/hw/riscv/virt.c
44
+++ b/hw/riscv/virt.c
41
@@ -XXX,XX +XXX,XX @@ static const MemMapEntry virt_memmap[] = {
45
@@ -XXX,XX +XXX,XX @@ static void create_fdt(RISCVVirtState *s, const MemMapEntry *memmap,
42
[VIRT_PLIC] = { 0xc000000, VIRT_PLIC_SIZE(VIRT_CPUS_MAX * 2) },
46
static const char * const clint_compat[2] = {
43
[VIRT_UART0] = { 0x10000000, 0x100 },
47
"sifive,clint0", "riscv,clint0"
44
[VIRT_VIRTIO] = { 0x10001000, 0x1000 },
48
};
45
+ [VIRT_FW_CFG] = { 0x10100000, 0x18 },
49
+ static const char * const plic_compat[2] = {
46
[VIRT_FLASH] = { 0x20000000, 0x4000000 },
50
+ "sifive,plic-1.0.0", "riscv,plic0"
47
[VIRT_PCIE_ECAM] = { 0x30000000, 0x10000000 },
51
+ };
48
[VIRT_PCIE_MMIO] = { 0x40000000, 0x40000000 },
52
49
@@ -XXX,XX +XXX,XX @@ static inline DeviceState *gpex_pcie_init(MemoryRegion *sys_mem,
53
if (mc->dtb) {
50
return dev;
54
fdt = mc->fdt = load_device_tree(mc->dtb, &s->fdt_size);
51
}
55
@@ -XXX,XX +XXX,XX @@ static void create_fdt(RISCVVirtState *s, const MemMapEntry *memmap,
52
56
"#address-cells", FDT_PLIC_ADDR_CELLS);
53
+static FWCfgState *create_fw_cfg(const MachineState *mc)
57
qemu_fdt_setprop_cell(fdt, plic_name,
54
+{
58
"#interrupt-cells", FDT_PLIC_INT_CELLS);
55
+ hwaddr base = virt_memmap[VIRT_FW_CFG].base;
59
- qemu_fdt_setprop_string(fdt, plic_name, "compatible", "riscv,plic0");
56
+ hwaddr size = virt_memmap[VIRT_FW_CFG].size;
60
+ qemu_fdt_setprop_string_array(fdt, plic_name, "compatible",
57
+ FWCfgState *fw_cfg;
61
+ (char **)&plic_compat, ARRAY_SIZE(plic_compat));
58
+ char *nodename;
62
qemu_fdt_setprop(fdt, plic_name, "interrupt-controller", NULL, 0);
59
+
63
qemu_fdt_setprop(fdt, plic_name, "interrupts-extended",
60
+ fw_cfg = fw_cfg_init_mem_wide(base + 8, base, 8, base + 16,
64
plic_cells, s->soc[socket].num_harts * sizeof(uint32_t) * 4);
61
+ &address_space_memory);
62
+ fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)mc->smp.cpus);
63
+
64
+ nodename = g_strdup_printf("/fw-cfg@%" PRIx64, base);
65
+ qemu_fdt_add_subnode(mc->fdt, nodename);
66
+ qemu_fdt_setprop_string(mc->fdt, nodename,
67
+ "compatible", "qemu,fw-cfg-mmio");
68
+ qemu_fdt_setprop_sized_cells(mc->fdt, nodename, "reg",
69
+ 2, base, 2, size);
70
+ qemu_fdt_setprop(mc->fdt, nodename, "dma-coherent", NULL, 0);
71
+ g_free(nodename);
72
+ return fw_cfg;
73
+}
74
+
75
static void virt_machine_init(MachineState *machine)
76
{
77
const MemMapEntry *memmap = virt_memmap;
78
@@ -XXX,XX +XXX,XX @@ static void virt_machine_init(MachineState *machine)
79
start_addr = virt_memmap[VIRT_FLASH].base;
80
}
81
82
+ /*
83
+ * Init fw_cfg. Must be done before riscv_load_fdt, otherwise the device
84
+ * tree cannot be altered and we get FDT_ERR_NOSPACE.
85
+ */
86
+ s->fw_cfg = create_fw_cfg(machine);
87
+ rom_set_fw(s->fw_cfg);
88
+
89
/* Compute the fdt load address in dram */
90
fdt_load_addr = riscv_load_fdt(memmap[VIRT_DRAM].base,
91
machine->ram_size, machine->fdt);
92
diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig
93
index XXXXXXX..XXXXXXX 100644
94
--- a/hw/riscv/Kconfig
95
+++ b/hw/riscv/Kconfig
96
@@ -XXX,XX +XXX,XX @@ config RISCV_VIRT
97
select SIFIVE_PLIC
98
select SIFIVE_TEST
99
select VIRTIO_MMIO
100
+ select FW_CFG_DMA
101
102
config SIFIVE_E
103
bool
104
--
65
--
105
2.30.1
66
2.31.1
106
67
107
68
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: Bin Meng <bin.meng@windriver.com>
2
2
3
Per SST25VF016B datasheet [1], SST flash requires a dummy byte after
3
The supported device bullet list has an additional space before each
4
the address bytes. Note only SPI mode is supported by SST flashes.
4
entry, which makes a wrong indentation level. Correct it.
5
6
[1] http://ww1.microchip.com/downloads/en/devicedoc/s71271_04.pdf
7
5
8
Signed-off-by: Bin Meng <bin.meng@windriver.com>
6
Signed-off-by: Bin Meng <bin.meng@windriver.com>
9
Acked-by: Alistair Francis <alistair.francis@wdc.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-id: 20210306060152.7250-1-bmeng.cn@gmail.com
8
Message-id: 20210430071302.1489082-5-bmeng.cn@gmail.com
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
10
---
13
hw/block/m25p80.c | 3 +++
11
docs/system/riscv/microchip-icicle-kit.rst | 20 +++++++--------
14
1 file changed, 3 insertions(+)
12
docs/system/riscv/sifive_u.rst | 30 +++++++++++-----------
13
2 files changed, 25 insertions(+), 25 deletions(-)
15
14
16
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
15
diff --git a/docs/system/riscv/microchip-icicle-kit.rst b/docs/system/riscv/microchip-icicle-kit.rst
17
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/block/m25p80.c
17
--- a/docs/system/riscv/microchip-icicle-kit.rst
19
+++ b/hw/block/m25p80.c
18
+++ b/docs/system/riscv/microchip-icicle-kit.rst
20
@@ -XXX,XX +XXX,XX @@ static void decode_fast_read_cmd(Flash *s)
19
@@ -XXX,XX +XXX,XX @@ Supported devices
21
s->needed_bytes = get_addr_length(s);
20
22
switch (get_man(s)) {
21
The ``microchip-icicle-kit`` machine supports the following devices:
23
/* Dummy cycles - modeled with bytes writes instead of bits */
22
24
+ case MAN_SST:
23
- * 1 E51 core
25
+ s->needed_bytes += 1;
24
- * 4 U54 cores
26
+ break;
25
- * Core Level Interruptor (CLINT)
27
case MAN_WINBOND:
26
- * Platform-Level Interrupt Controller (PLIC)
28
s->needed_bytes += 8;
27
- * L2 Loosely Integrated Memory (L2-LIM)
29
break;
28
- * DDR memory controller
29
- * 5 MMUARTs
30
- * 1 DMA controller
31
- * 2 GEM Ethernet controllers
32
- * 1 SDHC storage controller
33
+* 1 E51 core
34
+* 4 U54 cores
35
+* Core Level Interruptor (CLINT)
36
+* Platform-Level Interrupt Controller (PLIC)
37
+* L2 Loosely Integrated Memory (L2-LIM)
38
+* DDR memory controller
39
+* 5 MMUARTs
40
+* 1 DMA controller
41
+* 2 GEM Ethernet controllers
42
+* 1 SDHC storage controller
43
44
Boot options
45
------------
46
diff --git a/docs/system/riscv/sifive_u.rst b/docs/system/riscv/sifive_u.rst
47
index XXXXXXX..XXXXXXX 100644
48
--- a/docs/system/riscv/sifive_u.rst
49
+++ b/docs/system/riscv/sifive_u.rst
50
@@ -XXX,XX +XXX,XX @@ Supported devices
51
52
The ``sifive_u`` machine supports the following devices:
53
54
- * 1 E51 / E31 core
55
- * Up to 4 U54 / U34 cores
56
- * Core Level Interruptor (CLINT)
57
- * Platform-Level Interrupt Controller (PLIC)
58
- * Power, Reset, Clock, Interrupt (PRCI)
59
- * L2 Loosely Integrated Memory (L2-LIM)
60
- * DDR memory controller
61
- * 2 UARTs
62
- * 1 GEM Ethernet controller
63
- * 1 GPIO controller
64
- * 1 One-Time Programmable (OTP) memory with stored serial number
65
- * 1 DMA controller
66
- * 2 QSPI controllers
67
- * 1 ISSI 25WP256 flash
68
- * 1 SD card in SPI mode
69
+* 1 E51 / E31 core
70
+* Up to 4 U54 / U34 cores
71
+* Core Level Interruptor (CLINT)
72
+* Platform-Level Interrupt Controller (PLIC)
73
+* Power, Reset, Clock, Interrupt (PRCI)
74
+* L2 Loosely Integrated Memory (L2-LIM)
75
+* DDR memory controller
76
+* 2 UARTs
77
+* 1 GEM Ethernet controller
78
+* 1 GPIO controller
79
+* 1 One-Time Programmable (OTP) memory with stored serial number
80
+* 1 DMA controller
81
+* 2 QSPI controllers
82
+* 1 ISSI 25WP256 flash
83
+* 1 SD card in SPI mode
84
85
Please note the real world HiFive Unleashed board has a fixed configuration of
86
1 E51 core and 4 U54 core combination and the RISC-V core boots in 64-bit mode.
30
--
87
--
31
2.30.1
88
2.31.1
32
89
33
90
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: Bin Meng <bin.meng@windriver.com>
2
2
3
This adds the documentation to describe what is supported for the
3
Update the 'sifive_u' machine documentation to mention the '-dtb'
4
'microchip-icicle-kit' machine, and how to boot the machine in QEMU.
4
option that can be used to pass a custom DTB to QEMU.
5
5
6
Signed-off-by: Bin Meng <bin.meng@windriver.com>
6
Signed-off-by: Bin Meng <bin.meng@windriver.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-id: 20210322075248.136255-2-bmeng.cn@gmail.com
8
Message-id: 20210430071302.1489082-6-bmeng.cn@gmail.com
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
---
10
---
11
docs/system/riscv/microchip-icicle-kit.rst | 89 ++++++++++++++++++++++
11
docs/system/riscv/sifive_u.rst | 47 +++++++++++++++++++++++++++++-----
12
docs/system/target-riscv.rst | 1 +
12
1 file changed, 41 insertions(+), 6 deletions(-)
13
2 files changed, 90 insertions(+)
14
create mode 100644 docs/system/riscv/microchip-icicle-kit.rst
15
13
16
diff --git a/docs/system/riscv/microchip-icicle-kit.rst b/docs/system/riscv/microchip-icicle-kit.rst
14
diff --git a/docs/system/riscv/sifive_u.rst b/docs/system/riscv/sifive_u.rst
17
new file mode 100644
15
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX
16
--- a/docs/system/riscv/sifive_u.rst
19
--- /dev/null
17
+++ b/docs/system/riscv/sifive_u.rst
20
+++ b/docs/system/riscv/microchip-icicle-kit.rst
18
@@ -XXX,XX +XXX,XX @@ Hardware configuration information
21
@@ -XXX,XX +XXX,XX @@
19
----------------------------------
22
+Microchip PolarFire SoC Icicle Kit (``microchip-icicle-kit``)
20
23
+=============================================================
21
The ``sifive_u`` machine automatically generates a device tree blob ("dtb")
22
-which it passes to the guest. This provides information about the addresses,
23
-interrupt lines and other configuration of the various devices in the system.
24
-Guest software should discover the devices that are present in the generated
25
-DTB instead of using a DTB for the real hardware, as some of the devices are
26
-not modeled by QEMU and trying to access these devices may cause unexpected
27
-behavior.
28
+which it passes to the guest, if there is no ``-dtb`` option. This provides
29
+information about the addresses, interrupt lines and other configuration of
30
+the various devices in the system. Guest software should discover the devices
31
+that are present in the generated DTB instead of using a DTB for the real
32
+hardware, as some of the devices are not modeled by QEMU and trying to access
33
+these devices may cause unexpected behavior.
24
+
34
+
25
+Microchip PolarFire SoC Icicle Kit integrates a PolarFire SoC, with one
35
+If users want to provide their own DTB, they can use the ``-dtb`` option.
26
+SiFive's E51 plus four U54 cores and many on-chip peripherals and an FPGA.
36
+These DTBs should have the following requirements:
27
+
37
+
28
+For more details about Microchip PolarFire SoC, please see:
38
+* The /cpus node should contain at least one subnode for E51 and the number
29
+https://www.microsemi.com/product-directory/soc-fpgas/5498-polarfire-soc-fpga
39
+ of subnodes should match QEMU's ``-smp`` option
40
+* The /memory reg size should match QEMU’s selected ram_size via ``-m``
41
+* Should contain a node for the CLINT device with a compatible string
42
+ "riscv,clint0" if using with OpenSBI BIOS images
43
44
Boot options
45
------------
46
@@ -XXX,XX +XXX,XX @@ To boot the newly built Linux kernel in QEMU with the ``sifive_u`` machine:
47
-initrd /path/to/rootfs.ext4 \
48
-append "root=/dev/ram"
49
50
+Alternatively, we can use a custom DTB to boot the machine by inserting a CLINT
51
+node in fu540-c000.dtsi in the Linux kernel,
30
+
52
+
31
+The Icicle Kit board information can be found here:
53
+.. code-block:: none
32
+https://www.microsemi.com/existing-parts/parts/152514
33
+
54
+
34
+Supported devices
55
+ clint: clint@2000000 {
35
+-----------------
56
+ compatible = "riscv,clint0";
57
+ interrupts-extended = <&cpu0_intc 3 &cpu0_intc 7
58
+ &cpu1_intc 3 &cpu1_intc 7
59
+ &cpu2_intc 3 &cpu2_intc 7
60
+ &cpu3_intc 3 &cpu3_intc 7
61
+ &cpu4_intc 3 &cpu4_intc 7>;
62
+ reg = <0x00 0x2000000 0x00 0x10000>;
63
+ };
36
+
64
+
37
+The ``microchip-icicle-kit`` machine supports the following devices:
65
+with the following command line options:
38
+
39
+ * 1 E51 core
40
+ * 4 U54 cores
41
+ * Core Level Interruptor (CLINT)
42
+ * Platform-Level Interrupt Controller (PLIC)
43
+ * L2 Loosely Integrated Memory (L2-LIM)
44
+ * DDR memory controller
45
+ * 5 MMUARTs
46
+ * 1 DMA controller
47
+ * 2 GEM Ethernet controllers
48
+ * 1 SDHC storage controller
49
+
50
+Boot options
51
+------------
52
+
53
+The ``microchip-icicle-kit`` machine can start using the standard -bios
54
+functionality for loading its BIOS image, aka Hart Software Services (HSS_).
55
+HSS loads the second stage bootloader U-Boot from an SD card. It does not
56
+support direct kernel loading via the -kernel option. One has to load kernel
57
+from U-Boot.
58
+
59
+The memory is set to 1537 MiB by default which is the minimum required high
60
+memory size by HSS. A sanity check on ram size is performed in the machine
61
+init routine to prompt user to increase the RAM size to > 1537 MiB when less
62
+than 1537 MiB ram is detected.
63
+
64
+Boot the machine
65
+----------------
66
+
67
+HSS 2020.12 release is tested at the time of writing. To build an HSS image
68
+that can be booted by the ``microchip-icicle-kit`` machine, type the following
69
+in the HSS source tree:
70
+
66
+
71
+.. code-block:: bash
67
+.. code-block:: bash
72
+
68
+
73
+ $ export CROSS_COMPILE=riscv64-linux-
69
+ $ qemu-system-riscv64 -M sifive_u -smp 5 -m 8G \
74
+ $ cp boards/mpfs-icicle-kit-es/def_config .config
70
+ -display none -serial stdio \
75
+ $ make BOARD=mpfs-icicle-kit-es
71
+ -kernel arch/riscv/boot/Image \
72
+ -dtb arch/riscv/boot/dts/sifive/hifive-unleashed-a00.dtb \
73
+ -initrd /path/to/rootfs.ext4 \
74
+ -append "root=/dev/ram"
76
+
75
+
77
+Download the official SD card image released by Microchip and prepare it for
76
To build a Linux mainline kernel that can be booted by the ``sifive_u`` machine
78
+QEMU usage:
77
in 32-bit mode, use the rv32_defconfig configuration. A patch is required to
79
+
78
fix the 32-bit boot issue for Linux kernel v5.10.
80
+.. code-block:: bash
81
+
82
+ $ wget ftp://ftpsoc.microsemi.com/outgoing/core-image-minimal-dev-icicle-kit-es-sd-20201009141623.rootfs.wic.gz
83
+ $ gunzip core-image-minimal-dev-icicle-kit-es-sd-20201009141623.rootfs.wic.gz
84
+ $ qemu-img resize core-image-minimal-dev-icicle-kit-es-sd-20201009141623.rootfs.wic 4G
85
+
86
+Then we can boot the machine by:
87
+
88
+.. code-block:: bash
89
+
90
+ $ qemu-system-riscv64 -M microchip-icicle-kit -smp 5 \
91
+ -bios path/to/hss.bin -sd path/to/sdcard.img \
92
+ -nic user,model=cadence_gem \
93
+ -nic tap,ifname=tap,model=cadence_gem,script=no \
94
+ -display none -serial stdio \
95
+ -chardev socket,id=serial1,path=serial1.sock,server=on,wait=on \
96
+ -serial chardev:serial1
97
+
98
+With above command line, current terminal session will be used for the first
99
+serial port. Open another terminal window, and use `minicom` to connect the
100
+second serial port.
101
+
102
+.. code-block:: bash
103
+
104
+ $ minicom -D unix\#serial1.sock
105
+
106
+HSS output is on the first serial port (stdio) and U-Boot outputs on the
107
+second serial port. U-Boot will automatically load the Linux kernel from
108
+the SD card image.
109
+
110
+.. _HSS: https://github.com/polarfire-soc/hart-software-services
111
diff --git a/docs/system/target-riscv.rst b/docs/system/target-riscv.rst
112
index XXXXXXX..XXXXXXX 100644
113
--- a/docs/system/target-riscv.rst
114
+++ b/docs/system/target-riscv.rst
115
@@ -XXX,XX +XXX,XX @@ undocumented; you can get a complete list by running
116
.. toctree::
117
:maxdepth: 1
118
119
+ riscv/microchip-icicle-kit
120
riscv/sifive_u
121
122
RISC-V CPU features
123
--
79
--
124
2.30.1
80
2.31.1
125
81
126
82
diff view generated by jsdifflib
1
From: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
1
From: Bin Meng <bin.meng@windriver.com>
2
2
3
According to the specification the "field SPVP of hstatus controls the
3
The OpenSBI BIOS image names are used by many RISC-V machines.
4
privilege level of the access" for the hypervisor virtual-machine load
4
Let's define macros for them.
5
and store instructions HLV, HLVX and HSV.
6
5
7
Signed-off-by: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
6
Signed-off-by: Bin Meng <bin.meng@windriver.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 20210311103005.1400718-1-georg.kotheimer@kernkonzept.com
8
Message-id: 20210430071302.1489082-7-bmeng.cn@gmail.com
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
10
---
12
target/riscv/cpu_helper.c | 25 ++++++++++++++-----------
11
include/hw/riscv/boot.h | 5 +++++
13
1 file changed, 14 insertions(+), 11 deletions(-)
12
hw/riscv/sifive_u.c | 6 ++----
13
hw/riscv/spike.c | 6 ++----
14
hw/riscv/virt.c | 6 ++----
15
4 files changed, 11 insertions(+), 12 deletions(-)
14
16
15
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
17
diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h
16
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/cpu_helper.c
19
--- a/include/hw/riscv/boot.h
18
+++ b/target/riscv/cpu_helper.c
20
+++ b/include/hw/riscv/boot.h
19
@@ -XXX,XX +XXX,XX @@ static int get_physical_address(CPURISCVState *env, hwaddr *physical,
21
@@ -XXX,XX +XXX,XX @@
20
use_background = true;
22
#include "hw/loader.h"
23
#include "hw/riscv/riscv_hart.h"
24
25
+#define RISCV32_BIOS_BIN "opensbi-riscv32-generic-fw_dynamic.bin"
26
+#define RISCV32_BIOS_ELF "opensbi-riscv32-generic-fw_dynamic.elf"
27
+#define RISCV64_BIOS_BIN "opensbi-riscv64-generic-fw_dynamic.bin"
28
+#define RISCV64_BIOS_ELF "opensbi-riscv64-generic-fw_dynamic.elf"
29
+
30
bool riscv_is_32bit(RISCVHartArrayState *harts);
31
32
target_ulong riscv_calc_kernel_start_addr(RISCVHartArrayState *harts,
33
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/hw/riscv/sifive_u.c
36
+++ b/hw/riscv/sifive_u.c
37
@@ -XXX,XX +XXX,XX @@ static void sifive_u_machine_init(MachineState *machine)
38
39
if (riscv_is_32bit(&s->soc.u_cpus)) {
40
firmware_end_addr = riscv_find_and_load_firmware(machine,
41
- "opensbi-riscv32-generic-fw_dynamic.bin",
42
- start_addr, NULL);
43
+ RISCV32_BIOS_BIN, start_addr, NULL);
44
} else {
45
firmware_end_addr = riscv_find_and_load_firmware(machine,
46
- "opensbi-riscv64-generic-fw_dynamic.bin",
47
- start_addr, NULL);
48
+ RISCV64_BIOS_BIN, start_addr, NULL);
21
}
49
}
22
50
23
- if (mode == PRV_M && access_type != MMU_INST_FETCH) {
51
if (machine->kernel_filename) {
24
+ /* MPRV does not affect the virtual-machine load/store
52
diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c
25
+ instructions, HLV, HLVX, and HSV. */
53
index XXXXXXX..XXXXXXX 100644
26
+ if (riscv_cpu_two_stage_lookup(mmu_idx)) {
54
--- a/hw/riscv/spike.c
27
+ mode = get_field(env->hstatus, HSTATUS_SPVP);
55
+++ b/hw/riscv/spike.c
28
+ } else if (mode == PRV_M && access_type != MMU_INST_FETCH) {
56
@@ -XXX,XX +XXX,XX @@ static void spike_board_init(MachineState *machine)
29
if (get_field(env->mstatus, MSTATUS_MPRV)) {
57
*/
30
mode = get_field(env->mstatus, MSTATUS_MPP);
58
if (riscv_is_32bit(&s->soc[0])) {
31
}
59
firmware_end_addr = riscv_find_and_load_firmware(machine,
32
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
60
- "opensbi-riscv32-generic-fw_dynamic.elf",
33
qemu_log_mask(CPU_LOG_MMU, "%s ad %" VADDR_PRIx " rw %d mmu_idx %d\n",
61
- memmap[SPIKE_DRAM].base,
34
__func__, address, access_type, mmu_idx);
62
+ RISCV32_BIOS_ELF, memmap[SPIKE_DRAM].base,
35
63
htif_symbol_callback);
36
- if (mode == PRV_M && access_type != MMU_INST_FETCH) {
64
} else {
37
- if (get_field(env->mstatus, MSTATUS_MPRV)) {
65
firmware_end_addr = riscv_find_and_load_firmware(machine,
38
- mode = get_field(env->mstatus, MSTATUS_MPP);
66
- "opensbi-riscv64-generic-fw_dynamic.elf",
39
+ /* MPRV does not affect the virtual-machine load/store
67
- memmap[SPIKE_DRAM].base,
40
+ instructions, HLV, HLVX, and HSV. */
68
+ RISCV64_BIOS_ELF, memmap[SPIKE_DRAM].base,
41
+ if (riscv_cpu_two_stage_lookup(mmu_idx)) {
69
htif_symbol_callback);
42
+ mode = get_field(env->hstatus, HSTATUS_SPVP);
43
+ } else if (mode == PRV_M && access_type != MMU_INST_FETCH &&
44
+ get_field(env->mstatus, MSTATUS_MPRV)) {
45
+ mode = get_field(env->mstatus, MSTATUS_MPP);
46
+ if (riscv_has_ext(env, RVH) && get_field(env->mstatus, MSTATUS_MPV)) {
47
+ two_stage_lookup = true;
48
}
49
}
70
}
50
71
51
- if (riscv_has_ext(env, RVH) && env->priv == PRV_M &&
72
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
52
- access_type != MMU_INST_FETCH &&
73
index XXXXXXX..XXXXXXX 100644
53
- get_field(env->mstatus, MSTATUS_MPRV) &&
74
--- a/hw/riscv/virt.c
54
- get_field(env->mstatus, MSTATUS_MPV)) {
75
+++ b/hw/riscv/virt.c
55
- two_stage_lookup = true;
76
@@ -XXX,XX +XXX,XX @@ static void virt_machine_init(MachineState *machine)
56
- }
77
57
-
78
if (riscv_is_32bit(&s->soc[0])) {
58
if (riscv_cpu_virt_enabled(env) ||
79
firmware_end_addr = riscv_find_and_load_firmware(machine,
59
((riscv_cpu_two_stage_lookup(mmu_idx) || two_stage_lookup) &&
80
- "opensbi-riscv32-generic-fw_dynamic.bin",
60
access_type != MMU_INST_FETCH)) {
81
- start_addr, NULL);
82
+ RISCV32_BIOS_BIN, start_addr, NULL);
83
} else {
84
firmware_end_addr = riscv_find_and_load_firmware(machine,
85
- "opensbi-riscv64-generic-fw_dynamic.bin",
86
- start_addr, NULL);
87
+ RISCV64_BIOS_BIN, start_addr, NULL);
88
}
89
90
if (machine->kernel_filename) {
61
--
91
--
62
2.30.1
92
2.31.1
63
93
64
94
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: Bin Meng <bin.meng@windriver.com>
2
2
3
Since HSS commit c20a89f8dcac, the Icicle Kit reference design has
3
At present the Microchip Icicle Kit machine only supports using
4
been updated to use a register mapped at 0x4f000000 instead of a
4
'-bios' to load the HSS, and does not support '-kernel' for direct
5
GPIO to control whether eMMC or SD card is to be used. With this
5
kernel booting just like other RISC-V machines do. One has to use
6
support the same HSS image can be used for both eMMC and SD card
6
U-Boot which is chain-loaded by HSS, to load a kernel for testing.
7
boot flow, while previously two different board configurations were
7
This is not so convenient.
8
used. This is undocumented but one can take a look at the HSS code
8
9
HSS_MMCInit() in services/mmc/mmc_api.c.
9
Adding '-kernel' support together with the existing '-bios', we
10
10
follow the following table to select which payload we execute:
11
With this commit, HSS image built from 2020.12 release boots again.
11
12
-bios | -kernel | payload
13
------+------------+--------
14
N | N | HSS
15
Y | don't care | HSS
16
N | Y | kernel
17
18
This ensures backwards compatibility with how we used to expose
19
'-bios' to users. When '-kernel' is used for direct boot, '-dtb'
20
must be present to provide a valid device tree for the board,
21
as we don't generate device tree.
22
23
When direct kernel boot is used, the OpenSBI fw_dynamic BIOS image
24
is used to boot a payload like U-Boot or OS kernel directly.
25
26
Documentation is updated to describe the direct kernel boot. Note
27
as of today there is still no PolarFire SoC support in the upstream
28
Linux kernel hence the document does not include instructions for
29
that. It will be updated in the future.
12
30
13
Signed-off-by: Bin Meng <bin.meng@windriver.com>
31
Signed-off-by: Bin Meng <bin.meng@windriver.com>
14
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
32
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
15
Message-id: 20210322075248.136255-1-bmeng.cn@gmail.com
33
Message-id: 20210430071302.1489082-8-bmeng.cn@gmail.com
16
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
34
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
17
---
35
---
18
include/hw/riscv/microchip_pfsoc.h | 1 +
36
docs/system/riscv/microchip-icicle-kit.rst | 30 ++++++--
19
hw/riscv/microchip_pfsoc.c | 6 ++++++
37
hw/riscv/microchip_pfsoc.c | 81 +++++++++++++++++++++-
20
2 files changed, 7 insertions(+)
38
2 files changed, 103 insertions(+), 8 deletions(-)
21
39
22
diff --git a/include/hw/riscv/microchip_pfsoc.h b/include/hw/riscv/microchip_pfsoc.h
40
diff --git a/docs/system/riscv/microchip-icicle-kit.rst b/docs/system/riscv/microchip-icicle-kit.rst
23
index XXXXXXX..XXXXXXX 100644
41
index XXXXXXX..XXXXXXX 100644
24
--- a/include/hw/riscv/microchip_pfsoc.h
42
--- a/docs/system/riscv/microchip-icicle-kit.rst
25
+++ b/include/hw/riscv/microchip_pfsoc.h
43
+++ b/docs/system/riscv/microchip-icicle-kit.rst
26
@@ -XXX,XX +XXX,XX @@ enum {
44
@@ -XXX,XX +XXX,XX @@ Boot options
27
MICROCHIP_PFSOC_ENVM_DATA,
45
28
MICROCHIP_PFSOC_QSPI_XIP,
46
The ``microchip-icicle-kit`` machine can start using the standard -bios
29
MICROCHIP_PFSOC_IOSCB,
47
functionality for loading its BIOS image, aka Hart Software Services (HSS_).
30
+ MICROCHIP_PFSOC_EMMC_SD_MUX,
48
-HSS loads the second stage bootloader U-Boot from an SD card. It does not
31
MICROCHIP_PFSOC_DRAM_LO,
49
-support direct kernel loading via the -kernel option. One has to load kernel
32
MICROCHIP_PFSOC_DRAM_LO_ALIAS,
50
-from U-Boot.
33
MICROCHIP_PFSOC_DRAM_HI,
51
+HSS loads the second stage bootloader U-Boot from an SD card. Then a kernel
52
+can be loaded from U-Boot. It also supports direct kernel booting via the
53
+-kernel option along with the device tree blob via -dtb. When direct kernel
54
+boot is used, the OpenSBI fw_dynamic BIOS image is used to boot a payload
55
+like U-Boot or OS kernel directly.
56
+
57
+The user provided DTB should have the following requirements:
58
+
59
+* The /cpus node should contain at least one subnode for E51 and the number
60
+ of subnodes should match QEMU's ``-smp`` option
61
+* The /memory reg size should match QEMU’s selected ram_size via ``-m``
62
+* Should contain a node for the CLINT device with a compatible string
63
+ "riscv,clint0"
64
+
65
+QEMU follows below truth table to select which payload to execute:
66
+
67
+===== ========== =======
68
+-bios -kernel payload
69
+===== ========== =======
70
+ N N HSS
71
+ Y don't care HSS
72
+ N Y kernel
73
+===== ========== =======
74
75
The memory is set to 1537 MiB by default which is the minimum required high
76
memory size by HSS. A sanity check on ram size is performed in the machine
77
init routine to prompt user to increase the RAM size to > 1537 MiB when less
78
than 1537 MiB ram is detected.
79
80
-Boot the machine
81
-----------------
82
+Running HSS
83
+-----------
84
85
HSS 2020.12 release is tested at the time of writing. To build an HSS image
86
that can be booted by the ``microchip-icicle-kit`` machine, type the following
34
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
87
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
35
index XXXXXXX..XXXXXXX 100644
88
index XXXXXXX..XXXXXXX 100644
36
--- a/hw/riscv/microchip_pfsoc.c
89
--- a/hw/riscv/microchip_pfsoc.c
37
+++ b/hw/riscv/microchip_pfsoc.c
90
+++ b/hw/riscv/microchip_pfsoc.c
38
@@ -XXX,XX +XXX,XX @@ static const MemMapEntry microchip_pfsoc_memmap[] = {
91
@@ -XXX,XX +XXX,XX @@
39
[MICROCHIP_PFSOC_ENVM_DATA] = { 0x20220000, 0x20000 },
92
#include "hw/riscv/microchip_pfsoc.h"
40
[MICROCHIP_PFSOC_QSPI_XIP] = { 0x21000000, 0x1000000 },
93
#include "hw/intc/sifive_clint.h"
41
[MICROCHIP_PFSOC_IOSCB] = { 0x30000000, 0x10000000 },
94
#include "hw/intc/sifive_plic.h"
42
+ [MICROCHIP_PFSOC_EMMC_SD_MUX] = { 0x4f000000, 0x4 },
95
+#include "sysemu/device_tree.h"
43
[MICROCHIP_PFSOC_DRAM_LO] = { 0x80000000, 0x40000000 },
96
#include "sysemu/sysemu.h"
44
[MICROCHIP_PFSOC_DRAM_LO_ALIAS] = { 0xc0000000, 0x40000000 },
97
45
[MICROCHIP_PFSOC_DRAM_HI] = { 0x1000000000, 0x0 },
98
/*
46
@@ -XXX,XX +XXX,XX @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
99
@@ -XXX,XX +XXX,XX @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
47
sysbus_mmio_map(SYS_BUS_DEVICE(&s->ioscb), 0,
100
MemoryRegion *mem_high = g_new(MemoryRegion, 1);
48
memmap[MICROCHIP_PFSOC_IOSCB].base);
101
MemoryRegion *mem_high_alias = g_new(MemoryRegion, 1);
49
102
uint64_t mem_high_size;
50
+ /* eMMC/SD mux */
103
+ hwaddr firmware_load_addr;
51
+ create_unimplemented_device("microchip.pfsoc.emmc_sd_mux",
104
+ const char *firmware_name;
52
+ memmap[MICROCHIP_PFSOC_EMMC_SD_MUX].base,
105
+ bool kernel_as_payload = false;
53
+ memmap[MICROCHIP_PFSOC_EMMC_SD_MUX].size);
106
+ target_ulong firmware_end_addr, kernel_start_addr;
54
+
107
+ uint64_t kernel_entry;
55
/* QSPI Flash */
108
+ uint32_t fdt_load_addr;
56
memory_region_init_rom(qspi_xip_mem, OBJECT(dev),
109
DriveInfo *dinfo = drive_get_next(IF_SD);
57
"microchip.pfsoc.qspi_xip",
110
111
/* Sanity check on RAM size */
112
@@ -XXX,XX +XXX,XX @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
113
memmap[MICROCHIP_PFSOC_DRAM_HI_ALIAS].base,
114
mem_high_alias);
115
116
- /* Load the firmware */
117
- riscv_find_and_load_firmware(machine, BIOS_FILENAME, RESET_VECTOR, NULL);
118
-
119
/* Attach an SD card */
120
if (dinfo) {
121
CadenceSDHCIState *sdhci = &(s->soc.sdhci);
122
@@ -XXX,XX +XXX,XX @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
123
&error_fatal);
124
qdev_realize_and_unref(card, sdhci->bus, &error_fatal);
125
}
126
+
127
+ /*
128
+ * We follow the following table to select which payload we execute.
129
+ *
130
+ * -bios | -kernel | payload
131
+ * -------+------------+--------
132
+ * N | N | HSS
133
+ * Y | don't care | HSS
134
+ * N | Y | kernel
135
+ *
136
+ * This ensures backwards compatibility with how we used to expose -bios
137
+ * to users but allows them to run through direct kernel booting as well.
138
+ *
139
+ * When -kernel is used for direct boot, -dtb must be present to provide
140
+ * a valid device tree for the board, as we don't generate device tree.
141
+ */
142
+
143
+ if (machine->kernel_filename && machine->dtb) {
144
+ int fdt_size;
145
+ machine->fdt = load_device_tree(machine->dtb, &fdt_size);
146
+ if (!machine->fdt) {
147
+ error_report("load_device_tree() failed");
148
+ exit(1);
149
+ }
150
+
151
+ firmware_name = RISCV64_BIOS_BIN;
152
+ firmware_load_addr = memmap[MICROCHIP_PFSOC_DRAM_LO].base;
153
+ kernel_as_payload = true;
154
+ }
155
+
156
+ if (!kernel_as_payload) {
157
+ firmware_name = BIOS_FILENAME;
158
+ firmware_load_addr = RESET_VECTOR;
159
+ }
160
+
161
+ /* Load the firmware */
162
+ firmware_end_addr = riscv_find_and_load_firmware(machine, firmware_name,
163
+ firmware_load_addr, NULL);
164
+
165
+ if (kernel_as_payload) {
166
+ kernel_start_addr = riscv_calc_kernel_start_addr(&s->soc.u_cpus,
167
+ firmware_end_addr);
168
+
169
+ kernel_entry = riscv_load_kernel(machine->kernel_filename,
170
+ kernel_start_addr, NULL);
171
+
172
+ if (machine->initrd_filename) {
173
+ hwaddr start;
174
+ hwaddr end = riscv_load_initrd(machine->initrd_filename,
175
+ machine->ram_size, kernel_entry,
176
+ &start);
177
+ qemu_fdt_setprop_cell(machine->fdt, "/chosen",
178
+ "linux,initrd-start", start);
179
+ qemu_fdt_setprop_cell(machine->fdt, "/chosen",
180
+ "linux,initrd-end", end);
181
+ }
182
+
183
+ if (machine->kernel_cmdline) {
184
+ qemu_fdt_setprop_string(machine->fdt, "/chosen",
185
+ "bootargs", machine->kernel_cmdline);
186
+ }
187
+
188
+ /* Compute the fdt load address in dram */
189
+ fdt_load_addr = riscv_load_fdt(memmap[MICROCHIP_PFSOC_DRAM_LO].base,
190
+ machine->ram_size, machine->fdt);
191
+ /* Load the reset vector */
192
+ riscv_setup_rom_reset_vec(machine, &s->soc.u_cpus, firmware_load_addr,
193
+ memmap[MICROCHIP_PFSOC_ENVM_DATA].base,
194
+ memmap[MICROCHIP_PFSOC_ENVM_DATA].size,
195
+ kernel_entry, fdt_load_addr, machine->fdt);
196
+ }
197
}
198
199
static void microchip_icicle_kit_machine_class_init(ObjectClass *oc, void *data)
58
--
200
--
59
2.30.1
201
2.31.1
60
202
61
203
diff view generated by jsdifflib
New patch
1
From: Jose Martins <josemartins90@gmail.com>
1
2
3
The wfi exception trigger behavior should take into account user mode,
4
hstatus.vtw, and the fact the an wfi might raise different types of
5
exceptions depending on various factors:
6
7
If supervisor mode is not present:
8
9
- an illegal instruction exception should be generated if user mode
10
executes and wfi instruction and mstatus.tw = 1.
11
12
If supervisor mode is present:
13
14
- when a wfi instruction is executed, an illegal exception should be triggered
15
if either the current mode is user or the mode is supervisor and mstatus.tw is
16
set.
17
18
Plus, if the hypervisor extensions are enabled:
19
20
- a virtual instruction exception should be raised when a wfi is executed from
21
virtual-user or virtual-supervisor and hstatus.vtw is set.
22
23
Signed-off-by: Jose Martins <josemartins90@gmail.com>
24
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
25
Message-id: 20210420213656.85148-1-josemartins90@gmail.com
26
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
27
---
28
target/riscv/cpu_bits.h | 1 +
29
target/riscv/op_helper.c | 11 ++++++++---
30
2 files changed, 9 insertions(+), 3 deletions(-)
31
32
diff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h
33
index XXXXXXX..XXXXXXX 100644
34
--- a/target/riscv/cpu_bits.h
35
+++ b/target/riscv/cpu_bits.h
36
@@ -XXX,XX +XXX,XX @@
37
#define HSTATUS_HU 0x00000200
38
#define HSTATUS_VGEIN 0x0003F000
39
#define HSTATUS_VTVM 0x00100000
40
+#define HSTATUS_VTW 0x00200000
41
#define HSTATUS_VTSR 0x00400000
42
#define HSTATUS_VSXL 0x300000000
43
44
diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/target/riscv/op_helper.c
47
+++ b/target/riscv/op_helper.c
48
@@ -XXX,XX +XXX,XX @@ target_ulong helper_mret(CPURISCVState *env, target_ulong cpu_pc_deb)
49
void helper_wfi(CPURISCVState *env)
50
{
51
CPUState *cs = env_cpu(env);
52
+ bool rvs = riscv_has_ext(env, RVS);
53
+ bool prv_u = env->priv == PRV_U;
54
+ bool prv_s = env->priv == PRV_S;
55
56
- if ((env->priv == PRV_S &&
57
- get_field(env->mstatus, MSTATUS_TW)) ||
58
- riscv_cpu_virt_enabled(env)) {
59
+ if (((prv_s || (!rvs && prv_u)) && get_field(env->mstatus, MSTATUS_TW)) ||
60
+ (rvs && prv_u && !riscv_cpu_virt_enabled(env))) {
61
+ riscv_raise_exception(env, RISCV_EXCP_ILLEGAL_INST, GETPC());
62
+ } else if (riscv_cpu_virt_enabled(env) && (prv_u ||
63
+ (prv_s && get_field(env->hstatus, HSTATUS_VTW)))) {
64
riscv_raise_exception(env, RISCV_EXCP_VIRT_INSTRUCTION_FAULT, GETPC());
65
} else {
66
cs->halted = 1;
67
--
68
2.31.1
69
70
diff view generated by jsdifflib
New patch
1
QEMU 5.1 changed the behaviour of the default boot for the RISC-V virt
2
and sifive_u machines. This patch moves that change from the
3
deprecated.rst file to the removed-features.rst file and the
4
target-riscv.rst.
1
5
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
8
Message-id: 4f1c261e7f69045ab8bb8926d85fe1d35e48ea5b.1620081256.git.alistair.francis@wdc.com
9
---
10
docs/system/deprecated.rst | 19 -------------------
11
docs/system/removed-features.rst | 5 +++++
12
docs/system/target-riscv.rst | 13 ++++++++++++-
13
3 files changed, 17 insertions(+), 20 deletions(-)
14
15
diff --git a/docs/system/deprecated.rst b/docs/system/deprecated.rst
16
index XXXXXXX..XXXXXXX 100644
17
--- a/docs/system/deprecated.rst
18
+++ b/docs/system/deprecated.rst
19
@@ -XXX,XX +XXX,XX @@ pcspk-audiodev=<name>``.
20
``tty`` and ``parport`` are aliases that will be removed. Instead, the
21
actual backend names ``serial`` and ``parallel`` should be used.
22
23
-RISC-V ``-bios`` (since 5.1)
24
-''''''''''''''''''''''''''''
25
-
26
-QEMU 4.1 introduced support for the -bios option in QEMU for RISC-V for the
27
-RISC-V virt machine and sifive_u machine. QEMU 4.1 had no changes to the
28
-default behaviour to avoid breakages.
29
-
30
-QEMU 5.1 changes the default behaviour from ``-bios none`` to ``-bios default``.
31
-
32
-QEMU 5.1 has three options:
33
- 1. ``-bios default`` - This is the current default behavior if no -bios option
34
- is included. This option will load the default OpenSBI firmware automatically.
35
- The firmware is included with the QEMU release and no user interaction is
36
- required. All a user needs to do is specify the kernel they want to boot
37
- with the -kernel option
38
- 2. ``-bios none`` - QEMU will not automatically load any firmware. It is up
39
- to the user to load all the images they need.
40
- 3. ``-bios <file>`` - Tells QEMU to load the specified file as the firmwrae.
41
-
42
Short-form boolean options (since 6.0)
43
''''''''''''''''''''''''''''''''''''''
44
45
diff --git a/docs/system/removed-features.rst b/docs/system/removed-features.rst
46
index XXXXXXX..XXXXXXX 100644
47
--- a/docs/system/removed-features.rst
48
+++ b/docs/system/removed-features.rst
49
@@ -XXX,XX +XXX,XX @@ devices. Drives the board doesn't pick up can no longer be used with
50
This option was undocumented and not used in the field.
51
Use `-device usb-ccid`` instead.
52
53
+RISC-V firmware not booted by default (removed in 5.1)
54
+''''''''''''''''''''''''''''''''''''''''''''''''''''''
55
+
56
+QEMU 5.1 changes the default behaviour from ``-bios none`` to ``-bios default``
57
+for the RISC-V ``virt`` machine and ``sifive_u`` machine.
58
59
QEMU Machine Protocol (QMP) commands
60
------------------------------------
61
diff --git a/docs/system/target-riscv.rst b/docs/system/target-riscv.rst
62
index XXXXXXX..XXXXXXX 100644
63
--- a/docs/system/target-riscv.rst
64
+++ b/docs/system/target-riscv.rst
65
@@ -XXX,XX +XXX,XX @@ undocumented; you can get a complete list by running
66
riscv/shakti-c
67
riscv/sifive_u
68
69
-RISC-V CPU features
70
+RISC-V CPU firmware
71
-------------------
72
+
73
+When using the ``sifive_u`` or ``virt`` machine there are three different
74
+firmware boot options:
75
+1. ``-bios default`` - This is the default behaviour if no -bios option
76
+is included. This option will load the default OpenSBI firmware automatically.
77
+The firmware is included with the QEMU release and no user interaction is
78
+required. All a user needs to do is specify the kernel they want to boot
79
+with the -kernel option
80
+2. ``-bios none`` - QEMU will not automatically load any firmware. It is up
81
+to the user to load all the images they need.
82
+3. ``-bios <file>`` - Tells QEMU to load the specified file as the firmware.
83
--
84
2.31.1
85
86
diff view generated by jsdifflib
1
From: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
The current condition for the use of background registers only
3
Physical Memory Protection is a system feature.
4
considers the hypervisor load and store instructions,
4
Avoid polluting the user-mode emulation by its definitions.
5
but not accesses from M mode via MSTATUS_MPRV+MPV.
6
5
7
Signed-off-by: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 20210311103036.1401073-1-georg.kotheimer@kernkonzept.com
8
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
9
Message-id: 20210516205333.696094-1-f4bug@amsat.org
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
11
---
12
target/riscv/cpu_helper.c | 2 +-
12
target/riscv/cpu.h | 2 ++
13
1 file changed, 1 insertion(+), 1 deletion(-)
13
1 file changed, 2 insertions(+)
14
14
15
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
15
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
16
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/cpu_helper.c
17
--- a/target/riscv/cpu.h
18
+++ b/target/riscv/cpu_helper.c
18
+++ b/target/riscv/cpu.h
19
@@ -XXX,XX +XXX,XX @@ static int get_physical_address(CPURISCVState *env, hwaddr *physical,
19
@@ -XXX,XX +XXX,XX @@ enum {
20
* was called. Background registers will be used if the guest has
20
21
* forced a two stage translation to be on (in HS or M mode).
21
typedef struct CPURISCVState CPURISCVState;
22
*/
22
23
- if (!riscv_cpu_virt_enabled(env) && riscv_cpu_two_stage_lookup(mmu_idx)) {
23
+#if !defined(CONFIG_USER_ONLY)
24
+ if (!riscv_cpu_virt_enabled(env) && two_stage) {
24
#include "pmp.h"
25
use_background = true;
25
+#endif
26
}
26
27
#define RV_VLEN_MAX 256
27
28
28
--
29
--
29
2.30.1
30
2.31.1
30
31
31
32
diff view generated by jsdifflib
New patch
1
From: Bin Meng <bmeng.cn@gmail.com>
1
2
3
riscv_excp_names[] and riscv_intr_names[] are only referenced by
4
target/riscv/cpu.c locally.
5
6
Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 20210514052435.2203156-1-bmeng.cn@gmail.com
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
target/riscv/cpu.h | 2 --
13
target/riscv/cpu.c | 4 ++--
14
2 files changed, 2 insertions(+), 4 deletions(-)
15
16
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/riscv/cpu.h
19
+++ b/target/riscv/cpu.h
20
@@ -XXX,XX +XXX,XX @@ static inline bool riscv_feature(CPURISCVState *env, int feature)
21
22
extern const char * const riscv_int_regnames[];
23
extern const char * const riscv_fpr_regnames[];
24
-extern const char * const riscv_excp_names[];
25
-extern const char * const riscv_intr_names[];
26
27
const char *riscv_cpu_get_trap_name(target_ulong cause, bool async);
28
void riscv_cpu_do_interrupt(CPUState *cpu);
29
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/target/riscv/cpu.c
32
+++ b/target/riscv/cpu.c
33
@@ -XXX,XX +XXX,XX @@ const char * const riscv_fpr_regnames[] = {
34
"f30/ft10", "f31/ft11"
35
};
36
37
-const char * const riscv_excp_names[] = {
38
+static const char * const riscv_excp_names[] = {
39
"misaligned_fetch",
40
"fault_fetch",
41
"illegal_instruction",
42
@@ -XXX,XX +XXX,XX @@ const char * const riscv_excp_names[] = {
43
"guest_store_page_fault",
44
};
45
46
-const char * const riscv_intr_names[] = {
47
+static const char * const riscv_intr_names[] = {
48
"u_software",
49
"s_software",
50
"vs_software",
51
--
52
2.31.1
53
54
diff view generated by jsdifflib
New patch
1
From: Changbin Du <changbin.du@gmail.com>
1
2
3
This dumps the CSR mscratch/sscratch/satp and meanwhile aligns
4
the output of CSR mtval/stval.
5
6
Signed-off-by: Changbin Du <changbin.du@gmail.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
9
Message-id: 20210519155738.20486-1-changbin.du@gmail.com
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
target/riscv/cpu.c | 7 +++++--
13
1 file changed, 5 insertions(+), 2 deletions(-)
14
15
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/cpu.c
18
+++ b/target/riscv/cpu.c
19
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_dump_state(CPUState *cs, FILE *f, int flags)
20
if (riscv_has_ext(env, RVH)) {
21
qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "vscause ", env->vscause);
22
}
23
- qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "mtval ", env->mtval);
24
- qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "stval ", env->stval);
25
+ qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "mtval ", env->mtval);
26
+ qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "stval ", env->stval);
27
if (riscv_has_ext(env, RVH)) {
28
qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "htval ", env->htval);
29
qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "mtval2 ", env->mtval2);
30
}
31
+ qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "mscratch", env->mscratch);
32
+ qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "sscratch", env->sscratch);
33
+ qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "satp ", env->satp);
34
#endif
35
36
for (i = 0; i < 32; i++) {
37
--
38
2.31.1
39
40
diff view generated by jsdifflib
1
From: Jim Shu <cwshu@andestech.com>
1
Although we construct epmp_operation in such a way that it can only be
2
between 0 and 15 Coverity complains that we don't handle the other
3
possible cases. To fix Coverity and make it easier for humans to read
4
add a default case to the switch statement that calls
5
g_assert_not_reached().
2
6
3
If PMP permission of any address has been changed by updating PMP entry,
7
Fixes: CID 1453108
4
flush all TLB pages to prevent from getting old permission.
5
6
Signed-off-by: Jim Shu <cwshu@andestech.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-id: 1613916082-19528-4-git-send-email-cwshu@andestech.com
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
10
Reviewed-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
11
Message-id: ec5f225928eec448278c82fcb1f6805ee61dde82.1621550996.git.alistair.francis@wdc.com
10
---
12
---
11
target/riscv/pmp.c | 4 ++++
13
target/riscv/pmp.c | 4 ++++
12
1 file changed, 4 insertions(+)
14
1 file changed, 4 insertions(+)
13
15
14
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
16
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
15
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
16
--- a/target/riscv/pmp.c
18
--- a/target/riscv/pmp.c
17
+++ b/target/riscv/pmp.c
19
+++ b/target/riscv/pmp.c
18
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@ bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
19
#include "qapi/error.h"
21
case 15:
20
#include "cpu.h"
22
*allowed_privs = PMP_READ;
21
#include "trace.h"
23
break;
22
+#include "exec/exec-all.h"
24
+ default:
23
25
+ g_assert_not_reached();
24
static void pmp_write_cfg(CPURISCVState *env, uint32_t addr_index,
26
}
25
uint8_t val);
27
} else {
26
@@ -XXX,XX +XXX,XX @@ void pmpcfg_csr_write(CPURISCVState *env, uint32_t reg_index,
28
switch (epmp_operation) {
27
cfg_val = (val >> 8 * i) & 0xff;
29
@@ -XXX,XX +XXX,XX @@ bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
28
pmp_write_cfg(env, (reg_index * 4) + i, cfg_val);
30
case 7:
29
}
31
*allowed_privs = PMP_READ | PMP_WRITE | PMP_EXEC;
30
+
32
break;
31
+ /* If PMP permission of any addr has been changed, flush TLB pages. */
33
+ default:
32
+ tlb_flush(env_cpu(env));
34
+ g_assert_not_reached();
33
}
35
}
34
36
}
35
37
}
36
--
38
--
37
2.30.1
39
2.31.1
38
40
39
41
diff view generated by jsdifflib
New patch
1
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
3
Since commit e2e7168a214b0ed98dc357bba96816486a289762, if oprsz
4
is still zero(as we don't use this field), simd_desc will trigger an
5
assert.
6
7
Besides, tcg_gen_gvec_*_ptr calls simd_desc in it's implementation.
8
Here we pass the value to maxsz and oprsz to bypass the assert.
9
10
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Message-id: 20210521054816.1784297-1-zhiwei_liu@c-sky.com
13
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
14
---
15
target/riscv/insn_trans/trans_rvv.c.inc | 89 ++++++++++++++-----------
16
1 file changed, 50 insertions(+), 39 deletions(-)
17
18
diff --git a/target/riscv/insn_trans/trans_rvv.c.inc b/target/riscv/insn_trans/trans_rvv.c.inc
19
index XXXXXXX..XXXXXXX 100644
20
--- a/target/riscv/insn_trans/trans_rvv.c.inc
21
+++ b/target/riscv/insn_trans/trans_rvv.c.inc
22
@@ -XXX,XX +XXX,XX @@ static bool ldst_us_trans(uint32_t vd, uint32_t rs1, uint32_t data,
23
* The first part is vlen in bytes, encoded in maxsz of simd_desc.
24
* The second part is lmul, encoded in data of simd_desc.
25
*/
26
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
27
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
28
29
gen_get_gpr(base, rs1);
30
tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, vd));
31
@@ -XXX,XX +XXX,XX @@ static bool ldst_stride_trans(uint32_t vd, uint32_t rs1, uint32_t rs2,
32
mask = tcg_temp_new_ptr();
33
base = tcg_temp_new();
34
stride = tcg_temp_new();
35
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
36
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
37
38
gen_get_gpr(base, rs1);
39
gen_get_gpr(stride, rs2);
40
@@ -XXX,XX +XXX,XX @@ static bool ldst_index_trans(uint32_t vd, uint32_t rs1, uint32_t vs2,
41
mask = tcg_temp_new_ptr();
42
index = tcg_temp_new_ptr();
43
base = tcg_temp_new();
44
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
45
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
46
47
gen_get_gpr(base, rs1);
48
tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, vd));
49
@@ -XXX,XX +XXX,XX @@ static bool ldff_trans(uint32_t vd, uint32_t rs1, uint32_t data,
50
dest = tcg_temp_new_ptr();
51
mask = tcg_temp_new_ptr();
52
base = tcg_temp_new();
53
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
54
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
55
56
gen_get_gpr(base, rs1);
57
tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, vd));
58
@@ -XXX,XX +XXX,XX @@ static bool amo_trans(uint32_t vd, uint32_t rs1, uint32_t vs2,
59
mask = tcg_temp_new_ptr();
60
index = tcg_temp_new_ptr();
61
base = tcg_temp_new();
62
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
63
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
64
65
gen_get_gpr(base, rs1);
66
tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, vd));
67
@@ -XXX,XX +XXX,XX @@ do_opivv_gvec(DisasContext *s, arg_rmrr *a, GVecGen3Fn *gvec_fn,
68
data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
69
tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0),
70
vreg_ofs(s, a->rs1), vreg_ofs(s, a->rs2),
71
- cpu_env, 0, s->vlen / 8, data, fn);
72
+ cpu_env, s->vlen / 8, s->vlen / 8, data, fn);
73
}
74
gen_set_label(over);
75
return true;
76
@@ -XXX,XX +XXX,XX @@ static bool opivx_trans(uint32_t vd, uint32_t rs1, uint32_t vs2, uint32_t vm,
77
data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
78
data = FIELD_DP32(data, VDATA, VM, vm);
79
data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
80
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
81
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
82
83
tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, vd));
84
tcg_gen_addi_ptr(src2, cpu_env, vreg_ofs(s, vs2));
85
@@ -XXX,XX +XXX,XX @@ static bool opivi_trans(uint32_t vd, uint32_t imm, uint32_t vs2, uint32_t vm,
86
data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
87
data = FIELD_DP32(data, VDATA, VM, vm);
88
data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
89
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
90
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
91
92
tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, vd));
93
tcg_gen_addi_ptr(src2, cpu_env, vreg_ofs(s, vs2));
94
@@ -XXX,XX +XXX,XX @@ static bool do_opivv_widen(DisasContext *s, arg_rmrr *a,
95
tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0),
96
vreg_ofs(s, a->rs1),
97
vreg_ofs(s, a->rs2),
98
- cpu_env, 0, s->vlen / 8,
99
+ cpu_env, s->vlen / 8, s->vlen / 8,
100
data, fn);
101
gen_set_label(over);
102
return true;
103
@@ -XXX,XX +XXX,XX @@ static bool do_opiwv_widen(DisasContext *s, arg_rmrr *a,
104
tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0),
105
vreg_ofs(s, a->rs1),
106
vreg_ofs(s, a->rs2),
107
- cpu_env, 0, s->vlen / 8, data, fn);
108
+ cpu_env, s->vlen / 8, s->vlen / 8, data, fn);
109
gen_set_label(over);
110
return true;
111
}
112
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
113
data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
114
tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
115
vreg_ofs(s, a->rs1), \
116
- vreg_ofs(s, a->rs2), cpu_env, 0, \
117
- s->vlen / 8, data, fns[s->sew]); \
118
+ vreg_ofs(s, a->rs2), cpu_env, \
119
+ s->vlen / 8, s->vlen / 8, data, \
120
+ fns[s->sew]); \
121
gen_set_label(over); \
122
return true; \
123
} \
124
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
125
data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
126
tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
127
vreg_ofs(s, a->rs1), \
128
- vreg_ofs(s, a->rs2), cpu_env, 0, \
129
- s->vlen / 8, data, fns[s->sew]); \
130
+ vreg_ofs(s, a->rs2), cpu_env, \
131
+ s->vlen / 8, s->vlen / 8, data, \
132
+ fns[s->sew]); \
133
gen_set_label(over); \
134
return true; \
135
} \
136
@@ -XXX,XX +XXX,XX @@ static bool trans_vmv_v_x(DisasContext *s, arg_vmv_v_x *a)
137
};
138
139
tcg_gen_ext_tl_i64(s1_i64, s1);
140
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
141
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
142
tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, a->rd));
143
fns[s->sew](dest, s1_i64, cpu_env, desc);
144
145
@@ -XXX,XX +XXX,XX @@ static bool trans_vmv_v_i(DisasContext *s, arg_vmv_v_i *a)
146
147
s1 = tcg_const_i64(simm);
148
dest = tcg_temp_new_ptr();
149
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
150
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
151
tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, a->rd));
152
fns[s->sew](dest, s1, cpu_env, desc);
153
154
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
155
data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
156
tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
157
vreg_ofs(s, a->rs1), \
158
- vreg_ofs(s, a->rs2), cpu_env, 0, \
159
- s->vlen / 8, data, fns[s->sew - 1]); \
160
+ vreg_ofs(s, a->rs2), cpu_env, \
161
+ s->vlen / 8, s->vlen / 8, data, \
162
+ fns[s->sew - 1]); \
163
gen_set_label(over); \
164
return true; \
165
} \
166
@@ -XXX,XX +XXX,XX @@ static bool opfvf_trans(uint32_t vd, uint32_t rs1, uint32_t vs2,
167
dest = tcg_temp_new_ptr();
168
mask = tcg_temp_new_ptr();
169
src2 = tcg_temp_new_ptr();
170
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
171
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
172
173
tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, vd));
174
tcg_gen_addi_ptr(src2, cpu_env, vreg_ofs(s, vs2));
175
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
176
data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
177
tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
178
vreg_ofs(s, a->rs1), \
179
- vreg_ofs(s, a->rs2), cpu_env, 0, \
180
- s->vlen / 8, data, fns[s->sew - 1]); \
181
+ vreg_ofs(s, a->rs2), cpu_env, \
182
+ s->vlen / 8, s->vlen / 8, data, \
183
+ fns[s->sew - 1]); \
184
gen_set_label(over); \
185
return true; \
186
} \
187
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
188
data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
189
tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
190
vreg_ofs(s, a->rs1), \
191
- vreg_ofs(s, a->rs2), cpu_env, 0, \
192
- s->vlen / 8, data, fns[s->sew - 1]); \
193
+ vreg_ofs(s, a->rs2), cpu_env, \
194
+ s->vlen / 8, s->vlen / 8, data, \
195
+ fns[s->sew - 1]); \
196
gen_set_label(over); \
197
return true; \
198
} \
199
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmr *a) \
200
data = FIELD_DP32(data, VDATA, VM, a->vm); \
201
data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
202
tcg_gen_gvec_3_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
203
- vreg_ofs(s, a->rs2), cpu_env, 0, \
204
- s->vlen / 8, data, fns[s->sew - 1]); \
205
+ vreg_ofs(s, a->rs2), cpu_env, \
206
+ s->vlen / 8, s->vlen / 8, data, \
207
+ fns[s->sew - 1]); \
208
gen_set_label(over); \
209
return true; \
210
} \
211
@@ -XXX,XX +XXX,XX @@ static bool trans_vfmv_v_f(DisasContext *s, arg_vfmv_v_f *a)
212
tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
213
214
dest = tcg_temp_new_ptr();
215
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
216
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
217
tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, a->rd));
218
fns[s->sew - 1](dest, cpu_fpr[a->rs1], cpu_env, desc);
219
220
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmr *a) \
221
data = FIELD_DP32(data, VDATA, VM, a->vm); \
222
data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
223
tcg_gen_gvec_3_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
224
- vreg_ofs(s, a->rs2), cpu_env, 0, \
225
- s->vlen / 8, data, fns[s->sew - 1]); \
226
+ vreg_ofs(s, a->rs2), cpu_env, \
227
+ s->vlen / 8, s->vlen / 8, data, \
228
+ fns[s->sew - 1]); \
229
gen_set_label(over); \
230
return true; \
231
} \
232
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmr *a) \
233
data = FIELD_DP32(data, VDATA, VM, a->vm); \
234
data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
235
tcg_gen_gvec_3_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
236
- vreg_ofs(s, a->rs2), cpu_env, 0, \
237
- s->vlen / 8, data, fns[s->sew - 1]); \
238
+ vreg_ofs(s, a->rs2), cpu_env, \
239
+ s->vlen / 8, s->vlen / 8, data, \
240
+ fns[s->sew - 1]); \
241
gen_set_label(over); \
242
return true; \
243
} \
244
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_r *a) \
245
data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
246
tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
247
vreg_ofs(s, a->rs1), \
248
- vreg_ofs(s, a->rs2), cpu_env, 0, \
249
- s->vlen / 8, data, fn); \
250
+ vreg_ofs(s, a->rs2), cpu_env, \
251
+ s->vlen / 8, s->vlen / 8, data, fn); \
252
gen_set_label(over); \
253
return true; \
254
} \
255
@@ -XXX,XX +XXX,XX @@ static bool trans_vmpopc_m(DisasContext *s, arg_rmr *a)
256
mask = tcg_temp_new_ptr();
257
src2 = tcg_temp_new_ptr();
258
dst = tcg_temp_new();
259
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
260
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
261
262
tcg_gen_addi_ptr(src2, cpu_env, vreg_ofs(s, a->rs2));
263
tcg_gen_addi_ptr(mask, cpu_env, vreg_ofs(s, 0));
264
@@ -XXX,XX +XXX,XX @@ static bool trans_vmfirst_m(DisasContext *s, arg_rmr *a)
265
mask = tcg_temp_new_ptr();
266
src2 = tcg_temp_new_ptr();
267
dst = tcg_temp_new();
268
- desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
269
+ desc = tcg_const_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
270
271
tcg_gen_addi_ptr(src2, cpu_env, vreg_ofs(s, a->rs2));
272
tcg_gen_addi_ptr(mask, cpu_env, vreg_ofs(s, 0));
273
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmr *a) \
274
data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
275
tcg_gen_gvec_3_ptr(vreg_ofs(s, a->rd), \
276
vreg_ofs(s, 0), vreg_ofs(s, a->rs2), \
277
- cpu_env, 0, s->vlen / 8, data, fn); \
278
+ cpu_env, s->vlen / 8, s->vlen / 8, \
279
+ data, fn); \
280
gen_set_label(over); \
281
return true; \
282
} \
283
@@ -XXX,XX +XXX,XX @@ static bool trans_viota_m(DisasContext *s, arg_viota_m *a)
284
gen_helper_viota_m_w, gen_helper_viota_m_d,
285
};
286
tcg_gen_gvec_3_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0),
287
- vreg_ofs(s, a->rs2), cpu_env, 0,
288
- s->vlen / 8, data, fns[s->sew]);
289
+ vreg_ofs(s, a->rs2), cpu_env,
290
+ s->vlen / 8, s->vlen / 8, data, fns[s->sew]);
291
gen_set_label(over);
292
return true;
293
}
294
@@ -XXX,XX +XXX,XX @@ static bool trans_vid_v(DisasContext *s, arg_vid_v *a)
295
gen_helper_vid_v_w, gen_helper_vid_v_d,
296
};
297
tcg_gen_gvec_2_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0),
298
- cpu_env, 0, s->vlen / 8, data, fns[s->sew]);
299
+ cpu_env, s->vlen / 8, s->vlen / 8,
300
+ data, fns[s->sew]);
301
gen_set_label(over);
302
return true;
303
}
304
@@ -XXX,XX +XXX,XX @@ static bool trans_vcompress_vm(DisasContext *s, arg_r *a)
305
data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
306
tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0),
307
vreg_ofs(s, a->rs1), vreg_ofs(s, a->rs2),
308
- cpu_env, 0, s->vlen / 8, data, fns[s->sew]);
309
+ cpu_env, s->vlen / 8, s->vlen / 8, data,
310
+ fns[s->sew]);
311
gen_set_label(over);
312
return true;
313
}
314
--
315
2.31.1
316
317
diff view generated by jsdifflib
New patch
1
From: Kito Cheng <kito.cheng@sifive.com>
1
2
3
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
4
Signed-off-by: Frank Chang <frank.chang@sifive.com>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Message-id: 20210505160620.15723-2-frank.chang@sifive.com
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
---
10
target/riscv/insn32.decode | 10 +++++-----
11
1 file changed, 5 insertions(+), 5 deletions(-)
12
13
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/riscv/insn32.decode
16
+++ b/target/riscv/insn32.decode
17
@@ -XXX,XX +XXX,XX @@
18
%rd 7:5
19
%sh5 20:5
20
21
-%sh10 20:10
22
+%sh7 20:7
23
%csr 20:12
24
%rm 12:3
25
%nf 29:3 !function=ex_plus_1
26
@@ -XXX,XX +XXX,XX @@
27
@u .................... ..... ....... &u imm=%imm_u %rd
28
@j .................... ..... ....... &j imm=%imm_j %rd
29
30
-@sh ...... ...... ..... ... ..... ....... &shift shamt=%sh10 %rs1 %rd
31
+@sh ...... ...... ..... ... ..... ....... &shift shamt=%sh7 %rs1 %rd
32
@csr ............ ..... ... ..... ....... %csr %rs1 %rd
33
34
@atom_ld ..... aq:1 rl:1 ..... ........ ..... ....... &atomic rs2=0 %rs1 %rd
35
@@ -XXX,XX +XXX,XX @@ sltiu ............ ..... 011 ..... 0010011 @i
36
xori ............ ..... 100 ..... 0010011 @i
37
ori ............ ..... 110 ..... 0010011 @i
38
andi ............ ..... 111 ..... 0010011 @i
39
-slli 00.... ...... ..... 001 ..... 0010011 @sh
40
-srli 00.... ...... ..... 101 ..... 0010011 @sh
41
-srai 01.... ...... ..... 101 ..... 0010011 @sh
42
+slli 00000. ...... ..... 001 ..... 0010011 @sh
43
+srli 00000. ...... ..... 101 ..... 0010011 @sh
44
+srai 01000. ...... ..... 101 ..... 0010011 @sh
45
add 0000000 ..... ..... 000 ..... 0110011 @r
46
sub 0100000 ..... ..... 000 ..... 0110011 @r
47
sll 0000000 ..... ..... 001 ..... 0110011 @r
48
--
49
2.31.1
50
51
diff view generated by jsdifflib
New patch
1
From: Kito Cheng <kito.cheng@sifive.com>
1
2
3
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
4
Signed-off-by: Frank Chang <frank.chang@sifive.com>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Message-id: 20210505160620.15723-3-frank.chang@sifive.com
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
---
10
target/riscv/cpu.h | 1 +
11
target/riscv/insn32.decode | 11 ++++++-
12
target/riscv/translate.c | 38 +++++++++++++++++++++
13
target/riscv/insn_trans/trans_rvb.c.inc | 44 +++++++++++++++++++++++++
14
4 files changed, 93 insertions(+), 1 deletion(-)
15
create mode 100644 target/riscv/insn_trans/trans_rvb.c.inc
16
17
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
18
index XXXXXXX..XXXXXXX 100644
19
--- a/target/riscv/cpu.h
20
+++ b/target/riscv/cpu.h
21
@@ -XXX,XX +XXX,XX @@
22
#define RVS RV('S')
23
#define RVU RV('U')
24
#define RVH RV('H')
25
+#define RVB RV('B')
26
27
/* S extension denotes that Supervisor mode exists, however it is possible
28
to have a core that support S mode but does not have an MMU and there
29
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
30
index XXXXXXX..XXXXXXX 100644
31
--- a/target/riscv/insn32.decode
32
+++ b/target/riscv/insn32.decode
33
@@ -XXX,XX +XXX,XX @@
34
&i imm rs1 rd
35
&j imm rd
36
&r rd rs1 rs2
37
+&r2 rd rs1
38
&s imm rs1 rs2
39
&u imm rd
40
&shift shamt rs1 rd
41
@@ -XXX,XX +XXX,XX @@
42
@r4_rm ..... .. ..... ..... ... ..... ....... %rs3 %rs2 %rs1 %rm %rd
43
@r_rm ....... ..... ..... ... ..... ....... %rs2 %rs1 %rm %rd
44
@r2_rm ....... ..... ..... ... ..... ....... %rs1 %rm %rd
45
-@r2 ....... ..... ..... ... ..... ....... %rs1 %rd
46
+@r2 ....... ..... ..... ... ..... ....... &r2 %rs1 %rd
47
@r2_nfvm ... ... vm:1 ..... ..... ... ..... ....... &r2nfvm %nf %rs1 %rd
48
@r2_vm ...... vm:1 ..... ..... ... ..... ....... &rmr %rs2 %rd
49
@r1_vm ...... vm:1 ..... ..... ... ..... ....... %rd
50
@@ -XXX,XX +XXX,XX @@ vamomind_v 10000 . . ..... ..... 111 ..... 0101111 @r_wdvm
51
vamomaxd_v 10100 . . ..... ..... 111 ..... 0101111 @r_wdvm
52
vamominud_v 11000 . . ..... ..... 111 ..... 0101111 @r_wdvm
53
vamomaxud_v 11100 . . ..... ..... 111 ..... 0101111 @r_wdvm
54
+
55
+# *** RV32B Standard Extension ***
56
+clz 011000 000000 ..... 001 ..... 0010011 @r2
57
+ctz 011000 000001 ..... 001 ..... 0010011 @r2
58
+
59
+# *** RV64B Standard Extension (in addition to RV32B) ***
60
+clzw 0110000 00000 ..... 001 ..... 0011011 @r2
61
+ctzw 0110000 00001 ..... 001 ..... 0011011 @r2
62
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
63
index XXXXXXX..XXXXXXX 100644
64
--- a/target/riscv/translate.c
65
+++ b/target/riscv/translate.c
66
@@ -XXX,XX +XXX,XX @@ static bool gen_arith_div_uw(DisasContext *ctx, arg_r *a,
67
return true;
68
}
69
70
+static void gen_ctzw(TCGv ret, TCGv arg1)
71
+{
72
+ tcg_gen_ori_tl(ret, arg1, (target_ulong)MAKE_64BIT_MASK(32, 32));
73
+ tcg_gen_ctzi_tl(ret, ret, 64);
74
+}
75
+
76
+static void gen_clzw(TCGv ret, TCGv arg1)
77
+{
78
+ tcg_gen_ext32u_tl(ret, arg1);
79
+ tcg_gen_clzi_tl(ret, ret, 64);
80
+ tcg_gen_subi_tl(ret, ret, 32);
81
+}
82
+
83
static bool gen_arith(DisasContext *ctx, arg_r *a,
84
void(*func)(TCGv, TCGv, TCGv))
85
{
86
@@ -XXX,XX +XXX,XX @@ static uint32_t opcode_at(DisasContextBase *dcbase, target_ulong pc)
87
return cpu_ldl_code(env, pc);
88
}
89
90
+static void gen_ctz(TCGv ret, TCGv arg1)
91
+{
92
+ tcg_gen_ctzi_tl(ret, arg1, TARGET_LONG_BITS);
93
+}
94
+
95
+static void gen_clz(TCGv ret, TCGv arg1)
96
+{
97
+ tcg_gen_clzi_tl(ret, arg1, TARGET_LONG_BITS);
98
+}
99
+
100
+static bool gen_unary(DisasContext *ctx, arg_r2 *a,
101
+ void(*func)(TCGv, TCGv))
102
+{
103
+ TCGv source = tcg_temp_new();
104
+
105
+ gen_get_gpr(source, a->rs1);
106
+
107
+ (*func)(source, source);
108
+
109
+ gen_set_gpr(a->rd, source);
110
+ tcg_temp_free(source);
111
+ return true;
112
+}
113
+
114
/* Include insn module translation function */
115
#include "insn_trans/trans_rvi.c.inc"
116
#include "insn_trans/trans_rvm.c.inc"
117
@@ -XXX,XX +XXX,XX @@ static uint32_t opcode_at(DisasContextBase *dcbase, target_ulong pc)
118
#include "insn_trans/trans_rvd.c.inc"
119
#include "insn_trans/trans_rvh.c.inc"
120
#include "insn_trans/trans_rvv.c.inc"
121
+#include "insn_trans/trans_rvb.c.inc"
122
#include "insn_trans/trans_privileged.c.inc"
123
124
/* Include the auto-generated decoder for 16 bit insn */
125
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
126
new file mode 100644
127
index XXXXXXX..XXXXXXX
128
--- /dev/null
129
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
130
@@ -XXX,XX +XXX,XX @@
131
+/*
132
+ * RISC-V translation routines for the RVB Standard Extension.
133
+ *
134
+ * Copyright (c) 2020 Kito Cheng, kito.cheng@sifive.com
135
+ * Copyright (c) 2020 Frank Chang, frank.chang@sifive.com
136
+ *
137
+ * This program is free software; you can redistribute it and/or modify it
138
+ * under the terms and conditions of the GNU General Public License,
139
+ * version 2 or later, as published by the Free Software Foundation.
140
+ *
141
+ * This program is distributed in the hope it will be useful, but WITHOUT
142
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
143
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
144
+ * more details.
145
+ *
146
+ * You should have received a copy of the GNU General Public License along with
147
+ * this program. If not, see <http://www.gnu.org/licenses/>.
148
+ */
149
+
150
+static bool trans_clz(DisasContext *ctx, arg_clz *a)
151
+{
152
+ REQUIRE_EXT(ctx, RVB);
153
+ return gen_unary(ctx, a, gen_clz);
154
+}
155
+
156
+static bool trans_ctz(DisasContext *ctx, arg_ctz *a)
157
+{
158
+ REQUIRE_EXT(ctx, RVB);
159
+ return gen_unary(ctx, a, gen_ctz);
160
+}
161
+
162
+static bool trans_clzw(DisasContext *ctx, arg_clzw *a)
163
+{
164
+ REQUIRE_64BIT(ctx);
165
+ REQUIRE_EXT(ctx, RVB);
166
+ return gen_unary(ctx, a, gen_clzw);
167
+}
168
+
169
+static bool trans_ctzw(DisasContext *ctx, arg_ctzw *a)
170
+{
171
+ REQUIRE_64BIT(ctx);
172
+ REQUIRE_EXT(ctx, RVB);
173
+ return gen_unary(ctx, a, gen_ctzw);
174
+}
175
--
176
2.31.1
177
178
diff view generated by jsdifflib
1
From: Frank Chang <frank.chang@sifive.com>
1
From: Frank Chang <frank.chang@sifive.com>
2
2
3
vs() should return -RISCV_EXCP_ILLEGAL_INST instead of -1 if rvv feature
3
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
4
is not enabled.
5
6
If -1 is returned, exception will be raised and cs->exception_index will
7
be set to the negative return value. The exception will then be treated
8
as an instruction access fault instead of illegal instruction fault.
9
10
Signed-off-by: Frank Chang <frank.chang@sifive.com>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
13
Message-id: 20210223065935.20208-1-frank.chang@sifive.com
6
Signed-off-by: Frank Chang <frank.chang@sifive.com>
7
Message-id: 20210505160620.15723-4-frank.chang@sifive.com
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/csr.c | 2 +-
10
target/riscv/insn32.decode | 2 ++
17
1 file changed, 1 insertion(+), 1 deletion(-)
11
target/riscv/translate.c | 6 ++++++
12
target/riscv/insn_trans/trans_rvb.c.inc | 13 +++++++++++++
13
3 files changed, 21 insertions(+)
18
14
19
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
15
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
20
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
21
--- a/target/riscv/csr.c
17
--- a/target/riscv/insn32.decode
22
+++ b/target/riscv/csr.c
18
+++ b/target/riscv/insn32.decode
23
@@ -XXX,XX +XXX,XX @@ static int vs(CPURISCVState *env, int csrno)
19
@@ -XXX,XX +XXX,XX @@ vamomaxud_v 11100 . . ..... ..... 111 ..... 0101111 @r_wdvm
24
if (env->misa & RVV) {
20
# *** RV32B Standard Extension ***
25
return 0;
21
clz 011000 000000 ..... 001 ..... 0010011 @r2
26
}
22
ctz 011000 000001 ..... 001 ..... 0010011 @r2
27
- return -1;
23
+cpop 011000 000010 ..... 001 ..... 0010011 @r2
28
+ return -RISCV_EXCP_ILLEGAL_INST;
24
25
# *** RV64B Standard Extension (in addition to RV32B) ***
26
clzw 0110000 00000 ..... 001 ..... 0011011 @r2
27
ctzw 0110000 00001 ..... 001 ..... 0011011 @r2
28
+cpopw 0110000 00010 ..... 001 ..... 0011011 @r2
29
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/target/riscv/translate.c
32
+++ b/target/riscv/translate.c
33
@@ -XXX,XX +XXX,XX @@ static void gen_clzw(TCGv ret, TCGv arg1)
34
tcg_gen_subi_tl(ret, ret, 32);
29
}
35
}
30
36
31
static int ctr(CPURISCVState *env, int csrno)
37
+static void gen_cpopw(TCGv ret, TCGv arg1)
38
+{
39
+ tcg_gen_ext32u_tl(arg1, arg1);
40
+ tcg_gen_ctpop_tl(ret, arg1);
41
+}
42
+
43
static bool gen_arith(DisasContext *ctx, arg_r *a,
44
void(*func)(TCGv, TCGv, TCGv))
45
{
46
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
47
index XXXXXXX..XXXXXXX 100644
48
--- a/target/riscv/insn_trans/trans_rvb.c.inc
49
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
50
@@ -XXX,XX +XXX,XX @@ static bool trans_ctz(DisasContext *ctx, arg_ctz *a)
51
return gen_unary(ctx, a, gen_ctz);
52
}
53
54
+static bool trans_cpop(DisasContext *ctx, arg_cpop *a)
55
+{
56
+ REQUIRE_EXT(ctx, RVB);
57
+ return gen_unary(ctx, a, tcg_gen_ctpop_tl);
58
+}
59
+
60
static bool trans_clzw(DisasContext *ctx, arg_clzw *a)
61
{
62
REQUIRE_64BIT(ctx);
63
@@ -XXX,XX +XXX,XX @@ static bool trans_ctzw(DisasContext *ctx, arg_ctzw *a)
64
REQUIRE_EXT(ctx, RVB);
65
return gen_unary(ctx, a, gen_ctzw);
66
}
67
+
68
+static bool trans_cpopw(DisasContext *ctx, arg_cpopw *a)
69
+{
70
+ REQUIRE_64BIT(ctx);
71
+ REQUIRE_EXT(ctx, RVB);
72
+ return gen_unary(ctx, a, gen_cpopw);
73
+}
32
--
74
--
33
2.30.1
75
2.31.1
34
76
35
77
diff view generated by jsdifflib
New patch
1
From: Kito Cheng <kito.cheng@sifive.com>
1
2
3
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
4
Signed-off-by: Frank Chang <frank.chang@sifive.com>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Message-id: 20210505160620.15723-5-frank.chang@sifive.com
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
---
10
target/riscv/insn32.decode | 3 +++
11
target/riscv/insn_trans/trans_rvb.c.inc | 18 ++++++++++++++++++
12
2 files changed, 21 insertions(+)
13
14
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/riscv/insn32.decode
17
+++ b/target/riscv/insn32.decode
18
@@ -XXX,XX +XXX,XX @@ vamomaxud_v 11100 . . ..... ..... 111 ..... 0101111 @r_wdvm
19
clz 011000 000000 ..... 001 ..... 0010011 @r2
20
ctz 011000 000001 ..... 001 ..... 0010011 @r2
21
cpop 011000 000010 ..... 001 ..... 0010011 @r2
22
+andn 0100000 .......... 111 ..... 0110011 @r
23
+orn 0100000 .......... 110 ..... 0110011 @r
24
+xnor 0100000 .......... 100 ..... 0110011 @r
25
26
# *** RV64B Standard Extension (in addition to RV32B) ***
27
clzw 0110000 00000 ..... 001 ..... 0011011 @r2
28
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
29
index XXXXXXX..XXXXXXX 100644
30
--- a/target/riscv/insn_trans/trans_rvb.c.inc
31
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
32
@@ -XXX,XX +XXX,XX @@ static bool trans_cpop(DisasContext *ctx, arg_cpop *a)
33
return gen_unary(ctx, a, tcg_gen_ctpop_tl);
34
}
35
36
+static bool trans_andn(DisasContext *ctx, arg_andn *a)
37
+{
38
+ REQUIRE_EXT(ctx, RVB);
39
+ return gen_arith(ctx, a, tcg_gen_andc_tl);
40
+}
41
+
42
+static bool trans_orn(DisasContext *ctx, arg_orn *a)
43
+{
44
+ REQUIRE_EXT(ctx, RVB);
45
+ return gen_arith(ctx, a, tcg_gen_orc_tl);
46
+}
47
+
48
+static bool trans_xnor(DisasContext *ctx, arg_xnor *a)
49
+{
50
+ REQUIRE_EXT(ctx, RVB);
51
+ return gen_arith(ctx, a, tcg_gen_eqv_tl);
52
+}
53
+
54
static bool trans_clzw(DisasContext *ctx, arg_clzw *a)
55
{
56
REQUIRE_64BIT(ctx);
57
--
58
2.31.1
59
60
diff view generated by jsdifflib
New patch
1
From: Kito Cheng <kito.cheng@sifive.com>
1
2
3
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
4
Signed-off-by: Frank Chang <frank.chang@sifive.com>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Message-id: 20210505160620.15723-6-frank.chang@sifive.com
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
---
10
target/riscv/insn32.decode | 6 ++++
11
target/riscv/translate.c | 40 +++++++++++++++++++++++++
12
target/riscv/insn_trans/trans_rvb.c.inc | 32 ++++++++++++++++++++
13
3 files changed, 78 insertions(+)
14
15
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/insn32.decode
18
+++ b/target/riscv/insn32.decode
19
@@ -XXX,XX +XXX,XX @@ cpop 011000 000010 ..... 001 ..... 0010011 @r2
20
andn 0100000 .......... 111 ..... 0110011 @r
21
orn 0100000 .......... 110 ..... 0110011 @r
22
xnor 0100000 .......... 100 ..... 0110011 @r
23
+pack 0000100 .......... 100 ..... 0110011 @r
24
+packu 0100100 .......... 100 ..... 0110011 @r
25
+packh 0000100 .......... 111 ..... 0110011 @r
26
27
# *** RV64B Standard Extension (in addition to RV32B) ***
28
clzw 0110000 00000 ..... 001 ..... 0011011 @r2
29
ctzw 0110000 00001 ..... 001 ..... 0011011 @r2
30
cpopw 0110000 00010 ..... 001 ..... 0011011 @r2
31
+
32
+packw 0000100 .......... 100 ..... 0111011 @r
33
+packuw 0100100 .......... 100 ..... 0111011 @r
34
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/target/riscv/translate.c
37
+++ b/target/riscv/translate.c
38
@@ -XXX,XX +XXX,XX @@ static bool gen_arith_div_uw(DisasContext *ctx, arg_r *a,
39
return true;
40
}
41
42
+static void gen_pack(TCGv ret, TCGv arg1, TCGv arg2)
43
+{
44
+ tcg_gen_deposit_tl(ret, arg1, arg2,
45
+ TARGET_LONG_BITS / 2,
46
+ TARGET_LONG_BITS / 2);
47
+}
48
+
49
+static void gen_packu(TCGv ret, TCGv arg1, TCGv arg2)
50
+{
51
+ TCGv t = tcg_temp_new();
52
+ tcg_gen_shri_tl(t, arg1, TARGET_LONG_BITS / 2);
53
+ tcg_gen_deposit_tl(ret, arg2, t, 0, TARGET_LONG_BITS / 2);
54
+ tcg_temp_free(t);
55
+}
56
+
57
+static void gen_packh(TCGv ret, TCGv arg1, TCGv arg2)
58
+{
59
+ TCGv t = tcg_temp_new();
60
+ tcg_gen_ext8u_tl(t, arg2);
61
+ tcg_gen_deposit_tl(ret, arg1, t, 8, TARGET_LONG_BITS - 8);
62
+ tcg_temp_free(t);
63
+}
64
+
65
static void gen_ctzw(TCGv ret, TCGv arg1)
66
{
67
tcg_gen_ori_tl(ret, arg1, (target_ulong)MAKE_64BIT_MASK(32, 32));
68
@@ -XXX,XX +XXX,XX @@ static void gen_cpopw(TCGv ret, TCGv arg1)
69
tcg_gen_ctpop_tl(ret, arg1);
70
}
71
72
+static void gen_packw(TCGv ret, TCGv arg1, TCGv arg2)
73
+{
74
+ TCGv t = tcg_temp_new();
75
+ tcg_gen_ext16s_tl(t, arg2);
76
+ tcg_gen_deposit_tl(ret, arg1, t, 16, 48);
77
+ tcg_temp_free(t);
78
+}
79
+
80
+static void gen_packuw(TCGv ret, TCGv arg1, TCGv arg2)
81
+{
82
+ TCGv t = tcg_temp_new();
83
+ tcg_gen_shri_tl(t, arg1, 16);
84
+ tcg_gen_deposit_tl(ret, arg2, t, 0, 16);
85
+ tcg_gen_ext32s_tl(ret, ret);
86
+ tcg_temp_free(t);
87
+}
88
+
89
static bool gen_arith(DisasContext *ctx, arg_r *a,
90
void(*func)(TCGv, TCGv, TCGv))
91
{
92
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
93
index XXXXXXX..XXXXXXX 100644
94
--- a/target/riscv/insn_trans/trans_rvb.c.inc
95
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
96
@@ -XXX,XX +XXX,XX @@ static bool trans_xnor(DisasContext *ctx, arg_xnor *a)
97
return gen_arith(ctx, a, tcg_gen_eqv_tl);
98
}
99
100
+static bool trans_pack(DisasContext *ctx, arg_pack *a)
101
+{
102
+ REQUIRE_EXT(ctx, RVB);
103
+ return gen_arith(ctx, a, gen_pack);
104
+}
105
+
106
+static bool trans_packu(DisasContext *ctx, arg_packu *a)
107
+{
108
+ REQUIRE_EXT(ctx, RVB);
109
+ return gen_arith(ctx, a, gen_packu);
110
+}
111
+
112
+static bool trans_packh(DisasContext *ctx, arg_packh *a)
113
+{
114
+ REQUIRE_EXT(ctx, RVB);
115
+ return gen_arith(ctx, a, gen_packh);
116
+}
117
+
118
static bool trans_clzw(DisasContext *ctx, arg_clzw *a)
119
{
120
REQUIRE_64BIT(ctx);
121
@@ -XXX,XX +XXX,XX @@ static bool trans_cpopw(DisasContext *ctx, arg_cpopw *a)
122
REQUIRE_EXT(ctx, RVB);
123
return gen_unary(ctx, a, gen_cpopw);
124
}
125
+
126
+static bool trans_packw(DisasContext *ctx, arg_packw *a)
127
+{
128
+ REQUIRE_64BIT(ctx);
129
+ REQUIRE_EXT(ctx, RVB);
130
+ return gen_arith(ctx, a, gen_packw);
131
+}
132
+
133
+static bool trans_packuw(DisasContext *ctx, arg_packuw *a)
134
+{
135
+ REQUIRE_64BIT(ctx);
136
+ REQUIRE_EXT(ctx, RVB);
137
+ return gen_arith(ctx, a, gen_packuw);
138
+}
139
--
140
2.31.1
141
142
diff view generated by jsdifflib
New patch
1
From: Kito Cheng <kito.cheng@sifive.com>
1
2
3
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Signed-off-by: Frank Chang <frank.chang@sifive.com>
7
Message-id: 20210505160620.15723-7-frank.chang@sifive.com
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
---
10
target/riscv/insn32.decode | 4 ++++
11
target/riscv/insn_trans/trans_rvb.c.inc | 24 ++++++++++++++++++++++++
12
2 files changed, 28 insertions(+)
13
14
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/riscv/insn32.decode
17
+++ b/target/riscv/insn32.decode
18
@@ -XXX,XX +XXX,XX @@ xnor 0100000 .......... 100 ..... 0110011 @r
19
pack 0000100 .......... 100 ..... 0110011 @r
20
packu 0100100 .......... 100 ..... 0110011 @r
21
packh 0000100 .......... 111 ..... 0110011 @r
22
+min 0000101 .......... 100 ..... 0110011 @r
23
+minu 0000101 .......... 101 ..... 0110011 @r
24
+max 0000101 .......... 110 ..... 0110011 @r
25
+maxu 0000101 .......... 111 ..... 0110011 @r
26
27
# *** RV64B Standard Extension (in addition to RV32B) ***
28
clzw 0110000 00000 ..... 001 ..... 0011011 @r2
29
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
30
index XXXXXXX..XXXXXXX 100644
31
--- a/target/riscv/insn_trans/trans_rvb.c.inc
32
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
33
@@ -XXX,XX +XXX,XX @@ static bool trans_packh(DisasContext *ctx, arg_packh *a)
34
return gen_arith(ctx, a, gen_packh);
35
}
36
37
+static bool trans_min(DisasContext *ctx, arg_min *a)
38
+{
39
+ REQUIRE_EXT(ctx, RVB);
40
+ return gen_arith(ctx, a, tcg_gen_smin_tl);
41
+}
42
+
43
+static bool trans_max(DisasContext *ctx, arg_max *a)
44
+{
45
+ REQUIRE_EXT(ctx, RVB);
46
+ return gen_arith(ctx, a, tcg_gen_smax_tl);
47
+}
48
+
49
+static bool trans_minu(DisasContext *ctx, arg_minu *a)
50
+{
51
+ REQUIRE_EXT(ctx, RVB);
52
+ return gen_arith(ctx, a, tcg_gen_umin_tl);
53
+}
54
+
55
+static bool trans_maxu(DisasContext *ctx, arg_maxu *a)
56
+{
57
+ REQUIRE_EXT(ctx, RVB);
58
+ return gen_arith(ctx, a, tcg_gen_umax_tl);
59
+}
60
+
61
static bool trans_clzw(DisasContext *ctx, arg_clzw *a)
62
{
63
REQUIRE_64BIT(ctx);
64
--
65
2.31.1
66
67
diff view generated by jsdifflib
New patch
1
From: Kito Cheng <kito.cheng@sifive.com>
1
2
3
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Signed-off-by: Frank Chang <frank.chang@sifive.com>
7
Message-id: 20210505160620.15723-8-frank.chang@sifive.com
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
---
10
target/riscv/insn32.decode | 3 +++
11
target/riscv/insn_trans/trans_rvb.c.inc | 12 ++++++++++++
12
2 files changed, 15 insertions(+)
13
14
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/riscv/insn32.decode
17
+++ b/target/riscv/insn32.decode
18
@@ -XXX,XX +XXX,XX @@ vamomaxud_v 11100 . . ..... ..... 111 ..... 0101111 @r_wdvm
19
clz 011000 000000 ..... 001 ..... 0010011 @r2
20
ctz 011000 000001 ..... 001 ..... 0010011 @r2
21
cpop 011000 000010 ..... 001 ..... 0010011 @r2
22
+sext_b 011000 000100 ..... 001 ..... 0010011 @r2
23
+sext_h 011000 000101 ..... 001 ..... 0010011 @r2
24
+
25
andn 0100000 .......... 111 ..... 0110011 @r
26
orn 0100000 .......... 110 ..... 0110011 @r
27
xnor 0100000 .......... 100 ..... 0110011 @r
28
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
29
index XXXXXXX..XXXXXXX 100644
30
--- a/target/riscv/insn_trans/trans_rvb.c.inc
31
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
32
@@ -XXX,XX +XXX,XX @@ static bool trans_maxu(DisasContext *ctx, arg_maxu *a)
33
return gen_arith(ctx, a, tcg_gen_umax_tl);
34
}
35
36
+static bool trans_sext_b(DisasContext *ctx, arg_sext_b *a)
37
+{
38
+ REQUIRE_EXT(ctx, RVB);
39
+ return gen_unary(ctx, a, tcg_gen_ext8s_tl);
40
+}
41
+
42
+static bool trans_sext_h(DisasContext *ctx, arg_sext_h *a)
43
+{
44
+ REQUIRE_EXT(ctx, RVB);
45
+ return gen_unary(ctx, a, tcg_gen_ext16s_tl);
46
+}
47
+
48
static bool trans_clzw(DisasContext *ctx, arg_clzw *a)
49
{
50
REQUIRE_64BIT(ctx);
51
--
52
2.31.1
53
54
diff view generated by jsdifflib
1
From: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
1
From: Frank Chang <frank.chang@sifive.com>
2
2
3
When decode_insn16() fails, we fall back to decode_RV32_64C() for
3
Add gen_shifti() and gen_shiftiw() helper functions to reuse the same
4
further compressed instruction decoding. However, prior to this change,
4
interfaces for immediate shift instructions.
5
we did not raise an illegal instruction exception, if decode_RV32_64C()
6
fails to decode the instruction. This means that we skipped illegal
7
compressed instructions instead of raising an illegal instruction
8
exception.
9
5
10
Instead of patching decode_RV32_64C(), we can just remove it,
6
Signed-off-by: Frank Chang <frank.chang@sifive.com>
11
as it is dead code since f330433b363 anyway.
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
13
Signed-off-by: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
14
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
15
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20210505160620.15723-9-frank.chang@sifive.com
16
Message-id: 20210322121609.3097928-1-georg.kotheimer@kernkonzept.com
17
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
18
---
11
---
19
target/riscv/translate.c | 179 +--------------------------------------
12
target/riscv/translate.c | 39 ++++++++++++++++++
20
1 file changed, 1 insertion(+), 178 deletions(-)
13
target/riscv/insn_trans/trans_rvi.c.inc | 54 ++-----------------------
14
2 files changed, 43 insertions(+), 50 deletions(-)
21
15
22
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
16
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
23
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
24
--- a/target/riscv/translate.c
18
--- a/target/riscv/translate.c
25
+++ b/target/riscv/translate.c
19
+++ b/target/riscv/translate.c
26
@@ -XXX,XX +XXX,XX @@ typedef struct DisasContext {
20
@@ -XXX,XX +XXX,XX @@ static uint32_t opcode_at(DisasContextBase *dcbase, target_ulong pc)
27
CPUState *cs;
21
return cpu_ldl_code(env, pc);
28
} DisasContext;
29
30
-#ifdef TARGET_RISCV64
31
-/* convert riscv funct3 to qemu memop for load/store */
32
-static const int tcg_memop_lookup[8] = {
33
- [0 ... 7] = -1,
34
- [0] = MO_SB,
35
- [1] = MO_TESW,
36
- [2] = MO_TESL,
37
- [3] = MO_TEQ,
38
- [4] = MO_UB,
39
- [5] = MO_TEUW,
40
- [6] = MO_TEUL,
41
-};
42
-#endif
43
-
44
#ifdef TARGET_RISCV64
45
#define CASE_OP_32_64(X) case X: case glue(X, W)
46
#else
47
@@ -XXX,XX +XXX,XX @@ static void gen_jal(DisasContext *ctx, int rd, target_ulong imm)
48
ctx->base.is_jmp = DISAS_NORETURN;
49
}
22
}
50
23
51
-#ifdef TARGET_RISCV64
24
+static bool gen_shifti(DisasContext *ctx, arg_shift *a,
52
-static void gen_load_c(DisasContext *ctx, uint32_t opc, int rd, int rs1,
25
+ void(*func)(TCGv, TCGv, TCGv))
53
- target_long imm)
26
+{
54
-{
27
+ if (a->shamt >= TARGET_LONG_BITS) {
55
- TCGv t0 = tcg_temp_new();
28
+ return false;
56
- TCGv t1 = tcg_temp_new();
29
+ }
57
- gen_get_gpr(t0, rs1);
30
+
58
- tcg_gen_addi_tl(t0, t0, imm);
31
+ TCGv source1 = tcg_temp_new();
59
- int memop = tcg_memop_lookup[(opc >> 12) & 0x7];
32
+ TCGv source2 = tcg_temp_new();
60
-
33
+
61
- if (memop < 0) {
34
+ gen_get_gpr(source1, a->rs1);
62
- gen_exception_illegal(ctx);
35
+
63
- return;
36
+ tcg_gen_movi_tl(source2, a->shamt);
37
+ (*func)(source1, source1, source2);
38
+
39
+ gen_set_gpr(a->rd, source1);
40
+ tcg_temp_free(source1);
41
+ tcg_temp_free(source2);
42
+ return true;
43
+}
44
+
45
+static bool gen_shiftiw(DisasContext *ctx, arg_shift *a,
46
+ void(*func)(TCGv, TCGv, TCGv))
47
+{
48
+ TCGv source1 = tcg_temp_new();
49
+ TCGv source2 = tcg_temp_new();
50
+
51
+ gen_get_gpr(source1, a->rs1);
52
+ tcg_gen_movi_tl(source2, a->shamt);
53
+
54
+ (*func)(source1, source1, source2);
55
+ tcg_gen_ext32s_tl(source1, source1);
56
+
57
+ gen_set_gpr(a->rd, source1);
58
+ tcg_temp_free(source1);
59
+ tcg_temp_free(source2);
60
+ return true;
61
+}
62
+
63
static void gen_ctz(TCGv ret, TCGv arg1)
64
{
65
tcg_gen_ctzi_tl(ret, arg1, TARGET_LONG_BITS);
66
diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_trans/trans_rvi.c.inc
67
index XXXXXXX..XXXXXXX 100644
68
--- a/target/riscv/insn_trans/trans_rvi.c.inc
69
+++ b/target/riscv/insn_trans/trans_rvi.c.inc
70
@@ -XXX,XX +XXX,XX @@ static bool trans_andi(DisasContext *ctx, arg_andi *a)
71
}
72
static bool trans_slli(DisasContext *ctx, arg_slli *a)
73
{
74
- if (a->shamt >= TARGET_LONG_BITS) {
75
- return false;
64
- }
76
- }
65
-
77
-
66
- tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, memop);
78
- if (a->rd != 0) {
67
- gen_set_gpr(rd, t1);
79
- TCGv t = tcg_temp_new();
68
- tcg_temp_free(t0);
80
- gen_get_gpr(t, a->rs1);
69
- tcg_temp_free(t1);
70
-}
71
-
81
-
72
-static void gen_store_c(DisasContext *ctx, uint32_t opc, int rs1, int rs2,
82
- tcg_gen_shli_tl(t, t, a->shamt);
73
- target_long imm)
74
-{
75
- TCGv t0 = tcg_temp_new();
76
- TCGv dat = tcg_temp_new();
77
- gen_get_gpr(t0, rs1);
78
- tcg_gen_addi_tl(t0, t0, imm);
79
- gen_get_gpr(dat, rs2);
80
- int memop = tcg_memop_lookup[(opc >> 12) & 0x7];
81
-
83
-
82
- if (memop < 0) {
84
- gen_set_gpr(a->rd, t);
83
- gen_exception_illegal(ctx);
85
- tcg_temp_free(t);
84
- return;
86
- } /* NOP otherwise */
87
- return true;
88
+ return gen_shifti(ctx, a, tcg_gen_shl_tl);
89
}
90
91
static bool trans_srli(DisasContext *ctx, arg_srli *a)
92
{
93
- if (a->shamt >= TARGET_LONG_BITS) {
94
- return false;
85
- }
95
- }
86
-
96
-
87
- tcg_gen_qemu_st_tl(dat, t0, ctx->mem_idx, memop);
97
- if (a->rd != 0) {
88
- tcg_temp_free(t0);
98
- TCGv t = tcg_temp_new();
89
- tcg_temp_free(dat);
99
- gen_get_gpr(t, a->rs1);
90
-}
91
-#endif
92
-
100
-
93
#ifndef CONFIG_USER_ONLY
101
- tcg_gen_shri_tl(t, t, a->shamt);
94
/* The states of mstatus_fs are:
102
- gen_set_gpr(a->rd, t);
95
* 0 = disabled, 1 = initial, 2 = clean, 3 = dirty
103
- tcg_temp_free(t);
96
@@ -XXX,XX +XXX,XX @@ static void mark_fs_dirty(DisasContext *ctx)
104
- } /* NOP otherwise */
97
static inline void mark_fs_dirty(DisasContext *ctx) { }
105
- return true;
98
#endif
106
+ return gen_shifti(ctx, a, tcg_gen_shr_tl);
99
107
}
100
-#if !defined(TARGET_RISCV64)
108
101
-static void gen_fp_load(DisasContext *ctx, uint32_t opc, int rd,
109
static bool trans_srai(DisasContext *ctx, arg_srai *a)
102
- int rs1, target_long imm)
110
{
103
-{
111
- if (a->shamt >= TARGET_LONG_BITS) {
104
- TCGv t0;
112
- return false;
105
-
106
- if (ctx->mstatus_fs == 0) {
107
- gen_exception_illegal(ctx);
108
- return;
109
- }
113
- }
110
-
114
-
111
- t0 = tcg_temp_new();
115
- if (a->rd != 0) {
112
- gen_get_gpr(t0, rs1);
116
- TCGv t = tcg_temp_new();
113
- tcg_gen_addi_tl(t0, t0, imm);
117
- gen_get_gpr(t, a->rs1);
114
-
118
-
115
- switch (opc) {
119
- tcg_gen_sari_tl(t, t, a->shamt);
116
- case OPC_RISC_FLW:
120
- gen_set_gpr(a->rd, t);
117
- if (!has_ext(ctx, RVF)) {
121
- tcg_temp_free(t);
118
- goto do_illegal;
122
- } /* NOP otherwise */
119
- }
123
- return true;
120
- tcg_gen_qemu_ld_i64(cpu_fpr[rd], t0, ctx->mem_idx, MO_TEUL);
124
+ return gen_shifti(ctx, a, tcg_gen_sar_tl);
121
- /* RISC-V requires NaN-boxing of narrower width floating point values */
125
}
122
- tcg_gen_ori_i64(cpu_fpr[rd], cpu_fpr[rd], 0xffffffff00000000ULL);
126
123
- break;
127
static bool trans_add(DisasContext *ctx, arg_add *a)
124
- case OPC_RISC_FLD:
128
@@ -XXX,XX +XXX,XX @@ static bool trans_addiw(DisasContext *ctx, arg_addiw *a)
125
- if (!has_ext(ctx, RVD)) {
129
static bool trans_slliw(DisasContext *ctx, arg_slliw *a)
126
- goto do_illegal;
130
{
127
- }
131
REQUIRE_64BIT(ctx);
128
- tcg_gen_qemu_ld_i64(cpu_fpr[rd], t0, ctx->mem_idx, MO_TEQ);
132
- TCGv source1;
129
- break;
133
- source1 = tcg_temp_new();
130
- do_illegal:
134
- gen_get_gpr(source1, a->rs1);
131
- default:
132
- gen_exception_illegal(ctx);
133
- break;
134
- }
135
- tcg_temp_free(t0);
136
-
135
-
137
- mark_fs_dirty(ctx);
136
- tcg_gen_shli_tl(source1, source1, a->shamt);
138
-}
137
- tcg_gen_ext32s_tl(source1, source1);
138
- gen_set_gpr(a->rd, source1);
139
-
139
-
140
-static void gen_fp_store(DisasContext *ctx, uint32_t opc, int rs1,
140
- tcg_temp_free(source1);
141
- int rs2, target_long imm)
141
- return true;
142
-{
142
+ return gen_shiftiw(ctx, a, tcg_gen_shl_tl);
143
- TCGv t0;
144
-
145
- if (ctx->mstatus_fs == 0) {
146
- gen_exception_illegal(ctx);
147
- return;
148
- }
149
-
150
- t0 = tcg_temp_new();
151
- gen_get_gpr(t0, rs1);
152
- tcg_gen_addi_tl(t0, t0, imm);
153
-
154
- switch (opc) {
155
- case OPC_RISC_FSW:
156
- if (!has_ext(ctx, RVF)) {
157
- goto do_illegal;
158
- }
159
- tcg_gen_qemu_st_i64(cpu_fpr[rs2], t0, ctx->mem_idx, MO_TEUL);
160
- break;
161
- case OPC_RISC_FSD:
162
- if (!has_ext(ctx, RVD)) {
163
- goto do_illegal;
164
- }
165
- tcg_gen_qemu_st_i64(cpu_fpr[rs2], t0, ctx->mem_idx, MO_TEQ);
166
- break;
167
- do_illegal:
168
- default:
169
- gen_exception_illegal(ctx);
170
- break;
171
- }
172
-
173
- tcg_temp_free(t0);
174
-}
175
-#endif
176
-
177
static void gen_set_rm(DisasContext *ctx, int rm)
178
{
179
TCGv_i32 t0;
180
@@ -XXX,XX +XXX,XX @@ static void gen_set_rm(DisasContext *ctx, int rm)
181
tcg_temp_free_i32(t0);
182
}
143
}
183
144
184
-static void decode_RV32_64C0(DisasContext *ctx, uint16_t opcode)
145
static bool trans_srliw(DisasContext *ctx, arg_srliw *a)
185
-{
186
- uint8_t funct3 = extract16(opcode, 13, 3);
187
- uint8_t rd_rs2 = GET_C_RS2S(opcode);
188
- uint8_t rs1s = GET_C_RS1S(opcode);
189
-
190
- switch (funct3) {
191
- case 3:
192
-#if defined(TARGET_RISCV64)
193
- /* C.LD(RV64/128) -> ld rd', offset[7:3](rs1')*/
194
- gen_load_c(ctx, OPC_RISC_LD, rd_rs2, rs1s,
195
- GET_C_LD_IMM(opcode));
196
-#else
197
- /* C.FLW (RV32) -> flw rd', offset[6:2](rs1')*/
198
- gen_fp_load(ctx, OPC_RISC_FLW, rd_rs2, rs1s,
199
- GET_C_LW_IMM(opcode));
200
-#endif
201
- break;
202
- case 7:
203
-#if defined(TARGET_RISCV64)
204
- /* C.SD (RV64/128) -> sd rs2', offset[7:3](rs1')*/
205
- gen_store_c(ctx, OPC_RISC_SD, rs1s, rd_rs2,
206
- GET_C_LD_IMM(opcode));
207
-#else
208
- /* C.FSW (RV32) -> fsw rs2', offset[6:2](rs1')*/
209
- gen_fp_store(ctx, OPC_RISC_FSW, rs1s, rd_rs2,
210
- GET_C_LW_IMM(opcode));
211
-#endif
212
- break;
213
- }
214
-}
215
-
216
-static void decode_RV32_64C(DisasContext *ctx, uint16_t opcode)
217
-{
218
- uint8_t op = extract16(opcode, 0, 2);
219
-
220
- switch (op) {
221
- case 0:
222
- decode_RV32_64C0(ctx, opcode);
223
- break;
224
- }
225
-}
226
-
227
static int ex_plus_1(DisasContext *ctx, int nf)
228
{
229
return nf + 1;
230
@@ -XXX,XX +XXX,XX @@ static void decode_opc(CPURISCVState *env, DisasContext *ctx, uint16_t opcode)
231
} else {
232
ctx->pc_succ_insn = ctx->base.pc_next + 2;
233
if (!decode_insn16(ctx, opcode)) {
234
- /* fall back to old decoder */
235
- decode_RV32_64C(ctx, opcode);
236
+ gen_exception_illegal(ctx);
237
}
238
}
239
} else {
240
--
146
--
241
2.30.1
147
2.31.1
242
148
243
149
diff view generated by jsdifflib
New patch
1
1
From: Frank Chang <frank.chang@sifive.com>
2
3
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
4
Signed-off-by: Frank Chang <frank.chang@sifive.com>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Message-id: 20210505160620.15723-10-frank.chang@sifive.com
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
---
10
target/riscv/insn32.decode | 17 +++++
11
target/riscv/translate.c | 61 ++++++++++++++++
12
target/riscv/insn_trans/trans_rvb.c.inc | 97 +++++++++++++++++++++++++
13
3 files changed, 175 insertions(+)
14
15
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/insn32.decode
18
+++ b/target/riscv/insn32.decode
19
@@ -XXX,XX +XXX,XX @@ min 0000101 .......... 100 ..... 0110011 @r
20
minu 0000101 .......... 101 ..... 0110011 @r
21
max 0000101 .......... 110 ..... 0110011 @r
22
maxu 0000101 .......... 111 ..... 0110011 @r
23
+bset 0010100 .......... 001 ..... 0110011 @r
24
+bclr 0100100 .......... 001 ..... 0110011 @r
25
+binv 0110100 .......... 001 ..... 0110011 @r
26
+bext 0100100 .......... 101 ..... 0110011 @r
27
+
28
+bseti 00101. ........... 001 ..... 0010011 @sh
29
+bclri 01001. ........... 001 ..... 0010011 @sh
30
+binvi 01101. ........... 001 ..... 0010011 @sh
31
+bexti 01001. ........... 101 ..... 0010011 @sh
32
33
# *** RV64B Standard Extension (in addition to RV32B) ***
34
clzw 0110000 00000 ..... 001 ..... 0011011 @r2
35
@@ -XXX,XX +XXX,XX @@ cpopw 0110000 00010 ..... 001 ..... 0011011 @r2
36
37
packw 0000100 .......... 100 ..... 0111011 @r
38
packuw 0100100 .......... 100 ..... 0111011 @r
39
+bsetw 0010100 .......... 001 ..... 0111011 @r
40
+bclrw 0100100 .......... 001 ..... 0111011 @r
41
+binvw 0110100 .......... 001 ..... 0111011 @r
42
+bextw 0100100 .......... 101 ..... 0111011 @r
43
+
44
+bsetiw 0010100 .......... 001 ..... 0011011 @sh5
45
+bclriw 0100100 .......... 001 ..... 0011011 @sh5
46
+binviw 0110100 .......... 001 ..... 0011011 @sh5
47
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
48
index XXXXXXX..XXXXXXX 100644
49
--- a/target/riscv/translate.c
50
+++ b/target/riscv/translate.c
51
@@ -XXX,XX +XXX,XX @@ static void gen_packh(TCGv ret, TCGv arg1, TCGv arg2)
52
tcg_temp_free(t);
53
}
54
55
+static void gen_sbop_mask(TCGv ret, TCGv shamt)
56
+{
57
+ tcg_gen_movi_tl(ret, 1);
58
+ tcg_gen_shl_tl(ret, ret, shamt);
59
+}
60
+
61
+static void gen_bset(TCGv ret, TCGv arg1, TCGv shamt)
62
+{
63
+ TCGv t = tcg_temp_new();
64
+
65
+ gen_sbop_mask(t, shamt);
66
+ tcg_gen_or_tl(ret, arg1, t);
67
+
68
+ tcg_temp_free(t);
69
+}
70
+
71
+static void gen_bclr(TCGv ret, TCGv arg1, TCGv shamt)
72
+{
73
+ TCGv t = tcg_temp_new();
74
+
75
+ gen_sbop_mask(t, shamt);
76
+ tcg_gen_andc_tl(ret, arg1, t);
77
+
78
+ tcg_temp_free(t);
79
+}
80
+
81
+static void gen_binv(TCGv ret, TCGv arg1, TCGv shamt)
82
+{
83
+ TCGv t = tcg_temp_new();
84
+
85
+ gen_sbop_mask(t, shamt);
86
+ tcg_gen_xor_tl(ret, arg1, t);
87
+
88
+ tcg_temp_free(t);
89
+}
90
+
91
+static void gen_bext(TCGv ret, TCGv arg1, TCGv shamt)
92
+{
93
+ tcg_gen_shr_tl(ret, arg1, shamt);
94
+ tcg_gen_andi_tl(ret, ret, 1);
95
+}
96
+
97
static void gen_ctzw(TCGv ret, TCGv arg1)
98
{
99
tcg_gen_ori_tl(ret, arg1, (target_ulong)MAKE_64BIT_MASK(32, 32));
100
@@ -XXX,XX +XXX,XX @@ static bool gen_shifti(DisasContext *ctx, arg_shift *a,
101
return true;
102
}
103
104
+static bool gen_shiftw(DisasContext *ctx, arg_r *a,
105
+ void(*func)(TCGv, TCGv, TCGv))
106
+{
107
+ TCGv source1 = tcg_temp_new();
108
+ TCGv source2 = tcg_temp_new();
109
+
110
+ gen_get_gpr(source1, a->rs1);
111
+ gen_get_gpr(source2, a->rs2);
112
+
113
+ tcg_gen_andi_tl(source2, source2, 31);
114
+ (*func)(source1, source1, source2);
115
+ tcg_gen_ext32s_tl(source1, source1);
116
+
117
+ gen_set_gpr(a->rd, source1);
118
+ tcg_temp_free(source1);
119
+ tcg_temp_free(source2);
120
+ return true;
121
+}
122
+
123
static bool gen_shiftiw(DisasContext *ctx, arg_shift *a,
124
void(*func)(TCGv, TCGv, TCGv))
125
{
126
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
127
index XXXXXXX..XXXXXXX 100644
128
--- a/target/riscv/insn_trans/trans_rvb.c.inc
129
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
130
@@ -XXX,XX +XXX,XX @@ static bool trans_sext_h(DisasContext *ctx, arg_sext_h *a)
131
return gen_unary(ctx, a, tcg_gen_ext16s_tl);
132
}
133
134
+static bool trans_bset(DisasContext *ctx, arg_bset *a)
135
+{
136
+ REQUIRE_EXT(ctx, RVB);
137
+ return gen_shift(ctx, a, gen_bset);
138
+}
139
+
140
+static bool trans_bseti(DisasContext *ctx, arg_bseti *a)
141
+{
142
+ REQUIRE_EXT(ctx, RVB);
143
+ return gen_shifti(ctx, a, gen_bset);
144
+}
145
+
146
+static bool trans_bclr(DisasContext *ctx, arg_bclr *a)
147
+{
148
+ REQUIRE_EXT(ctx, RVB);
149
+ return gen_shift(ctx, a, gen_bclr);
150
+}
151
+
152
+static bool trans_bclri(DisasContext *ctx, arg_bclri *a)
153
+{
154
+ REQUIRE_EXT(ctx, RVB);
155
+ return gen_shifti(ctx, a, gen_bclr);
156
+}
157
+
158
+static bool trans_binv(DisasContext *ctx, arg_binv *a)
159
+{
160
+ REQUIRE_EXT(ctx, RVB);
161
+ return gen_shift(ctx, a, gen_binv);
162
+}
163
+
164
+static bool trans_binvi(DisasContext *ctx, arg_binvi *a)
165
+{
166
+ REQUIRE_EXT(ctx, RVB);
167
+ return gen_shifti(ctx, a, gen_binv);
168
+}
169
+
170
+static bool trans_bext(DisasContext *ctx, arg_bext *a)
171
+{
172
+ REQUIRE_EXT(ctx, RVB);
173
+ return gen_shift(ctx, a, gen_bext);
174
+}
175
+
176
+static bool trans_bexti(DisasContext *ctx, arg_bexti *a)
177
+{
178
+ REQUIRE_EXT(ctx, RVB);
179
+ return gen_shifti(ctx, a, gen_bext);
180
+}
181
+
182
static bool trans_clzw(DisasContext *ctx, arg_clzw *a)
183
{
184
REQUIRE_64BIT(ctx);
185
@@ -XXX,XX +XXX,XX @@ static bool trans_packuw(DisasContext *ctx, arg_packuw *a)
186
REQUIRE_EXT(ctx, RVB);
187
return gen_arith(ctx, a, gen_packuw);
188
}
189
+
190
+static bool trans_bsetw(DisasContext *ctx, arg_bsetw *a)
191
+{
192
+ REQUIRE_64BIT(ctx);
193
+ REQUIRE_EXT(ctx, RVB);
194
+ return gen_shiftw(ctx, a, gen_bset);
195
+}
196
+
197
+static bool trans_bsetiw(DisasContext *ctx, arg_bsetiw *a)
198
+{
199
+ REQUIRE_64BIT(ctx);
200
+ REQUIRE_EXT(ctx, RVB);
201
+ return gen_shiftiw(ctx, a, gen_bset);
202
+}
203
+
204
+static bool trans_bclrw(DisasContext *ctx, arg_bclrw *a)
205
+{
206
+ REQUIRE_64BIT(ctx);
207
+ REQUIRE_EXT(ctx, RVB);
208
+ return gen_shiftw(ctx, a, gen_bclr);
209
+}
210
+
211
+static bool trans_bclriw(DisasContext *ctx, arg_bclriw *a)
212
+{
213
+ REQUIRE_64BIT(ctx);
214
+ REQUIRE_EXT(ctx, RVB);
215
+ return gen_shiftiw(ctx, a, gen_bclr);
216
+}
217
+
218
+static bool trans_binvw(DisasContext *ctx, arg_binvw *a)
219
+{
220
+ REQUIRE_64BIT(ctx);
221
+ REQUIRE_EXT(ctx, RVB);
222
+ return gen_shiftw(ctx, a, gen_binv);
223
+}
224
+
225
+static bool trans_binviw(DisasContext *ctx, arg_binviw *a)
226
+{
227
+ REQUIRE_64BIT(ctx);
228
+ REQUIRE_EXT(ctx, RVB);
229
+ return gen_shiftiw(ctx, a, gen_binv);
230
+}
231
+
232
+static bool trans_bextw(DisasContext *ctx, arg_bextw *a)
233
+{
234
+ REQUIRE_64BIT(ctx);
235
+ REQUIRE_EXT(ctx, RVB);
236
+ return gen_shiftw(ctx, a, gen_bext);
237
+}
238
--
239
2.31.1
240
241
diff view generated by jsdifflib
New patch
1
From: Kito Cheng <kito.cheng@sifive.com>
1
2
3
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
4
Signed-off-by: Frank Chang <frank.chang@sifive.com>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Message-id: 20210505160620.15723-11-frank.chang@sifive.com
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
---
10
target/riscv/insn32.decode | 8 ++++
11
target/riscv/translate.c | 14 +++++++
12
target/riscv/insn_trans/trans_rvb.c.inc | 52 +++++++++++++++++++++++++
13
3 files changed, 74 insertions(+)
14
15
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/insn32.decode
18
+++ b/target/riscv/insn32.decode
19
@@ -XXX,XX +XXX,XX @@ bset 0010100 .......... 001 ..... 0110011 @r
20
bclr 0100100 .......... 001 ..... 0110011 @r
21
binv 0110100 .......... 001 ..... 0110011 @r
22
bext 0100100 .......... 101 ..... 0110011 @r
23
+slo 0010000 .......... 001 ..... 0110011 @r
24
+sro 0010000 .......... 101 ..... 0110011 @r
25
26
bseti 00101. ........... 001 ..... 0010011 @sh
27
bclri 01001. ........... 001 ..... 0010011 @sh
28
binvi 01101. ........... 001 ..... 0010011 @sh
29
bexti 01001. ........... 101 ..... 0010011 @sh
30
+sloi 00100. ........... 001 ..... 0010011 @sh
31
+sroi 00100. ........... 101 ..... 0010011 @sh
32
33
# *** RV64B Standard Extension (in addition to RV32B) ***
34
clzw 0110000 00000 ..... 001 ..... 0011011 @r2
35
@@ -XXX,XX +XXX,XX @@ bsetw 0010100 .......... 001 ..... 0111011 @r
36
bclrw 0100100 .......... 001 ..... 0111011 @r
37
binvw 0110100 .......... 001 ..... 0111011 @r
38
bextw 0100100 .......... 101 ..... 0111011 @r
39
+slow 0010000 .......... 001 ..... 0111011 @r
40
+srow 0010000 .......... 101 ..... 0111011 @r
41
42
bsetiw 0010100 .......... 001 ..... 0011011 @sh5
43
bclriw 0100100 .......... 001 ..... 0011011 @sh5
44
binviw 0110100 .......... 001 ..... 0011011 @sh5
45
+sloiw 0010000 .......... 001 ..... 0011011 @sh5
46
+sroiw 0010000 .......... 101 ..... 0011011 @sh5
47
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
48
index XXXXXXX..XXXXXXX 100644
49
--- a/target/riscv/translate.c
50
+++ b/target/riscv/translate.c
51
@@ -XXX,XX +XXX,XX @@ static void gen_bext(TCGv ret, TCGv arg1, TCGv shamt)
52
tcg_gen_andi_tl(ret, ret, 1);
53
}
54
55
+static void gen_slo(TCGv ret, TCGv arg1, TCGv arg2)
56
+{
57
+ tcg_gen_not_tl(ret, arg1);
58
+ tcg_gen_shl_tl(ret, ret, arg2);
59
+ tcg_gen_not_tl(ret, ret);
60
+}
61
+
62
+static void gen_sro(TCGv ret, TCGv arg1, TCGv arg2)
63
+{
64
+ tcg_gen_not_tl(ret, arg1);
65
+ tcg_gen_shr_tl(ret, ret, arg2);
66
+ tcg_gen_not_tl(ret, ret);
67
+}
68
+
69
static void gen_ctzw(TCGv ret, TCGv arg1)
70
{
71
tcg_gen_ori_tl(ret, arg1, (target_ulong)MAKE_64BIT_MASK(32, 32));
72
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
73
index XXXXXXX..XXXXXXX 100644
74
--- a/target/riscv/insn_trans/trans_rvb.c.inc
75
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
76
@@ -XXX,XX +XXX,XX @@ static bool trans_bexti(DisasContext *ctx, arg_bexti *a)
77
return gen_shifti(ctx, a, gen_bext);
78
}
79
80
+static bool trans_slo(DisasContext *ctx, arg_slo *a)
81
+{
82
+ REQUIRE_EXT(ctx, RVB);
83
+ return gen_shift(ctx, a, gen_slo);
84
+}
85
+
86
+static bool trans_sloi(DisasContext *ctx, arg_sloi *a)
87
+{
88
+ REQUIRE_EXT(ctx, RVB);
89
+ return gen_shifti(ctx, a, gen_slo);
90
+}
91
+
92
+static bool trans_sro(DisasContext *ctx, arg_sro *a)
93
+{
94
+ REQUIRE_EXT(ctx, RVB);
95
+ return gen_shift(ctx, a, gen_sro);
96
+}
97
+
98
+static bool trans_sroi(DisasContext *ctx, arg_sroi *a)
99
+{
100
+ REQUIRE_EXT(ctx, RVB);
101
+ return gen_shifti(ctx, a, gen_sro);
102
+}
103
+
104
static bool trans_clzw(DisasContext *ctx, arg_clzw *a)
105
{
106
REQUIRE_64BIT(ctx);
107
@@ -XXX,XX +XXX,XX @@ static bool trans_bextw(DisasContext *ctx, arg_bextw *a)
108
REQUIRE_EXT(ctx, RVB);
109
return gen_shiftw(ctx, a, gen_bext);
110
}
111
+
112
+static bool trans_slow(DisasContext *ctx, arg_slow *a)
113
+{
114
+ REQUIRE_64BIT(ctx);
115
+ REQUIRE_EXT(ctx, RVB);
116
+ return gen_shiftw(ctx, a, gen_slo);
117
+}
118
+
119
+static bool trans_sloiw(DisasContext *ctx, arg_sloiw *a)
120
+{
121
+ REQUIRE_64BIT(ctx);
122
+ REQUIRE_EXT(ctx, RVB);
123
+ return gen_shiftiw(ctx, a, gen_slo);
124
+}
125
+
126
+static bool trans_srow(DisasContext *ctx, arg_srow *a)
127
+{
128
+ REQUIRE_64BIT(ctx);
129
+ REQUIRE_EXT(ctx, RVB);
130
+ return gen_shiftw(ctx, a, gen_sro);
131
+}
132
+
133
+static bool trans_sroiw(DisasContext *ctx, arg_sroiw *a)
134
+{
135
+ REQUIRE_64BIT(ctx);
136
+ REQUIRE_EXT(ctx, RVB);
137
+ return gen_shiftiw(ctx, a, gen_sro);
138
+}
139
--
140
2.31.1
141
142
diff view generated by jsdifflib
1
From: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
1
From: Kito Cheng <kito.cheng@sifive.com>
2
2
3
Signed-off-by: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
3
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
4
Signed-off-by: Frank Chang <frank.chang@sifive.com>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Message-id: 20210311094902.1377593-1-georg.kotheimer@kernkonzept.com
7
Message-id: 20210505160620.15723-12-frank.chang@sifive.com
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
---
9
---
8
target/riscv/csr.c | 7 ++++---
10
target/riscv/insn32.decode | 6 ++++
9
1 file changed, 4 insertions(+), 3 deletions(-)
11
target/riscv/translate.c | 36 +++++++++++++++++++++++
12
target/riscv/insn_trans/trans_rvb.c.inc | 39 +++++++++++++++++++++++++
13
3 files changed, 81 insertions(+)
10
14
11
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
15
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
12
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
13
--- a/target/riscv/csr.c
17
--- a/target/riscv/insn32.decode
14
+++ b/target/riscv/csr.c
18
+++ b/target/riscv/insn32.decode
15
@@ -XXX,XX +XXX,XX @@ static const target_ulong sstatus_v1_10_mask = SSTATUS_SIE | SSTATUS_SPIE |
19
@@ -XXX,XX +XXX,XX @@ binv 0110100 .......... 001 ..... 0110011 @r
16
SSTATUS_UIE | SSTATUS_UPIE | SSTATUS_SPP | SSTATUS_FS | SSTATUS_XS |
20
bext 0100100 .......... 101 ..... 0110011 @r
17
SSTATUS_SUM | SSTATUS_MXR | SSTATUS_SD;
21
slo 0010000 .......... 001 ..... 0110011 @r
18
static const target_ulong sip_writable_mask = SIP_SSIP | MIP_USIP | MIP_UEIP;
22
sro 0010000 .......... 101 ..... 0110011 @r
19
-static const target_ulong hip_writable_mask = MIP_VSSIP | MIP_VSTIP | MIP_VSEIP;
23
+ror 0110000 .......... 101 ..... 0110011 @r
20
+static const target_ulong hip_writable_mask = MIP_VSSIP;
24
+rol 0110000 .......... 001 ..... 0110011 @r
21
+static const target_ulong hvip_writable_mask = MIP_VSSIP | MIP_VSTIP | MIP_VSEIP;
25
22
static const target_ulong vsip_writable_mask = MIP_VSSIP;
26
bseti 00101. ........... 001 ..... 0010011 @sh
23
27
bclri 01001. ........... 001 ..... 0010011 @sh
24
static const char valid_vm_1_10_32[16] = {
28
@@ -XXX,XX +XXX,XX @@ binvi 01101. ........... 001 ..... 0010011 @sh
25
@@ -XXX,XX +XXX,XX @@ static int rmw_hvip(CPURISCVState *env, int csrno, target_ulong *ret_value,
29
bexti 01001. ........... 101 ..... 0010011 @sh
26
target_ulong new_value, target_ulong write_mask)
30
sloi 00100. ........... 001 ..... 0010011 @sh
31
sroi 00100. ........... 101 ..... 0010011 @sh
32
+rori 01100. ........... 101 ..... 0010011 @sh
33
34
# *** RV64B Standard Extension (in addition to RV32B) ***
35
clzw 0110000 00000 ..... 001 ..... 0011011 @r2
36
@@ -XXX,XX +XXX,XX @@ binvw 0110100 .......... 001 ..... 0111011 @r
37
bextw 0100100 .......... 101 ..... 0111011 @r
38
slow 0010000 .......... 001 ..... 0111011 @r
39
srow 0010000 .......... 101 ..... 0111011 @r
40
+rorw 0110000 .......... 101 ..... 0111011 @r
41
+rolw 0110000 .......... 001 ..... 0111011 @r
42
43
bsetiw 0010100 .......... 001 ..... 0011011 @sh5
44
bclriw 0100100 .......... 001 ..... 0011011 @sh5
45
binviw 0110100 .......... 001 ..... 0011011 @sh5
46
sloiw 0010000 .......... 001 ..... 0011011 @sh5
47
sroiw 0010000 .......... 101 ..... 0011011 @sh5
48
+roriw 0110000 .......... 101 ..... 0011011 @sh5
49
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
50
index XXXXXXX..XXXXXXX 100644
51
--- a/target/riscv/translate.c
52
+++ b/target/riscv/translate.c
53
@@ -XXX,XX +XXX,XX @@ static void gen_packuw(TCGv ret, TCGv arg1, TCGv arg2)
54
tcg_temp_free(t);
55
}
56
57
+static void gen_rorw(TCGv ret, TCGv arg1, TCGv arg2)
58
+{
59
+ TCGv_i32 t1 = tcg_temp_new_i32();
60
+ TCGv_i32 t2 = tcg_temp_new_i32();
61
+
62
+ /* truncate to 32-bits */
63
+ tcg_gen_trunc_tl_i32(t1, arg1);
64
+ tcg_gen_trunc_tl_i32(t2, arg2);
65
+
66
+ tcg_gen_rotr_i32(t1, t1, t2);
67
+
68
+ /* sign-extend 64-bits */
69
+ tcg_gen_ext_i32_tl(ret, t1);
70
+
71
+ tcg_temp_free_i32(t1);
72
+ tcg_temp_free_i32(t2);
73
+}
74
+
75
+static void gen_rolw(TCGv ret, TCGv arg1, TCGv arg2)
76
+{
77
+ TCGv_i32 t1 = tcg_temp_new_i32();
78
+ TCGv_i32 t2 = tcg_temp_new_i32();
79
+
80
+ /* truncate to 32-bits */
81
+ tcg_gen_trunc_tl_i32(t1, arg1);
82
+ tcg_gen_trunc_tl_i32(t2, arg2);
83
+
84
+ tcg_gen_rotl_i32(t1, t1, t2);
85
+
86
+ /* sign-extend 64-bits */
87
+ tcg_gen_ext_i32_tl(ret, t1);
88
+
89
+ tcg_temp_free_i32(t1);
90
+ tcg_temp_free_i32(t2);
91
+}
92
+
93
static bool gen_arith(DisasContext *ctx, arg_r *a,
94
void(*func)(TCGv, TCGv, TCGv))
27
{
95
{
28
int ret = rmw_mip(env, 0, ret_value, new_value,
96
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
29
- write_mask & hip_writable_mask);
97
index XXXXXXX..XXXXXXX 100644
30
+ write_mask & hvip_writable_mask);
98
--- a/target/riscv/insn_trans/trans_rvb.c.inc
31
99
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
32
- *ret_value &= hip_writable_mask;
100
@@ -XXX,XX +XXX,XX @@ static bool trans_sroi(DisasContext *ctx, arg_sroi *a)
33
+ *ret_value &= hvip_writable_mask;
101
return gen_shifti(ctx, a, gen_sro);
34
35
return ret;
36
}
102
}
103
104
+static bool trans_ror(DisasContext *ctx, arg_ror *a)
105
+{
106
+ REQUIRE_EXT(ctx, RVB);
107
+ return gen_shift(ctx, a, tcg_gen_rotr_tl);
108
+}
109
+
110
+static bool trans_rori(DisasContext *ctx, arg_rori *a)
111
+{
112
+ REQUIRE_EXT(ctx, RVB);
113
+ return gen_shifti(ctx, a, tcg_gen_rotr_tl);
114
+}
115
+
116
+static bool trans_rol(DisasContext *ctx, arg_rol *a)
117
+{
118
+ REQUIRE_EXT(ctx, RVB);
119
+ return gen_shift(ctx, a, tcg_gen_rotl_tl);
120
+}
121
+
122
static bool trans_clzw(DisasContext *ctx, arg_clzw *a)
123
{
124
REQUIRE_64BIT(ctx);
125
@@ -XXX,XX +XXX,XX @@ static bool trans_sroiw(DisasContext *ctx, arg_sroiw *a)
126
REQUIRE_EXT(ctx, RVB);
127
return gen_shiftiw(ctx, a, gen_sro);
128
}
129
+
130
+static bool trans_rorw(DisasContext *ctx, arg_rorw *a)
131
+{
132
+ REQUIRE_64BIT(ctx);
133
+ REQUIRE_EXT(ctx, RVB);
134
+ return gen_shiftw(ctx, a, gen_rorw);
135
+}
136
+
137
+static bool trans_roriw(DisasContext *ctx, arg_roriw *a)
138
+{
139
+ REQUIRE_64BIT(ctx);
140
+ REQUIRE_EXT(ctx, RVB);
141
+ return gen_shiftiw(ctx, a, gen_rorw);
142
+}
143
+
144
+static bool trans_rolw(DisasContext *ctx, arg_rolw *a)
145
+{
146
+ REQUIRE_64BIT(ctx);
147
+ REQUIRE_EXT(ctx, RVB);
148
+ return gen_shiftw(ctx, a, gen_rolw);
149
+}
37
--
150
--
38
2.30.1
151
2.31.1
39
152
40
153
diff view generated by jsdifflib
New patch
1
1
From: Frank Chang <frank.chang@sifive.com>
2
3
Signed-off-by: Frank Chang <frank.chang@sifive.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20210505160620.15723-13-frank.chang@sifive.com
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
---
8
target/riscv/helper.h | 4 ++
9
target/riscv/insn32.decode | 4 ++
10
target/riscv/bitmanip_helper.c | 64 +++++++++++++++++++++++++
11
target/riscv/translate.c | 28 +++++++++++
12
target/riscv/insn_trans/trans_rvb.c.inc | 31 ++++++++++++
13
target/riscv/meson.build | 1 +
14
6 files changed, 132 insertions(+)
15
create mode 100644 target/riscv/bitmanip_helper.c
16
17
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
18
index XXXXXXX..XXXXXXX 100644
19
--- a/target/riscv/helper.h
20
+++ b/target/riscv/helper.h
21
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_2(fcvt_d_l, TCG_CALL_NO_RWG, i64, env, tl)
22
DEF_HELPER_FLAGS_2(fcvt_d_lu, TCG_CALL_NO_RWG, i64, env, tl)
23
DEF_HELPER_FLAGS_1(fclass_d, TCG_CALL_NO_RWG_SE, tl, i64)
24
25
+/* Bitmanip */
26
+DEF_HELPER_FLAGS_2(grev, TCG_CALL_NO_RWG_SE, tl, tl, tl)
27
+DEF_HELPER_FLAGS_2(grevw, TCG_CALL_NO_RWG_SE, tl, tl, tl)
28
+
29
/* Special functions */
30
DEF_HELPER_3(csrrw, tl, env, tl, tl)
31
DEF_HELPER_4(csrrs, tl, env, tl, tl, tl)
32
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
33
index XXXXXXX..XXXXXXX 100644
34
--- a/target/riscv/insn32.decode
35
+++ b/target/riscv/insn32.decode
36
@@ -XXX,XX +XXX,XX @@ slo 0010000 .......... 001 ..... 0110011 @r
37
sro 0010000 .......... 101 ..... 0110011 @r
38
ror 0110000 .......... 101 ..... 0110011 @r
39
rol 0110000 .......... 001 ..... 0110011 @r
40
+grev 0110100 .......... 101 ..... 0110011 @r
41
42
bseti 00101. ........... 001 ..... 0010011 @sh
43
bclri 01001. ........... 001 ..... 0010011 @sh
44
@@ -XXX,XX +XXX,XX @@ bexti 01001. ........... 101 ..... 0010011 @sh
45
sloi 00100. ........... 001 ..... 0010011 @sh
46
sroi 00100. ........... 101 ..... 0010011 @sh
47
rori 01100. ........... 101 ..... 0010011 @sh
48
+grevi 01101. ........... 101 ..... 0010011 @sh
49
50
# *** RV64B Standard Extension (in addition to RV32B) ***
51
clzw 0110000 00000 ..... 001 ..... 0011011 @r2
52
@@ -XXX,XX +XXX,XX @@ slow 0010000 .......... 001 ..... 0111011 @r
53
srow 0010000 .......... 101 ..... 0111011 @r
54
rorw 0110000 .......... 101 ..... 0111011 @r
55
rolw 0110000 .......... 001 ..... 0111011 @r
56
+grevw 0110100 .......... 101 ..... 0111011 @r
57
58
bsetiw 0010100 .......... 001 ..... 0011011 @sh5
59
bclriw 0100100 .......... 001 ..... 0011011 @sh5
60
@@ -XXX,XX +XXX,XX @@ binviw 0110100 .......... 001 ..... 0011011 @sh5
61
sloiw 0010000 .......... 001 ..... 0011011 @sh5
62
sroiw 0010000 .......... 101 ..... 0011011 @sh5
63
roriw 0110000 .......... 101 ..... 0011011 @sh5
64
+greviw 0110100 .......... 101 ..... 0011011 @sh5
65
diff --git a/target/riscv/bitmanip_helper.c b/target/riscv/bitmanip_helper.c
66
new file mode 100644
67
index XXXXXXX..XXXXXXX
68
--- /dev/null
69
+++ b/target/riscv/bitmanip_helper.c
70
@@ -XXX,XX +XXX,XX @@
71
+/*
72
+ * RISC-V Bitmanip Extension Helpers for QEMU.
73
+ *
74
+ * Copyright (c) 2020 Kito Cheng, kito.cheng@sifive.com
75
+ * Copyright (c) 2020 Frank Chang, frank.chang@sifive.com
76
+ *
77
+ * This program is free software; you can redistribute it and/or modify it
78
+ * under the terms and conditions of the GNU General Public License,
79
+ * version 2 or later, as published by the Free Software Foundation.
80
+ *
81
+ * This program is distributed in the hope it will be useful, but WITHOUT
82
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
83
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
84
+ * more details.
85
+ *
86
+ * You should have received a copy of the GNU General Public License along with
87
+ * this program. If not, see <http://www.gnu.org/licenses/>.
88
+ */
89
+
90
+#include "qemu/osdep.h"
91
+#include "qemu/host-utils.h"
92
+#include "exec/exec-all.h"
93
+#include "exec/helper-proto.h"
94
+#include "tcg/tcg.h"
95
+
96
+static const uint64_t adjacent_masks[] = {
97
+ dup_const(MO_8, 0x55),
98
+ dup_const(MO_8, 0x33),
99
+ dup_const(MO_8, 0x0f),
100
+ dup_const(MO_16, 0xff),
101
+ dup_const(MO_32, 0xffff),
102
+ UINT32_MAX
103
+};
104
+
105
+static inline target_ulong do_swap(target_ulong x, uint64_t mask, int shift)
106
+{
107
+ return ((x & mask) << shift) | ((x & ~mask) >> shift);
108
+}
109
+
110
+static target_ulong do_grev(target_ulong rs1,
111
+ target_ulong rs2,
112
+ int bits)
113
+{
114
+ target_ulong x = rs1;
115
+ int i, shift;
116
+
117
+ for (i = 0, shift = 1; shift < bits; i++, shift <<= 1) {
118
+ if (rs2 & shift) {
119
+ x = do_swap(x, adjacent_masks[i], shift);
120
+ }
121
+ }
122
+
123
+ return x;
124
+}
125
+
126
+target_ulong HELPER(grev)(target_ulong rs1, target_ulong rs2)
127
+{
128
+ return do_grev(rs1, rs2, TARGET_LONG_BITS);
129
+}
130
+
131
+target_ulong HELPER(grevw)(target_ulong rs1, target_ulong rs2)
132
+{
133
+ return do_grev(rs1, rs2, 32);
134
+}
135
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
136
index XXXXXXX..XXXXXXX 100644
137
--- a/target/riscv/translate.c
138
+++ b/target/riscv/translate.c
139
@@ -XXX,XX +XXX,XX @@ static void gen_sro(TCGv ret, TCGv arg1, TCGv arg2)
140
tcg_gen_not_tl(ret, ret);
141
}
142
143
+static bool gen_grevi(DisasContext *ctx, arg_grevi *a)
144
+{
145
+ TCGv source1 = tcg_temp_new();
146
+ TCGv source2;
147
+
148
+ gen_get_gpr(source1, a->rs1);
149
+
150
+ if (a->shamt == (TARGET_LONG_BITS - 8)) {
151
+ /* rev8, byte swaps */
152
+ tcg_gen_bswap_tl(source1, source1);
153
+ } else {
154
+ source2 = tcg_temp_new();
155
+ tcg_gen_movi_tl(source2, a->shamt);
156
+ gen_helper_grev(source1, source1, source2);
157
+ tcg_temp_free(source2);
158
+ }
159
+
160
+ gen_set_gpr(a->rd, source1);
161
+ tcg_temp_free(source1);
162
+ return true;
163
+}
164
+
165
static void gen_ctzw(TCGv ret, TCGv arg1)
166
{
167
tcg_gen_ori_tl(ret, arg1, (target_ulong)MAKE_64BIT_MASK(32, 32));
168
@@ -XXX,XX +XXX,XX @@ static void gen_rolw(TCGv ret, TCGv arg1, TCGv arg2)
169
tcg_temp_free_i32(t2);
170
}
171
172
+static void gen_grevw(TCGv ret, TCGv arg1, TCGv arg2)
173
+{
174
+ tcg_gen_ext32u_tl(arg1, arg1);
175
+ gen_helper_grev(ret, arg1, arg2);
176
+}
177
+
178
static bool gen_arith(DisasContext *ctx, arg_r *a,
179
void(*func)(TCGv, TCGv, TCGv))
180
{
181
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
182
index XXXXXXX..XXXXXXX 100644
183
--- a/target/riscv/insn_trans/trans_rvb.c.inc
184
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
185
@@ -XXX,XX +XXX,XX @@ static bool trans_rol(DisasContext *ctx, arg_rol *a)
186
return gen_shift(ctx, a, tcg_gen_rotl_tl);
187
}
188
189
+static bool trans_grev(DisasContext *ctx, arg_grev *a)
190
+{
191
+ REQUIRE_EXT(ctx, RVB);
192
+ return gen_shift(ctx, a, gen_helper_grev);
193
+}
194
+
195
+static bool trans_grevi(DisasContext *ctx, arg_grevi *a)
196
+{
197
+ REQUIRE_EXT(ctx, RVB);
198
+
199
+ if (a->shamt >= TARGET_LONG_BITS) {
200
+ return false;
201
+ }
202
+
203
+ return gen_grevi(ctx, a);
204
+}
205
+
206
static bool trans_clzw(DisasContext *ctx, arg_clzw *a)
207
{
208
REQUIRE_64BIT(ctx);
209
@@ -XXX,XX +XXX,XX @@ static bool trans_rolw(DisasContext *ctx, arg_rolw *a)
210
REQUIRE_EXT(ctx, RVB);
211
return gen_shiftw(ctx, a, gen_rolw);
212
}
213
+
214
+static bool trans_grevw(DisasContext *ctx, arg_grevw *a)
215
+{
216
+ REQUIRE_64BIT(ctx);
217
+ REQUIRE_EXT(ctx, RVB);
218
+ return gen_shiftw(ctx, a, gen_grevw);
219
+}
220
+
221
+static bool trans_greviw(DisasContext *ctx, arg_greviw *a)
222
+{
223
+ REQUIRE_64BIT(ctx);
224
+ REQUIRE_EXT(ctx, RVB);
225
+ return gen_shiftiw(ctx, a, gen_grevw);
226
+}
227
diff --git a/target/riscv/meson.build b/target/riscv/meson.build
228
index XXXXXXX..XXXXXXX 100644
229
--- a/target/riscv/meson.build
230
+++ b/target/riscv/meson.build
231
@@ -XXX,XX +XXX,XX @@ riscv_ss.add(files(
232
'gdbstub.c',
233
'op_helper.c',
234
'vector_helper.c',
235
+ 'bitmanip_helper.c',
236
'translate.c',
237
))
238
239
--
240
2.31.1
241
242
diff view generated by jsdifflib
1
From: Jim Shu <cwshu@andestech.com>
1
From: Frank Chang <frank.chang@sifive.com>
2
2
3
Currently, PMP permission checking of TLB page is bypassed if TLB hits
3
Signed-off-by: Frank Chang <frank.chang@sifive.com>
4
Fix it by propagating PMP permission to TLB page permission.
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
5
Message-id: 20210505160620.15723-14-frank.chang@sifive.com
6
PMP permission checking also use MMU-style API to change TLB permission
7
and size.
8
9
Signed-off-by: Jim Shu <cwshu@andestech.com>
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
11
Message-id: 1613916082-19528-2-git-send-email-cwshu@andestech.com
12
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
13
---
7
---
14
target/riscv/pmp.h | 4 +-
8
target/riscv/helper.h | 2 ++
15
target/riscv/cpu_helper.c | 84 +++++++++++++++++++++++++++++----------
9
target/riscv/insn32.decode | 4 ++++
16
target/riscv/pmp.c | 80 +++++++++++++++++++++++++++----------
10
target/riscv/bitmanip_helper.c | 26 +++++++++++++++++++++++++
17
3 files changed, 125 insertions(+), 43 deletions(-)
11
target/riscv/translate.c | 6 ++++++
12
target/riscv/insn_trans/trans_rvb.c.inc | 26 +++++++++++++++++++++++++
13
5 files changed, 64 insertions(+)
18
14
19
diff --git a/target/riscv/pmp.h b/target/riscv/pmp.h
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
20
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
21
--- a/target/riscv/pmp.h
17
--- a/target/riscv/helper.h
22
+++ b/target/riscv/pmp.h
18
+++ b/target/riscv/helper.h
23
@@ -XXX,XX +XXX,XX @@ void pmpaddr_csr_write(CPURISCVState *env, uint32_t addr_index,
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_1(fclass_d, TCG_CALL_NO_RWG_SE, tl, i64)
24
target_ulong val);
20
/* Bitmanip */
25
target_ulong pmpaddr_csr_read(CPURISCVState *env, uint32_t addr_index);
21
DEF_HELPER_FLAGS_2(grev, TCG_CALL_NO_RWG_SE, tl, tl, tl)
26
bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
22
DEF_HELPER_FLAGS_2(grevw, TCG_CALL_NO_RWG_SE, tl, tl, tl)
27
- target_ulong size, pmp_priv_t priv, target_ulong mode);
23
+DEF_HELPER_FLAGS_2(gorc, TCG_CALL_NO_RWG_SE, tl, tl, tl)
28
+ target_ulong size, pmp_priv_t privs, pmp_priv_t *allowed_privs,
24
+DEF_HELPER_FLAGS_2(gorcw, TCG_CALL_NO_RWG_SE, tl, tl, tl)
29
+ target_ulong mode);
25
30
bool pmp_is_range_in_tlb(CPURISCVState *env, hwaddr tlb_sa,
26
/* Special functions */
31
target_ulong *tlb_size);
27
DEF_HELPER_3(csrrw, tl, env, tl, tl)
32
void pmp_update_rule_addr(CPURISCVState *env, uint32_t pmp_index);
28
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
33
void pmp_update_rule_nums(CPURISCVState *env);
34
uint32_t pmp_get_num_rules(CPURISCVState *env);
35
+int pmp_priv_to_page_prot(pmp_priv_t pmp_priv);
36
37
#endif
38
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
39
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
40
--- a/target/riscv/cpu_helper.c
30
--- a/target/riscv/insn32.decode
41
+++ b/target/riscv/cpu_helper.c
31
+++ b/target/riscv/insn32.decode
42
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_set_mode(CPURISCVState *env, target_ulong newpriv)
32
@@ -XXX,XX +XXX,XX @@ sro 0010000 .......... 101 ..... 0110011 @r
43
env->load_res = -1;
33
ror 0110000 .......... 101 ..... 0110011 @r
34
rol 0110000 .......... 001 ..... 0110011 @r
35
grev 0110100 .......... 101 ..... 0110011 @r
36
+gorc 0010100 .......... 101 ..... 0110011 @r
37
38
bseti 00101. ........... 001 ..... 0010011 @sh
39
bclri 01001. ........... 001 ..... 0010011 @sh
40
@@ -XXX,XX +XXX,XX @@ sloi 00100. ........... 001 ..... 0010011 @sh
41
sroi 00100. ........... 101 ..... 0010011 @sh
42
rori 01100. ........... 101 ..... 0010011 @sh
43
grevi 01101. ........... 101 ..... 0010011 @sh
44
+gorci 00101. ........... 101 ..... 0010011 @sh
45
46
# *** RV64B Standard Extension (in addition to RV32B) ***
47
clzw 0110000 00000 ..... 001 ..... 0011011 @r2
48
@@ -XXX,XX +XXX,XX @@ srow 0010000 .......... 101 ..... 0111011 @r
49
rorw 0110000 .......... 101 ..... 0111011 @r
50
rolw 0110000 .......... 001 ..... 0111011 @r
51
grevw 0110100 .......... 101 ..... 0111011 @r
52
+gorcw 0010100 .......... 101 ..... 0111011 @r
53
54
bsetiw 0010100 .......... 001 ..... 0011011 @sh5
55
bclriw 0100100 .......... 001 ..... 0011011 @sh5
56
@@ -XXX,XX +XXX,XX @@ sloiw 0010000 .......... 001 ..... 0011011 @sh5
57
sroiw 0010000 .......... 101 ..... 0011011 @sh5
58
roriw 0110000 .......... 101 ..... 0011011 @sh5
59
greviw 0110100 .......... 101 ..... 0011011 @sh5
60
+gorciw 0010100 .......... 101 ..... 0011011 @sh5
61
diff --git a/target/riscv/bitmanip_helper.c b/target/riscv/bitmanip_helper.c
62
index XXXXXXX..XXXXXXX 100644
63
--- a/target/riscv/bitmanip_helper.c
64
+++ b/target/riscv/bitmanip_helper.c
65
@@ -XXX,XX +XXX,XX @@ target_ulong HELPER(grevw)(target_ulong rs1, target_ulong rs2)
66
{
67
return do_grev(rs1, rs2, 32);
44
}
68
}
45
69
+
46
+/*
70
+static target_ulong do_gorc(target_ulong rs1,
47
+ * get_physical_address_pmp - check PMP permission for this physical address
71
+ target_ulong rs2,
48
+ *
72
+ int bits)
49
+ * Match the PMP region and check permission for this physical address and it's
50
+ * TLB page. Returns 0 if the permission checking was successful
51
+ *
52
+ * @env: CPURISCVState
53
+ * @prot: The returned protection attributes
54
+ * @tlb_size: TLB page size containing addr. It could be modified after PMP
55
+ * permission checking. NULL if not set TLB page for addr.
56
+ * @addr: The physical address to be checked permission
57
+ * @access_type: The type of MMU access
58
+ * @mode: Indicates current privilege level.
59
+ */
60
+static int get_physical_address_pmp(CPURISCVState *env, int *prot,
61
+ target_ulong *tlb_size, hwaddr addr,
62
+ int size, MMUAccessType access_type,
63
+ int mode)
64
+{
73
+{
65
+ pmp_priv_t pmp_priv;
74
+ target_ulong x = rs1;
66
+ target_ulong tlb_size_pmp = 0;
75
+ int i, shift;
67
+
76
+
68
+ if (!riscv_feature(env, RISCV_FEATURE_PMP)) {
77
+ for (i = 0, shift = 1; shift < bits; i++, shift <<= 1) {
69
+ *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
78
+ if (rs2 & shift) {
70
+ return TRANSLATE_SUCCESS;
79
+ x |= do_swap(x, adjacent_masks[i], shift);
71
+ }
72
+
73
+ if (!pmp_hart_has_privs(env, addr, size, 1 << access_type, &pmp_priv,
74
+ mode)) {
75
+ *prot = 0;
76
+ return TRANSLATE_PMP_FAIL;
77
+ }
78
+
79
+ *prot = pmp_priv_to_page_prot(pmp_priv);
80
+ if (tlb_size != NULL) {
81
+ if (pmp_is_range_in_tlb(env, addr & ~(*tlb_size - 1), &tlb_size_pmp)) {
82
+ *tlb_size = tlb_size_pmp;
83
+ }
80
+ }
84
+ }
81
+ }
85
+
82
+
86
+ return TRANSLATE_SUCCESS;
83
+ return x;
87
+}
84
+}
88
+
85
+
89
/* get_physical_address - get the physical address for this virtual address
86
+target_ulong HELPER(gorc)(target_ulong rs1, target_ulong rs2)
90
*
91
* Do a page table walk to obtain the physical address corresponding to a
92
@@ -XXX,XX +XXX,XX @@ restart:
93
pte_addr = base + idx * ptesize;
94
}
95
96
- if (riscv_feature(env, RISCV_FEATURE_PMP) &&
97
- !pmp_hart_has_privs(env, pte_addr, sizeof(target_ulong),
98
- 1 << MMU_DATA_LOAD, PRV_S)) {
99
+ int pmp_prot;
100
+ int pmp_ret = get_physical_address_pmp(env, &pmp_prot, NULL, pte_addr,
101
+ sizeof(target_ulong),
102
+ MMU_DATA_LOAD, PRV_S);
103
+ if (pmp_ret != TRANSLATE_SUCCESS) {
104
return TRANSLATE_PMP_FAIL;
105
}
106
107
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
108
#ifndef CONFIG_USER_ONLY
109
vaddr im_address;
110
hwaddr pa = 0;
111
- int prot, prot2;
112
+ int prot, prot2, prot_pmp;
113
bool pmp_violation = false;
114
bool first_stage_error = true;
115
bool two_stage_lookup = false;
116
int ret = TRANSLATE_FAIL;
117
int mode = mmu_idx;
118
- target_ulong tlb_size = 0;
119
+ /* default TLB page size */
120
+ target_ulong tlb_size = TARGET_PAGE_SIZE;
121
122
env->guest_phys_fault_addr = 0;
123
124
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
125
126
prot &= prot2;
127
128
- if (riscv_feature(env, RISCV_FEATURE_PMP) &&
129
- (ret == TRANSLATE_SUCCESS) &&
130
- !pmp_hart_has_privs(env, pa, size, 1 << access_type, mode)) {
131
- ret = TRANSLATE_PMP_FAIL;
132
+ if (ret == TRANSLATE_SUCCESS) {
133
+ ret = get_physical_address_pmp(env, &prot_pmp, &tlb_size, pa,
134
+ size, access_type, mode);
135
+ prot &= prot_pmp;
136
}
137
138
if (ret != TRANSLATE_SUCCESS) {
139
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
140
"%s address=%" VADDR_PRIx " ret %d physical "
141
TARGET_FMT_plx " prot %d\n",
142
__func__, address, ret, pa, prot);
143
- }
144
145
- if (riscv_feature(env, RISCV_FEATURE_PMP) &&
146
- (ret == TRANSLATE_SUCCESS) &&
147
- !pmp_hart_has_privs(env, pa, size, 1 << access_type, mode)) {
148
- ret = TRANSLATE_PMP_FAIL;
149
+ if (ret == TRANSLATE_SUCCESS) {
150
+ ret = get_physical_address_pmp(env, &prot_pmp, &tlb_size, pa,
151
+ size, access_type, mode);
152
+ prot &= prot_pmp;
153
+ }
154
}
155
+
156
if (ret == TRANSLATE_PMP_FAIL) {
157
pmp_violation = true;
158
}
159
160
if (ret == TRANSLATE_SUCCESS) {
161
- if (pmp_is_range_in_tlb(env, pa & TARGET_PAGE_MASK, &tlb_size)) {
162
- tlb_set_page(cs, address & ~(tlb_size - 1), pa & ~(tlb_size - 1),
163
- prot, mmu_idx, tlb_size);
164
- } else {
165
- tlb_set_page(cs, address & TARGET_PAGE_MASK, pa & TARGET_PAGE_MASK,
166
- prot, mmu_idx, TARGET_PAGE_SIZE);
167
- }
168
+ tlb_set_page(cs, address & ~(tlb_size - 1), pa & ~(tlb_size - 1),
169
+ prot, mmu_idx, tlb_size);
170
return true;
171
} else if (probe) {
172
return false;
173
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
174
index XXXXXXX..XXXXXXX 100644
175
--- a/target/riscv/pmp.c
176
+++ b/target/riscv/pmp.c
177
@@ -XXX,XX +XXX,XX @@ static int pmp_is_in_range(CPURISCVState *env, int pmp_index, target_ulong addr)
178
return result;
179
}
180
181
+/*
182
+ * Check if the address has required RWX privs when no PMP entry is matched.
183
+ */
184
+static bool pmp_hart_has_privs_default(CPURISCVState *env, target_ulong addr,
185
+ target_ulong size, pmp_priv_t privs, pmp_priv_t *allowed_privs,
186
+ target_ulong mode)
187
+{
87
+{
188
+ bool ret;
88
+ return do_gorc(rs1, rs2, TARGET_LONG_BITS);
189
+
190
+ if ((!riscv_feature(env, RISCV_FEATURE_PMP)) || (mode == PRV_M)) {
191
+ /*
192
+ * Privileged spec v1.10 states if HW doesn't implement any PMP entry
193
+ * or no PMP entry matches an M-Mode access, the access succeeds.
194
+ */
195
+ ret = true;
196
+ *allowed_privs = PMP_READ | PMP_WRITE | PMP_EXEC;
197
+ } else {
198
+ /*
199
+ * Other modes are not allowed to succeed if they don't * match a rule,
200
+ * but there are rules. We've checked for no rule earlier in this
201
+ * function.
202
+ */
203
+ ret = false;
204
+ *allowed_privs = 0;
205
+ }
206
+
207
+ return ret;
208
+}
89
+}
209
+
90
+
210
91
+target_ulong HELPER(gorcw)(target_ulong rs1, target_ulong rs2)
211
/*
92
+{
212
* Public Interface
93
+ return do_gorc(rs1, rs2, 32);
213
@@ -XXX,XX +XXX,XX @@ static int pmp_is_in_range(CPURISCVState *env, int pmp_index, target_ulong addr)
94
+}
214
* Check if the address has required RWX privs to complete desired operation
95
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
215
*/
96
index XXXXXXX..XXXXXXX 100644
216
bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
97
--- a/target/riscv/translate.c
217
- target_ulong size, pmp_priv_t privs, target_ulong mode)
98
+++ b/target/riscv/translate.c
218
+ target_ulong size, pmp_priv_t privs, pmp_priv_t *allowed_privs,
99
@@ -XXX,XX +XXX,XX @@ static void gen_grevw(TCGv ret, TCGv arg1, TCGv arg2)
219
+ target_ulong mode)
100
gen_helper_grev(ret, arg1, arg2);
101
}
102
103
+static void gen_gorcw(TCGv ret, TCGv arg1, TCGv arg2)
104
+{
105
+ tcg_gen_ext32u_tl(arg1, arg1);
106
+ gen_helper_gorcw(ret, arg1, arg2);
107
+}
108
+
109
static bool gen_arith(DisasContext *ctx, arg_r *a,
110
void(*func)(TCGv, TCGv, TCGv))
220
{
111
{
221
int i = 0;
112
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
222
int ret = -1;
113
index XXXXXXX..XXXXXXX 100644
223
int pmp_size = 0;
114
--- a/target/riscv/insn_trans/trans_rvb.c.inc
224
target_ulong s = 0;
115
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
225
target_ulong e = 0;
116
@@ -XXX,XX +XXX,XX @@ static bool trans_grevi(DisasContext *ctx, arg_grevi *a)
226
- pmp_priv_t allowed_privs = 0;
117
return gen_grevi(ctx, a);
227
228
/* Short cut if no rules */
229
if (0 == pmp_get_num_rules(env)) {
230
- return (env->priv == PRV_M) ? true : false;
231
+ return pmp_hart_has_privs_default(env, addr, size, privs,
232
+ allowed_privs, mode);
233
}
234
235
if (size == 0) {
236
@@ -XXX,XX +XXX,XX @@ bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
237
* check
238
*/
239
if (((s + e) == 2) && (PMP_AMATCH_OFF != a_field)) {
240
- allowed_privs = PMP_READ | PMP_WRITE | PMP_EXEC;
241
+ *allowed_privs = PMP_READ | PMP_WRITE | PMP_EXEC;
242
if ((mode != PRV_M) || pmp_is_locked(env, i)) {
243
- allowed_privs &= env->pmp_state.pmp[i].cfg_reg;
244
+ *allowed_privs &= env->pmp_state.pmp[i].cfg_reg;
245
}
246
247
- if ((privs & allowed_privs) == privs) {
248
- ret = 1;
249
- break;
250
- } else {
251
- ret = 0;
252
- break;
253
- }
254
+ ret = ((privs & *allowed_privs) == privs);
255
+ break;
256
}
257
}
258
259
/* No rule matched */
260
if (ret == -1) {
261
- if (mode == PRV_M) {
262
- ret = 1; /* Privileged spec v1.10 states if no PMP entry matches an
263
- * M-Mode access, the access succeeds */
264
- } else {
265
- ret = 0; /* Other modes are not allowed to succeed if they don't
266
- * match a rule, but there are rules. We've checked for
267
- * no rule earlier in this function. */
268
- }
269
+ return pmp_hart_has_privs_default(env, addr, size, privs,
270
+ allowed_privs, mode);
271
}
272
273
return ret == 1 ? true : false;
274
}
118
}
275
119
276
-
120
+static bool trans_gorc(DisasContext *ctx, arg_gorc *a)
277
/*
121
+{
278
* Handle a write to a pmpcfg CSP
122
+ REQUIRE_EXT(ctx, RVB);
279
*/
123
+ return gen_shift(ctx, a, gen_helper_gorc);
280
@@ -XXX,XX +XXX,XX @@ bool pmp_is_range_in_tlb(CPURISCVState *env, hwaddr tlb_sa,
124
+}
281
125
+
282
return false;
126
+static bool trans_gorci(DisasContext *ctx, arg_gorci *a)
127
+{
128
+ REQUIRE_EXT(ctx, RVB);
129
+ return gen_shifti(ctx, a, gen_helper_gorc);
130
+}
131
+
132
static bool trans_clzw(DisasContext *ctx, arg_clzw *a)
133
{
134
REQUIRE_64BIT(ctx);
135
@@ -XXX,XX +XXX,XX @@ static bool trans_greviw(DisasContext *ctx, arg_greviw *a)
136
REQUIRE_EXT(ctx, RVB);
137
return gen_shiftiw(ctx, a, gen_grevw);
283
}
138
}
284
+
139
+
285
+/*
140
+static bool trans_gorcw(DisasContext *ctx, arg_gorcw *a)
286
+ * Convert PMP privilege to TLB page privilege.
287
+ */
288
+int pmp_priv_to_page_prot(pmp_priv_t pmp_priv)
289
+{
141
+{
290
+ int prot = 0;
142
+ REQUIRE_64BIT(ctx);
143
+ REQUIRE_EXT(ctx, RVB);
144
+ return gen_shiftw(ctx, a, gen_gorcw);
145
+}
291
+
146
+
292
+ if (pmp_priv & PMP_READ) {
147
+static bool trans_gorciw(DisasContext *ctx, arg_gorciw *a)
293
+ prot |= PAGE_READ;
148
+{
294
+ }
149
+ REQUIRE_64BIT(ctx);
295
+ if (pmp_priv & PMP_WRITE) {
150
+ REQUIRE_EXT(ctx, RVB);
296
+ prot |= PAGE_WRITE;
151
+ return gen_shiftiw(ctx, a, gen_gorcw);
297
+ }
298
+ if (pmp_priv & PMP_EXEC) {
299
+ prot |= PAGE_EXEC;
300
+ }
301
+
302
+ return prot;
303
+}
152
+}
304
--
153
--
305
2.30.1
154
2.31.1
306
155
307
156
diff view generated by jsdifflib
1
From: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
1
From: Kito Cheng <kito.cheng@sifive.com>
2
2
3
The previous implementation was broken in many ways:
3
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
4
- Used mideleg instead of hideleg to mask accesses
4
Signed-off-by: Frank Chang <frank.chang@sifive.com>
5
- Used MIP_VSSIP instead of VS_MODE_INTERRUPTS to mask writes to vsie
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
- Did not shift between S bits and VS bits (VSEIP <-> SEIP, ...)
6
Message-id: 20210505160620.15723-15-frank.chang@sifive.com
7
8
Signed-off-by: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-id: 20210311094738.1376795-1-georg.kotheimer@kernkonzept.com
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
8
---
13
target/riscv/csr.c | 68 +++++++++++++++++++++++-----------------------
9
target/riscv/insn32.decode | 6 +++++
14
1 file changed, 34 insertions(+), 34 deletions(-)
10
target/riscv/translate.c | 32 +++++++++++++++++++++++++
11
target/riscv/insn_trans/trans_rvb.c.inc | 24 +++++++++++++++++++
12
3 files changed, 62 insertions(+)
15
13
16
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
14
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
17
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
18
--- a/target/riscv/csr.c
16
--- a/target/riscv/insn32.decode
19
+++ b/target/riscv/csr.c
17
+++ b/target/riscv/insn32.decode
20
@@ -XXX,XX +XXX,XX @@ static int write_sstatus(CPURISCVState *env, int csrno, target_ulong val)
18
@@ -XXX,XX +XXX,XX @@ ror 0110000 .......... 101 ..... 0110011 @r
21
return write_mstatus(env, CSR_MSTATUS, newval);
19
rol 0110000 .......... 001 ..... 0110011 @r
20
grev 0110100 .......... 101 ..... 0110011 @r
21
gorc 0010100 .......... 101 ..... 0110011 @r
22
+sh1add 0010000 .......... 010 ..... 0110011 @r
23
+sh2add 0010000 .......... 100 ..... 0110011 @r
24
+sh3add 0010000 .......... 110 ..... 0110011 @r
25
26
bseti 00101. ........... 001 ..... 0010011 @sh
27
bclri 01001. ........... 001 ..... 0010011 @sh
28
@@ -XXX,XX +XXX,XX @@ rorw 0110000 .......... 101 ..... 0111011 @r
29
rolw 0110000 .......... 001 ..... 0111011 @r
30
grevw 0110100 .......... 101 ..... 0111011 @r
31
gorcw 0010100 .......... 101 ..... 0111011 @r
32
+sh1add_uw 0010000 .......... 010 ..... 0111011 @r
33
+sh2add_uw 0010000 .......... 100 ..... 0111011 @r
34
+sh3add_uw 0010000 .......... 110 ..... 0111011 @r
35
36
bsetiw 0010100 .......... 001 ..... 0011011 @sh5
37
bclriw 0100100 .......... 001 ..... 0011011 @sh5
38
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/target/riscv/translate.c
41
+++ b/target/riscv/translate.c
42
@@ -XXX,XX +XXX,XX @@ static bool gen_grevi(DisasContext *ctx, arg_grevi *a)
43
return true;
22
}
44
}
23
45
24
+static int read_vsie(CPURISCVState *env, int csrno, target_ulong *val)
46
+#define GEN_SHADD(SHAMT) \
25
+{
47
+static void gen_sh##SHAMT##add(TCGv ret, TCGv arg1, TCGv arg2) \
26
+ /* Shift the VS bits to their S bit location in vsie */
48
+{ \
27
+ *val = (env->mie & env->hideleg & VS_MODE_INTERRUPTS) >> 1;
49
+ TCGv t = tcg_temp_new(); \
28
+ return 0;
50
+ \
51
+ tcg_gen_shli_tl(t, arg1, SHAMT); \
52
+ tcg_gen_add_tl(ret, t, arg2); \
53
+ \
54
+ tcg_temp_free(t); \
29
+}
55
+}
30
+
56
+
31
static int read_sie(CPURISCVState *env, int csrno, target_ulong *val)
57
+GEN_SHADD(1)
58
+GEN_SHADD(2)
59
+GEN_SHADD(3)
60
+
61
static void gen_ctzw(TCGv ret, TCGv arg1)
32
{
62
{
33
if (riscv_cpu_virt_enabled(env)) {
63
tcg_gen_ori_tl(ret, arg1, (target_ulong)MAKE_64BIT_MASK(32, 32));
34
- /* Tell the guest the VS bits, shifted to the S bit locations */
64
@@ -XXX,XX +XXX,XX @@ static void gen_gorcw(TCGv ret, TCGv arg1, TCGv arg2)
35
- *val = (env->mie & env->mideleg & VS_MODE_INTERRUPTS) >> 1;
65
gen_helper_gorcw(ret, arg1, arg2);
36
+ read_vsie(env, CSR_VSIE, val);
37
} else {
38
*val = env->mie & env->mideleg;
39
}
40
return 0;
41
}
66
}
42
67
43
-static int write_sie(CPURISCVState *env, int csrno, target_ulong val)
68
+#define GEN_SHADD_UW(SHAMT) \
44
+static int write_vsie(CPURISCVState *env, int csrno, target_ulong val)
69
+static void gen_sh##SHAMT##add_uw(TCGv ret, TCGv arg1, TCGv arg2) \
45
{
70
+{ \
46
- target_ulong newval;
71
+ TCGv t = tcg_temp_new(); \
47
+ /* Shift the S bits to their VS bit location in mie */
72
+ \
48
+ target_ulong newval = (env->mie & ~VS_MODE_INTERRUPTS) |
73
+ tcg_gen_ext32u_tl(t, arg1); \
49
+ ((val << 1) & env->hideleg & VS_MODE_INTERRUPTS);
74
+ \
50
+ return write_mie(env, CSR_MIE, newval);
75
+ tcg_gen_shli_tl(t, t, SHAMT); \
51
+}
76
+ tcg_gen_add_tl(ret, t, arg2); \
52
77
+ \
53
+static int write_sie(CPURISCVState *env, int csrno, target_ulong val)
78
+ tcg_temp_free(t); \
54
+{
55
if (riscv_cpu_virt_enabled(env)) {
56
- /* Shift the guests S bits to VS */
57
- newval = (env->mie & ~VS_MODE_INTERRUPTS) |
58
- ((val << 1) & VS_MODE_INTERRUPTS);
59
+ write_vsie(env, CSR_VSIE, val);
60
} else {
61
- newval = (env->mie & ~S_MODE_INTERRUPTS) | (val & S_MODE_INTERRUPTS);
62
+ target_ulong newval = (env->mie & ~S_MODE_INTERRUPTS) |
63
+ (val & S_MODE_INTERRUPTS);
64
+ write_mie(env, CSR_MIE, newval);
65
}
66
67
- return write_mie(env, CSR_MIE, newval);
68
+ return 0;
69
}
70
71
static int read_stvec(CPURISCVState *env, int csrno, target_ulong *val)
72
@@ -XXX,XX +XXX,XX @@ static int write_sbadaddr(CPURISCVState *env, int csrno, target_ulong val)
73
return 0;
74
}
75
76
+static int rmw_vsip(CPURISCVState *env, int csrno, target_ulong *ret_value,
77
+ target_ulong new_value, target_ulong write_mask)
78
+{
79
+ /* Shift the S bits to their VS bit location in mip */
80
+ int ret = rmw_mip(env, 0, ret_value, new_value << 1,
81
+ (write_mask << 1) & vsip_writable_mask & env->hideleg);
82
+ *ret_value &= VS_MODE_INTERRUPTS;
83
+ /* Shift the VS bits to their S bit location in vsip */
84
+ *ret_value >>= 1;
85
+ return ret;
86
+}
79
+}
87
+
80
+
88
static int rmw_sip(CPURISCVState *env, int csrno, target_ulong *ret_value,
81
+GEN_SHADD_UW(1)
89
target_ulong new_value, target_ulong write_mask)
82
+GEN_SHADD_UW(2)
83
+GEN_SHADD_UW(3)
84
+
85
static bool gen_arith(DisasContext *ctx, arg_r *a,
86
void(*func)(TCGv, TCGv, TCGv))
90
{
87
{
91
int ret;
88
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
92
89
index XXXXXXX..XXXXXXX 100644
93
if (riscv_cpu_virt_enabled(env)) {
90
--- a/target/riscv/insn_trans/trans_rvb.c.inc
94
- /* Shift the new values to line up with the VS bits */
91
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
95
- ret = rmw_mip(env, CSR_MSTATUS, ret_value, new_value << 1,
92
@@ -XXX,XX +XXX,XX @@ static bool trans_gorci(DisasContext *ctx, arg_gorci *a)
96
- (write_mask & sip_writable_mask) << 1 & env->mideleg);
93
return gen_shifti(ctx, a, gen_helper_gorc);
97
- ret &= vsip_writable_mask;
98
- ret >>= 1;
99
+ ret = rmw_vsip(env, CSR_VSIP, ret_value, new_value, write_mask);
100
} else {
101
ret = rmw_mip(env, CSR_MSTATUS, ret_value, new_value,
102
write_mask & env->mideleg & sip_writable_mask);
103
@@ -XXX,XX +XXX,XX @@ static int write_vsstatus(CPURISCVState *env, int csrno, target_ulong val)
104
return 0;
105
}
94
}
106
95
107
-static int rmw_vsip(CPURISCVState *env, int csrno, target_ulong *ret_value,
96
+#define GEN_TRANS_SHADD(SHAMT) \
108
- target_ulong new_value, target_ulong write_mask)
97
+static bool trans_sh##SHAMT##add(DisasContext *ctx, arg_sh##SHAMT##add *a) \
109
-{
98
+{ \
110
- int ret = rmw_mip(env, 0, ret_value, new_value,
99
+ REQUIRE_EXT(ctx, RVB); \
111
- write_mask & env->mideleg & vsip_writable_mask);
100
+ return gen_arith(ctx, a, gen_sh##SHAMT##add); \
112
- return ret;
101
+}
113
-}
102
+
114
-
103
+GEN_TRANS_SHADD(1)
115
-static int read_vsie(CPURISCVState *env, int csrno, target_ulong *val)
104
+GEN_TRANS_SHADD(2)
116
-{
105
+GEN_TRANS_SHADD(3)
117
- *val = env->mie & env->mideleg & VS_MODE_INTERRUPTS;
106
+
118
- return 0;
107
static bool trans_clzw(DisasContext *ctx, arg_clzw *a)
119
-}
120
-
121
-static int write_vsie(CPURISCVState *env, int csrno, target_ulong val)
122
-{
123
- target_ulong newval = (env->mie & ~env->mideleg) | (val & env->mideleg & MIP_VSSIP);
124
- return write_mie(env, CSR_MIE, newval);
125
-}
126
-
127
static int read_vstvec(CPURISCVState *env, int csrno, target_ulong *val)
128
{
108
{
129
*val = env->vstvec;
109
REQUIRE_64BIT(ctx);
110
@@ -XXX,XX +XXX,XX @@ static bool trans_gorciw(DisasContext *ctx, arg_gorciw *a)
111
REQUIRE_EXT(ctx, RVB);
112
return gen_shiftiw(ctx, a, gen_gorcw);
113
}
114
+
115
+#define GEN_TRANS_SHADD_UW(SHAMT) \
116
+static bool trans_sh##SHAMT##add_uw(DisasContext *ctx, \
117
+ arg_sh##SHAMT##add_uw *a) \
118
+{ \
119
+ REQUIRE_64BIT(ctx); \
120
+ REQUIRE_EXT(ctx, RVB); \
121
+ return gen_arith(ctx, a, gen_sh##SHAMT##add_uw); \
122
+}
123
+
124
+GEN_TRANS_SHADD_UW(1)
125
+GEN_TRANS_SHADD_UW(2)
126
+GEN_TRANS_SHADD_UW(3)
130
--
127
--
131
2.30.1
128
2.31.1
132
129
133
130
diff view generated by jsdifflib
1
From: Jim Shu <cwshu@andestech.com>
1
From: Kito Cheng <kito.cheng@sifive.com>
2
2
3
Like MMU translation, add qemu log of PMP permission checking for
3
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
4
debugging.
4
Signed-off-by: Frank Chang <frank.chang@sifive.com>
5
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Jim Shu <cwshu@andestech.com>
6
Message-id: 20210505160620.15723-16-frank.chang@sifive.com
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-id: 1613916082-19528-3-git-send-email-cwshu@andestech.com
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
---
8
---
11
target/riscv/cpu_helper.c | 12 ++++++++++++
9
target/riscv/insn32.decode | 3 +++
12
1 file changed, 12 insertions(+)
10
target/riscv/translate.c | 6 ++++++
11
target/riscv/insn_trans/trans_rvb.c.inc | 26 +++++++++++++++++++++++++
12
3 files changed, 35 insertions(+)
13
13
14
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
14
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
15
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/riscv/cpu_helper.c
16
--- a/target/riscv/insn32.decode
17
+++ b/target/riscv/cpu_helper.c
17
+++ b/target/riscv/insn32.decode
18
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
18
@@ -XXX,XX +XXX,XX @@ gorcw 0010100 .......... 101 ..... 0111011 @r
19
if (ret == TRANSLATE_SUCCESS) {
19
sh1add_uw 0010000 .......... 010 ..... 0111011 @r
20
ret = get_physical_address_pmp(env, &prot_pmp, &tlb_size, pa,
20
sh2add_uw 0010000 .......... 100 ..... 0111011 @r
21
size, access_type, mode);
21
sh3add_uw 0010000 .......... 110 ..... 0111011 @r
22
+add_uw 0000100 .......... 000 ..... 0111011 @r
23
24
bsetiw 0010100 .......... 001 ..... 0011011 @sh5
25
bclriw 0100100 .......... 001 ..... 0011011 @sh5
26
@@ -XXX,XX +XXX,XX @@ sroiw 0010000 .......... 101 ..... 0011011 @sh5
27
roriw 0110000 .......... 101 ..... 0011011 @sh5
28
greviw 0110100 .......... 101 ..... 0011011 @sh5
29
gorciw 0010100 .......... 101 ..... 0011011 @sh5
22
+
30
+
23
+ qemu_log_mask(CPU_LOG_MMU,
31
+slli_uw 00001. ........... 001 ..... 0011011 @sh
24
+ "%s PMP address=" TARGET_FMT_plx " ret %d prot"
32
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
25
+ " %d tlb_size " TARGET_FMT_lu "\n",
33
index XXXXXXX..XXXXXXX 100644
26
+ __func__, pa, ret, prot_pmp, tlb_size);
34
--- a/target/riscv/translate.c
35
+++ b/target/riscv/translate.c
36
@@ -XXX,XX +XXX,XX @@ GEN_SHADD_UW(1)
37
GEN_SHADD_UW(2)
38
GEN_SHADD_UW(3)
39
40
+static void gen_add_uw(TCGv ret, TCGv arg1, TCGv arg2)
41
+{
42
+ tcg_gen_ext32u_tl(arg1, arg1);
43
+ tcg_gen_add_tl(ret, arg1, arg2);
44
+}
27
+
45
+
28
prot &= prot_pmp;
46
static bool gen_arith(DisasContext *ctx, arg_r *a,
29
}
47
void(*func)(TCGv, TCGv, TCGv))
30
48
{
31
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
49
diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc
32
if (ret == TRANSLATE_SUCCESS) {
50
index XXXXXXX..XXXXXXX 100644
33
ret = get_physical_address_pmp(env, &prot_pmp, &tlb_size, pa,
51
--- a/target/riscv/insn_trans/trans_rvb.c.inc
34
size, access_type, mode);
52
+++ b/target/riscv/insn_trans/trans_rvb.c.inc
53
@@ -XXX,XX +XXX,XX @@ static bool trans_sh##SHAMT##add_uw(DisasContext *ctx, \
54
GEN_TRANS_SHADD_UW(1)
55
GEN_TRANS_SHADD_UW(2)
56
GEN_TRANS_SHADD_UW(3)
35
+
57
+
36
+ qemu_log_mask(CPU_LOG_MMU,
58
+static bool trans_add_uw(DisasContext *ctx, arg_add_uw *a)
37
+ "%s PMP address=" TARGET_FMT_plx " ret %d prot"
59
+{
38
+ " %d tlb_size " TARGET_FMT_lu "\n",
60
+ REQUIRE_64BIT(ctx);
39
+ __func__, pa, ret, prot_pmp, tlb_size);
61
+ REQUIRE_EXT(ctx, RVB);
62
+ return gen_arith(ctx, a, gen_add_uw);
63
+}
40
+
64
+
41
prot &= prot_pmp;
65
+static bool trans_slli_uw(DisasContext *ctx, arg_slli_uw *a)
42
}
66
+{
43
}
67
+ REQUIRE_64BIT(ctx);
68
+ REQUIRE_EXT(ctx, RVB);
69
+
70
+ TCGv source1 = tcg_temp_new();
71
+ gen_get_gpr(source1, a->rs1);
72
+
73
+ if (a->shamt < 32) {
74
+ tcg_gen_deposit_z_tl(source1, source1, a->shamt, 32);
75
+ } else {
76
+ tcg_gen_shli_tl(source1, source1, a->shamt);
77
+ }
78
+
79
+ gen_set_gpr(a->rd, source1);
80
+ tcg_temp_free(source1);
81
+ return true;
82
+}
44
--
83
--
45
2.30.1
84
2.31.1
46
85
47
86
diff view generated by jsdifflib
1
From: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
1
From: Kito Cheng <kito.cheng@sifive.com>
2
2
3
The current two-stage lookup detection in riscv_cpu_do_interrupt falls
3
B-extension is default off, use cpu rv32 or rv64 with x-b=true to
4
short of its purpose, as all it checks is whether two-stage address
4
enable B-extension.
5
translation either via the hypervisor-load store instructions or the
6
MPRV feature would be allowed.
7
5
8
What we really need instead is whether two-stage address translation was
6
Signed-off-by: Kito Cheng <kito.cheng@sifive.com>
9
active when the exception was raised. However, in riscv_cpu_do_interrupt
7
Signed-off-by: Frank Chang <frank.chang@sifive.com>
10
we do not have the information to reliably detect this. Therefore, when
11
we raise a memory fault exception we have to record whether two-stage
12
address translation is active.
13
14
Signed-off-by: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
15
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
16
Message-id: 20210319141459.1196741-1-georg.kotheimer@kernkonzept.com
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20210505160620.15723-17-frank.chang@sifive.com
17
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
18
---
12
---
19
target/riscv/cpu.h | 4 ++++
13
target/riscv/cpu.h | 1 +
20
target/riscv/cpu.c | 1 +
14
target/riscv/cpu.c | 4 ++++
21
target/riscv/cpu_helper.c | 21 ++++++++-------------
15
2 files changed, 5 insertions(+)
22
3 files changed, 13 insertions(+), 13 deletions(-)
23
16
24
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
17
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
25
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
26
--- a/target/riscv/cpu.h
19
--- a/target/riscv/cpu.h
27
+++ b/target/riscv/cpu.h
20
+++ b/target/riscv/cpu.h
28
@@ -XXX,XX +XXX,XX @@ struct CPURISCVState {
21
@@ -XXX,XX +XXX,XX @@ struct RISCVCPU {
29
target_ulong satp_hs;
22
bool ext_f;
30
uint64_t mstatus_hs;
23
bool ext_d;
31
24
bool ext_c;
32
+ /* Signals whether the current exception occurred with two-stage address
25
+ bool ext_b;
33
+ translation active. */
26
bool ext_s;
34
+ bool two_stage_lookup;
27
bool ext_u;
35
+
28
bool ext_h;
36
target_ulong scounteren;
37
target_ulong mcounteren;
38
39
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
29
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
40
index XXXXXXX..XXXXXXX 100644
30
index XXXXXXX..XXXXXXX 100644
41
--- a/target/riscv/cpu.c
31
--- a/target/riscv/cpu.c
42
+++ b/target/riscv/cpu.c
32
+++ b/target/riscv/cpu.c
43
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_reset(DeviceState *dev)
33
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
44
env->mstatus &= ~(MSTATUS_MIE | MSTATUS_MPRV);
34
if (cpu->cfg.ext_h) {
45
env->mcause = 0;
35
target_misa |= RVH;
46
env->pc = env->resetvec;
47
+ env->two_stage_lookup = false;
48
#endif
49
cs->exception_index = EXCP_NONE;
50
env->load_res = -1;
51
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
52
index XXXXXXX..XXXXXXX 100644
53
--- a/target/riscv/cpu_helper.c
54
+++ b/target/riscv/cpu_helper.c
55
@@ -XXX,XX +XXX,XX @@ static void raise_mmu_exception(CPURISCVState *env, target_ulong address,
56
g_assert_not_reached();
57
}
58
env->badaddr = address;
59
+ env->two_stage_lookup = two_stage;
60
}
61
62
hwaddr riscv_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
63
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
64
}
65
66
env->badaddr = addr;
67
+ env->two_stage_lookup = riscv_cpu_virt_enabled(env) ||
68
+ riscv_cpu_two_stage_lookup(mmu_idx);
69
riscv_raise_exception(&cpu->env, cs->exception_index, retaddr);
70
}
71
72
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_do_unaligned_access(CPUState *cs, vaddr addr,
73
g_assert_not_reached();
74
}
75
env->badaddr = addr;
76
+ env->two_stage_lookup = riscv_cpu_virt_enabled(env) ||
77
+ riscv_cpu_two_stage_lookup(mmu_idx);
78
riscv_raise_exception(env, cs->exception_index, retaddr);
79
}
80
#endif /* !CONFIG_USER_ONLY */
81
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_do_interrupt(CPUState *cs)
82
/* handle the trap in S-mode */
83
if (riscv_has_ext(env, RVH)) {
84
target_ulong hdeleg = async ? env->hideleg : env->hedeleg;
85
- bool two_stage_lookup = false;
86
87
- if (env->priv == PRV_M ||
88
- (env->priv == PRV_S && !riscv_cpu_virt_enabled(env)) ||
89
- (env->priv == PRV_U && !riscv_cpu_virt_enabled(env) &&
90
- get_field(env->hstatus, HSTATUS_HU))) {
91
- two_stage_lookup = true;
92
- }
93
-
94
- if ((riscv_cpu_virt_enabled(env) || two_stage_lookup) && write_tval) {
95
+ if (env->two_stage_lookup && write_tval) {
96
/*
97
* If we are writing a guest virtual address to stval, set
98
* this to 1. If we are trapping to VS we will set this to 0
99
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_do_interrupt(CPUState *cs)
100
riscv_cpu_set_force_hs_excep(env, 0);
101
} else {
102
/* Trap into HS mode */
103
- if (!two_stage_lookup) {
104
- env->hstatus = set_field(env->hstatus, HSTATUS_SPV,
105
- riscv_cpu_virt_enabled(env));
106
- }
107
+ env->hstatus = set_field(env->hstatus, HSTATUS_SPV, false);
108
htval = env->guest_phys_fault_addr;
109
}
110
}
36
}
111
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_do_interrupt(CPUState *cs)
37
+ if (cpu->cfg.ext_b) {
112
* RISC-V ISA Specification.
38
+ target_misa |= RVB;
113
*/
39
+ }
114
40
if (cpu->cfg.ext_v) {
115
+ env->two_stage_lookup = false;
41
target_misa |= RVV;
116
#endif
42
if (!is_power_of_2(cpu->cfg.vlen)) {
117
cs->exception_index = EXCP_NONE; /* mark handled to qemu */
43
@@ -XXX,XX +XXX,XX @@ static Property riscv_cpu_properties[] = {
118
}
44
DEFINE_PROP_BOOL("s", RISCVCPU, cfg.ext_s, true),
45
DEFINE_PROP_BOOL("u", RISCVCPU, cfg.ext_u, true),
46
/* This is experimental so mark with 'x-' */
47
+ DEFINE_PROP_BOOL("x-b", RISCVCPU, cfg.ext_b, false),
48
DEFINE_PROP_BOOL("x-h", RISCVCPU, cfg.ext_h, false),
49
DEFINE_PROP_BOOL("x-v", RISCVCPU, cfg.ext_v, false),
50
DEFINE_PROP_BOOL("Counters", RISCVCPU, cfg.ext_counters, true),
119
--
51
--
120
2.30.1
52
2.31.1
121
53
122
54
diff view generated by jsdifflib
1
From: Alexander Wagner <alexander.wagner@ulal.de>
1
From: Frank Chang <frank.chang@sifive.com>
2
2
3
Not disabling the UART leads to QEMU overwriting the UART receive buffer with
3
Default b-ext version is v0.93.
4
the newest received byte. The rx_level variable is added to allow the use of
5
the existing OpenTitan driver libraries.
6
4
7
Signed-off-by: Alexander Wagner <alexander.wagner@ulal.de>
5
Signed-off-by: Frank Chang <frank.chang@sifive.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 20210309152130.13038-1-alexander.wagner@ulal.de
7
Message-id: 20210505160620.15723-18-frank.chang@sifive.com
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
9
---
12
include/hw/char/ibex_uart.h | 4 ++++
10
target/riscv/cpu.h | 3 +++
13
hw/char/ibex_uart.c | 23 ++++++++++++++++++-----
11
target/riscv/cpu.c | 23 +++++++++++++++++++++++
14
2 files changed, 22 insertions(+), 5 deletions(-)
12
2 files changed, 26 insertions(+)
15
13
16
diff --git a/include/hw/char/ibex_uart.h b/include/hw/char/ibex_uart.h
14
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
17
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/char/ibex_uart.h
16
--- a/target/riscv/cpu.h
19
+++ b/include/hw/char/ibex_uart.h
17
+++ b/target/riscv/cpu.h
20
@@ -XXX,XX +XXX,XX @@ REG32(FIFO_CTRL, 0x1c)
18
@@ -XXX,XX +XXX,XX @@ enum {
21
FIELD(FIFO_CTRL, RXILVL, 2, 3)
19
#define PRIV_VERSION_1_10_0 0x00011000
22
FIELD(FIFO_CTRL, TXILVL, 5, 2)
20
#define PRIV_VERSION_1_11_0 0x00011100
23
REG32(FIFO_STATUS, 0x20)
21
24
+ FIELD(FIFO_STATUS, TXLVL, 0, 5)
22
+#define BEXT_VERSION_0_93_0 0x00009300
25
+ FIELD(FIFO_STATUS, RXLVL, 16, 5)
23
#define VEXT_VERSION_0_07_1 0x00000701
26
REG32(OVRD, 0x24)
24
27
REG32(VAL, 0x28)
25
enum {
28
REG32(TIMEOUT_CTRL, 0x2c)
26
@@ -XXX,XX +XXX,XX @@ struct CPURISCVState {
29
@@ -XXX,XX +XXX,XX @@ struct IbexUartState {
27
target_ulong guest_phys_fault_addr;
30
uint8_t tx_fifo[IBEX_UART_TX_FIFO_SIZE];
28
31
uint32_t tx_level;
29
target_ulong priv_ver;
32
30
+ target_ulong bext_ver;
33
+ uint32_t rx_level;
31
target_ulong vext_ver;
32
target_ulong misa;
33
target_ulong misa_mask;
34
@@ -XXX,XX +XXX,XX @@ struct RISCVCPU {
35
36
char *priv_spec;
37
char *user_spec;
38
+ char *bext_spec;
39
char *vext_spec;
40
uint16_t vlen;
41
uint16_t elen;
42
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
43
index XXXXXXX..XXXXXXX 100644
44
--- a/target/riscv/cpu.c
45
+++ b/target/riscv/cpu.c
46
@@ -XXX,XX +XXX,XX @@ static void set_priv_version(CPURISCVState *env, int priv_ver)
47
env->priv_ver = priv_ver;
48
}
49
50
+static void set_bext_version(CPURISCVState *env, int bext_ver)
51
+{
52
+ env->bext_ver = bext_ver;
53
+}
34
+
54
+
35
QEMUTimer *fifo_trigger_handle;
55
static void set_vext_version(CPURISCVState *env, int vext_ver)
36
uint64_t char_tx_time;
37
38
diff --git a/hw/char/ibex_uart.c b/hw/char/ibex_uart.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/hw/char/ibex_uart.c
41
+++ b/hw/char/ibex_uart.c
42
@@ -XXX,XX +XXX,XX @@ static int ibex_uart_can_receive(void *opaque)
43
{
56
{
44
IbexUartState *s = opaque;
57
env->vext_ver = vext_ver;
45
58
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
46
- if (s->uart_ctrl & R_CTRL_RX_ENABLE_MASK) {
59
CPURISCVState *env = &cpu->env;
47
+ if ((s->uart_ctrl & R_CTRL_RX_ENABLE_MASK)
60
RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(dev);
48
+ && !(s->uart_status & R_STATUS_RXFULL_MASK)) {
61
int priv_version = PRIV_VERSION_1_11_0;
49
return 1;
62
+ int bext_version = BEXT_VERSION_0_93_0;
63
int vext_version = VEXT_VERSION_0_07_1;
64
target_ulong target_misa = env->misa;
65
Error *local_err = NULL;
66
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
50
}
67
}
51
68
52
@@ -XXX,XX +XXX,XX @@ static void ibex_uart_receive(void *opaque, const uint8_t *buf, int size)
69
set_priv_version(env, priv_version);
53
70
+ set_bext_version(env, bext_version);
54
s->uart_status &= ~R_STATUS_RXIDLE_MASK;
71
set_vext_version(env, vext_version);
55
s->uart_status &= ~R_STATUS_RXEMPTY_MASK;
72
56
+ /* The RXFULL is set after receiving a single byte
73
if (cpu->cfg.mmu) {
57
+ * as the FIFO buffers are not yet implemented.
74
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
58
+ */
75
}
59
+ s->uart_status |= R_STATUS_RXFULL_MASK;
76
if (cpu->cfg.ext_b) {
60
+ s->rx_level += 1;
77
target_misa |= RVB;
61
78
+
62
if (size > rx_fifo_level) {
79
+ if (cpu->cfg.bext_spec) {
63
s->uart_intr_state |= R_INTR_STATE_RX_WATERMARK_MASK;
80
+ if (!g_strcmp0(cpu->cfg.bext_spec, "v0.93")) {
64
@@ -XXX,XX +XXX,XX @@ static void ibex_uart_reset(DeviceState *dev)
81
+ bext_version = BEXT_VERSION_0_93_0;
65
s->uart_timeout_ctrl = 0x00000000;
82
+ } else {
66
83
+ error_setg(errp,
67
s->tx_level = 0;
84
+ "Unsupported bitmanip spec version '%s'",
68
+ s->rx_level = 0;
85
+ cpu->cfg.bext_spec);
69
86
+ return;
70
s->char_tx_time = (NANOSECONDS_PER_SECOND / 230400) * 10;
87
+ }
71
88
+ } else {
72
@@ -XXX,XX +XXX,XX @@ static uint64_t ibex_uart_read(void *opaque, hwaddr addr,
89
+ qemu_log("bitmanip version is not specified, "
73
90
+ "use the default value v0.93\n");
74
case R_RDATA:
75
retvalue = s->uart_rdata;
76
- if (s->uart_ctrl & R_CTRL_RX_ENABLE_MASK) {
77
+ if ((s->uart_ctrl & R_CTRL_RX_ENABLE_MASK) && (s->rx_level > 0)) {
78
qemu_chr_fe_accept_input(&s->chr);
79
80
- s->uart_status |= R_STATUS_RXIDLE_MASK;
81
- s->uart_status |= R_STATUS_RXEMPTY_MASK;
82
+ s->rx_level -= 1;
83
+ s->uart_status &= ~R_STATUS_RXFULL_MASK;
84
+ if (s->rx_level == 0) {
85
+ s->uart_status |= R_STATUS_RXIDLE_MASK;
86
+ s->uart_status |= R_STATUS_RXEMPTY_MASK;
87
+ }
91
+ }
92
+ set_bext_version(env, bext_version);
88
}
93
}
89
break;
94
if (cpu->cfg.ext_v) {
90
case R_WDATA:
95
target_misa |= RVV;
91
@@ -XXX,XX +XXX,XX @@ static uint64_t ibex_uart_read(void *opaque, hwaddr addr,
96
@@ -XXX,XX +XXX,XX @@ static Property riscv_cpu_properties[] = {
92
case R_FIFO_STATUS:
97
DEFINE_PROP_BOOL("Zifencei", RISCVCPU, cfg.ext_ifencei, true),
93
retvalue = s->uart_fifo_status;
98
DEFINE_PROP_BOOL("Zicsr", RISCVCPU, cfg.ext_icsr, true),
94
99
DEFINE_PROP_STRING("priv_spec", RISCVCPU, cfg.priv_spec),
95
- retvalue |= s->tx_level & 0x1F;
100
+ DEFINE_PROP_STRING("bext_spec", RISCVCPU, cfg.bext_spec),
96
+ retvalue |= (s->rx_level & 0x1F) << R_FIFO_STATUS_RXLVL_SHIFT;
101
DEFINE_PROP_STRING("vext_spec", RISCVCPU, cfg.vext_spec),
97
+ retvalue |= (s->tx_level & 0x1F) << R_FIFO_STATUS_TXLVL_SHIFT;
102
DEFINE_PROP_UINT16("vlen", RISCVCPU, cfg.vlen, 128),
98
103
DEFINE_PROP_UINT16("elen", RISCVCPU, cfg.elen, 64),
99
qemu_log_mask(LOG_UNIMP,
100
"%s: RX fifos are not supported\n", __func__);
101
@@ -XXX,XX +XXX,XX @@ static void ibex_uart_write(void *opaque, hwaddr addr,
102
s->uart_fifo_ctrl = value;
103
104
if (value & R_FIFO_CTRL_RXRST_MASK) {
105
+ s->rx_level = 0;
106
qemu_log_mask(LOG_UNIMP,
107
"%s: RX fifos are not supported\n", __func__);
108
}
109
--
104
--
110
2.30.1
105
2.31.1
111
106
112
107
diff view generated by jsdifflib