1
The following changes since commit 75ee62ac606bfc9eb59310b9446df3434bf6e8c2:
1
The following changes since commit c95bd5ff1660883d15ad6e0005e4c8571604f51a:
2
2
3
Merge remote-tracking branch 'remotes/ehabkost-gl/tags/x86-next-pull-request' into staging (2020-12-17 18:53:36 +0000)
3
Merge remote-tracking branch 'remotes/philmd/tags/mips-fixes-20210322' into staging (2021-03-22 14:26:13 +0000)
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-20201217-1
7
git@github.com:alistair23/qemu.git tags/pull-riscv-to-apply-20210322-2
8
8
9
for you to fetch changes up to d31e970a01e7399b9cd43ec0dc00c857d968987e:
9
for you to fetch changes up to 9a27f69bd668d9d71674407badc412ce1231c7d5:
10
10
11
riscv/opentitan: Update the OpenTitan memory layout (2020-12-17 21:56:44 -0800)
11
target/riscv: Prevent lost illegal instruction exceptions (2021-03-22 21:54:40 -0400)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
A collection of RISC-V improvements:
14
RISC-V PR for 6.0
15
- Improve the sifive_u DTB generation
15
16
- Add QSPI NOR flash to Microchip PFSoC
16
This PR includes:
17
- Fix a bug in the Hypervisor HLVX/HLV/HSV instructions
17
- Fix for vector CSR access
18
- Fix some mstatus mask defines
18
- Improvements to the Ibex UART device
19
- Ibex PLIC improvements
19
- PMP improvements and bug fixes
20
- OpenTitan memory layout update
20
- Hypervisor extension bug fixes
21
- Initial steps towards support for 32-bit CPUs on 64-bit builds
21
- ramfb support for the virt machine
22
- Fast read support for SST flash
23
- Improvements to the microchip_pfsoc machine
22
24
23
----------------------------------------------------------------
25
----------------------------------------------------------------
24
Alex Richardson (1):
26
Alexander Wagner (1):
25
target/riscv: Fix definition of MSTATUS_TW and MSTATUS_TSR
27
hw/char: disable ibex uart receive if the buffer is full
26
28
27
Alistair Francis (18):
29
Asherah Connor (2):
28
intc/ibex_plic: Clear interrupts that occur during claim process
30
hw/riscv: Add fw_cfg support to virt
29
hw/riscv: Expand the is 32-bit check to support more CPUs
31
hw/riscv: allow ramfb on virt
30
target/riscv: Add a TYPE_RISCV_CPU_BASE CPU
31
riscv: spike: Remove target macro conditionals
32
riscv: virt: Remove target macro conditionals
33
hw/riscv: boot: Remove compile time XLEN checks
34
hw/riscv: virt: Remove compile time XLEN checks
35
hw/riscv: spike: Remove compile time XLEN checks
36
hw/riscv: sifive_u: Remove compile time XLEN checks
37
target/riscv: fpu_helper: Match function defs in HELPER macros
38
target/riscv: Add a riscv_cpu_is_32bit() helper function
39
target/riscv: Specify the XLEN for CPUs
40
target/riscv: cpu: Remove compile time XLEN checks
41
target/riscv: cpu_helper: Remove compile time XLEN checks
42
target/riscv: csr: Remove compile time XLEN checks
43
target/riscv: cpu: Set XLEN independently from target
44
hw/riscv: Use the CPU to determine if 32-bit
45
riscv/opentitan: Update the OpenTitan memory layout
46
32
47
Anup Patel (1):
33
Bin Meng (3):
48
hw/riscv: sifive_u: Add UART1 DT node in the generated DTB
34
hw/block: m25p80: Support fast read for SST flashes
35
hw/riscv: microchip_pfsoc: Map EMMC/SD mux register
36
docs/system: riscv: Add documentation for 'microchip-icicle-kit' machine
49
37
50
Vitaly Wool (1):
38
Frank Chang (1):
51
hw/riscv: microchip_pfsoc: add QSPI NOR flash
39
target/riscv: fix vs() to return proper error code
52
40
53
Xinhao Zhang (1):
41
Georg Kotheimer (6):
54
hw/core/register.c: Don't use '#' flag of printf format
42
target/riscv: Adjust privilege level for HLV(X)/HSV instructions
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
55
48
56
Yifei Jiang (1):
49
Jim Shu (3):
57
target/riscv: Fix the bug of HLVX/HLV/HSV
50
target/riscv: propagate PMP permission to TLB page
51
target/riscv: add log of PMP permission checking
52
target/riscv: flush TLB pages if PMP permission has been changed
58
53
59
include/hw/riscv/boot.h | 14 +--
54
docs/system/riscv/microchip-icicle-kit.rst | 89 ++++++++++++++
60
include/hw/riscv/microchip_pfsoc.h | 3 +
55
docs/system/target-riscv.rst | 1 +
61
include/hw/riscv/opentitan.h | 23 +++--
56
include/hw/char/ibex_uart.h | 4 +
62
include/hw/riscv/spike.h | 6 --
57
include/hw/riscv/microchip_pfsoc.h | 1 +
63
include/hw/riscv/virt.h | 6 --
58
include/hw/riscv/virt.h | 2 +
64
target/riscv/cpu.h | 8 ++
59
target/riscv/cpu.h | 4 +
65
target/riscv/cpu_bits.h | 8 +-
60
target/riscv/pmp.h | 4 +-
66
target/riscv/helper.h | 24 ++---
61
hw/block/m25p80.c | 3 +
67
hw/core/register.c | 16 ++--
62
hw/char/ibex_uart.c | 23 +++-
68
hw/intc/ibex_plic.c | 13 ++-
63
hw/riscv/microchip_pfsoc.c | 6 +
69
hw/riscv/boot.c | 70 ++++++++-------
64
hw/riscv/virt.c | 33 ++++++
70
hw/riscv/microchip_pfsoc.c | 21 +++++
65
target/riscv/cpu.c | 1 +
71
hw/riscv/opentitan.c | 81 ++++++++++++-----
66
target/riscv/cpu_helper.c | 144 +++++++++++++++--------
72
hw/riscv/sifive_u.c | 74 ++++++++++------
67
target/riscv/csr.c | 77 +++++++------
73
hw/riscv/spike.c | 52 ++++++-----
68
target/riscv/pmp.c | 84 ++++++++++----
74
hw/riscv/virt.c | 39 ++++----
69
target/riscv/translate.c | 179 +----------------------------
75
target/riscv/cpu.c | 84 ++++++++++++------
70
hw/riscv/Kconfig | 1 +
76
target/riscv/cpu_helper.c | 15 ++--
71
17 files changed, 367 insertions(+), 289 deletions(-)
77
target/riscv/csr.c | 176 +++++++++++++++++++------------------
72
create mode 100644 docs/system/riscv/microchip-icicle-kit.rst
78
target/riscv/fpu_helper.c | 8 --
79
20 files changed, 434 insertions(+), 307 deletions(-)
80
73
diff view generated by jsdifflib
1
OpenTitan is currently only avalible on an FPGA platform and the memory
1
From: Frank Chang <frank.chang@sifive.com>
2
addresses have changed. Update to use the new memory addresses.
3
2
3
vs() should return -RISCV_EXCP_ILLEGAL_INST instead of -1 if rvv feature
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>
12
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
13
Message-id: 20210223065935.20208-1-frank.chang@sifive.com
4
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
14
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
5
Message-id: 8eb65314830a75d0fea3fccf77bc45b8ddd01c42.1607982831.git.alistair.francis@wdc.com
6
---
15
---
7
include/hw/riscv/opentitan.h | 23 +++++++---
16
target/riscv/csr.c | 2 +-
8
hw/riscv/opentitan.c | 81 +++++++++++++++++++++++++-----------
17
1 file changed, 1 insertion(+), 1 deletion(-)
9
2 files changed, 74 insertions(+), 30 deletions(-)
10
18
11
diff --git a/include/hw/riscv/opentitan.h b/include/hw/riscv/opentitan.h
19
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
12
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
13
--- a/include/hw/riscv/opentitan.h
21
--- a/target/riscv/csr.c
14
+++ b/include/hw/riscv/opentitan.h
22
+++ b/target/riscv/csr.c
15
@@ -XXX,XX +XXX,XX @@ enum {
23
@@ -XXX,XX +XXX,XX @@ static int vs(CPURISCVState *env, int csrno)
16
IBEX_DEV_UART,
24
if (env->misa & RVV) {
17
IBEX_DEV_GPIO,
25
return 0;
18
IBEX_DEV_SPI,
26
}
19
- IBEX_DEV_FLASH_CTRL,
27
- return -1;
20
+ IBEX_DEV_I2C,
28
+ return -RISCV_EXCP_ILLEGAL_INST;
21
+ IBEX_DEV_PATTGEN,
22
IBEX_DEV_RV_TIMER,
23
- IBEX_DEV_AES,
24
- IBEX_DEV_HMAC,
25
- IBEX_DEV_PLIC,
26
+ IBEX_DEV_SENSOR_CTRL,
27
+ IBEX_DEV_OTP_CTRL,
28
IBEX_DEV_PWRMGR,
29
IBEX_DEV_RSTMGR,
30
IBEX_DEV_CLKMGR,
31
IBEX_DEV_PINMUX,
32
+ IBEX_DEV_PADCTRL,
33
+ IBEX_DEV_USBDEV,
34
+ IBEX_DEV_FLASH_CTRL,
35
+ IBEX_DEV_PLIC,
36
+ IBEX_DEV_AES,
37
+ IBEX_DEV_HMAC,
38
+ IBEX_DEV_KMAC,
39
+ IBEX_DEV_KEYMGR,
40
+ IBEX_DEV_CSRNG,
41
+ IBEX_DEV_ENTROPY,
42
+ IBEX_DEV_EDNO,
43
+ IBEX_DEV_EDN1,
44
IBEX_DEV_ALERT_HANDLER,
45
IBEX_DEV_NMI_GEN,
46
- IBEX_DEV_USBDEV,
47
- IBEX_DEV_PADCTRL,
48
+ IBEX_DEV_OTBN,
49
};
50
51
enum {
52
diff --git a/hw/riscv/opentitan.c b/hw/riscv/opentitan.c
53
index XXXXXXX..XXXXXXX 100644
54
--- a/hw/riscv/opentitan.c
55
+++ b/hw/riscv/opentitan.c
56
@@ -XXX,XX +XXX,XX @@ static const struct MemmapEntry {
57
[IBEX_DEV_ROM] = { 0x00008000, 16 * KiB },
58
[IBEX_DEV_RAM] = { 0x10000000, 0x10000 },
59
[IBEX_DEV_FLASH] = { 0x20000000, 0x80000 },
60
- [IBEX_DEV_UART] = { 0x40000000, 0x10000 },
61
- [IBEX_DEV_GPIO] = { 0x40010000, 0x10000 },
62
- [IBEX_DEV_SPI] = { 0x40020000, 0x10000 },
63
- [IBEX_DEV_FLASH_CTRL] = { 0x40030000, 0x10000 },
64
- [IBEX_DEV_PINMUX] = { 0x40070000, 0x10000 },
65
- [IBEX_DEV_RV_TIMER] = { 0x40080000, 0x10000 },
66
- [IBEX_DEV_PLIC] = { 0x40090000, 0x10000 },
67
- [IBEX_DEV_PWRMGR] = { 0x400A0000, 0x10000 },
68
- [IBEX_DEV_RSTMGR] = { 0x400B0000, 0x10000 },
69
- [IBEX_DEV_CLKMGR] = { 0x400C0000, 0x10000 },
70
- [IBEX_DEV_AES] = { 0x40110000, 0x10000 },
71
- [IBEX_DEV_HMAC] = { 0x40120000, 0x10000 },
72
- [IBEX_DEV_ALERT_HANDLER] = { 0x40130000, 0x10000 },
73
- [IBEX_DEV_NMI_GEN] = { 0x40140000, 0x10000 },
74
- [IBEX_DEV_USBDEV] = { 0x40150000, 0x10000 },
75
- [IBEX_DEV_PADCTRL] = { 0x40160000, 0x10000 }
76
+ [IBEX_DEV_UART] = { 0x40000000, 0x1000 },
77
+ [IBEX_DEV_GPIO] = { 0x40040000, 0x1000 },
78
+ [IBEX_DEV_SPI] = { 0x40050000, 0x1000 },
79
+ [IBEX_DEV_I2C] = { 0x40080000, 0x1000 },
80
+ [IBEX_DEV_PATTGEN] = { 0x400e0000, 0x1000 },
81
+ [IBEX_DEV_RV_TIMER] = { 0x40100000, 0x1000 },
82
+ [IBEX_DEV_SENSOR_CTRL] = { 0x40110000, 0x1000 },
83
+ [IBEX_DEV_OTP_CTRL] = { 0x40130000, 0x4000 },
84
+ [IBEX_DEV_PWRMGR] = { 0x40400000, 0x1000 },
85
+ [IBEX_DEV_RSTMGR] = { 0x40410000, 0x1000 },
86
+ [IBEX_DEV_CLKMGR] = { 0x40420000, 0x1000 },
87
+ [IBEX_DEV_PINMUX] = { 0x40460000, 0x1000 },
88
+ [IBEX_DEV_PADCTRL] = { 0x40470000, 0x1000 },
89
+ [IBEX_DEV_USBDEV] = { 0x40500000, 0x1000 },
90
+ [IBEX_DEV_FLASH_CTRL] = { 0x41000000, 0x1000 },
91
+ [IBEX_DEV_PLIC] = { 0x41010000, 0x1000 },
92
+ [IBEX_DEV_AES] = { 0x41100000, 0x1000 },
93
+ [IBEX_DEV_HMAC] = { 0x41110000, 0x1000 },
94
+ [IBEX_DEV_KMAC] = { 0x41120000, 0x1000 },
95
+ [IBEX_DEV_KEYMGR] = { 0x41130000, 0x1000 },
96
+ [IBEX_DEV_CSRNG] = { 0x41150000, 0x1000 },
97
+ [IBEX_DEV_ENTROPY] = { 0x41160000, 0x1000 },
98
+ [IBEX_DEV_EDNO] = { 0x41170000, 0x1000 },
99
+ [IBEX_DEV_EDN1] = { 0x41180000, 0x1000 },
100
+ [IBEX_DEV_ALERT_HANDLER] = { 0x411b0000, 0x1000 },
101
+ [IBEX_DEV_NMI_GEN] = { 0x411c0000, 0x1000 },
102
+ [IBEX_DEV_OTBN] = { 0x411d0000, 0x10000 },
103
};
104
105
static void opentitan_board_init(MachineState *machine)
106
@@ -XXX,XX +XXX,XX @@ static void lowrisc_ibex_soc_realize(DeviceState *dev_soc, Error **errp)
107
memmap[IBEX_DEV_GPIO].base, memmap[IBEX_DEV_GPIO].size);
108
create_unimplemented_device("riscv.lowrisc.ibex.spi",
109
memmap[IBEX_DEV_SPI].base, memmap[IBEX_DEV_SPI].size);
110
- create_unimplemented_device("riscv.lowrisc.ibex.flash_ctrl",
111
- memmap[IBEX_DEV_FLASH_CTRL].base, memmap[IBEX_DEV_FLASH_CTRL].size);
112
+ create_unimplemented_device("riscv.lowrisc.ibex.i2c",
113
+ memmap[IBEX_DEV_I2C].base, memmap[IBEX_DEV_I2C].size);
114
+ create_unimplemented_device("riscv.lowrisc.ibex.pattgen",
115
+ memmap[IBEX_DEV_PATTGEN].base, memmap[IBEX_DEV_PATTGEN].size);
116
create_unimplemented_device("riscv.lowrisc.ibex.rv_timer",
117
memmap[IBEX_DEV_RV_TIMER].base, memmap[IBEX_DEV_RV_TIMER].size);
118
+ create_unimplemented_device("riscv.lowrisc.ibex.sensor_ctrl",
119
+ memmap[IBEX_DEV_SENSOR_CTRL].base, memmap[IBEX_DEV_SENSOR_CTRL].size);
120
+ create_unimplemented_device("riscv.lowrisc.ibex.otp_ctrl",
121
+ memmap[IBEX_DEV_OTP_CTRL].base, memmap[IBEX_DEV_OTP_CTRL].size);
122
create_unimplemented_device("riscv.lowrisc.ibex.pwrmgr",
123
memmap[IBEX_DEV_PWRMGR].base, memmap[IBEX_DEV_PWRMGR].size);
124
create_unimplemented_device("riscv.lowrisc.ibex.rstmgr",
125
memmap[IBEX_DEV_RSTMGR].base, memmap[IBEX_DEV_RSTMGR].size);
126
create_unimplemented_device("riscv.lowrisc.ibex.clkmgr",
127
memmap[IBEX_DEV_CLKMGR].base, memmap[IBEX_DEV_CLKMGR].size);
128
+ create_unimplemented_device("riscv.lowrisc.ibex.pinmux",
129
+ memmap[IBEX_DEV_PINMUX].base, memmap[IBEX_DEV_PINMUX].size);
130
+ create_unimplemented_device("riscv.lowrisc.ibex.padctrl",
131
+ memmap[IBEX_DEV_PADCTRL].base, memmap[IBEX_DEV_PADCTRL].size);
132
+ create_unimplemented_device("riscv.lowrisc.ibex.usbdev",
133
+ memmap[IBEX_DEV_USBDEV].base, memmap[IBEX_DEV_USBDEV].size);
134
+ create_unimplemented_device("riscv.lowrisc.ibex.flash_ctrl",
135
+ memmap[IBEX_DEV_FLASH_CTRL].base, memmap[IBEX_DEV_FLASH_CTRL].size);
136
create_unimplemented_device("riscv.lowrisc.ibex.aes",
137
memmap[IBEX_DEV_AES].base, memmap[IBEX_DEV_AES].size);
138
create_unimplemented_device("riscv.lowrisc.ibex.hmac",
139
memmap[IBEX_DEV_HMAC].base, memmap[IBEX_DEV_HMAC].size);
140
- create_unimplemented_device("riscv.lowrisc.ibex.pinmux",
141
- memmap[IBEX_DEV_PINMUX].base, memmap[IBEX_DEV_PINMUX].size);
142
+ create_unimplemented_device("riscv.lowrisc.ibex.kmac",
143
+ memmap[IBEX_DEV_KMAC].base, memmap[IBEX_DEV_KMAC].size);
144
+ create_unimplemented_device("riscv.lowrisc.ibex.keymgr",
145
+ memmap[IBEX_DEV_KEYMGR].base, memmap[IBEX_DEV_KEYMGR].size);
146
+ create_unimplemented_device("riscv.lowrisc.ibex.csrng",
147
+ memmap[IBEX_DEV_CSRNG].base, memmap[IBEX_DEV_CSRNG].size);
148
+ create_unimplemented_device("riscv.lowrisc.ibex.entropy",
149
+ memmap[IBEX_DEV_ENTROPY].base, memmap[IBEX_DEV_ENTROPY].size);
150
+ create_unimplemented_device("riscv.lowrisc.ibex.edn0",
151
+ memmap[IBEX_DEV_EDNO].base, memmap[IBEX_DEV_EDNO].size);
152
+ create_unimplemented_device("riscv.lowrisc.ibex.edn1",
153
+ memmap[IBEX_DEV_EDN1].base, memmap[IBEX_DEV_EDN1].size);
154
create_unimplemented_device("riscv.lowrisc.ibex.alert_handler",
155
memmap[IBEX_DEV_ALERT_HANDLER].base, memmap[IBEX_DEV_ALERT_HANDLER].size);
156
create_unimplemented_device("riscv.lowrisc.ibex.nmi_gen",
157
memmap[IBEX_DEV_NMI_GEN].base, memmap[IBEX_DEV_NMI_GEN].size);
158
- create_unimplemented_device("riscv.lowrisc.ibex.usbdev",
159
- memmap[IBEX_DEV_USBDEV].base, memmap[IBEX_DEV_USBDEV].size);
160
- create_unimplemented_device("riscv.lowrisc.ibex.padctrl",
161
- memmap[IBEX_DEV_PADCTRL].base, memmap[IBEX_DEV_PADCTRL].size);
162
+ create_unimplemented_device("riscv.lowrisc.ibex.otbn",
163
+ memmap[IBEX_DEV_OTBN].base, memmap[IBEX_DEV_OTBN].size);
164
}
29
}
165
30
166
static void lowrisc_ibex_soc_class_init(ObjectClass *oc, void *data)
31
static int ctr(CPURISCVState *env, int csrno)
167
--
32
--
168
2.29.2
33
2.30.1
169
34
170
35
diff view generated by jsdifflib
1
Instead of using string compares to determine if a RISC-V machine is
1
From: Alexander Wagner <alexander.wagner@ulal.de>
2
using 32-bit or 64-bit CPUs we can use the initalised CPUs. This avoids
3
us having to maintain a list of CPU names to compare against.
4
2
5
This commit also fixes the name of the function to match the
3
Not disabling the UART leads to QEMU overwriting the UART receive buffer with
6
riscv_cpu_is_32bit() function.
4
the newest received byte. The rx_level variable is added to allow the use of
5
the existing OpenTitan driver libraries.
7
6
7
Signed-off-by: Alexander Wagner <alexander.wagner@ulal.de>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 20210309152130.13038-1-alexander.wagner@ulal.de
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 8ab7614e5df93ab5267788b73dcd75f9f5615e82.1608142916.git.alistair.francis@wdc.com
11
---
11
---
12
include/hw/riscv/boot.h | 8 +++++---
12
include/hw/char/ibex_uart.h | 4 ++++
13
hw/riscv/boot.c | 31 ++++++++++---------------------
13
hw/char/ibex_uart.c | 23 ++++++++++++++++++-----
14
hw/riscv/sifive_u.c | 10 +++++-----
14
2 files changed, 22 insertions(+), 5 deletions(-)
15
hw/riscv/spike.c | 8 ++++----
16
hw/riscv/virt.c | 9 +++++----
17
5 files changed, 29 insertions(+), 37 deletions(-)
18
15
19
diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h
16
diff --git a/include/hw/char/ibex_uart.h b/include/hw/char/ibex_uart.h
20
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
21
--- a/include/hw/riscv/boot.h
18
--- a/include/hw/char/ibex_uart.h
22
+++ b/include/hw/riscv/boot.h
19
+++ b/include/hw/char/ibex_uart.h
23
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@ REG32(FIFO_CTRL, 0x1c)
24
21
FIELD(FIFO_CTRL, RXILVL, 2, 3)
25
#include "exec/cpu-defs.h"
22
FIELD(FIFO_CTRL, TXILVL, 5, 2)
26
#include "hw/loader.h"
23
REG32(FIFO_STATUS, 0x20)
27
+#include "hw/riscv/riscv_hart.h"
24
+ FIELD(FIFO_STATUS, TXLVL, 0, 5)
28
25
+ FIELD(FIFO_STATUS, RXLVL, 16, 5)
29
-bool riscv_is_32_bit(MachineState *machine);
26
REG32(OVRD, 0x24)
30
+bool riscv_is_32bit(RISCVHartArrayState harts);
27
REG32(VAL, 0x28)
31
28
REG32(TIMEOUT_CTRL, 0x2c)
32
-target_ulong riscv_calc_kernel_start_addr(MachineState *machine,
29
@@ -XXX,XX +XXX,XX @@ struct IbexUartState {
33
+target_ulong riscv_calc_kernel_start_addr(RISCVHartArrayState harts,
30
uint8_t tx_fifo[IBEX_UART_TX_FIFO_SIZE];
34
target_ulong firmware_end_addr);
31
uint32_t tx_level;
35
target_ulong riscv_find_and_load_firmware(MachineState *machine,
32
36
const char *default_machine_firmware,
33
+ uint32_t rx_level;
37
@@ -XXX,XX +XXX,XX @@ target_ulong riscv_load_kernel(const char *kernel_filename,
34
+
38
hwaddr riscv_load_initrd(const char *filename, uint64_t mem_size,
35
QEMUTimer *fifo_trigger_handle;
39
uint64_t kernel_entry, hwaddr *start);
36
uint64_t char_tx_time;
40
uint32_t riscv_load_fdt(hwaddr dram_start, uint64_t dram_size, void *fdt);
37
41
-void riscv_setup_rom_reset_vec(MachineState *machine, hwaddr saddr,
38
diff --git a/hw/char/ibex_uart.c b/hw/char/ibex_uart.c
42
+void riscv_setup_rom_reset_vec(MachineState *machine, RISCVHartArrayState harts,
43
+ hwaddr saddr,
44
hwaddr rom_base, hwaddr rom_size,
45
uint64_t kernel_entry,
46
uint32_t fdt_load_addr, void *fdt);
47
diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c
48
index XXXXXXX..XXXXXXX 100644
39
index XXXXXXX..XXXXXXX 100644
49
--- a/hw/riscv/boot.c
40
--- a/hw/char/ibex_uart.c
50
+++ b/hw/riscv/boot.c
41
+++ b/hw/char/ibex_uart.c
51
@@ -XXX,XX +XXX,XX @@
42
@@ -XXX,XX +XXX,XX @@ static int ibex_uart_can_receive(void *opaque)
52
53
#include <libfdt.h>
54
55
-bool riscv_is_32_bit(MachineState *machine)
56
+bool riscv_is_32bit(RISCVHartArrayState harts)
57
{
43
{
58
- /*
44
IbexUartState *s = opaque;
59
- * To determine if the CPU is 32-bit we need to check a few different CPUs.
45
60
- *
46
- if (s->uart_ctrl & R_CTRL_RX_ENABLE_MASK) {
61
- * If the CPU starts with rv32
47
+ if ((s->uart_ctrl & R_CTRL_RX_ENABLE_MASK)
62
- * If the CPU is a sifive 3 seriries CPU (E31, U34)
48
+ && !(s->uart_status & R_STATUS_RXFULL_MASK)) {
63
- * If it's the Ibex CPU
49
return 1;
64
- */
65
- if (!strncmp(machine->cpu_type, "rv32", 4) ||
66
- (!strncmp(machine->cpu_type, "sifive", 6) &&
67
- machine->cpu_type[8] == '3') ||
68
- !strncmp(machine->cpu_type, "lowrisc-ibex", 12)) {
69
- return true;
70
- } else {
71
- return false;
72
- }
73
+ RISCVCPU hart = harts.harts[0];
74
+
75
+ return riscv_cpu_is_32bit(&hart.env);
76
}
77
78
-target_ulong riscv_calc_kernel_start_addr(MachineState *machine,
79
+target_ulong riscv_calc_kernel_start_addr(RISCVHartArrayState harts,
80
target_ulong firmware_end_addr) {
81
- if (riscv_is_32_bit(machine)) {
82
+ if (riscv_is_32bit(harts)) {
83
return QEMU_ALIGN_UP(firmware_end_addr, 4 * MiB);
84
} else {
85
return QEMU_ALIGN_UP(firmware_end_addr, 2 * MiB);
86
@@ -XXX,XX +XXX,XX @@ void riscv_rom_copy_firmware_info(MachineState *machine, hwaddr rom_base,
87
&address_space_memory);
88
}
89
90
-void riscv_setup_rom_reset_vec(MachineState *machine, hwaddr start_addr,
91
+void riscv_setup_rom_reset_vec(MachineState *machine, RISCVHartArrayState harts,
92
+ hwaddr start_addr,
93
hwaddr rom_base, hwaddr rom_size,
94
uint64_t kernel_entry,
95
uint32_t fdt_load_addr, void *fdt)
96
@@ -XXX,XX +XXX,XX @@ void riscv_setup_rom_reset_vec(MachineState *machine, hwaddr start_addr,
97
int i;
98
uint32_t start_addr_hi32 = 0x00000000;
99
100
- if (!riscv_is_32_bit(machine)) {
101
+ if (!riscv_is_32bit(harts)) {
102
start_addr_hi32 = start_addr >> 32;
103
}
50
}
104
/* reset vector */
51
105
@@ -XXX,XX +XXX,XX @@ void riscv_setup_rom_reset_vec(MachineState *machine, hwaddr start_addr,
52
@@ -XXX,XX +XXX,XX @@ static void ibex_uart_receive(void *opaque, const uint8_t *buf, int size)
106
0x00000000,
53
107
/* fw_dyn: */
54
s->uart_status &= ~R_STATUS_RXIDLE_MASK;
108
};
55
s->uart_status &= ~R_STATUS_RXEMPTY_MASK;
109
- if (riscv_is_32_bit(machine)) {
56
+ /* The RXFULL is set after receiving a single byte
110
+ if (riscv_is_32bit(harts)) {
57
+ * as the FIFO buffers are not yet implemented.
111
reset_vec[3] = 0x0202a583; /* lw a1, 32(t0) */
58
+ */
112
reset_vec[4] = 0x0182a283; /* lw t0, 24(t0) */
59
+ s->uart_status |= R_STATUS_RXFULL_MASK;
113
} else {
60
+ s->rx_level += 1;
114
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
61
115
index XXXXXXX..XXXXXXX 100644
62
if (size > rx_fifo_level) {
116
--- a/hw/riscv/sifive_u.c
63
s->uart_intr_state |= R_INTR_STATE_RX_WATERMARK_MASK;
117
+++ b/hw/riscv/sifive_u.c
64
@@ -XXX,XX +XXX,XX @@ static void ibex_uart_reset(DeviceState *dev)
118
@@ -XXX,XX +XXX,XX @@ static void sifive_u_machine_init(MachineState *machine)
65
s->uart_timeout_ctrl = 0x00000000;
119
66
120
/* create device tree */
67
s->tx_level = 0;
121
create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline,
68
+ s->rx_level = 0;
122
- riscv_is_32_bit(machine));
69
123
+ riscv_is_32bit(s->soc.u_cpus));
70
s->char_tx_time = (NANOSECONDS_PER_SECOND / 230400) * 10;
124
71
125
if (s->start_in_flash) {
72
@@ -XXX,XX +XXX,XX @@ static uint64_t ibex_uart_read(void *opaque, hwaddr addr,
126
/*
73
127
@@ -XXX,XX +XXX,XX @@ static void sifive_u_machine_init(MachineState *machine)
74
case R_RDATA:
75
retvalue = s->uart_rdata;
76
- if (s->uart_ctrl & R_CTRL_RX_ENABLE_MASK) {
77
+ if ((s->uart_ctrl & R_CTRL_RX_ENABLE_MASK) && (s->rx_level > 0)) {
78
qemu_chr_fe_accept_input(&s->chr);
79
80
- s->uart_status |= R_STATUS_RXIDLE_MASK;
81
- s->uart_status |= R_STATUS_RXEMPTY_MASK;
82
+ s->rx_level -= 1;
83
+ s->uart_status &= ~R_STATUS_RXFULL_MASK;
84
+ if (s->rx_level == 0) {
85
+ s->uart_status |= R_STATUS_RXIDLE_MASK;
86
+ s->uart_status |= R_STATUS_RXEMPTY_MASK;
87
+ }
88
}
128
break;
89
break;
129
}
90
case R_WDATA:
130
91
@@ -XXX,XX +XXX,XX @@ static uint64_t ibex_uart_read(void *opaque, hwaddr addr,
131
- if (riscv_is_32_bit(machine)) {
92
case R_FIFO_STATUS:
132
+ if (riscv_is_32bit(s->soc.u_cpus)) {
93
retvalue = s->uart_fifo_status;
133
firmware_end_addr = riscv_find_and_load_firmware(machine,
94
134
"opensbi-riscv32-generic-fw_dynamic.bin",
95
- retvalue |= s->tx_level & 0x1F;
135
start_addr, NULL);
96
+ retvalue |= (s->rx_level & 0x1F) << R_FIFO_STATUS_RXLVL_SHIFT;
136
@@ -XXX,XX +XXX,XX @@ static void sifive_u_machine_init(MachineState *machine)
97
+ retvalue |= (s->tx_level & 0x1F) << R_FIFO_STATUS_TXLVL_SHIFT;
137
}
98
138
99
qemu_log_mask(LOG_UNIMP,
139
if (machine->kernel_filename) {
100
"%s: RX fifos are not supported\n", __func__);
140
- kernel_start_addr = riscv_calc_kernel_start_addr(machine,
101
@@ -XXX,XX +XXX,XX @@ static void ibex_uart_write(void *opaque, hwaddr addr,
141
+ kernel_start_addr = riscv_calc_kernel_start_addr(s->soc.u_cpus,
102
s->uart_fifo_ctrl = value;
142
firmware_end_addr);
103
143
104
if (value & R_FIFO_CTRL_RXRST_MASK) {
144
kernel_entry = riscv_load_kernel(machine->kernel_filename,
105
+ s->rx_level = 0;
145
@@ -XXX,XX +XXX,XX @@ static void sifive_u_machine_init(MachineState *machine)
106
qemu_log_mask(LOG_UNIMP,
146
/* Compute the fdt load address in dram */
107
"%s: RX fifos are not supported\n", __func__);
147
fdt_load_addr = riscv_load_fdt(memmap[SIFIVE_U_DEV_DRAM].base,
108
}
148
machine->ram_size, s->fdt);
149
- if (!riscv_is_32_bit(machine)) {
150
+ if (!riscv_is_32bit(s->soc.u_cpus)) {
151
start_addr_hi32 = (uint64_t)start_addr >> 32;
152
}
153
154
@@ -XXX,XX +XXX,XX @@ static void sifive_u_machine_init(MachineState *machine)
155
0x00000000,
156
/* fw_dyn: */
157
};
158
- if (riscv_is_32_bit(machine)) {
159
+ if (riscv_is_32bit(s->soc.u_cpus)) {
160
reset_vec[4] = 0x0202a583; /* lw a1, 32(t0) */
161
reset_vec[5] = 0x0182a283; /* lw t0, 24(t0) */
162
} else {
163
diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c
164
index XXXXXXX..XXXXXXX 100644
165
--- a/hw/riscv/spike.c
166
+++ b/hw/riscv/spike.c
167
@@ -XXX,XX +XXX,XX @@ static void spike_board_init(MachineState *machine)
168
169
/* create device tree */
170
create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline,
171
- riscv_is_32_bit(machine));
172
+ riscv_is_32bit(s->soc[0]));
173
174
/* boot rom */
175
memory_region_init_rom(mask_rom, NULL, "riscv.spike.mrom",
176
@@ -XXX,XX +XXX,XX @@ static void spike_board_init(MachineState *machine)
177
* keeping ELF files here was intentional because BIN files don't work
178
* for the Spike machine as HTIF emulation depends on ELF parsing.
179
*/
180
- if (riscv_is_32_bit(machine)) {
181
+ if (riscv_is_32bit(s->soc[0])) {
182
firmware_end_addr = riscv_find_and_load_firmware(machine,
183
"opensbi-riscv32-generic-fw_dynamic.elf",
184
memmap[SPIKE_DRAM].base,
185
@@ -XXX,XX +XXX,XX @@ static void spike_board_init(MachineState *machine)
186
}
187
188
if (machine->kernel_filename) {
189
- kernel_start_addr = riscv_calc_kernel_start_addr(machine,
190
+ kernel_start_addr = riscv_calc_kernel_start_addr(s->soc[0],
191
firmware_end_addr);
192
193
kernel_entry = riscv_load_kernel(machine->kernel_filename,
194
@@ -XXX,XX +XXX,XX @@ static void spike_board_init(MachineState *machine)
195
fdt_load_addr = riscv_load_fdt(memmap[SPIKE_DRAM].base,
196
machine->ram_size, s->fdt);
197
/* load the reset vector */
198
- riscv_setup_rom_reset_vec(machine, memmap[SPIKE_DRAM].base,
199
+ riscv_setup_rom_reset_vec(machine, s->soc[0], memmap[SPIKE_DRAM].base,
200
memmap[SPIKE_MROM].base,
201
memmap[SPIKE_MROM].size, kernel_entry,
202
fdt_load_addr, s->fdt);
203
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
204
index XXXXXXX..XXXXXXX 100644
205
--- a/hw/riscv/virt.c
206
+++ b/hw/riscv/virt.c
207
@@ -XXX,XX +XXX,XX @@ static void virt_machine_init(MachineState *machine)
208
209
/* create device tree */
210
create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline,
211
- riscv_is_32_bit(machine));
212
+ riscv_is_32bit(s->soc[0]));
213
214
/* boot rom */
215
memory_region_init_rom(mask_rom, NULL, "riscv_virt_board.mrom",
216
@@ -XXX,XX +XXX,XX @@ static void virt_machine_init(MachineState *machine)
217
memory_region_add_subregion(system_memory, memmap[VIRT_MROM].base,
218
mask_rom);
219
220
- if (riscv_is_32_bit(machine)) {
221
+ if (riscv_is_32bit(s->soc[0])) {
222
firmware_end_addr = riscv_find_and_load_firmware(machine,
223
"opensbi-riscv32-generic-fw_dynamic.bin",
224
start_addr, NULL);
225
@@ -XXX,XX +XXX,XX @@ static void virt_machine_init(MachineState *machine)
226
}
227
228
if (machine->kernel_filename) {
229
- kernel_start_addr = riscv_calc_kernel_start_addr(machine,
230
+ kernel_start_addr = riscv_calc_kernel_start_addr(s->soc[0],
231
firmware_end_addr);
232
233
kernel_entry = riscv_load_kernel(machine->kernel_filename,
234
@@ -XXX,XX +XXX,XX @@ static void virt_machine_init(MachineState *machine)
235
fdt_load_addr = riscv_load_fdt(memmap[VIRT_DRAM].base,
236
machine->ram_size, s->fdt);
237
/* load the reset vector */
238
- riscv_setup_rom_reset_vec(machine, start_addr, virt_memmap[VIRT_MROM].base,
239
+ riscv_setup_rom_reset_vec(machine, s->soc[0], start_addr,
240
+ virt_memmap[VIRT_MROM].base,
241
virt_memmap[VIRT_MROM].size, kernel_entry,
242
fdt_load_addr, s->fdt);
243
244
--
109
--
245
2.29.2
110
2.30.1
246
111
247
112
diff view generated by jsdifflib
1
From: Jim Shu <cwshu@andestech.com>
2
3
Currently, PMP permission checking of TLB page is bypassed if TLB hits
4
Fix it by propagating PMP permission to TLB page permission.
5
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
1
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
2
Reviewed-by: Bin Meng <bin.meng@windriver.com>
3
Tested-by: Bin Meng <bin.meng@windriver.com>
4
Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>
5
Acked-by: Palmer Dabbelt <palmerdabbelt@google.com>
6
Message-id: 7eddba45b5d223321c031431849fdd42eceb514b.1608142916.git.alistair.francis@wdc.com
7
---
13
---
8
target/riscv/cpu.c | 25 ++++++++++++++++---------
14
target/riscv/pmp.h | 4 +-
9
1 file changed, 16 insertions(+), 9 deletions(-)
15
target/riscv/cpu_helper.c | 84 +++++++++++++++++++++++++++++----------
10
16
target/riscv/pmp.c | 80 +++++++++++++++++++++++++++----------
11
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
17
3 files changed, 125 insertions(+), 43 deletions(-)
18
19
diff --git a/target/riscv/pmp.h b/target/riscv/pmp.h
12
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
13
--- a/target/riscv/cpu.c
21
--- a/target/riscv/pmp.h
14
+++ b/target/riscv/cpu.c
22
+++ b/target/riscv/pmp.h
15
@@ -XXX,XX +XXX,XX @@ static void riscv_any_cpu_init(Object *obj)
23
@@ -XXX,XX +XXX,XX @@ void pmpaddr_csr_write(CPURISCVState *env, uint32_t addr_index,
16
set_priv_version(env, PRIV_VERSION_1_11_0);
24
target_ulong val);
25
target_ulong pmpaddr_csr_read(CPURISCVState *env, uint32_t addr_index);
26
bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
27
- target_ulong size, pmp_priv_t priv, target_ulong mode);
28
+ target_ulong size, pmp_priv_t privs, pmp_priv_t *allowed_privs,
29
+ target_ulong mode);
30
bool pmp_is_range_in_tlb(CPURISCVState *env, hwaddr tlb_sa,
31
target_ulong *tlb_size);
32
void pmp_update_rule_addr(CPURISCVState *env, uint32_t pmp_index);
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
40
--- a/target/riscv/cpu_helper.c
41
+++ b/target/riscv/cpu_helper.c
42
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_set_mode(CPURISCVState *env, target_ulong newpriv)
43
env->load_res = -1;
17
}
44
}
18
45
19
-static void riscv_base_cpu_init(Object *obj)
46
+/*
20
+#if defined(TARGET_RISCV64)
47
+ * get_physical_address_pmp - check PMP permission for this physical address
21
+static void rv64_base_cpu_init(Object *obj)
48
+ *
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
+{
65
+ pmp_priv_t pmp_priv;
66
+ target_ulong tlb_size_pmp = 0;
67
+
68
+ if (!riscv_feature(env, RISCV_FEATURE_PMP)) {
69
+ *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
70
+ return TRANSLATE_SUCCESS;
71
+ }
72
+
73
+ if (!pmp_hart_has_privs(env, addr, size, 1 << access_type, &pmp_priv,
74
+ mode)) {
75
+ *prot = 0;
76
+ return TRANSLATE_PMP_FAIL;
77
+ }
78
+
79
+ *prot = pmp_priv_to_page_prot(pmp_priv);
80
+ if (tlb_size != NULL) {
81
+ if (pmp_is_range_in_tlb(env, addr & ~(*tlb_size - 1), &tlb_size_pmp)) {
82
+ *tlb_size = tlb_size_pmp;
83
+ }
84
+ }
85
+
86
+ return TRANSLATE_SUCCESS;
87
+}
88
+
89
/* get_physical_address - get the physical address for this virtual address
90
*
91
* Do a page table walk to obtain the physical address corresponding to a
92
@@ -XXX,XX +XXX,XX @@ restart:
93
pte_addr = base + idx * ptesize;
94
}
95
96
- if (riscv_feature(env, RISCV_FEATURE_PMP) &&
97
- !pmp_hart_has_privs(env, pte_addr, sizeof(target_ulong),
98
- 1 << MMU_DATA_LOAD, PRV_S)) {
99
+ int pmp_prot;
100
+ int pmp_ret = get_physical_address_pmp(env, &pmp_prot, NULL, pte_addr,
101
+ sizeof(target_ulong),
102
+ MMU_DATA_LOAD, PRV_S);
103
+ if (pmp_ret != TRANSLATE_SUCCESS) {
104
return TRANSLATE_PMP_FAIL;
105
}
106
107
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
108
#ifndef CONFIG_USER_ONLY
109
vaddr im_address;
110
hwaddr pa = 0;
111
- int prot, prot2;
112
+ int prot, prot2, prot_pmp;
113
bool pmp_violation = false;
114
bool first_stage_error = true;
115
bool two_stage_lookup = false;
116
int ret = TRANSLATE_FAIL;
117
int mode = mmu_idx;
118
- target_ulong tlb_size = 0;
119
+ /* default TLB page size */
120
+ target_ulong tlb_size = TARGET_PAGE_SIZE;
121
122
env->guest_phys_fault_addr = 0;
123
124
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
125
126
prot &= prot2;
127
128
- if (riscv_feature(env, RISCV_FEATURE_PMP) &&
129
- (ret == TRANSLATE_SUCCESS) &&
130
- !pmp_hart_has_privs(env, pa, size, 1 << access_type, mode)) {
131
- ret = TRANSLATE_PMP_FAIL;
132
+ if (ret == TRANSLATE_SUCCESS) {
133
+ ret = get_physical_address_pmp(env, &prot_pmp, &tlb_size, pa,
134
+ size, access_type, mode);
135
+ prot &= prot_pmp;
136
}
137
138
if (ret != TRANSLATE_SUCCESS) {
139
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
140
"%s address=%" VADDR_PRIx " ret %d physical "
141
TARGET_FMT_plx " prot %d\n",
142
__func__, address, ret, pa, prot);
143
- }
144
145
- if (riscv_feature(env, RISCV_FEATURE_PMP) &&
146
- (ret == TRANSLATE_SUCCESS) &&
147
- !pmp_hart_has_privs(env, pa, size, 1 << access_type, mode)) {
148
- ret = TRANSLATE_PMP_FAIL;
149
+ if (ret == TRANSLATE_SUCCESS) {
150
+ ret = get_physical_address_pmp(env, &prot_pmp, &tlb_size, pa,
151
+ size, access_type, mode);
152
+ prot &= prot_pmp;
153
+ }
154
}
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
+{
188
+ bool ret;
189
+
190
+ if ((!riscv_feature(env, RISCV_FEATURE_PMP)) || (mode == PRV_M)) {
191
+ /*
192
+ * Privileged spec v1.10 states if HW doesn't implement any PMP entry
193
+ * or no PMP entry matches an M-Mode access, the access succeeds.
194
+ */
195
+ ret = true;
196
+ *allowed_privs = PMP_READ | PMP_WRITE | PMP_EXEC;
197
+ } else {
198
+ /*
199
+ * Other modes are not allowed to succeed if they don't * match a rule,
200
+ * but there are rules. We've checked for no rule earlier in this
201
+ * function.
202
+ */
203
+ ret = false;
204
+ *allowed_privs = 0;
205
+ }
206
+
207
+ return ret;
208
+}
209
+
210
211
/*
212
* Public Interface
213
@@ -XXX,XX +XXX,XX @@ static int pmp_is_in_range(CPURISCVState *env, int pmp_index, target_ulong addr)
214
* Check if the address has required RWX privs to complete desired operation
215
*/
216
bool pmp_hart_has_privs(CPURISCVState *env, target_ulong addr,
217
- target_ulong size, pmp_priv_t privs, target_ulong mode)
218
+ target_ulong size, pmp_priv_t privs, pmp_priv_t *allowed_privs,
219
+ target_ulong mode)
22
{
220
{
23
CPURISCVState *env = &RISCV_CPU(obj)->env;
221
int i = 0;
24
/* We set this in the realise function */
222
int ret = -1;
25
- set_misa(env, 0);
223
int pmp_size = 0;
26
+ set_misa(env, RV64);
224
target_ulong s = 0;
225
target_ulong e = 0;
226
- pmp_priv_t allowed_privs = 0;
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;
27
}
274
}
28
275
29
-#ifdef TARGET_RISCV64
276
-
30
static void rv64_sifive_u_cpu_init(Object *obj)
277
/*
31
{
278
* Handle a write to a pmpcfg CSP
32
CPURISCVState *env = &RISCV_CPU(obj)->env;
279
*/
33
@@ -XXX,XX +XXX,XX @@ static void rv64_sifive_e_cpu_init(Object *obj)
280
@@ -XXX,XX +XXX,XX @@ bool pmp_is_range_in_tlb(CPURISCVState *env, hwaddr tlb_sa,
34
qdev_prop_set_bit(DEVICE(obj), "mmu", false);
281
282
return false;
35
}
283
}
36
#else
284
+
37
+static void rv32_base_cpu_init(Object *obj)
285
+/*
286
+ * Convert PMP privilege to TLB page privilege.
287
+ */
288
+int pmp_priv_to_page_prot(pmp_priv_t pmp_priv)
38
+{
289
+{
39
+ CPURISCVState *env = &RISCV_CPU(obj)->env;
290
+ int prot = 0;
40
+ /* We set this in the realise function */
291
+
41
+ set_misa(env, RV32);
292
+ if (pmp_priv & PMP_READ) {
293
+ prot |= PAGE_READ;
294
+ }
295
+ if (pmp_priv & PMP_WRITE) {
296
+ prot |= PAGE_WRITE;
297
+ }
298
+ if (pmp_priv & PMP_EXEC) {
299
+ prot |= PAGE_EXEC;
300
+ }
301
+
302
+ return prot;
42
+}
303
+}
43
+
44
static void rv32_sifive_u_cpu_init(Object *obj)
45
{
46
CPURISCVState *env = &RISCV_CPU(obj)->env;
47
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
48
RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(dev);
49
int priv_version = PRIV_VERSION_1_11_0;
50
int vext_version = VEXT_VERSION_0_07_1;
51
- target_ulong target_misa = 0;
52
+ target_ulong target_misa = env->misa;
53
Error *local_err = NULL;
54
55
cpu_exec_realizefn(cs, &local_err);
56
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
57
58
set_resetvec(env, cpu->cfg.resetvec);
59
60
- /* If misa isn't set (rv32 and rv64 machines) set it here */
61
- if (!env->misa) {
62
+ /* If only XLEN is set for misa, then set misa from properties */
63
+ if (env->misa == RV32 || env->misa == RV64) {
64
/* Do some ISA extension error checking */
65
if (cpu->cfg.ext_i && cpu->cfg.ext_e) {
66
error_setg(errp,
67
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
68
set_vext_version(env, vext_version);
69
}
70
71
- set_misa(env, RVXLEN | target_misa);
72
+ set_misa(env, target_misa);
73
}
74
75
riscv_cpu_register_gdb_regs_for_features(cs);
76
@@ -XXX,XX +XXX,XX @@ static const TypeInfo riscv_cpu_type_infos[] = {
77
},
78
DEFINE_CPU(TYPE_RISCV_CPU_ANY, riscv_any_cpu_init),
79
#if defined(TARGET_RISCV32)
80
- DEFINE_CPU(TYPE_RISCV_CPU_BASE32, riscv_base_cpu_init),
81
+ DEFINE_CPU(TYPE_RISCV_CPU_BASE32, rv32_base_cpu_init),
82
DEFINE_CPU(TYPE_RISCV_CPU_IBEX, rv32_ibex_cpu_init),
83
DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E31, rv32_sifive_e_cpu_init),
84
DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E34, rv32_imafcu_nommu_cpu_init),
85
DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_U34, rv32_sifive_u_cpu_init),
86
#elif defined(TARGET_RISCV64)
87
- DEFINE_CPU(TYPE_RISCV_CPU_BASE64, riscv_base_cpu_init),
88
+ DEFINE_CPU(TYPE_RISCV_CPU_BASE64, rv64_base_cpu_init),
89
DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E51, rv64_sifive_e_cpu_init),
90
DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_U54, rv64_sifive_u_cpu_init),
91
#endif
92
--
304
--
93
2.29.2
305
2.30.1
94
306
95
307
diff view generated by jsdifflib
1
From: Jim Shu <cwshu@andestech.com>
2
3
Like MMU translation, add qemu log of PMP permission checking for
4
debugging.
5
6
Signed-off-by: Jim Shu <cwshu@andestech.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-id: 1613916082-19528-3-git-send-email-cwshu@andestech.com
1
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
2
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
3
Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>
4
Acked-by: Palmer Dabbelt <palmerdabbelt@google.com>
5
Reviewed-by: Bin Meng <bin.meng@windriver.com>
6
Tested-by: Bin Meng <bin.meng@windriver.com>
7
Message-id: 872d2dfcd1c7c3914655d677e911b9432eb8f340.1608142916.git.alistair.francis@wdc.com
8
---
10
---
9
target/riscv/cpu_helper.c | 12 +++++++-----
11
target/riscv/cpu_helper.c | 12 ++++++++++++
10
1 file changed, 7 insertions(+), 5 deletions(-)
12
1 file changed, 12 insertions(+)
11
13
12
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
14
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
13
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
14
--- a/target/riscv/cpu_helper.c
16
--- a/target/riscv/cpu_helper.c
15
+++ b/target/riscv/cpu_helper.c
17
+++ b/target/riscv/cpu_helper.c
16
@@ -XXX,XX +XXX,XX @@ restart:
18
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
17
return TRANSLATE_PMP_FAIL;
19
if (ret == TRANSLATE_SUCCESS) {
20
ret = get_physical_address_pmp(env, &prot_pmp, &tlb_size, pa,
21
size, access_type, mode);
22
+
23
+ qemu_log_mask(CPU_LOG_MMU,
24
+ "%s PMP address=" TARGET_FMT_plx " ret %d prot"
25
+ " %d tlb_size " TARGET_FMT_lu "\n",
26
+ __func__, pa, ret, prot_pmp, tlb_size);
27
+
28
prot &= prot_pmp;
29
}
30
31
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
32
if (ret == TRANSLATE_SUCCESS) {
33
ret = get_physical_address_pmp(env, &prot_pmp, &tlb_size, pa,
34
size, access_type, mode);
35
+
36
+ qemu_log_mask(CPU_LOG_MMU,
37
+ "%s PMP address=" TARGET_FMT_plx " ret %d prot"
38
+ " %d tlb_size " TARGET_FMT_lu "\n",
39
+ __func__, pa, ret, prot_pmp, tlb_size);
40
+
41
prot &= prot_pmp;
18
}
42
}
19
43
}
20
-#if defined(TARGET_RISCV32)
21
- target_ulong pte = address_space_ldl(cs->as, pte_addr, attrs, &res);
22
-#elif defined(TARGET_RISCV64)
23
- target_ulong pte = address_space_ldq(cs->as, pte_addr, attrs, &res);
24
-#endif
25
+ target_ulong pte;
26
+ if (riscv_cpu_is_32bit(env)) {
27
+ pte = address_space_ldl(cs->as, pte_addr, attrs, &res);
28
+ } else {
29
+ pte = address_space_ldq(cs->as, pte_addr, attrs, &res);
30
+ }
31
+
32
if (res != MEMTX_OK) {
33
return TRANSLATE_FAIL;
34
}
35
--
44
--
36
2.29.2
45
2.30.1
37
46
38
47
diff view generated by jsdifflib
1
From: Jim Shu <cwshu@andestech.com>
2
3
If PMP permission of any address has been changed by updating PMP entry,
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
1
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
2
Reviewed-by: Bin Meng <bin.meng@windriver.com>
3
Tested-by: Bin Meng <bin.meng@windriver.com>
4
Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>
5
Acked-by: Palmer Dabbelt <palmerdabbelt@google.com>
6
Message-id: 51e9842dbed1acceebad7f97bd3aae69aa1ac19e.1608142916.git.alistair.francis@wdc.com
7
---
10
---
8
include/hw/riscv/boot.h | 8 +++---
11
target/riscv/pmp.c | 4 ++++
9
hw/riscv/boot.c | 55 ++++++++++++++++++++++-------------------
12
1 file changed, 4 insertions(+)
10
hw/riscv/sifive_u.c | 2 +-
11
hw/riscv/spike.c | 3 ++-
12
hw/riscv/virt.c | 2 +-
13
5 files changed, 39 insertions(+), 31 deletions(-)
14
13
15
diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h
14
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
16
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/riscv/boot.h
16
--- a/target/riscv/pmp.c
18
+++ b/include/hw/riscv/boot.h
17
+++ b/target/riscv/pmp.c
19
@@ -XXX,XX +XXX,XX @@ target_ulong riscv_load_kernel(const char *kernel_filename,
20
hwaddr riscv_load_initrd(const char *filename, uint64_t mem_size,
21
uint64_t kernel_entry, hwaddr *start);
22
uint32_t riscv_load_fdt(hwaddr dram_start, uint64_t dram_size, void *fdt);
23
-void riscv_setup_rom_reset_vec(hwaddr saddr, hwaddr rom_base,
24
- hwaddr rom_size, uint64_t kernel_entry,
25
+void riscv_setup_rom_reset_vec(MachineState *machine, hwaddr saddr,
26
+ hwaddr rom_base, hwaddr rom_size,
27
+ uint64_t kernel_entry,
28
uint32_t fdt_load_addr, void *fdt);
29
-void riscv_rom_copy_firmware_info(hwaddr rom_base, hwaddr rom_size,
30
+void riscv_rom_copy_firmware_info(MachineState *machine, hwaddr rom_base,
31
+ hwaddr rom_size,
32
uint32_t reset_vec_size,
33
uint64_t kernel_entry);
34
35
diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c
36
index XXXXXXX..XXXXXXX 100644
37
--- a/hw/riscv/boot.c
38
+++ b/hw/riscv/boot.c
39
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@
40
19
#include "qapi/error.h"
41
#include <libfdt.h>
20
#include "cpu.h"
42
21
#include "trace.h"
43
-#if defined(TARGET_RISCV32)
22
+#include "exec/exec-all.h"
44
-#define fw_dynamic_info_data(__val) cpu_to_le32(__val)
23
45
-#else
24
static void pmp_write_cfg(CPURISCVState *env, uint32_t addr_index,
46
-#define fw_dynamic_info_data(__val) cpu_to_le64(__val)
25
uint8_t val);
47
-#endif
26
@@ -XXX,XX +XXX,XX @@ void pmpcfg_csr_write(CPURISCVState *env, uint32_t reg_index,
48
-
27
cfg_val = (val >> 8 * i) & 0xff;
49
bool riscv_is_32_bit(MachineState *machine)
28
pmp_write_cfg(env, (reg_index * 4) + i, cfg_val);
50
{
29
}
51
/*
30
+
52
@@ -XXX,XX +XXX,XX @@ uint32_t riscv_load_fdt(hwaddr dram_base, uint64_t mem_size, void *fdt)
31
+ /* If PMP permission of any addr has been changed, flush TLB pages. */
53
return fdt_addr;
32
+ tlb_flush(env_cpu(env));
54
}
33
}
55
34
56
-void riscv_rom_copy_firmware_info(hwaddr rom_base, hwaddr rom_size,
57
- uint32_t reset_vec_size, uint64_t kernel_entry)
58
+void riscv_rom_copy_firmware_info(MachineState *machine, hwaddr rom_base,
59
+ hwaddr rom_size, uint32_t reset_vec_size,
60
+ uint64_t kernel_entry)
61
{
62
struct fw_dynamic_info dinfo;
63
size_t dinfo_len;
64
65
- dinfo.magic = fw_dynamic_info_data(FW_DYNAMIC_INFO_MAGIC_VALUE);
66
- dinfo.version = fw_dynamic_info_data(FW_DYNAMIC_INFO_VERSION);
67
- dinfo.next_mode = fw_dynamic_info_data(FW_DYNAMIC_INFO_NEXT_MODE_S);
68
- dinfo.next_addr = fw_dynamic_info_data(kernel_entry);
69
+ if (sizeof(dinfo.magic) == 4) {
70
+ dinfo.magic = cpu_to_le32(FW_DYNAMIC_INFO_MAGIC_VALUE);
71
+ dinfo.version = cpu_to_le32(FW_DYNAMIC_INFO_VERSION);
72
+ dinfo.next_mode = cpu_to_le32(FW_DYNAMIC_INFO_NEXT_MODE_S);
73
+ dinfo.next_addr = cpu_to_le32(kernel_entry);
74
+ } else {
75
+ dinfo.magic = cpu_to_le64(FW_DYNAMIC_INFO_MAGIC_VALUE);
76
+ dinfo.version = cpu_to_le64(FW_DYNAMIC_INFO_VERSION);
77
+ dinfo.next_mode = cpu_to_le64(FW_DYNAMIC_INFO_NEXT_MODE_S);
78
+ dinfo.next_addr = cpu_to_le64(kernel_entry);
79
+ }
80
dinfo.options = 0;
81
dinfo.boot_hart = 0;
82
dinfo_len = sizeof(dinfo);
83
@@ -XXX,XX +XXX,XX @@ void riscv_rom_copy_firmware_info(hwaddr rom_base, hwaddr rom_size,
84
&address_space_memory);
85
}
86
87
-void riscv_setup_rom_reset_vec(hwaddr start_addr, hwaddr rom_base,
88
- hwaddr rom_size, uint64_t kernel_entry,
89
+void riscv_setup_rom_reset_vec(MachineState *machine, hwaddr start_addr,
90
+ hwaddr rom_base, hwaddr rom_size,
91
+ uint64_t kernel_entry,
92
uint32_t fdt_load_addr, void *fdt)
93
{
94
int i;
95
uint32_t start_addr_hi32 = 0x00000000;
96
97
- #if defined(TARGET_RISCV64)
98
- start_addr_hi32 = start_addr >> 32;
99
- #endif
100
+ if (!riscv_is_32_bit(machine)) {
101
+ start_addr_hi32 = start_addr >> 32;
102
+ }
103
/* reset vector */
104
uint32_t reset_vec[10] = {
105
0x00000297, /* 1: auipc t0, %pcrel_hi(fw_dyn) */
106
0x02828613, /* addi a2, t0, %pcrel_lo(1b) */
107
0xf1402573, /* csrr a0, mhartid */
108
-#if defined(TARGET_RISCV32)
109
- 0x0202a583, /* lw a1, 32(t0) */
110
- 0x0182a283, /* lw t0, 24(t0) */
111
-#elif defined(TARGET_RISCV64)
112
- 0x0202b583, /* ld a1, 32(t0) */
113
- 0x0182b283, /* ld t0, 24(t0) */
114
-#endif
115
+ 0,
116
+ 0,
117
0x00028067, /* jr t0 */
118
start_addr, /* start: .dword */
119
start_addr_hi32,
120
@@ -XXX,XX +XXX,XX @@ void riscv_setup_rom_reset_vec(hwaddr start_addr, hwaddr rom_base,
121
0x00000000,
122
/* fw_dyn: */
123
};
124
+ if (riscv_is_32_bit(machine)) {
125
+ reset_vec[3] = 0x0202a583; /* lw a1, 32(t0) */
126
+ reset_vec[4] = 0x0182a283; /* lw t0, 24(t0) */
127
+ } else {
128
+ reset_vec[3] = 0x0202b583; /* ld a1, 32(t0) */
129
+ reset_vec[4] = 0x0182b283; /* ld t0, 24(t0) */
130
+ }
131
132
/* copy in the reset vector in little_endian byte order */
133
for (i = 0; i < ARRAY_SIZE(reset_vec); i++) {
134
@@ -XXX,XX +XXX,XX @@ void riscv_setup_rom_reset_vec(hwaddr start_addr, hwaddr rom_base,
135
}
136
rom_add_blob_fixed_as("mrom.reset", reset_vec, sizeof(reset_vec),
137
rom_base, &address_space_memory);
138
- riscv_rom_copy_firmware_info(rom_base, rom_size, sizeof(reset_vec),
139
+ riscv_rom_copy_firmware_info(machine, rom_base, rom_size, sizeof(reset_vec),
140
kernel_entry);
141
142
return;
143
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
144
index XXXXXXX..XXXXXXX 100644
145
--- a/hw/riscv/sifive_u.c
146
+++ b/hw/riscv/sifive_u.c
147
@@ -XXX,XX +XXX,XX @@ static void sifive_u_machine_init(MachineState *machine)
148
rom_add_blob_fixed_as("mrom.reset", reset_vec, sizeof(reset_vec),
149
memmap[SIFIVE_U_DEV_MROM].base, &address_space_memory);
150
151
- riscv_rom_copy_firmware_info(memmap[SIFIVE_U_DEV_MROM].base,
152
+ riscv_rom_copy_firmware_info(machine, memmap[SIFIVE_U_DEV_MROM].base,
153
memmap[SIFIVE_U_DEV_MROM].size,
154
sizeof(reset_vec), kernel_entry);
155
}
156
diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c
157
index XXXXXXX..XXXXXXX 100644
158
--- a/hw/riscv/spike.c
159
+++ b/hw/riscv/spike.c
160
@@ -XXX,XX +XXX,XX @@ static void spike_board_init(MachineState *machine)
161
fdt_load_addr = riscv_load_fdt(memmap[SPIKE_DRAM].base,
162
machine->ram_size, s->fdt);
163
/* load the reset vector */
164
- riscv_setup_rom_reset_vec(memmap[SPIKE_DRAM].base, memmap[SPIKE_MROM].base,
165
+ riscv_setup_rom_reset_vec(machine, memmap[SPIKE_DRAM].base,
166
+ memmap[SPIKE_MROM].base,
167
memmap[SPIKE_MROM].size, kernel_entry,
168
fdt_load_addr, s->fdt);
169
170
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
171
index XXXXXXX..XXXXXXX 100644
172
--- a/hw/riscv/virt.c
173
+++ b/hw/riscv/virt.c
174
@@ -XXX,XX +XXX,XX @@ static void virt_machine_init(MachineState *machine)
175
fdt_load_addr = riscv_load_fdt(memmap[VIRT_DRAM].base,
176
machine->ram_size, s->fdt);
177
/* load the reset vector */
178
- riscv_setup_rom_reset_vec(start_addr, virt_memmap[VIRT_MROM].base,
179
+ riscv_setup_rom_reset_vec(machine, start_addr, virt_memmap[VIRT_MROM].base,
180
virt_memmap[VIRT_MROM].size, kernel_entry,
181
fdt_load_addr, s->fdt);
182
35
183
--
36
--
184
2.29.2
37
2.30.1
185
38
186
39
diff view generated by jsdifflib
1
From: Xinhao Zhang <zhangxinhao1@huawei.com>
1
From: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
2
2
3
Fix code style. Don't use '#' flag of printf format ('%#') in
3
According to the specification the "field SPVP of hstatus controls the
4
format strings, use '0x' prefix instead
4
privilege level of the access" for the hypervisor virtual-machine load
5
and store instructions HLV, HLVX and HSV.
5
6
6
Signed-off-by: Xinhao Zhang <zhangxinhao1@huawei.com>
7
Signed-off-by: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
7
Signed-off-by: Kai Deng <dengkai1@huawei.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 20201116140148.2850128-1-zhangxinhao1@huawei.com
9
Message-id: 20210311103005.1400718-1-georg.kotheimer@kernkonzept.com
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
11
---
12
hw/core/register.c | 16 ++++++++--------
12
target/riscv/cpu_helper.c | 25 ++++++++++++++-----------
13
1 file changed, 8 insertions(+), 8 deletions(-)
13
1 file changed, 14 insertions(+), 11 deletions(-)
14
14
15
diff --git a/hw/core/register.c b/hw/core/register.c
15
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
16
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/core/register.c
17
--- a/target/riscv/cpu_helper.c
18
+++ b/hw/core/register.c
18
+++ b/target/riscv/cpu_helper.c
19
@@ -XXX,XX +XXX,XX @@ void register_write(RegisterInfo *reg, uint64_t val, uint64_t we,
19
@@ -XXX,XX +XXX,XX @@ static int get_physical_address(CPURISCVState *env, hwaddr *physical,
20
20
use_background = true;
21
if (!ac || !ac->name) {
22
qemu_log_mask(LOG_GUEST_ERROR, "%s: write to undefined device state "
23
- "(written value: %#" PRIx64 ")\n", prefix, val);
24
+ "(written value: 0x%" PRIx64 ")\n", prefix, val);
25
return;
26
}
21
}
27
22
28
@@ -XXX,XX +XXX,XX @@ void register_write(RegisterInfo *reg, uint64_t val, uint64_t we,
23
- if (mode == PRV_M && access_type != MMU_INST_FETCH) {
29
test = (old_val ^ val) & ac->rsvd;
24
+ /* MPRV does not affect the virtual-machine load/store
30
if (test) {
25
+ instructions, HLV, HLVX, and HSV. */
31
qemu_log_mask(LOG_GUEST_ERROR, "%s: change of value in reserved bit"
26
+ if (riscv_cpu_two_stage_lookup(mmu_idx)) {
32
- "fields: %#" PRIx64 ")\n", prefix, test);
27
+ mode = get_field(env->hstatus, HSTATUS_SPVP);
33
+ "fields: 0x%" PRIx64 ")\n", prefix, test);
28
+ } else if (mode == PRV_M && access_type != MMU_INST_FETCH) {
29
if (get_field(env->mstatus, MSTATUS_MPRV)) {
30
mode = get_field(env->mstatus, MSTATUS_MPP);
31
}
32
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
33
qemu_log_mask(CPU_LOG_MMU, "%s ad %" VADDR_PRIx " rw %d mmu_idx %d\n",
34
__func__, address, access_type, mmu_idx);
35
36
- if (mode == PRV_M && access_type != MMU_INST_FETCH) {
37
- if (get_field(env->mstatus, MSTATUS_MPRV)) {
38
- mode = get_field(env->mstatus, MSTATUS_MPP);
39
+ /* MPRV does not affect the virtual-machine load/store
40
+ instructions, HLV, HLVX, and HSV. */
41
+ if (riscv_cpu_two_stage_lookup(mmu_idx)) {
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
}
34
}
49
}
35
50
36
test = val & ac->unimp;
51
- if (riscv_has_ext(env, RVH) && env->priv == PRV_M &&
37
if (test) {
52
- access_type != MMU_INST_FETCH &&
38
qemu_log_mask(LOG_UNIMP,
53
- get_field(env->mstatus, MSTATUS_MPRV) &&
39
- "%s:%s writing %#" PRIx64 " to unimplemented bits:" \
54
- get_field(env->mstatus, MSTATUS_MPV)) {
40
- " %#" PRIx64 "\n",
55
- two_stage_lookup = true;
41
+ "%s:%s writing 0x%" PRIx64 " to unimplemented bits:" \
56
- }
42
+ " 0x%" PRIx64 "\n",
57
-
43
prefix, reg->access->name, val, ac->unimp);
58
if (riscv_cpu_virt_enabled(env) ||
44
}
59
((riscv_cpu_two_stage_lookup(mmu_idx) || two_stage_lookup) &&
45
60
access_type != MMU_INST_FETCH)) {
46
@@ -XXX,XX +XXX,XX @@ void register_write(RegisterInfo *reg, uint64_t val, uint64_t we,
47
}
48
49
if (debug) {
50
- qemu_log("%s:%s: write of value %#" PRIx64 "\n", prefix, ac->name,
51
+ qemu_log("%s:%s: write of value 0x%" PRIx64 "\n", prefix, ac->name,
52
new_val);
53
}
54
55
@@ -XXX,XX +XXX,XX @@ uint64_t register_read(RegisterInfo *reg, uint64_t re, const char* prefix,
56
}
57
58
if (debug) {
59
- qemu_log("%s:%s: read of value %#" PRIx64 "\n", prefix,
60
+ qemu_log("%s:%s: read of value 0x%" PRIx64 "\n", prefix,
61
ac->name, ret);
62
}
63
64
@@ -XXX,XX +XXX,XX @@ void register_write_memory(void *opaque, hwaddr addr,
65
66
if (!reg) {
67
qemu_log_mask(LOG_GUEST_ERROR, "%s: write to unimplemented register " \
68
- "at address: %#" PRIx64 "\n", reg_array->prefix, addr);
69
+ "at address: 0x%" PRIx64 "\n", reg_array->prefix, addr);
70
return;
71
}
72
73
@@ -XXX,XX +XXX,XX @@ uint64_t register_read_memory(void *opaque, hwaddr addr,
74
75
if (!reg) {
76
qemu_log_mask(LOG_GUEST_ERROR, "%s: read to unimplemented register " \
77
- "at address: %#" PRIx64 "\n", reg_array->prefix, addr);
78
+ "at address: 0x%" PRIx64 "\n", reg_array->prefix, addr);
79
return 0;
80
}
81
82
--
61
--
83
2.29.2
62
2.30.1
84
63
85
64
diff view generated by jsdifflib
1
From: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
2
3
Signed-off-by: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Message-id: 20210311094902.1377593-1-georg.kotheimer@kernkonzept.com
1
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
2
Reviewed-by: Bin Meng <bin.meng@windriver.com>
3
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>
5
Acked-by: Palmer Dabbelt <palmerdabbelt@google.com>
6
Tested-by: Bin Meng <bin.meng@windriver.com>
7
Message-id: a426ead44db5065a0790066d43e91245683509d7.1608142916.git.alistair.francis@wdc.com
8
---
7
---
9
target/riscv/cpu.c | 19 ++++++++++---------
8
target/riscv/csr.c | 7 ++++---
10
1 file changed, 10 insertions(+), 9 deletions(-)
9
1 file changed, 4 insertions(+), 3 deletions(-)
11
10
12
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
11
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
13
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
14
--- a/target/riscv/cpu.c
13
--- a/target/riscv/csr.c
15
+++ b/target/riscv/cpu.c
14
+++ b/target/riscv/csr.c
16
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_dump_state(CPUState *cs, FILE *f, int flags)
15
@@ -XXX,XX +XXX,XX @@ static const target_ulong sstatus_v1_10_mask = SSTATUS_SIE | SSTATUS_SPIE |
17
#ifndef CONFIG_USER_ONLY
16
SSTATUS_UIE | SSTATUS_UPIE | SSTATUS_SPP | SSTATUS_FS | SSTATUS_XS |
18
qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "mhartid ", env->mhartid);
17
SSTATUS_SUM | SSTATUS_MXR | SSTATUS_SD;
19
qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "mstatus ", (target_ulong)env->mstatus);
18
static const target_ulong sip_writable_mask = SIP_SSIP | MIP_USIP | MIP_UEIP;
20
-#ifdef TARGET_RISCV32
19
-static const target_ulong hip_writable_mask = MIP_VSSIP | MIP_VSTIP | MIP_VSEIP;
21
- qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "mstatush ",
20
+static const target_ulong hip_writable_mask = MIP_VSSIP;
22
- (target_ulong)(env->mstatus >> 32));
21
+static const target_ulong hvip_writable_mask = MIP_VSSIP | MIP_VSTIP | MIP_VSEIP;
23
-#endif
22
static const target_ulong vsip_writable_mask = MIP_VSSIP;
24
+ if (riscv_cpu_is_32bit(env)) {
23
25
+ qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "mstatush ",
24
static const char valid_vm_1_10_32[16] = {
26
+ (target_ulong)(env->mstatus >> 32));
25
@@ -XXX,XX +XXX,XX @@ static int rmw_hvip(CPURISCVState *env, int csrno, target_ulong *ret_value,
27
+ }
26
target_ulong new_value, target_ulong write_mask)
28
if (riscv_has_ext(env, RVH)) {
29
qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "hstatus ", env->hstatus);
30
qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "vsstatus ",
31
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_reset(DeviceState *dev)
32
33
static void riscv_cpu_disas_set_info(CPUState *s, disassemble_info *info)
34
{
27
{
35
-#if defined(TARGET_RISCV32)
28
int ret = rmw_mip(env, 0, ret_value, new_value,
36
- info->print_insn = print_insn_riscv32;
29
- write_mask & hip_writable_mask);
37
-#elif defined(TARGET_RISCV64)
30
+ write_mask & hvip_writable_mask);
38
- info->print_insn = print_insn_riscv64;
31
39
-#endif
32
- *ret_value &= hip_writable_mask;
40
+ RISCVCPU *cpu = RISCV_CPU(s);
33
+ *ret_value &= hvip_writable_mask;
41
+ if (riscv_cpu_is_32bit(&cpu->env)) {
34
42
+ info->print_insn = print_insn_riscv32;
35
return ret;
43
+ } else {
44
+ info->print_insn = print_insn_riscv64;
45
+ }
46
}
36
}
47
48
static void riscv_cpu_realize(DeviceState *dev, Error **errp)
49
--
37
--
50
2.29.2
38
2.30.1
51
39
52
40
diff view generated by jsdifflib
1
From: Yifei Jiang <jiangyifei@huawei.com>
1
From: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
2
2
3
We found that the hypervisor virtual-machine load and store instructions,
3
The current condition for the use of background registers only
4
included HLVX/HLV/HSV, couldn't access guest userspace memory.
4
considers the hypervisor load and store instructions,
5
but not accesses from M mode via MSTATUS_MPRV+MPV.
5
6
6
In the riscv-privileged spec, HLVX/HLV/HSV is defined as follow:
7
Signed-off-by: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
7
"As usual when V=1, two-stage address translation is applied, and
8
the HS-level sstatus.SUM is ignored."
9
10
But get_physical_address() doesn't ignore sstatus.SUM, when HLVX/HLV/HSV
11
accesses guest userspace memory. So this patch fixes it.
12
13
Signed-off-by: Yifei Jiang <jiangyifei@huawei.com>
14
Signed-off-by: Yipeng Yin <yinyipeng1@huawei.com>
15
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
16
Message-id: 20201130012810.899-1-jiangyifei@huawei.com
9
Message-id: 20210311103036.1401073-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/cpu_helper.c | 3 ++-
12
target/riscv/cpu_helper.c | 2 +-
20
1 file changed, 2 insertions(+), 1 deletion(-)
13
1 file changed, 1 insertion(+), 1 deletion(-)
21
14
22
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
15
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
23
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
24
--- a/target/riscv/cpu_helper.c
17
--- a/target/riscv/cpu_helper.c
25
+++ b/target/riscv/cpu_helper.c
18
+++ b/target/riscv/cpu_helper.c
26
@@ -XXX,XX +XXX,XX @@ static int get_physical_address(CPURISCVState *env, hwaddr *physical,
19
@@ -XXX,XX +XXX,XX @@ static int get_physical_address(CPURISCVState *env, hwaddr *physical,
27
vm = get_field(env->hgatp, HGATP_MODE);
20
* was called. Background registers will be used if the guest has
28
widened = 2;
21
* forced a two stage translation to be on (in HS or M mode).
22
*/
23
- if (!riscv_cpu_virt_enabled(env) && riscv_cpu_two_stage_lookup(mmu_idx)) {
24
+ if (!riscv_cpu_virt_enabled(env) && two_stage) {
25
use_background = true;
29
}
26
}
30
- sum = get_field(env->mstatus, MSTATUS_SUM);
27
31
+ /* status.SUM will be ignored if execute on background */
32
+ sum = get_field(env->mstatus, MSTATUS_SUM) || use_background;
33
switch (vm) {
34
case VM_1_10_SV32:
35
levels = 2; ptidxbits = 10; ptesize = 4; break;
36
--
28
--
37
2.29.2
29
2.30.1
38
30
39
31
diff view generated by jsdifflib
1
From: Asherah Connor <ashe@kivikakk.ee>
2
3
Provides fw_cfg for the virt machine on riscv. This enables
4
using e.g. ramfb later.
5
6
Signed-off-by: Asherah Connor <ashe@kivikakk.ee>
7
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 20210318235041.17175-2-ashe@kivikakk.ee
1
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
2
Reviewed-by: Bin Meng <bin.meng@windriver.com>
3
Tested-by: Bin Meng <bin.meng@windriver.com>
4
Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>
5
Acked-by: Palmer Dabbelt <palmerdabbelt@google.com>
6
Message-id: aed1174c2efd2f050fa5bd8f524d68795b12c0e4.1608142916.git.alistair.francis@wdc.com
7
---
11
---
8
include/hw/riscv/virt.h | 6 ------
12
include/hw/riscv/virt.h | 2 ++
9
hw/riscv/virt.c | 2 +-
13
hw/riscv/virt.c | 30 ++++++++++++++++++++++++++++++
10
2 files changed, 1 insertion(+), 7 deletions(-)
14
hw/riscv/Kconfig | 1 +
15
3 files changed, 33 insertions(+)
11
16
12
diff --git a/include/hw/riscv/virt.h b/include/hw/riscv/virt.h
17
diff --git a/include/hw/riscv/virt.h b/include/hw/riscv/virt.h
13
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
14
--- a/include/hw/riscv/virt.h
19
--- a/include/hw/riscv/virt.h
15
+++ b/include/hw/riscv/virt.h
20
+++ b/include/hw/riscv/virt.h
21
@@ -XXX,XX +XXX,XX @@ struct RISCVVirtState {
22
RISCVHartArrayState soc[VIRT_SOCKETS_MAX];
23
DeviceState *plic[VIRT_SOCKETS_MAX];
24
PFlashCFI01 *flash[2];
25
+ FWCfgState *fw_cfg;
26
27
int fdt_size;
28
};
16
@@ -XXX,XX +XXX,XX @@ enum {
29
@@ -XXX,XX +XXX,XX @@ enum {
17
#define FDT_INT_MAP_WIDTH (FDT_PCI_ADDR_CELLS + FDT_PCI_INT_CELLS + 1 + \
30
VIRT_PLIC,
18
FDT_PLIC_ADDR_CELLS + FDT_PLIC_INT_CELLS)
31
VIRT_UART0,
19
32
VIRT_VIRTIO,
20
-#if defined(TARGET_RISCV32)
33
+ VIRT_FW_CFG,
21
-#define VIRT_CPU TYPE_RISCV_CPU_BASE32
34
VIRT_FLASH,
22
-#elif defined(TARGET_RISCV64)
35
VIRT_DRAM,
23
-#define VIRT_CPU TYPE_RISCV_CPU_BASE64
36
VIRT_PCIE_MMIO,
24
-#endif
25
-
26
#endif
27
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
37
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
28
index XXXXXXX..XXXXXXX 100644
38
index XXXXXXX..XXXXXXX 100644
29
--- a/hw/riscv/virt.c
39
--- a/hw/riscv/virt.c
30
+++ b/hw/riscv/virt.c
40
+++ b/hw/riscv/virt.c
31
@@ -XXX,XX +XXX,XX @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
41
@@ -XXX,XX +XXX,XX @@ static const MemMapEntry virt_memmap[] = {
32
mc->desc = "RISC-V VirtIO board";
42
[VIRT_PLIC] = { 0xc000000, VIRT_PLIC_SIZE(VIRT_CPUS_MAX * 2) },
33
mc->init = virt_machine_init;
43
[VIRT_UART0] = { 0x10000000, 0x100 },
34
mc->max_cpus = VIRT_CPUS_MAX;
44
[VIRT_VIRTIO] = { 0x10001000, 0x1000 },
35
- mc->default_cpu_type = VIRT_CPU;
45
+ [VIRT_FW_CFG] = { 0x10100000, 0x18 },
36
+ mc->default_cpu_type = TYPE_RISCV_CPU_BASE;
46
[VIRT_FLASH] = { 0x20000000, 0x4000000 },
37
mc->pci_allow_0_address = true;
47
[VIRT_PCIE_ECAM] = { 0x30000000, 0x10000000 },
38
mc->possible_cpu_arch_ids = riscv_numa_possible_cpu_arch_ids;
48
[VIRT_PCIE_MMIO] = { 0x40000000, 0x40000000 },
39
mc->cpu_index_to_instance_props = riscv_numa_cpu_index_to_props;
49
@@ -XXX,XX +XXX,XX @@ static inline DeviceState *gpex_pcie_init(MemoryRegion *sys_mem,
50
return dev;
51
}
52
53
+static FWCfgState *create_fw_cfg(const MachineState *mc)
54
+{
55
+ hwaddr base = virt_memmap[VIRT_FW_CFG].base;
56
+ hwaddr size = virt_memmap[VIRT_FW_CFG].size;
57
+ FWCfgState *fw_cfg;
58
+ char *nodename;
59
+
60
+ fw_cfg = fw_cfg_init_mem_wide(base + 8, base, 8, base + 16,
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
40
--
104
--
41
2.29.2
105
2.30.1
42
106
43
107
diff view generated by jsdifflib
1
From: Asherah Connor <ashe@kivikakk.ee>
2
3
Allow ramfb on virt. This lets `-device ramfb' work.
4
5
Signed-off-by: Asherah Connor <ashe@kivikakk.ee>
6
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-id: 20210318235041.17175-3-ashe@kivikakk.ee
1
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
2
Reviewed-by: Bin Meng <bin.meng@windriver.com>
3
Tested-by: Bin Meng <bin.meng@windriver.com>
4
Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>
5
Acked-by: Palmer Dabbelt <palmerdabbelt@google.com>
6
Message-id: d7ca1aca672515e6a4aa0d41716238b055f3f25c.1608142916.git.alistair.francis@wdc.com
7
---
10
---
8
hw/riscv/virt.c | 32 +++++++++++++++++---------------
11
hw/riscv/virt.c | 3 +++
9
1 file changed, 17 insertions(+), 15 deletions(-)
12
1 file changed, 3 insertions(+)
10
13
11
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
14
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
12
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/riscv/virt.c
16
--- a/hw/riscv/virt.c
14
+++ b/hw/riscv/virt.c
17
+++ b/hw/riscv/virt.c
15
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@
19
#include "sysemu/sysemu.h"
16
#include "hw/pci/pci.h"
20
#include "hw/pci/pci.h"
17
#include "hw/pci-host/gpex.h"
21
#include "hw/pci-host/gpex.h"
18
22
+#include "hw/display/ramfb.h"
19
-#if defined(TARGET_RISCV32)
23
20
-# define BIOS_FILENAME "opensbi-riscv32-generic-fw_dynamic.bin"
24
static const MemMapEntry virt_memmap[] = {
21
-#else
25
[VIRT_DEBUG] = { 0x0, 0x100 },
22
-# define BIOS_FILENAME "opensbi-riscv64-generic-fw_dynamic.bin"
26
@@ -XXX,XX +XXX,XX @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
23
-#endif
27
mc->cpu_index_to_instance_props = riscv_numa_cpu_index_to_props;
24
-
28
mc->get_default_cpu_node_id = riscv_numa_get_default_cpu_node_id;
25
static const struct MemmapEntry {
29
mc->numa_mem_supported = true;
26
hwaddr base;
30
+
27
hwaddr size;
31
+ machine_class_allow_dynamic_sysbus_dev(mc, TYPE_RAMFB_DEVICE);
28
@@ -XXX,XX +XXX,XX @@ static void create_pcie_irq_map(void *fdt, char *nodename,
29
}
32
}
30
33
31
static void create_fdt(RISCVVirtState *s, const struct MemmapEntry *memmap,
34
static const TypeInfo virt_machine_typeinfo = {
32
- uint64_t mem_size, const char *cmdline)
33
+ uint64_t mem_size, const char *cmdline, bool is_32_bit)
34
{
35
void *fdt;
36
int i, cpu, socket;
37
@@ -XXX,XX +XXX,XX @@ static void create_fdt(RISCVVirtState *s, const struct MemmapEntry *memmap,
38
cpu_name = g_strdup_printf("/cpus/cpu@%d",
39
s->soc[socket].hartid_base + cpu);
40
qemu_fdt_add_subnode(fdt, cpu_name);
41
-#if defined(TARGET_RISCV32)
42
- qemu_fdt_setprop_string(fdt, cpu_name, "mmu-type", "riscv,sv32");
43
-#else
44
- qemu_fdt_setprop_string(fdt, cpu_name, "mmu-type", "riscv,sv48");
45
-#endif
46
+ if (is_32_bit) {
47
+ qemu_fdt_setprop_string(fdt, cpu_name, "mmu-type", "riscv,sv32");
48
+ } else {
49
+ qemu_fdt_setprop_string(fdt, cpu_name, "mmu-type", "riscv,sv48");
50
+ }
51
name = riscv_isa_string(&s->soc[socket].harts[cpu]);
52
qemu_fdt_setprop_string(fdt, cpu_name, "riscv,isa", name);
53
g_free(name);
54
@@ -XXX,XX +XXX,XX @@ static void virt_machine_init(MachineState *machine)
55
main_mem);
56
57
/* create device tree */
58
- create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline);
59
+ create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline,
60
+ riscv_is_32_bit(machine));
61
62
/* boot rom */
63
memory_region_init_rom(mask_rom, NULL, "riscv_virt_board.mrom",
64
@@ -XXX,XX +XXX,XX @@ static void virt_machine_init(MachineState *machine)
65
memory_region_add_subregion(system_memory, memmap[VIRT_MROM].base,
66
mask_rom);
67
68
- firmware_end_addr = riscv_find_and_load_firmware(machine, BIOS_FILENAME,
69
- start_addr, NULL);
70
+ if (riscv_is_32_bit(machine)) {
71
+ firmware_end_addr = riscv_find_and_load_firmware(machine,
72
+ "opensbi-riscv32-generic-fw_dynamic.bin",
73
+ start_addr, NULL);
74
+ } else {
75
+ firmware_end_addr = riscv_find_and_load_firmware(machine,
76
+ "opensbi-riscv64-generic-fw_dynamic.bin",
77
+ start_addr, NULL);
78
+ }
79
80
if (machine->kernel_filename) {
81
kernel_start_addr = riscv_calc_kernel_start_addr(machine,
82
--
35
--
83
2.29.2
36
2.30.1
84
37
85
38
diff view generated by jsdifflib
1
From: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
2
3
The previous implementation was broken in many ways:
4
- Used mideleg instead of hideleg to mask accesses
5
- Used MIP_VSSIP instead of VS_MODE_INTERRUPTS to mask writes to vsie
6
- Did not shift between S bits and VS bits (VSEIP <-> SEIP, ...)
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
1
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
2
Reviewed-by: Bin Meng <bin.meng@windriver.com>
3
Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>
4
Acked-by: Palmer Dabbelt <palmerdabbelt@google.com>
5
Tested-by: Bin Meng <bin.meng@windriver.com>
6
Message-id: 7371180970b7db310d3a1da21d03d33499c2beb0.1608142916.git.alistair.francis@wdc.com
7
---
12
---
8
target/riscv/cpu_bits.h | 4 +-
13
target/riscv/csr.c | 68 +++++++++++++++++++++++-----------------------
9
target/riscv/csr.c | 176 +++++++++++++++++++++-------------------
14
1 file changed, 34 insertions(+), 34 deletions(-)
10
2 files changed, 92 insertions(+), 88 deletions(-)
11
15
12
diff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h
13
index XXXXXXX..XXXXXXX 100644
14
--- a/target/riscv/cpu_bits.h
15
+++ b/target/riscv/cpu_bits.h
16
@@ -XXX,XX +XXX,XX @@
17
#define HSTATUS_VGEIN 0x0003F000
18
#define HSTATUS_VTVM 0x00100000
19
#define HSTATUS_VTSR 0x00400000
20
-#if defined(TARGET_RISCV64)
21
-#define HSTATUS_VSXL 0x300000000
22
-#endif
23
+#define HSTATUS_VSXL 0x300000000
24
25
#define HSTATUS32_WPRI 0xFF8FF87E
26
#define HSTATUS64_WPRI 0xFFFFFFFFFF8FF87EULL
27
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
16
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
28
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
29
--- a/target/riscv/csr.c
18
--- a/target/riscv/csr.c
30
+++ b/target/riscv/csr.c
19
+++ b/target/riscv/csr.c
31
@@ -XXX,XX +XXX,XX @@ static int ctr(CPURISCVState *env, int csrno)
20
@@ -XXX,XX +XXX,XX @@ static int write_sstatus(CPURISCVState *env, int csrno, target_ulong val)
32
return -RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
21
return write_mstatus(env, CSR_MSTATUS, newval);
33
}
22
}
34
break;
23
35
-#if defined(TARGET_RISCV32)
24
+static int read_vsie(CPURISCVState *env, int csrno, target_ulong *val)
36
- case CSR_CYCLEH:
25
+{
37
- if (!get_field(env->hcounteren, HCOUNTEREN_CY) &&
26
+ /* Shift the VS bits to their S bit location in vsie */
38
- get_field(env->mcounteren, HCOUNTEREN_CY)) {
27
+ *val = (env->mie & env->hideleg & VS_MODE_INTERRUPTS) >> 1;
39
- return -RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
28
+ return 0;
40
- }
29
+}
41
- break;
30
+
42
- case CSR_TIMEH:
31
static int read_sie(CPURISCVState *env, int csrno, target_ulong *val)
43
- if (!get_field(env->hcounteren, HCOUNTEREN_TM) &&
32
{
44
- get_field(env->mcounteren, HCOUNTEREN_TM)) {
33
if (riscv_cpu_virt_enabled(env)) {
45
- return -RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
34
- /* Tell the guest the VS bits, shifted to the S bit locations */
46
- }
35
- *val = (env->mie & env->mideleg & VS_MODE_INTERRUPTS) >> 1;
47
- break;
36
+ read_vsie(env, CSR_VSIE, val);
48
- case CSR_INSTRETH:
37
} else {
49
- if (!get_field(env->hcounteren, HCOUNTEREN_IR) &&
38
*val = env->mie & env->mideleg;
50
- get_field(env->mcounteren, HCOUNTEREN_IR)) {
51
- return -RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
52
- }
53
- break;
54
- case CSR_HPMCOUNTER3H...CSR_HPMCOUNTER31H:
55
- if (!get_field(env->hcounteren, 1 << (csrno - CSR_HPMCOUNTER3H)) &&
56
- get_field(env->mcounteren, 1 << (csrno - CSR_HPMCOUNTER3H))) {
57
- return -RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
58
+ }
59
+ if (riscv_cpu_is_32bit(env)) {
60
+ switch (csrno) {
61
+ case CSR_CYCLEH:
62
+ if (!get_field(env->hcounteren, HCOUNTEREN_CY) &&
63
+ get_field(env->mcounteren, HCOUNTEREN_CY)) {
64
+ return -RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
65
+ }
66
+ break;
67
+ case CSR_TIMEH:
68
+ if (!get_field(env->hcounteren, HCOUNTEREN_TM) &&
69
+ get_field(env->mcounteren, HCOUNTEREN_TM)) {
70
+ return -RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
71
+ }
72
+ break;
73
+ case CSR_INSTRETH:
74
+ if (!get_field(env->hcounteren, HCOUNTEREN_IR) &&
75
+ get_field(env->mcounteren, HCOUNTEREN_IR)) {
76
+ return -RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
77
+ }
78
+ break;
79
+ case CSR_HPMCOUNTER3H...CSR_HPMCOUNTER31H:
80
+ if (!get_field(env->hcounteren, 1 << (csrno - CSR_HPMCOUNTER3H)) &&
81
+ get_field(env->mcounteren, 1 << (csrno - CSR_HPMCOUNTER3H))) {
82
+ return -RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
83
+ }
84
+ break;
85
}
86
- break;
87
-#endif
88
}
89
}
39
}
90
#endif
91
return 0;
40
return 0;
92
}
41
}
93
42
94
+static int ctr32(CPURISCVState *env, int csrno)
43
-static int write_sie(CPURISCVState *env, int csrno, target_ulong val)
44
+static int write_vsie(CPURISCVState *env, int csrno, target_ulong val)
45
{
46
- target_ulong newval;
47
+ /* Shift the S bits to their VS bit location in mie */
48
+ target_ulong newval = (env->mie & ~VS_MODE_INTERRUPTS) |
49
+ ((val << 1) & env->hideleg & VS_MODE_INTERRUPTS);
50
+ return write_mie(env, CSR_MIE, newval);
51
+}
52
53
+static int write_sie(CPURISCVState *env, int csrno, target_ulong val)
95
+{
54
+{
96
+ if (!riscv_cpu_is_32bit(env)) {
55
if (riscv_cpu_virt_enabled(env)) {
97
+ return -RISCV_EXCP_ILLEGAL_INST;
56
- /* Shift the guests S bits to VS */
98
+ }
57
- newval = (env->mie & ~VS_MODE_INTERRUPTS) |
99
+
58
- ((val << 1) & VS_MODE_INTERRUPTS);
100
+ return ctr(env, csrno);
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;
101
+}
86
+}
102
+
87
+
103
#if !defined(CONFIG_USER_ONLY)
88
static int rmw_sip(CPURISCVState *env, int csrno, target_ulong *ret_value,
104
static int any(CPURISCVState *env, int csrno)
89
target_ulong new_value, target_ulong write_mask)
105
{
90
{
91
int ret;
92
93
if (riscv_cpu_virt_enabled(env)) {
94
- /* Shift the new values to line up with the VS bits */
95
- ret = rmw_mip(env, CSR_MSTATUS, ret_value, new_value << 1,
96
- (write_mask & sip_writable_mask) << 1 & env->mideleg);
97
- ret &= vsip_writable_mask;
98
- ret >>= 1;
99
+ ret = rmw_vsip(env, CSR_VSIP, ret_value, new_value, write_mask);
100
} else {
101
ret = rmw_mip(env, CSR_MSTATUS, ret_value, new_value,
102
write_mask & env->mideleg & sip_writable_mask);
103
@@ -XXX,XX +XXX,XX @@ static int write_vsstatus(CPURISCVState *env, int csrno, target_ulong val)
106
return 0;
104
return 0;
107
}
105
}
108
106
109
+static int any32(CPURISCVState *env, int csrno)
107
-static int rmw_vsip(CPURISCVState *env, int csrno, target_ulong *ret_value,
110
+{
108
- target_ulong new_value, target_ulong write_mask)
111
+ if (!riscv_cpu_is_32bit(env)) {
109
-{
112
+ return -RISCV_EXCP_ILLEGAL_INST;
110
- int ret = rmw_mip(env, 0, ret_value, new_value,
113
+ }
111
- write_mask & env->mideleg & vsip_writable_mask);
114
+
112
- return ret;
115
+ return any(env, csrno);
113
-}
116
+
114
-
117
+}
115
-static int read_vsie(CPURISCVState *env, int csrno, target_ulong *val)
118
+
116
-{
119
static int smode(CPURISCVState *env, int csrno)
117
- *val = env->mie & env->mideleg & VS_MODE_INTERRUPTS;
118
- return 0;
119
-}
120
-
121
-static int write_vsie(CPURISCVState *env, int csrno, target_ulong val)
122
-{
123
- target_ulong newval = (env->mie & ~env->mideleg) | (val & env->mideleg & MIP_VSSIP);
124
- return write_mie(env, CSR_MIE, newval);
125
-}
126
-
127
static int read_vstvec(CPURISCVState *env, int csrno, target_ulong *val)
120
{
128
{
121
return -!riscv_has_ext(env, RVS);
129
*val = env->vstvec;
122
@@ -XXX,XX +XXX,XX @@ static int hmode(CPURISCVState *env, int csrno)
123
return -RISCV_EXCP_ILLEGAL_INST;
124
}
125
126
+static int hmode32(CPURISCVState *env, int csrno)
127
+{
128
+ if (!riscv_cpu_is_32bit(env)) {
129
+ return 0;
130
+ }
131
+
132
+ return hmode(env, csrno);
133
+
134
+}
135
+
136
static int pmp(CPURISCVState *env, int csrno)
137
{
138
return -!riscv_feature(env, RISCV_FEATURE_PMP);
139
@@ -XXX,XX +XXX,XX @@ static int read_instret(CPURISCVState *env, int csrno, target_ulong *val)
140
return 0;
141
}
142
143
-#if defined(TARGET_RISCV32)
144
static int read_instreth(CPURISCVState *env, int csrno, target_ulong *val)
145
{
146
#if !defined(CONFIG_USER_ONLY)
147
@@ -XXX,XX +XXX,XX @@ static int read_instreth(CPURISCVState *env, int csrno, target_ulong *val)
148
#endif
149
return 0;
150
}
151
-#endif /* TARGET_RISCV32 */
152
153
#if defined(CONFIG_USER_ONLY)
154
static int read_time(CPURISCVState *env, int csrno, target_ulong *val)
155
@@ -XXX,XX +XXX,XX @@ static int read_time(CPURISCVState *env, int csrno, target_ulong *val)
156
return 0;
157
}
158
159
-#if defined(TARGET_RISCV32)
160
static int read_timeh(CPURISCVState *env, int csrno, target_ulong *val)
161
{
162
*val = cpu_get_host_ticks() >> 32;
163
return 0;
164
}
165
-#endif
166
167
#else /* CONFIG_USER_ONLY */
168
169
@@ -XXX,XX +XXX,XX @@ static int read_time(CPURISCVState *env, int csrno, target_ulong *val)
170
return 0;
171
}
172
173
-#if defined(TARGET_RISCV32)
174
static int read_timeh(CPURISCVState *env, int csrno, target_ulong *val)
175
{
176
uint64_t delta = riscv_cpu_virt_enabled(env) ? env->htimedelta : 0;
177
@@ -XXX,XX +XXX,XX @@ static int read_timeh(CPURISCVState *env, int csrno, target_ulong *val)
178
*val = (env->rdtime_fn(env->rdtime_fn_arg) + delta) >> 32;
179
return 0;
180
}
181
-#endif
182
183
/* Machine constants */
184
185
@@ -XXX,XX +XXX,XX @@ static const target_ulong sip_writable_mask = SIP_SSIP | MIP_USIP | MIP_UEIP;
186
static const target_ulong hip_writable_mask = MIP_VSSIP | MIP_VSTIP | MIP_VSEIP;
187
static const target_ulong vsip_writable_mask = MIP_VSSIP;
188
189
-#if defined(TARGET_RISCV32)
190
-static const char valid_vm_1_10[16] = {
191
+static const char valid_vm_1_10_32[16] = {
192
[VM_1_10_MBARE] = 1,
193
[VM_1_10_SV32] = 1
194
};
195
-#elif defined(TARGET_RISCV64)
196
-static const char valid_vm_1_10[16] = {
197
+
198
+static const char valid_vm_1_10_64[16] = {
199
[VM_1_10_MBARE] = 1,
200
[VM_1_10_SV39] = 1,
201
[VM_1_10_SV48] = 1,
202
[VM_1_10_SV57] = 1
203
};
204
-#endif /* CONFIG_USER_ONLY */
205
206
/* Machine Information Registers */
207
static int read_zero(CPURISCVState *env, int csrno, target_ulong *val)
208
@@ -XXX,XX +XXX,XX @@ static int read_mstatus(CPURISCVState *env, int csrno, target_ulong *val)
209
210
static int validate_vm(CPURISCVState *env, target_ulong vm)
211
{
212
- return valid_vm_1_10[vm & 0xf];
213
+ if (riscv_cpu_is_32bit(env)) {
214
+ return valid_vm_1_10_32[vm & 0xf];
215
+ } else {
216
+ return valid_vm_1_10_64[vm & 0xf];
217
+ }
218
}
219
220
static int write_mstatus(CPURISCVState *env, int csrno, target_ulong val)
221
@@ -XXX,XX +XXX,XX @@ static int write_mstatus(CPURISCVState *env, int csrno, target_ulong val)
222
MSTATUS_SPP | MSTATUS_FS | MSTATUS_MPRV | MSTATUS_SUM |
223
MSTATUS_MPP | MSTATUS_MXR | MSTATUS_TVM | MSTATUS_TSR |
224
MSTATUS_TW;
225
-#if defined(TARGET_RISCV64)
226
- /*
227
- * RV32: MPV and GVA are not in mstatus. The current plan is to
228
- * add them to mstatush. For now, we just don't support it.
229
- */
230
- mask |= MSTATUS_MPV | MSTATUS_GVA;
231
-#endif
232
+
233
+ if (!riscv_cpu_is_32bit(env)) {
234
+ /*
235
+ * RV32: MPV and GVA are not in mstatus. The current plan is to
236
+ * add them to mstatush. For now, we just don't support it.
237
+ */
238
+ mask |= MSTATUS_MPV | MSTATUS_GVA;
239
+ }
240
241
mstatus = (mstatus & ~mask) | (val & mask);
242
243
@@ -XXX,XX +XXX,XX @@ static int write_mstatus(CPURISCVState *env, int csrno, target_ulong val)
244
return 0;
245
}
246
247
-#ifdef TARGET_RISCV32
248
static int read_mstatush(CPURISCVState *env, int csrno, target_ulong *val)
249
{
250
*val = env->mstatus >> 32;
251
@@ -XXX,XX +XXX,XX @@ static int write_mstatush(CPURISCVState *env, int csrno, target_ulong val)
252
253
return 0;
254
}
255
-#endif
256
257
static int read_misa(CPURISCVState *env, int csrno, target_ulong *val)
258
{
259
@@ -XXX,XX +XXX,XX @@ static int write_satp(CPURISCVState *env, int csrno, target_ulong val)
260
static int read_hstatus(CPURISCVState *env, int csrno, target_ulong *val)
261
{
262
*val = env->hstatus;
263
-#ifdef TARGET_RISCV64
264
- /* We only support 64-bit VSXL */
265
- *val = set_field(*val, HSTATUS_VSXL, 2);
266
-#endif
267
+ if (!riscv_cpu_is_32bit(env)) {
268
+ /* We only support 64-bit VSXL */
269
+ *val = set_field(*val, HSTATUS_VSXL, 2);
270
+ }
271
/* We only support little endian */
272
*val = set_field(*val, HSTATUS_VSBE, 0);
273
return 0;
274
@@ -XXX,XX +XXX,XX @@ static int read_hstatus(CPURISCVState *env, int csrno, target_ulong *val)
275
static int write_hstatus(CPURISCVState *env, int csrno, target_ulong val)
276
{
277
env->hstatus = val;
278
-#ifdef TARGET_RISCV64
279
- if (get_field(val, HSTATUS_VSXL) != 2) {
280
+ if (!riscv_cpu_is_32bit(env) && get_field(val, HSTATUS_VSXL) != 2) {
281
qemu_log_mask(LOG_UNIMP, "QEMU does not support mixed HSXLEN options.");
282
}
283
-#endif
284
if (get_field(val, HSTATUS_VSBE) != 0) {
285
qemu_log_mask(LOG_UNIMP, "QEMU does not support big endian guests.");
286
}
287
@@ -XXX,XX +XXX,XX @@ static int read_htimedelta(CPURISCVState *env, int csrno, target_ulong *val)
288
return -RISCV_EXCP_ILLEGAL_INST;
289
}
290
291
-#if defined(TARGET_RISCV32)
292
- *val = env->htimedelta & 0xffffffff;
293
-#else
294
*val = env->htimedelta;
295
-#endif
296
return 0;
297
}
298
299
@@ -XXX,XX +XXX,XX @@ static int write_htimedelta(CPURISCVState *env, int csrno, target_ulong val)
300
return -RISCV_EXCP_ILLEGAL_INST;
301
}
302
303
-#if defined(TARGET_RISCV32)
304
- env->htimedelta = deposit64(env->htimedelta, 0, 32, (uint64_t)val);
305
-#else
306
- env->htimedelta = val;
307
-#endif
308
+ if (riscv_cpu_is_32bit(env)) {
309
+ env->htimedelta = deposit64(env->htimedelta, 0, 32, (uint64_t)val);
310
+ } else {
311
+ env->htimedelta = val;
312
+ }
313
return 0;
314
}
315
316
-#if defined(TARGET_RISCV32)
317
static int read_htimedeltah(CPURISCVState *env, int csrno, target_ulong *val)
318
{
319
if (!env->rdtime_fn) {
320
@@ -XXX,XX +XXX,XX @@ static int write_htimedeltah(CPURISCVState *env, int csrno, target_ulong val)
321
env->htimedelta = deposit64(env->htimedelta, 32, 32, (uint64_t)val);
322
return 0;
323
}
324
-#endif
325
326
/* Virtual CSR Registers */
327
static int read_vsstatus(CPURISCVState *env, int csrno, target_ulong *val)
328
@@ -XXX,XX +XXX,XX @@ static riscv_csr_operations csr_ops[CSR_TABLE_SIZE] = {
329
/* User Timers and Counters */
330
[CSR_CYCLE] = { ctr, read_instret },
331
[CSR_INSTRET] = { ctr, read_instret },
332
-#if defined(TARGET_RISCV32)
333
- [CSR_CYCLEH] = { ctr, read_instreth },
334
- [CSR_INSTRETH] = { ctr, read_instreth },
335
-#endif
336
+ [CSR_CYCLEH] = { ctr32, read_instreth },
337
+ [CSR_INSTRETH] = { ctr32, read_instreth },
338
339
/* In privileged mode, the monitor will have to emulate TIME CSRs only if
340
* rdtime callback is not provided by machine/platform emulation */
341
[CSR_TIME] = { ctr, read_time },
342
-#if defined(TARGET_RISCV32)
343
- [CSR_TIMEH] = { ctr, read_timeh },
344
-#endif
345
+ [CSR_TIMEH] = { ctr32, read_timeh },
346
347
#if !defined(CONFIG_USER_ONLY)
348
/* Machine Timers and Counters */
349
[CSR_MCYCLE] = { any, read_instret },
350
[CSR_MINSTRET] = { any, read_instret },
351
-#if defined(TARGET_RISCV32)
352
- [CSR_MCYCLEH] = { any, read_instreth },
353
- [CSR_MINSTRETH] = { any, read_instreth },
354
-#endif
355
+ [CSR_MCYCLEH] = { any32, read_instreth },
356
+ [CSR_MINSTRETH] = { any32, read_instreth },
357
358
/* Machine Information Registers */
359
[CSR_MVENDORID] = { any, read_zero },
360
@@ -XXX,XX +XXX,XX @@ static riscv_csr_operations csr_ops[CSR_TABLE_SIZE] = {
361
[CSR_MTVEC] = { any, read_mtvec, write_mtvec },
362
[CSR_MCOUNTEREN] = { any, read_mcounteren, write_mcounteren },
363
364
-#if defined(TARGET_RISCV32)
365
- [CSR_MSTATUSH] = { any, read_mstatush, write_mstatush },
366
-#endif
367
+ [CSR_MSTATUSH] = { any32, read_mstatush, write_mstatush },
368
369
[CSR_MSCOUNTEREN] = { any, read_mscounteren, write_mscounteren },
370
371
@@ -XXX,XX +XXX,XX @@ static riscv_csr_operations csr_ops[CSR_TABLE_SIZE] = {
372
[CSR_HGEIP] = { hmode, read_hgeip, write_hgeip },
373
[CSR_HGATP] = { hmode, read_hgatp, write_hgatp },
374
[CSR_HTIMEDELTA] = { hmode, read_htimedelta, write_htimedelta },
375
-#if defined(TARGET_RISCV32)
376
- [CSR_HTIMEDELTAH] = { hmode, read_htimedeltah, write_htimedeltah},
377
-#endif
378
+ [CSR_HTIMEDELTAH] = { hmode32, read_htimedeltah, write_htimedeltah},
379
380
[CSR_VSSTATUS] = { hmode, read_vsstatus, write_vsstatus },
381
[CSR_VSIP] = { hmode, NULL, NULL, rmw_vsip },
382
@@ -XXX,XX +XXX,XX @@ static riscv_csr_operations csr_ops[CSR_TABLE_SIZE] = {
383
[CSR_HPMCOUNTER3 ... CSR_HPMCOUNTER31] = { ctr, read_zero },
384
[CSR_MHPMCOUNTER3 ... CSR_MHPMCOUNTER31] = { any, read_zero },
385
[CSR_MHPMEVENT3 ... CSR_MHPMEVENT31] = { any, read_zero },
386
-#if defined(TARGET_RISCV32)
387
- [CSR_HPMCOUNTER3H ... CSR_HPMCOUNTER31H] = { ctr, read_zero },
388
- [CSR_MHPMCOUNTER3H ... CSR_MHPMCOUNTER31H] = { any, read_zero },
389
-#endif
390
+ [CSR_HPMCOUNTER3H ... CSR_HPMCOUNTER31H] = { ctr32, read_zero },
391
+ [CSR_MHPMCOUNTER3H ... CSR_MHPMCOUNTER31H] = { any32, read_zero },
392
#endif /* !CONFIG_USER_ONLY */
393
};
394
--
130
--
395
2.29.2
131
2.30.1
396
132
397
133
diff view generated by jsdifflib
1
From: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
2
3
The current two-stage lookup detection in riscv_cpu_do_interrupt falls
4
short of its purpose, as all it checks is whether two-stage address
5
translation either via the hypervisor-load store instructions or the
6
MPRV feature would be allowed.
7
8
What we really need instead is whether two-stage address translation was
9
active when the exception was raised. However, in riscv_cpu_do_interrupt
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>
16
Message-id: 20210319141459.1196741-1-georg.kotheimer@kernkonzept.com
1
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
17
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
2
Reviewed-by: Bin Meng <bin.meng@windriver.com>
3
Tested-by: Bin Meng <bin.meng@windriver.com>
4
Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>
5
Acked-by: Palmer Dabbelt <palmerdabbelt@google.com>
6
Message-id: ebd37b237a8cbe457335b948bd57f487b6b31869.1608142916.git.alistair.francis@wdc.com
7
---
18
---
8
target/riscv/cpu.h | 2 ++
19
target/riscv/cpu.h | 4 ++++
9
target/riscv/cpu.c | 9 +++++++++
20
target/riscv/cpu.c | 1 +
10
2 files changed, 11 insertions(+)
21
target/riscv/cpu_helper.c | 21 ++++++++-------------
22
3 files changed, 13 insertions(+), 13 deletions(-)
11
23
12
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
24
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
13
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
14
--- a/target/riscv/cpu.h
26
--- a/target/riscv/cpu.h
15
+++ b/target/riscv/cpu.h
27
+++ b/target/riscv/cpu.h
16
@@ -XXX,XX +XXX,XX @@ FIELD(TB_FLAGS, VILL, 8, 1)
28
@@ -XXX,XX +XXX,XX @@ struct CPURISCVState {
17
/* Is a Hypervisor instruction load/store allowed? */
29
target_ulong satp_hs;
18
FIELD(TB_FLAGS, HLSX, 9, 1)
30
uint64_t mstatus_hs;
19
31
20
+bool riscv_cpu_is_32bit(CPURISCVState *env);
32
+ /* Signals whether the current exception occurred with two-stage address
33
+ translation active. */
34
+ bool two_stage_lookup;
21
+
35
+
22
/*
36
target_ulong scounteren;
23
* A simplification for VLMAX
37
target_ulong mcounteren;
24
* = (1 << LMUL) * VLEN / (8 * (1 << SEW))
38
25
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
39
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
26
index XXXXXXX..XXXXXXX 100644
40
index XXXXXXX..XXXXXXX 100644
27
--- a/target/riscv/cpu.c
41
--- a/target/riscv/cpu.c
28
+++ b/target/riscv/cpu.c
42
+++ b/target/riscv/cpu.c
29
@@ -XXX,XX +XXX,XX @@ const char *riscv_cpu_get_trap_name(target_ulong cause, bool async)
43
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_reset(DeviceState *dev)
44
env->mstatus &= ~(MSTATUS_MIE | MSTATUS_MPRV);
45
env->mcause = 0;
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();
30
}
57
}
58
env->badaddr = address;
59
+ env->two_stage_lookup = two_stage;
31
}
60
}
32
61
33
+bool riscv_cpu_is_32bit(CPURISCVState *env)
62
hwaddr riscv_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
34
+{
63
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
35
+ if (env->misa & RV64) {
64
}
36
+ return false;
65
37
+ }
66
env->badaddr = addr;
38
+
67
+ env->two_stage_lookup = riscv_cpu_virt_enabled(env) ||
39
+ return true;
68
+ riscv_cpu_two_stage_lookup(mmu_idx);
40
+}
69
riscv_raise_exception(&cpu->env, cs->exception_index, retaddr);
41
+
70
}
42
static void set_misa(CPURISCVState *env, target_ulong misa)
71
43
{
72
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_do_unaligned_access(CPUState *cs, vaddr addr,
44
env->misa_mask = env->misa = misa;
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
}
111
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_do_interrupt(CPUState *cs)
112
* RISC-V ISA Specification.
113
*/
114
115
+ env->two_stage_lookup = false;
116
#endif
117
cs->exception_index = EXCP_NONE; /* mark handled to qemu */
118
}
45
--
119
--
46
2.29.2
120
2.30.1
47
121
48
122
diff view generated by jsdifflib
1
From: Alex Richardson <Alexander.Richardson@cl.cam.ac.uk>
1
From: Bin Meng <bin.meng@windriver.com>
2
2
3
The TW and TSR fields should be bits 21 and 22 and not 30/29.
3
Per SST25VF016B datasheet [1], SST flash requires a dummy byte after
4
This was found while comparing QEMU behaviour against the sail formal
4
the address bytes. Note only SPI mode is supported by SST flashes.
5
model (https://github.com/rems-project/sail-riscv/).
6
5
7
Signed-off-by: Alex Richardson <Alexander.Richardson@cl.cam.ac.uk>
6
[1] http://ww1.microchip.com/downloads/en/devicedoc/s71271_04.pdf
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
9
Message-id: 20201130170117.71281-1-Alexander.Richardson@cl.cam.ac.uk
8
Signed-off-by: Bin Meng <bin.meng@windriver.com>
9
Acked-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-id: 20210306060152.7250-1-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
target/riscv/cpu_bits.h | 4 ++--
13
hw/block/m25p80.c | 3 +++
13
1 file changed, 2 insertions(+), 2 deletions(-)
14
1 file changed, 3 insertions(+)
14
15
15
diff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h
16
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
16
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/cpu_bits.h
18
--- a/hw/block/m25p80.c
18
+++ b/target/riscv/cpu_bits.h
19
+++ b/hw/block/m25p80.c
19
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@ static void decode_fast_read_cmd(Flash *s)
20
#define MSTATUS_MXR 0x00080000
21
s->needed_bytes = get_addr_length(s);
21
#define MSTATUS_VM 0x1F000000 /* until: priv-1.9.1 */
22
switch (get_man(s)) {
22
#define MSTATUS_TVM 0x00100000 /* since: priv-1.10 */
23
/* Dummy cycles - modeled with bytes writes instead of bits */
23
-#define MSTATUS_TW 0x20000000 /* since: priv-1.10 */
24
+ case MAN_SST:
24
-#define MSTATUS_TSR 0x40000000 /* since: priv-1.10 */
25
+ s->needed_bytes += 1;
25
+#define MSTATUS_TW 0x00200000 /* since: priv-1.10 */
26
+ break;
26
+#define MSTATUS_TSR 0x00400000 /* since: priv-1.10 */
27
case MAN_WINBOND:
27
#define MSTATUS_GVA 0x4000000000ULL
28
s->needed_bytes += 8;
28
#define MSTATUS_MPV 0x8000000000ULL
29
break;
29
30
--
30
--
31
2.29.2
31
2.30.1
32
32
33
33
diff view generated by jsdifflib
1
From: Vitaly Wool <vitaly.wool@konsulko.com>
1
From: Bin Meng <bin.meng@windriver.com>
2
2
3
Add QSPI NOR flash definition for Microchip PolarFire SoC.
3
Since HSS commit c20a89f8dcac, the Icicle Kit reference design has
4
been updated to use a register mapped at 0x4f000000 instead of a
5
GPIO to control whether eMMC or SD card is to be used. With this
6
support the same HSS image can be used for both eMMC and SD card
7
boot flow, while previously two different board configurations were
8
used. This is undocumented but one can take a look at the HSS code
9
HSS_MMCInit() in services/mmc/mmc_api.c.
4
10
5
Signed-off-by: Vitaly Wool <vitaly.wool@konsulko.com>
11
With this commit, HSS image built from 2020.12 release boots again.
6
Acked-by: Alistair Francis <alistair.francis@wdc.com>
12
7
Reviewed-by: Bin Meng <bin.meng@windriver.com>
13
Signed-off-by: Bin Meng <bin.meng@windriver.com>
8
Message-id: 20201112074950.33283-1-vitaly.wool@konsulko.com
14
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
15
Message-id: 20210322075248.136255-1-bmeng.cn@gmail.com
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
16
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
---
17
---
11
include/hw/riscv/microchip_pfsoc.h | 3 +++
18
include/hw/riscv/microchip_pfsoc.h | 1 +
12
hw/riscv/microchip_pfsoc.c | 21 +++++++++++++++++++++
19
hw/riscv/microchip_pfsoc.c | 6 ++++++
13
2 files changed, 24 insertions(+)
20
2 files changed, 7 insertions(+)
14
21
15
diff --git a/include/hw/riscv/microchip_pfsoc.h b/include/hw/riscv/microchip_pfsoc.h
22
diff --git a/include/hw/riscv/microchip_pfsoc.h b/include/hw/riscv/microchip_pfsoc.h
16
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/riscv/microchip_pfsoc.h
24
--- a/include/hw/riscv/microchip_pfsoc.h
18
+++ b/include/hw/riscv/microchip_pfsoc.h
25
+++ b/include/hw/riscv/microchip_pfsoc.h
19
@@ -XXX,XX +XXX,XX @@ enum {
26
@@ -XXX,XX +XXX,XX @@ enum {
20
MICROCHIP_PFSOC_MMUART2,
21
MICROCHIP_PFSOC_MMUART3,
22
MICROCHIP_PFSOC_MMUART4,
23
+ MICROCHIP_PFSOC_SPI0,
24
+ MICROCHIP_PFSOC_SPI1,
25
MICROCHIP_PFSOC_I2C1,
26
MICROCHIP_PFSOC_GEM0,
27
MICROCHIP_PFSOC_GEM1,
28
@@ -XXX,XX +XXX,XX @@ enum {
29
MICROCHIP_PFSOC_GPIO2,
30
MICROCHIP_PFSOC_ENVM_CFG,
31
MICROCHIP_PFSOC_ENVM_DATA,
27
MICROCHIP_PFSOC_ENVM_DATA,
32
+ MICROCHIP_PFSOC_QSPI_XIP,
28
MICROCHIP_PFSOC_QSPI_XIP,
33
MICROCHIP_PFSOC_IOSCB,
29
MICROCHIP_PFSOC_IOSCB,
30
+ MICROCHIP_PFSOC_EMMC_SD_MUX,
34
MICROCHIP_PFSOC_DRAM_LO,
31
MICROCHIP_PFSOC_DRAM_LO,
35
MICROCHIP_PFSOC_DRAM_LO_ALIAS,
32
MICROCHIP_PFSOC_DRAM_LO_ALIAS,
33
MICROCHIP_PFSOC_DRAM_HI,
36
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
34
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
37
index XXXXXXX..XXXXXXX 100644
35
index XXXXXXX..XXXXXXX 100644
38
--- a/hw/riscv/microchip_pfsoc.c
36
--- a/hw/riscv/microchip_pfsoc.c
39
+++ b/hw/riscv/microchip_pfsoc.c
37
+++ b/hw/riscv/microchip_pfsoc.c
40
@@ -XXX,XX +XXX,XX @@ static const struct MemmapEntry {
38
@@ -XXX,XX +XXX,XX @@ static const MemMapEntry microchip_pfsoc_memmap[] = {
41
[MICROCHIP_PFSOC_MMUART2] = { 0x20102000, 0x1000 },
42
[MICROCHIP_PFSOC_MMUART3] = { 0x20104000, 0x1000 },
43
[MICROCHIP_PFSOC_MMUART4] = { 0x20106000, 0x1000 },
44
+ [MICROCHIP_PFSOC_SPI0] = { 0x20108000, 0x1000 },
45
+ [MICROCHIP_PFSOC_SPI1] = { 0x20109000, 0x1000 },
46
[MICROCHIP_PFSOC_I2C1] = { 0x2010b000, 0x1000 },
47
[MICROCHIP_PFSOC_GEM0] = { 0x20110000, 0x2000 },
48
[MICROCHIP_PFSOC_GEM1] = { 0x20112000, 0x2000 },
49
@@ -XXX,XX +XXX,XX @@ static const struct MemmapEntry {
50
[MICROCHIP_PFSOC_GPIO2] = { 0x20122000, 0x1000 },
51
[MICROCHIP_PFSOC_ENVM_CFG] = { 0x20200000, 0x1000 },
52
[MICROCHIP_PFSOC_ENVM_DATA] = { 0x20220000, 0x20000 },
39
[MICROCHIP_PFSOC_ENVM_DATA] = { 0x20220000, 0x20000 },
53
+ [MICROCHIP_PFSOC_QSPI_XIP] = { 0x21000000, 0x1000000 },
40
[MICROCHIP_PFSOC_QSPI_XIP] = { 0x21000000, 0x1000000 },
54
[MICROCHIP_PFSOC_IOSCB] = { 0x30000000, 0x10000000 },
41
[MICROCHIP_PFSOC_IOSCB] = { 0x30000000, 0x10000000 },
42
+ [MICROCHIP_PFSOC_EMMC_SD_MUX] = { 0x4f000000, 0x4 },
55
[MICROCHIP_PFSOC_DRAM_LO] = { 0x80000000, 0x40000000 },
43
[MICROCHIP_PFSOC_DRAM_LO] = { 0x80000000, 0x40000000 },
56
[MICROCHIP_PFSOC_DRAM_LO_ALIAS] = { 0xc0000000, 0x40000000 },
44
[MICROCHIP_PFSOC_DRAM_LO_ALIAS] = { 0xc0000000, 0x40000000 },
45
[MICROCHIP_PFSOC_DRAM_HI] = { 0x1000000000, 0x0 },
57
@@ -XXX,XX +XXX,XX @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
46
@@ -XXX,XX +XXX,XX @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
58
MemoryRegion *e51_dtim_mem = g_new(MemoryRegion, 1);
59
MemoryRegion *l2lim_mem = g_new(MemoryRegion, 1);
60
MemoryRegion *envm_data = g_new(MemoryRegion, 1);
61
+ MemoryRegion *qspi_xip_mem = g_new(MemoryRegion, 1);
62
char *plic_hart_config;
63
size_t plic_hart_config_len;
64
NICInfo *nd;
65
@@ -XXX,XX +XXX,XX @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
66
qdev_get_gpio_in(DEVICE(s->plic), MICROCHIP_PFSOC_MMUART4_IRQ),
67
serial_hd(4));
68
69
+ /* SPI */
70
+ create_unimplemented_device("microchip.pfsoc.spi0",
71
+ memmap[MICROCHIP_PFSOC_SPI0].base,
72
+ memmap[MICROCHIP_PFSOC_SPI0].size);
73
+ create_unimplemented_device("microchip.pfsoc.spi1",
74
+ memmap[MICROCHIP_PFSOC_SPI1].base,
75
+ memmap[MICROCHIP_PFSOC_SPI1].size);
76
+
77
/* I2C1 */
78
create_unimplemented_device("microchip.pfsoc.i2c1",
79
memmap[MICROCHIP_PFSOC_I2C1].base,
80
@@ -XXX,XX +XXX,XX @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
81
sysbus_realize(SYS_BUS_DEVICE(&s->ioscb), errp);
82
sysbus_mmio_map(SYS_BUS_DEVICE(&s->ioscb), 0,
47
sysbus_mmio_map(SYS_BUS_DEVICE(&s->ioscb), 0,
83
memmap[MICROCHIP_PFSOC_IOSCB].base);
48
memmap[MICROCHIP_PFSOC_IOSCB].base);
49
50
+ /* eMMC/SD mux */
51
+ create_unimplemented_device("microchip.pfsoc.emmc_sd_mux",
52
+ memmap[MICROCHIP_PFSOC_EMMC_SD_MUX].base,
53
+ memmap[MICROCHIP_PFSOC_EMMC_SD_MUX].size);
84
+
54
+
85
+ /* QSPI Flash */
55
/* QSPI Flash */
86
+ memory_region_init_rom(qspi_xip_mem, OBJECT(dev),
56
memory_region_init_rom(qspi_xip_mem, OBJECT(dev),
87
+ "microchip.pfsoc.qspi_xip",
57
"microchip.pfsoc.qspi_xip",
88
+ memmap[MICROCHIP_PFSOC_QSPI_XIP].size,
89
+ &error_fatal);
90
+ memory_region_add_subregion(system_memory,
91
+ memmap[MICROCHIP_PFSOC_QSPI_XIP].base,
92
+ qspi_xip_mem);
93
}
94
95
static void microchip_pfsoc_soc_class_init(ObjectClass *oc, void *data)
96
--
58
--
97
2.29.2
59
2.30.1
98
60
99
61
diff view generated by jsdifflib
1
From: Anup Patel <anup.patel@wdc.com>
1
From: Bin Meng <bin.meng@windriver.com>
2
2
3
The sifive_u machine emulates two UARTs but we have only UART0 DT
3
This adds the documentation to describe what is supported for the
4
node in the generated DTB so this patch adds UART1 DT node in the
4
'microchip-icicle-kit' machine, and how to boot the machine in QEMU.
5
generated DTB.
6
5
7
Signed-off-by: Anup Patel <anup.patel@wdc.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: 20201111094725.3768755-1-anup.patel@wdc.com
8
Message-id: 20210322075248.136255-2-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
hw/riscv/sifive_u.c | 15 +++++++++++++++
11
docs/system/riscv/microchip-icicle-kit.rst | 89 ++++++++++++++++++++++
13
1 file changed, 15 insertions(+)
12
docs/system/target-riscv.rst | 1 +
13
2 files changed, 90 insertions(+)
14
create mode 100644 docs/system/riscv/microchip-icicle-kit.rst
14
15
15
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
16
diff --git a/docs/system/riscv/microchip-icicle-kit.rst b/docs/system/riscv/microchip-icicle-kit.rst
17
new file mode 100644
18
index XXXXXXX..XXXXXXX
19
--- /dev/null
20
+++ b/docs/system/riscv/microchip-icicle-kit.rst
21
@@ -XXX,XX +XXX,XX @@
22
+Microchip PolarFire SoC Icicle Kit (``microchip-icicle-kit``)
23
+=============================================================
24
+
25
+Microchip PolarFire SoC Icicle Kit integrates a PolarFire SoC, with one
26
+SiFive's E51 plus four U54 cores and many on-chip peripherals and an FPGA.
27
+
28
+For more details about Microchip PolarFire SoC, please see:
29
+https://www.microsemi.com/product-directory/soc-fpgas/5498-polarfire-soc-fpga
30
+
31
+The Icicle Kit board information can be found here:
32
+https://www.microsemi.com/existing-parts/parts/152514
33
+
34
+Supported devices
35
+-----------------
36
+
37
+The ``microchip-icicle-kit`` machine supports the following devices:
38
+
39
+ * 1 E51 core
40
+ * 4 U54 cores
41
+ * Core Level Interruptor (CLINT)
42
+ * Platform-Level Interrupt Controller (PLIC)
43
+ * L2 Loosely Integrated Memory (L2-LIM)
44
+ * DDR memory controller
45
+ * 5 MMUARTs
46
+ * 1 DMA controller
47
+ * 2 GEM Ethernet controllers
48
+ * 1 SDHC storage controller
49
+
50
+Boot options
51
+------------
52
+
53
+The ``microchip-icicle-kit`` machine can start using the standard -bios
54
+functionality for loading its BIOS image, aka Hart Software Services (HSS_).
55
+HSS loads the second stage bootloader U-Boot from an SD card. It does not
56
+support direct kernel loading via the -kernel option. One has to load kernel
57
+from U-Boot.
58
+
59
+The memory is set to 1537 MiB by default which is the minimum required high
60
+memory size by HSS. A sanity check on ram size is performed in the machine
61
+init routine to prompt user to increase the RAM size to > 1537 MiB when less
62
+than 1537 MiB ram is detected.
63
+
64
+Boot the machine
65
+----------------
66
+
67
+HSS 2020.12 release is tested at the time of writing. To build an HSS image
68
+that can be booted by the ``microchip-icicle-kit`` machine, type the following
69
+in the HSS source tree:
70
+
71
+.. code-block:: bash
72
+
73
+ $ export CROSS_COMPILE=riscv64-linux-
74
+ $ cp boards/mpfs-icicle-kit-es/def_config .config
75
+ $ make BOARD=mpfs-icicle-kit-es
76
+
77
+Download the official SD card image released by Microchip and prepare it for
78
+QEMU usage:
79
+
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
16
index XXXXXXX..XXXXXXX 100644
112
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/riscv/sifive_u.c
113
--- a/docs/system/target-riscv.rst
18
+++ b/hw/riscv/sifive_u.c
114
+++ b/docs/system/target-riscv.rst
19
@@ -XXX,XX +XXX,XX @@ static void create_fdt(SiFiveUState *s, const struct MemmapEntry *memmap,
115
@@ -XXX,XX +XXX,XX @@ undocumented; you can get a complete list by running
20
qemu_fdt_setprop_cell(fdt, nodename, "reg", 0x0);
116
.. toctree::
21
g_free(nodename);
117
:maxdepth: 1
22
118
23
+ nodename = g_strdup_printf("/soc/serial@%lx",
119
+ riscv/microchip-icicle-kit
24
+ (long)memmap[SIFIVE_U_DEV_UART1].base);
120
riscv/sifive_u
25
+ qemu_fdt_add_subnode(fdt, nodename);
121
26
+ qemu_fdt_setprop_string(fdt, nodename, "compatible", "sifive,uart0");
122
RISC-V CPU features
27
+ qemu_fdt_setprop_cells(fdt, nodename, "reg",
28
+ 0x0, memmap[SIFIVE_U_DEV_UART1].base,
29
+ 0x0, memmap[SIFIVE_U_DEV_UART1].size);
30
+ qemu_fdt_setprop_cells(fdt, nodename, "clocks",
31
+ prci_phandle, PRCI_CLK_TLCLK);
32
+ qemu_fdt_setprop_cell(fdt, nodename, "interrupt-parent", plic_phandle);
33
+ qemu_fdt_setprop_cell(fdt, nodename, "interrupts", SIFIVE_U_UART1_IRQ);
34
+
35
+ qemu_fdt_setprop_string(fdt, "/aliases", "serial1", nodename);
36
+ g_free(nodename);
37
+
38
nodename = g_strdup_printf("/soc/serial@%lx",
39
(long)memmap[SIFIVE_U_DEV_UART0].base);
40
qemu_fdt_add_subnode(fdt, nodename);
41
--
123
--
42
2.29.2
124
2.30.1
43
125
44
126
diff view generated by jsdifflib
Deleted patch
1
Previously if an interrupt occured during the claim process (after the
2
interrupt is claimed but before it's completed) it would never be
3
cleared.
4
This patch ensures that we also clear the hidden_pending bits as well.
5
1
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
Tested-by: Jackie Ke <jackieke724@hotmail.com>
8
Message-id: 4e9786084a86f220689123cc8a7837af8fa071cf.1607100423.git.alistair.francis@wdc.com
9
---
10
hw/intc/ibex_plic.c | 13 ++++++++++---
11
1 file changed, 10 insertions(+), 3 deletions(-)
12
13
diff --git a/hw/intc/ibex_plic.c b/hw/intc/ibex_plic.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/intc/ibex_plic.c
16
+++ b/hw/intc/ibex_plic.c
17
@@ -XXX,XX +XXX,XX @@ static void ibex_plic_irqs_set_pending(IbexPlicState *s, int irq, bool level)
18
{
19
int pending_num = irq / 32;
20
21
+ if (!level) {
22
+ /*
23
+ * If the level is low make sure we clear the hidden_pending.
24
+ */
25
+ s->hidden_pending[pending_num] &= ~(1 << (irq % 32));
26
+ }
27
+
28
if (s->claimed[pending_num] & 1 << (irq % 32)) {
29
/*
30
* The interrupt has been claimed, but not completed.
31
* The pending bit can't be set.
32
+ * Save the pending level for after the interrupt is completed.
33
*/
34
s->hidden_pending[pending_num] |= level << (irq % 32);
35
- return;
36
+ } else {
37
+ s->pending[pending_num] |= level << (irq % 32);
38
}
39
-
40
- s->pending[pending_num] |= level << (irq % 32);
41
}
42
43
static bool ibex_plic_irqs_pending(IbexPlicState *s, uint32_t context)
44
--
45
2.29.2
46
47
diff view generated by jsdifflib
Deleted patch
1
Currently the riscv_is_32_bit() function only supports the generic rv32
2
CPUs. Extend the function to support the SiFive and LowRISC CPUs as
3
well.
4
1
5
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
6
Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>
7
Acked-by: Palmer Dabbelt <palmerdabbelt@google.com>
8
Message-id: 9a13764115ba78688ba61b56526c6de65fc3ef42.1608142916.git.alistair.francis@wdc.com
9
---
10
hw/riscv/boot.c | 12 +++++++++++-
11
1 file changed, 11 insertions(+), 1 deletion(-)
12
13
diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/riscv/boot.c
16
+++ b/hw/riscv/boot.c
17
@@ -XXX,XX +XXX,XX @@
18
19
bool riscv_is_32_bit(MachineState *machine)
20
{
21
- if (!strncmp(machine->cpu_type, "rv32", 4)) {
22
+ /*
23
+ * To determine if the CPU is 32-bit we need to check a few different CPUs.
24
+ *
25
+ * If the CPU starts with rv32
26
+ * If the CPU is a sifive 3 seriries CPU (E31, U34)
27
+ * If it's the Ibex CPU
28
+ */
29
+ if (!strncmp(machine->cpu_type, "rv32", 4) ||
30
+ (!strncmp(machine->cpu_type, "sifive", 6) &&
31
+ machine->cpu_type[8] == '3') ||
32
+ !strncmp(machine->cpu_type, "lowrisc-ibex", 12)) {
33
return true;
34
} else {
35
return false;
36
--
37
2.29.2
38
39
diff view generated by jsdifflib
Deleted patch
1
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
2
Reviewed-by: Bin Meng <bin.meng@windriver.com>
3
Tested-by: Bin Meng <bin.meng@windriver.com>
4
Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>
5
Acked-by: Palmer Dabbelt <palmerdabbelt@google.com>
6
Message-id: 86e5ccd9eae2f5d8c2257679c6ccf6078a5d51af.1608142916.git.alistair.francis@wdc.com
7
---
8
target/riscv/cpu.h | 6 ++++++
9
1 file changed, 6 insertions(+)
10
1
11
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/riscv/cpu.h
14
+++ b/target/riscv/cpu.h
15
@@ -XXX,XX +XXX,XX @@
16
#define TYPE_RISCV_CPU_SIFIVE_U34 RISCV_CPU_TYPE_NAME("sifive-u34")
17
#define TYPE_RISCV_CPU_SIFIVE_U54 RISCV_CPU_TYPE_NAME("sifive-u54")
18
19
+#if defined(TARGET_RISCV32)
20
+# define TYPE_RISCV_CPU_BASE TYPE_RISCV_CPU_BASE32
21
+#elif defined(TARGET_RISCV64)
22
+# define TYPE_RISCV_CPU_BASE TYPE_RISCV_CPU_BASE64
23
+#endif
24
+
25
#define RV32 ((target_ulong)1 << (TARGET_LONG_BITS - 2))
26
#define RV64 ((target_ulong)2 << (TARGET_LONG_BITS - 2))
27
28
--
29
2.29.2
30
31
diff view generated by jsdifflib
Deleted patch
1
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
2
Reviewed-by: Bin Meng <bin.meng@windriver.com>
3
Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>
4
Acked-by: Palmer Dabbelt <palmerdabbelt@google.com>
5
Message-id: 04ac7fba2348c92f296a5e6a9959ac72b77ae4c6.1608142916.git.alistair.francis@wdc.com
6
---
7
include/hw/riscv/spike.h | 6 ------
8
hw/riscv/spike.c | 2 +-
9
2 files changed, 1 insertion(+), 7 deletions(-)
10
1
11
diff --git a/include/hw/riscv/spike.h b/include/hw/riscv/spike.h
12
index XXXXXXX..XXXXXXX 100644
13
--- a/include/hw/riscv/spike.h
14
+++ b/include/hw/riscv/spike.h
15
@@ -XXX,XX +XXX,XX @@ enum {
16
SPIKE_DRAM
17
};
18
19
-#if defined(TARGET_RISCV32)
20
-#define SPIKE_V1_10_0_CPU TYPE_RISCV_CPU_BASE32
21
-#elif defined(TARGET_RISCV64)
22
-#define SPIKE_V1_10_0_CPU TYPE_RISCV_CPU_BASE64
23
-#endif
24
-
25
#endif
26
diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c
27
index XXXXXXX..XXXXXXX 100644
28
--- a/hw/riscv/spike.c
29
+++ b/hw/riscv/spike.c
30
@@ -XXX,XX +XXX,XX @@ static void spike_machine_class_init(ObjectClass *oc, void *data)
31
mc->init = spike_board_init;
32
mc->max_cpus = SPIKE_CPUS_MAX;
33
mc->is_default = true;
34
- mc->default_cpu_type = SPIKE_V1_10_0_CPU;
35
+ mc->default_cpu_type = TYPE_RISCV_CPU_BASE;
36
mc->possible_cpu_arch_ids = riscv_numa_possible_cpu_arch_ids;
37
mc->cpu_index_to_instance_props = riscv_numa_cpu_index_to_props;
38
mc->get_default_cpu_node_id = riscv_numa_get_default_cpu_node_id;
39
--
40
2.29.2
41
42
diff view generated by jsdifflib
Deleted patch
1
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
2
Reviewed-by: Bin Meng <bin.meng@windriver.com>
3
Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>
4
Acked-by: Palmer Dabbelt <palmerdabbelt@google.com>
5
Message-id: ac75037dd58061486de421a0fcd9ac8a92014607.1608142916.git.alistair.francis@wdc.com
6
---
7
hw/riscv/spike.c | 45 ++++++++++++++++++++++++---------------------
8
1 file changed, 24 insertions(+), 21 deletions(-)
9
1
10
diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c
11
index XXXXXXX..XXXXXXX 100644
12
--- a/hw/riscv/spike.c
13
+++ b/hw/riscv/spike.c
14
@@ -XXX,XX +XXX,XX @@
15
#include "sysemu/qtest.h"
16
#include "sysemu/sysemu.h"
17
18
-/*
19
- * Not like other RISC-V machines that use plain binary bios images,
20
- * keeping ELF files here was intentional because BIN files don't work
21
- * for the Spike machine as HTIF emulation depends on ELF parsing.
22
- */
23
-#if defined(TARGET_RISCV32)
24
-# define BIOS_FILENAME "opensbi-riscv32-generic-fw_dynamic.elf"
25
-#else
26
-# define BIOS_FILENAME "opensbi-riscv64-generic-fw_dynamic.elf"
27
-#endif
28
-
29
static const struct MemmapEntry {
30
hwaddr base;
31
hwaddr size;
32
@@ -XXX,XX +XXX,XX @@ static const struct MemmapEntry {
33
};
34
35
static void create_fdt(SpikeState *s, const struct MemmapEntry *memmap,
36
- uint64_t mem_size, const char *cmdline)
37
+ uint64_t mem_size, const char *cmdline, bool is_32_bit)
38
{
39
void *fdt;
40
uint64_t addr, size;
41
@@ -XXX,XX +XXX,XX @@ static void create_fdt(SpikeState *s, const struct MemmapEntry *memmap,
42
cpu_name = g_strdup_printf("/cpus/cpu@%d",
43
s->soc[socket].hartid_base + cpu);
44
qemu_fdt_add_subnode(fdt, cpu_name);
45
-#if defined(TARGET_RISCV32)
46
- qemu_fdt_setprop_string(fdt, cpu_name, "mmu-type", "riscv,sv32");
47
-#else
48
- qemu_fdt_setprop_string(fdt, cpu_name, "mmu-type", "riscv,sv48");
49
-#endif
50
+ if (is_32_bit) {
51
+ qemu_fdt_setprop_string(fdt, cpu_name, "mmu-type", "riscv,sv32");
52
+ } else {
53
+ qemu_fdt_setprop_string(fdt, cpu_name, "mmu-type", "riscv,sv48");
54
+ }
55
name = riscv_isa_string(&s->soc[socket].harts[cpu]);
56
qemu_fdt_setprop_string(fdt, cpu_name, "riscv,isa", name);
57
g_free(name);
58
@@ -XXX,XX +XXX,XX @@ static void spike_board_init(MachineState *machine)
59
main_mem);
60
61
/* create device tree */
62
- create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline);
63
+ create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline,
64
+ riscv_is_32_bit(machine));
65
66
/* boot rom */
67
memory_region_init_rom(mask_rom, NULL, "riscv.spike.mrom",
68
@@ -XXX,XX +XXX,XX @@ static void spike_board_init(MachineState *machine)
69
memory_region_add_subregion(system_memory, memmap[SPIKE_MROM].base,
70
mask_rom);
71
72
- firmware_end_addr = riscv_find_and_load_firmware(machine, BIOS_FILENAME,
73
- memmap[SPIKE_DRAM].base,
74
- htif_symbol_callback);
75
+ /*
76
+ * Not like other RISC-V machines that use plain binary bios images,
77
+ * keeping ELF files here was intentional because BIN files don't work
78
+ * for the Spike machine as HTIF emulation depends on ELF parsing.
79
+ */
80
+ if (riscv_is_32_bit(machine)) {
81
+ firmware_end_addr = riscv_find_and_load_firmware(machine,
82
+ "opensbi-riscv32-generic-fw_dynamic.elf",
83
+ memmap[SPIKE_DRAM].base,
84
+ htif_symbol_callback);
85
+ } else {
86
+ firmware_end_addr = riscv_find_and_load_firmware(machine,
87
+ "opensbi-riscv64-generic-fw_dynamic.elf",
88
+ memmap[SPIKE_DRAM].base,
89
+ htif_symbol_callback);
90
+ }
91
92
if (machine->kernel_filename) {
93
kernel_start_addr = riscv_calc_kernel_start_addr(machine,
94
--
95
2.29.2
96
97
diff view generated by jsdifflib
Deleted patch
1
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
2
Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>
3
Acked-by: Palmer Dabbelt <palmerdabbelt@google.com>
4
Reviewed-by: Bin Meng <bin.meng@windriver.com>
5
Tested-by: Bin Meng <bin.meng@windriver.com>
6
Message-id: 40d6df4dd05302c566e419be3a1fef7799e57c2e.1608142916.git.alistair.francis@wdc.com
7
---
8
hw/riscv/sifive_u.c | 55 ++++++++++++++++++++++++---------------------
9
1 file changed, 30 insertions(+), 25 deletions(-)
10
1
11
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/riscv/sifive_u.c
14
+++ b/hw/riscv/sifive_u.c
15
@@ -XXX,XX +XXX,XX @@
16
17
#include <libfdt.h>
18
19
-#if defined(TARGET_RISCV32)
20
-# define BIOS_FILENAME "opensbi-riscv32-generic-fw_dynamic.bin"
21
-#else
22
-# define BIOS_FILENAME "opensbi-riscv64-generic-fw_dynamic.bin"
23
-#endif
24
-
25
static const struct MemmapEntry {
26
hwaddr base;
27
hwaddr size;
28
@@ -XXX,XX +XXX,XX @@ static const struct MemmapEntry {
29
#define GEM_REVISION 0x10070109
30
31
static void create_fdt(SiFiveUState *s, const struct MemmapEntry *memmap,
32
- uint64_t mem_size, const char *cmdline)
33
+ uint64_t mem_size, const char *cmdline, bool is_32_bit)
34
{
35
MachineState *ms = MACHINE(qdev_get_machine());
36
void *fdt;
37
@@ -XXX,XX +XXX,XX @@ static void create_fdt(SiFiveUState *s, const struct MemmapEntry *memmap,
38
qemu_fdt_add_subnode(fdt, nodename);
39
/* cpu 0 is the management hart that does not have mmu */
40
if (cpu != 0) {
41
-#if defined(TARGET_RISCV32)
42
- qemu_fdt_setprop_string(fdt, nodename, "mmu-type", "riscv,sv32");
43
-#else
44
- qemu_fdt_setprop_string(fdt, nodename, "mmu-type", "riscv,sv48");
45
-#endif
46
+ if (is_32_bit) {
47
+ qemu_fdt_setprop_string(fdt, nodename, "mmu-type", "riscv,sv32");
48
+ } else {
49
+ qemu_fdt_setprop_string(fdt, nodename, "mmu-type", "riscv,sv48");
50
+ }
51
isa = riscv_isa_string(&s->soc.u_cpus.harts[cpu - 1]);
52
} else {
53
isa = riscv_isa_string(&s->soc.e_cpus.harts[0]);
54
@@ -XXX,XX +XXX,XX @@ static void sifive_u_machine_init(MachineState *machine)
55
qemu_allocate_irq(sifive_u_machine_reset, NULL, 0));
56
57
/* create device tree */
58
- create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline);
59
+ create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline,
60
+ riscv_is_32_bit(machine));
61
62
if (s->start_in_flash) {
63
/*
64
@@ -XXX,XX +XXX,XX @@ static void sifive_u_machine_init(MachineState *machine)
65
break;
66
}
67
68
- firmware_end_addr = riscv_find_and_load_firmware(machine, BIOS_FILENAME,
69
- start_addr, NULL);
70
+ if (riscv_is_32_bit(machine)) {
71
+ firmware_end_addr = riscv_find_and_load_firmware(machine,
72
+ "opensbi-riscv32-generic-fw_dynamic.bin",
73
+ start_addr, NULL);
74
+ } else {
75
+ firmware_end_addr = riscv_find_and_load_firmware(machine,
76
+ "opensbi-riscv64-generic-fw_dynamic.bin",
77
+ start_addr, NULL);
78
+ }
79
80
if (machine->kernel_filename) {
81
kernel_start_addr = riscv_calc_kernel_start_addr(machine,
82
@@ -XXX,XX +XXX,XX @@ static void sifive_u_machine_init(MachineState *machine)
83
/* Compute the fdt load address in dram */
84
fdt_load_addr = riscv_load_fdt(memmap[SIFIVE_U_DEV_DRAM].base,
85
machine->ram_size, s->fdt);
86
- #if defined(TARGET_RISCV64)
87
- start_addr_hi32 = start_addr >> 32;
88
- #endif
89
+ if (!riscv_is_32_bit(machine)) {
90
+ start_addr_hi32 = (uint64_t)start_addr >> 32;
91
+ }
92
93
/* reset vector */
94
uint32_t reset_vec[11] = {
95
@@ -XXX,XX +XXX,XX @@ static void sifive_u_machine_init(MachineState *machine)
96
0x00000297, /* 1: auipc t0, %pcrel_hi(fw_dyn) */
97
0x02828613, /* addi a2, t0, %pcrel_lo(1b) */
98
0xf1402573, /* csrr a0, mhartid */
99
-#if defined(TARGET_RISCV32)
100
- 0x0202a583, /* lw a1, 32(t0) */
101
- 0x0182a283, /* lw t0, 24(t0) */
102
-#elif defined(TARGET_RISCV64)
103
- 0x0202b583, /* ld a1, 32(t0) */
104
- 0x0182b283, /* ld t0, 24(t0) */
105
-#endif
106
+ 0,
107
+ 0,
108
0x00028067, /* jr t0 */
109
start_addr, /* start: .dword */
110
start_addr_hi32,
111
@@ -XXX,XX +XXX,XX @@ static void sifive_u_machine_init(MachineState *machine)
112
0x00000000,
113
/* fw_dyn: */
114
};
115
+ if (riscv_is_32_bit(machine)) {
116
+ reset_vec[4] = 0x0202a583; /* lw a1, 32(t0) */
117
+ reset_vec[5] = 0x0182a283; /* lw t0, 24(t0) */
118
+ } else {
119
+ reset_vec[4] = 0x0202b583; /* ld a1, 32(t0) */
120
+ reset_vec[5] = 0x0182b283; /* ld t0, 24(t0) */
121
+ }
122
+
123
124
/* copy in the reset vector in little_endian byte order */
125
for (i = 0; i < ARRAY_SIZE(reset_vec); i++) {
126
--
127
2.29.2
128
129
diff view generated by jsdifflib
Deleted patch
1
Update the function definitions generated in helper.h to match the
2
actual function implementations.
3
1
4
Also remove all compile time XLEN checks when building.
5
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
Message-id: 614c369cb0000d070873a647b8aac7e023cba145.1608142916.git.alistair.francis@wdc.com
8
---
9
target/riscv/helper.h | 24 ++++++++----------------
10
target/riscv/fpu_helper.c | 8 --------
11
2 files changed, 8 insertions(+), 24 deletions(-)
12
13
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/riscv/helper.h
16
+++ b/target/riscv/helper.h
17
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(flt_s, TCG_CALL_NO_RWG, tl, env, i64, i64)
18
DEF_HELPER_FLAGS_3(feq_s, TCG_CALL_NO_RWG, tl, env, i64, i64)
19
DEF_HELPER_FLAGS_2(fcvt_w_s, TCG_CALL_NO_RWG, tl, env, i64)
20
DEF_HELPER_FLAGS_2(fcvt_wu_s, TCG_CALL_NO_RWG, tl, env, i64)
21
-#if defined(TARGET_RISCV64)
22
-DEF_HELPER_FLAGS_2(fcvt_l_s, TCG_CALL_NO_RWG, tl, env, i64)
23
-DEF_HELPER_FLAGS_2(fcvt_lu_s, TCG_CALL_NO_RWG, tl, env, i64)
24
-#endif
25
+DEF_HELPER_FLAGS_2(fcvt_l_s, TCG_CALL_NO_RWG, i64, env, i64)
26
+DEF_HELPER_FLAGS_2(fcvt_lu_s, TCG_CALL_NO_RWG, i64, env, i64)
27
DEF_HELPER_FLAGS_2(fcvt_s_w, TCG_CALL_NO_RWG, i64, env, tl)
28
DEF_HELPER_FLAGS_2(fcvt_s_wu, TCG_CALL_NO_RWG, i64, env, tl)
29
-#if defined(TARGET_RISCV64)
30
-DEF_HELPER_FLAGS_2(fcvt_s_l, TCG_CALL_NO_RWG, i64, env, tl)
31
-DEF_HELPER_FLAGS_2(fcvt_s_lu, TCG_CALL_NO_RWG, i64, env, tl)
32
-#endif
33
+DEF_HELPER_FLAGS_2(fcvt_s_l, TCG_CALL_NO_RWG, i64, env, i64)
34
+DEF_HELPER_FLAGS_2(fcvt_s_lu, TCG_CALL_NO_RWG, i64, env, i64)
35
DEF_HELPER_FLAGS_1(fclass_s, TCG_CALL_NO_RWG_SE, tl, i64)
36
37
/* Floating Point - Double Precision */
38
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(flt_d, TCG_CALL_NO_RWG, tl, env, i64, i64)
39
DEF_HELPER_FLAGS_3(feq_d, TCG_CALL_NO_RWG, tl, env, i64, i64)
40
DEF_HELPER_FLAGS_2(fcvt_w_d, TCG_CALL_NO_RWG, tl, env, i64)
41
DEF_HELPER_FLAGS_2(fcvt_wu_d, TCG_CALL_NO_RWG, tl, env, i64)
42
-#if defined(TARGET_RISCV64)
43
-DEF_HELPER_FLAGS_2(fcvt_l_d, TCG_CALL_NO_RWG, tl, env, i64)
44
-DEF_HELPER_FLAGS_2(fcvt_lu_d, TCG_CALL_NO_RWG, tl, env, i64)
45
-#endif
46
+DEF_HELPER_FLAGS_2(fcvt_l_d, TCG_CALL_NO_RWG, i64, env, i64)
47
+DEF_HELPER_FLAGS_2(fcvt_lu_d, TCG_CALL_NO_RWG, i64, env, i64)
48
DEF_HELPER_FLAGS_2(fcvt_d_w, TCG_CALL_NO_RWG, i64, env, tl)
49
DEF_HELPER_FLAGS_2(fcvt_d_wu, TCG_CALL_NO_RWG, i64, env, tl)
50
-#if defined(TARGET_RISCV64)
51
-DEF_HELPER_FLAGS_2(fcvt_d_l, TCG_CALL_NO_RWG, i64, env, tl)
52
-DEF_HELPER_FLAGS_2(fcvt_d_lu, TCG_CALL_NO_RWG, i64, env, tl)
53
-#endif
54
+DEF_HELPER_FLAGS_2(fcvt_d_l, TCG_CALL_NO_RWG, i64, env, i64)
55
+DEF_HELPER_FLAGS_2(fcvt_d_lu, TCG_CALL_NO_RWG, i64, env, i64)
56
DEF_HELPER_FLAGS_1(fclass_d, TCG_CALL_NO_RWG_SE, tl, i64)
57
58
/* Special functions */
59
diff --git a/target/riscv/fpu_helper.c b/target/riscv/fpu_helper.c
60
index XXXXXXX..XXXXXXX 100644
61
--- a/target/riscv/fpu_helper.c
62
+++ b/target/riscv/fpu_helper.c
63
@@ -XXX,XX +XXX,XX @@ target_ulong helper_fcvt_wu_s(CPURISCVState *env, uint64_t rs1)
64
return (int32_t)float32_to_uint32(frs1, &env->fp_status);
65
}
66
67
-#if defined(TARGET_RISCV64)
68
uint64_t helper_fcvt_l_s(CPURISCVState *env, uint64_t rs1)
69
{
70
float32 frs1 = check_nanbox_s(rs1);
71
@@ -XXX,XX +XXX,XX @@ uint64_t helper_fcvt_lu_s(CPURISCVState *env, uint64_t rs1)
72
float32 frs1 = check_nanbox_s(rs1);
73
return float32_to_uint64(frs1, &env->fp_status);
74
}
75
-#endif
76
77
uint64_t helper_fcvt_s_w(CPURISCVState *env, target_ulong rs1)
78
{
79
@@ -XXX,XX +XXX,XX @@ uint64_t helper_fcvt_s_wu(CPURISCVState *env, target_ulong rs1)
80
return nanbox_s(uint32_to_float32((uint32_t)rs1, &env->fp_status));
81
}
82
83
-#if defined(TARGET_RISCV64)
84
uint64_t helper_fcvt_s_l(CPURISCVState *env, uint64_t rs1)
85
{
86
return nanbox_s(int64_to_float32(rs1, &env->fp_status));
87
@@ -XXX,XX +XXX,XX @@ uint64_t helper_fcvt_s_lu(CPURISCVState *env, uint64_t rs1)
88
{
89
return nanbox_s(uint64_to_float32(rs1, &env->fp_status));
90
}
91
-#endif
92
93
target_ulong helper_fclass_s(uint64_t rs1)
94
{
95
@@ -XXX,XX +XXX,XX @@ target_ulong helper_fcvt_wu_d(CPURISCVState *env, uint64_t frs1)
96
return (int32_t)float64_to_uint32(frs1, &env->fp_status);
97
}
98
99
-#if defined(TARGET_RISCV64)
100
uint64_t helper_fcvt_l_d(CPURISCVState *env, uint64_t frs1)
101
{
102
return float64_to_int64(frs1, &env->fp_status);
103
@@ -XXX,XX +XXX,XX @@ uint64_t helper_fcvt_lu_d(CPURISCVState *env, uint64_t frs1)
104
{
105
return float64_to_uint64(frs1, &env->fp_status);
106
}
107
-#endif
108
109
uint64_t helper_fcvt_d_w(CPURISCVState *env, target_ulong rs1)
110
{
111
@@ -XXX,XX +XXX,XX @@ uint64_t helper_fcvt_d_wu(CPURISCVState *env, target_ulong rs1)
112
return uint32_to_float64((uint32_t)rs1, &env->fp_status);
113
}
114
115
-#if defined(TARGET_RISCV64)
116
uint64_t helper_fcvt_d_l(CPURISCVState *env, uint64_t rs1)
117
{
118
return int64_to_float64(rs1, &env->fp_status);
119
@@ -XXX,XX +XXX,XX @@ uint64_t helper_fcvt_d_lu(CPURISCVState *env, uint64_t rs1)
120
{
121
return uint64_to_float64(rs1, &env->fp_status);
122
}
123
-#endif
124
125
target_ulong helper_fclass_d(uint64_t frs1)
126
{
127
--
128
2.29.2
129
130
diff view generated by jsdifflib
1
From: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
2
3
When decode_insn16() fails, we fall back to decode_RV32_64C() for
4
further compressed instruction decoding. However, prior to this change,
5
we did not raise an illegal instruction exception, if decode_RV32_64C()
6
fails to decode the instruction. This means that we skipped illegal
7
compressed instructions instead of raising an illegal instruction
8
exception.
9
10
Instead of patching decode_RV32_64C(), we can just remove it,
11
as it is dead code since f330433b363 anyway.
12
13
Signed-off-by: Georg Kotheimer <georg.kotheimer@kernkonzept.com>
14
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
15
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
16
Message-id: 20210322121609.3097928-1-georg.kotheimer@kernkonzept.com
1
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
17
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
2
Reviewed-by: Bin Meng <bin.meng@windriver.com>
3
Tested-by: Bin Meng <bin.meng@windriver.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>
6
Acked-by: Palmer Dabbelt <palmerdabbelt@google.com>
7
Message-id: c1da66affbb83ec4a2fbeb0194293bd24d65f5dc.1608142916.git.alistair.francis@wdc.com
8
---
18
---
9
target/riscv/cpu.c | 33 +++++++++++++++++++++++----------
19
target/riscv/translate.c | 179 +--------------------------------------
10
1 file changed, 23 insertions(+), 10 deletions(-)
20
1 file changed, 1 insertion(+), 178 deletions(-)
11
21
12
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
22
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
13
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
14
--- a/target/riscv/cpu.c
24
--- a/target/riscv/translate.c
15
+++ b/target/riscv/cpu.c
25
+++ b/target/riscv/translate.c
16
@@ -XXX,XX +XXX,XX @@ static void riscv_base_cpu_init(Object *obj)
26
@@ -XXX,XX +XXX,XX @@ typedef struct DisasContext {
17
set_misa(env, 0);
27
CPUState *cs;
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;
18
}
49
}
19
50
20
-static void rvxx_sifive_u_cpu_init(Object *obj)
51
-#ifdef TARGET_RISCV64
21
+#ifdef TARGET_RISCV64
52
-static void gen_load_c(DisasContext *ctx, uint32_t opc, int rd, int rs1,
22
+static void rv64_sifive_u_cpu_init(Object *obj)
53
- target_long imm)
54
-{
55
- TCGv t0 = tcg_temp_new();
56
- TCGv t1 = tcg_temp_new();
57
- gen_get_gpr(t0, rs1);
58
- tcg_gen_addi_tl(t0, t0, imm);
59
- int memop = tcg_memop_lookup[(opc >> 12) & 0x7];
60
-
61
- if (memop < 0) {
62
- gen_exception_illegal(ctx);
63
- return;
64
- }
65
-
66
- tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, memop);
67
- gen_set_gpr(rd, t1);
68
- tcg_temp_free(t0);
69
- tcg_temp_free(t1);
70
-}
71
-
72
-static void gen_store_c(DisasContext *ctx, uint32_t opc, int rs1, int rs2,
73
- target_long imm)
74
-{
75
- TCGv t0 = tcg_temp_new();
76
- TCGv dat = tcg_temp_new();
77
- gen_get_gpr(t0, rs1);
78
- tcg_gen_addi_tl(t0, t0, imm);
79
- gen_get_gpr(dat, rs2);
80
- int memop = tcg_memop_lookup[(opc >> 12) & 0x7];
81
-
82
- if (memop < 0) {
83
- gen_exception_illegal(ctx);
84
- return;
85
- }
86
-
87
- tcg_gen_qemu_st_tl(dat, t0, ctx->mem_idx, memop);
88
- tcg_temp_free(t0);
89
- tcg_temp_free(dat);
90
-}
91
-#endif
92
-
93
#ifndef CONFIG_USER_ONLY
94
/* The states of mstatus_fs are:
95
* 0 = disabled, 1 = initial, 2 = clean, 3 = dirty
96
@@ -XXX,XX +XXX,XX @@ static void mark_fs_dirty(DisasContext *ctx)
97
static inline void mark_fs_dirty(DisasContext *ctx) { }
98
#endif
99
100
-#if !defined(TARGET_RISCV64)
101
-static void gen_fp_load(DisasContext *ctx, uint32_t opc, int rd,
102
- int rs1, target_long imm)
103
-{
104
- TCGv t0;
105
-
106
- if (ctx->mstatus_fs == 0) {
107
- gen_exception_illegal(ctx);
108
- return;
109
- }
110
-
111
- t0 = tcg_temp_new();
112
- gen_get_gpr(t0, rs1);
113
- tcg_gen_addi_tl(t0, t0, imm);
114
-
115
- switch (opc) {
116
- case OPC_RISC_FLW:
117
- if (!has_ext(ctx, RVF)) {
118
- goto do_illegal;
119
- }
120
- tcg_gen_qemu_ld_i64(cpu_fpr[rd], t0, ctx->mem_idx, MO_TEUL);
121
- /* RISC-V requires NaN-boxing of narrower width floating point values */
122
- tcg_gen_ori_i64(cpu_fpr[rd], cpu_fpr[rd], 0xffffffff00000000ULL);
123
- break;
124
- case OPC_RISC_FLD:
125
- if (!has_ext(ctx, RVD)) {
126
- goto do_illegal;
127
- }
128
- tcg_gen_qemu_ld_i64(cpu_fpr[rd], t0, ctx->mem_idx, MO_TEQ);
129
- break;
130
- do_illegal:
131
- default:
132
- gen_exception_illegal(ctx);
133
- break;
134
- }
135
- tcg_temp_free(t0);
136
-
137
- mark_fs_dirty(ctx);
138
-}
139
-
140
-static void gen_fp_store(DisasContext *ctx, uint32_t opc, int rs1,
141
- int rs2, target_long imm)
142
-{
143
- TCGv t0;
144
-
145
- if (ctx->mstatus_fs == 0) {
146
- gen_exception_illegal(ctx);
147
- return;
148
- }
149
-
150
- t0 = tcg_temp_new();
151
- gen_get_gpr(t0, rs1);
152
- tcg_gen_addi_tl(t0, t0, imm);
153
-
154
- switch (opc) {
155
- case OPC_RISC_FSW:
156
- if (!has_ext(ctx, RVF)) {
157
- goto do_illegal;
158
- }
159
- tcg_gen_qemu_st_i64(cpu_fpr[rs2], t0, ctx->mem_idx, MO_TEUL);
160
- break;
161
- case OPC_RISC_FSD:
162
- if (!has_ext(ctx, RVD)) {
163
- goto do_illegal;
164
- }
165
- tcg_gen_qemu_st_i64(cpu_fpr[rs2], t0, ctx->mem_idx, MO_TEQ);
166
- break;
167
- do_illegal:
168
- default:
169
- gen_exception_illegal(ctx);
170
- break;
171
- }
172
-
173
- tcg_temp_free(t0);
174
-}
175
-#endif
176
-
177
static void gen_set_rm(DisasContext *ctx, int rm)
23
{
178
{
24
CPURISCVState *env = &RISCV_CPU(obj)->env;
179
TCGv_i32 t0;
25
- set_misa(env, RVXLEN | RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU);
180
@@ -XXX,XX +XXX,XX @@ static void gen_set_rm(DisasContext *ctx, int rm)
26
+ set_misa(env, RV64 | RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU);
181
tcg_temp_free_i32(t0);
27
set_priv_version(env, PRIV_VERSION_1_10_0);
28
}
182
}
29
183
30
-static void rvxx_sifive_e_cpu_init(Object *obj)
184
-static void decode_RV32_64C0(DisasContext *ctx, uint16_t opcode)
31
+static void rv64_sifive_e_cpu_init(Object *obj)
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)
32
{
228
{
33
CPURISCVState *env = &RISCV_CPU(obj)->env;
229
return nf + 1;
34
- set_misa(env, RVXLEN | RVI | RVM | RVA | RVC | RVU);
230
@@ -XXX,XX +XXX,XX @@ static void decode_opc(CPURISCVState *env, DisasContext *ctx, uint16_t opcode)
35
+ set_misa(env, RV64 | RVI | RVM | RVA | RVC | RVU);
231
} else {
36
set_priv_version(env, PRIV_VERSION_1_10_0);
232
ctx->pc_succ_insn = ctx->base.pc_next + 2;
37
qdev_prop_set_bit(DEVICE(obj), "mmu", false);
233
if (!decode_insn16(ctx, opcode)) {
38
}
234
- /* fall back to old decoder */
39
+#else
235
- decode_RV32_64C(ctx, opcode);
40
+static void rv32_sifive_u_cpu_init(Object *obj)
236
+ gen_exception_illegal(ctx);
41
+{
237
}
42
+ CPURISCVState *env = &RISCV_CPU(obj)->env;
238
}
43
+ set_misa(env, RV32 | RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU);
239
} else {
44
+ set_priv_version(env, PRIV_VERSION_1_10_0);
45
+}
46
47
-#if defined(TARGET_RISCV32)
48
+static void rv32_sifive_e_cpu_init(Object *obj)
49
+{
50
+ CPURISCVState *env = &RISCV_CPU(obj)->env;
51
+ set_misa(env, RV32 | RVI | RVM | RVA | RVC | RVU);
52
+ set_priv_version(env, PRIV_VERSION_1_10_0);
53
+ qdev_prop_set_bit(DEVICE(obj), "mmu", false);
54
+}
55
56
static void rv32_ibex_cpu_init(Object *obj)
57
{
58
@@ -XXX,XX +XXX,XX @@ static void rv32_imafcu_nommu_cpu_init(Object *obj)
59
set_resetvec(env, DEFAULT_RSTVEC);
60
qdev_prop_set_bit(DEVICE(obj), "mmu", false);
61
}
62
-
63
#endif
64
65
static ObjectClass *riscv_cpu_class_by_name(const char *cpu_model)
66
@@ -XXX,XX +XXX,XX @@ static const TypeInfo riscv_cpu_type_infos[] = {
67
#if defined(TARGET_RISCV32)
68
DEFINE_CPU(TYPE_RISCV_CPU_BASE32, riscv_base_cpu_init),
69
DEFINE_CPU(TYPE_RISCV_CPU_IBEX, rv32_ibex_cpu_init),
70
- DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E31, rvxx_sifive_e_cpu_init),
71
+ DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E31, rv32_sifive_e_cpu_init),
72
DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E34, rv32_imafcu_nommu_cpu_init),
73
- DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_U34, rvxx_sifive_u_cpu_init),
74
+ DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_U34, rv32_sifive_u_cpu_init),
75
#elif defined(TARGET_RISCV64)
76
DEFINE_CPU(TYPE_RISCV_CPU_BASE64, riscv_base_cpu_init),
77
- DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E51, rvxx_sifive_e_cpu_init),
78
- DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_U54, rvxx_sifive_u_cpu_init),
79
+ DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E51, rv64_sifive_e_cpu_init),
80
+ DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_U54, rv64_sifive_u_cpu_init),
81
#endif
82
};
83
84
--
240
--
85
2.29.2
241
2.30.1
86
242
87
243
diff view generated by jsdifflib