1
The following changes since commit b6d32a06fc0984e537091cba08f2e1ed9f775d74:
1
The following changes since commit 131c58469f6fb68c89b38fee6aba8bbb20c7f4bf:
2
2
3
Merge tag 'pull-trivial-patches' of https://gitlab.com/mjt0k/qemu into staging (2024-06-30 16:12:24 -0700)
3
rust: add --rust-target option for bindgen (2025-02-06 13:51:46 -0500)
4
4
5
are available in the Git repository at:
5
are available in the Git repository at:
6
6
7
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20240701
7
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20250210
8
8
9
for you to fetch changes up to 58c782de557beb496bfb4c5ade721bbbd2480c72:
9
for you to fetch changes up to 27a8d899c7a100fd5aa040a8b993bb257687c393:
10
10
11
tests/qtest: Ensure STM32L4x5 EXTI state is correct at the end of QTests (2024-07-01 15:40:54 +0100)
11
linux-user: Do not define struct sched_attr if libc headers do (2025-02-07 16:09:20 +0000)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
target-arm queue:
14
target-arm queue:
15
* tests/avocado: update firmware for sbsa-ref and use all cores
15
* Deprecate pxa2xx CPUs, iwMMXt emulation, -old-param option
16
* hw/arm/smmu-common: Replace smmu_iommu_mr with smmu_find_sdev
16
* Drop unused AArch64DecodeTable typedefs
17
* arm: Fix VCMLA Dd, Dn, Dm[idx]
17
* Minor code cleanups
18
* arm: Fix SQDMULH (by element) with Q=0
18
* hw/net/cadence_gem: Fix the mask/compare/disable-mask logic
19
* arm: Fix FJCVTZS vs flush-to-zero
19
* linux-user: Do not define struct sched_attr if libc headers do
20
* arm: More conversion of A64 AdvSIMD to decodetree
21
* arm: Enable FEAT_Debugv8p8 for -cpu max
22
* MAINTAINERS: Update family name for Patrick Leis
23
* hw/arm/xilinx_zynq: Add boot-mode property
24
* docs/system/arm: Add a doc for zynq board
25
* hw/misc: In STM32L4x5 EXTI, correct configurable interrupts
26
* tests/qtest: fix minor issues in STM32L4x5 tests
27
20
28
----------------------------------------------------------------
21
----------------------------------------------------------------
29
Gustavo Romero (3):
22
Andrew Yuan (1):
30
target/arm: Fix indentation
23
hw/net/cadence_gem: Fix the mask/compare/disable-mask logic
31
target/arm: Move initialization of debug ID registers
32
target/arm: Enable FEAT_Debugv8p8 for -cpu max
33
24
34
Inès Varhol (3):
25
Khem Raj (1):
35
tests/qtest: Fix STM32L4x5 SYSCFG irq line 15 state assumption
26
linux-user: Do not define struct sched_attr if libc headers do
36
hw/misc: In STM32L4x5 EXTI, correct configurable interrupts
37
tests/qtest: Ensure STM32L4x5 EXTI state is correct at the end of QTests
38
27
39
Marcin Juszkiewicz (2):
28
Peter Maydell (4):
40
tests/avocado: update firmware for sbsa-ref
29
target/arm: deprecate the pxa2xx CPUs and iwMMXt emulation
41
tests/avocado: use default amount of cores on sbsa-ref
30
tests/tcg/arm: Remove test-arm-iwmmxt test
31
target/arm: Drop unused AArch64DecodeTable typedefs
32
qemu-options: Deprecate -old-param command line option
42
33
43
Nicolin Chen (1):
34
Philippe Mathieu-Daudé (6):
44
hw/arm/smmu-common: Replace smmu_iommu_mr with smmu_find_sdev
35
hw/arm/boot: Propagate vCPU to arm_load_dtb()
36
hw/arm/fsl-imx6: Add local 'mpcore/gic' variables
37
hw/arm/fsl-imx6ul: Add local 'mpcore/gic' variables
38
hw/arm/fsl-imx7: Add local 'mpcore/gic' variables
39
hw/cpu/arm: Alias 'num-cpu' property on TYPE_REALVIEW_MPCORE
40
hw/cpu/arm: Declare CPU QOM types using DEFINE_TYPES() macro
45
41
46
Patrick Leis (1):
42
docs/about/deprecated.rst | 34 ++++++++++++++++++++++
47
MAINTAINERS: Update my family name
43
include/hw/arm/boot.h | 4 ++-
44
target/arm/cpu.h | 1 +
45
hw/arm/boot.c | 11 +++----
46
hw/arm/fsl-imx6.c | 52 ++++++++++++++-------------------
47
hw/arm/fsl-imx6ul.c | 64 +++++++++++++++++------------------------
48
hw/arm/fsl-imx7.c | 52 +++++++++++++++------------------
49
hw/arm/virt.c | 2 +-
50
hw/cpu/a15mpcore.c | 21 ++++++--------
51
hw/cpu/a9mpcore.c | 21 ++++++--------
52
hw/cpu/arm11mpcore.c | 21 ++++++--------
53
hw/cpu/realview_mpcore.c | 29 +++++++------------
54
hw/net/cadence_gem.c | 26 +++++++++++++----
55
linux-user/syscall.c | 4 ++-
56
system/vl.c | 1 +
57
target/arm/cpu.c | 3 ++
58
target/arm/tcg/cpu32.c | 36 +++++++++++++++--------
59
target/arm/tcg/translate-a64.c | 11 -------
60
tests/tcg/arm/Makefile.target | 7 -----
61
tests/tcg/arm/README | 5 ----
62
tests/tcg/arm/test-arm-iwmmxt.S | 49 -------------------------------
63
21 files changed, 205 insertions(+), 249 deletions(-)
64
delete mode 100644 tests/tcg/arm/test-arm-iwmmxt.S
48
65
49
Rayhan Faizel (3):
50
hw/nvram: Add BCM2835 OTP device
51
hw/arm: Connect OTP device to BCM2835
52
hw/misc: Implement mailbox properties for customer OTP and device specific private keys
53
54
Richard Henderson (13):
55
target/arm: Fix VCMLA Dd, Dn, Dm[idx]
56
target/arm: Fix SQDMULH (by element) with Q=0
57
target/arm: Fix FJCVTZS vs flush-to-zero
58
target/arm: Convert SQRDMLAH, SQRDMLSH to decodetree
59
target/arm: Convert SDOT, UDOT to decodetree
60
target/arm: Convert SUDOT, USDOT to decodetree
61
target/arm: Convert BFDOT to decodetree
62
target/arm: Convert BFMLALB, BFMLALT to decodetree
63
target/arm: Convert BFMMLA, SMMLA, UMMLA, USMMLA to decodetree
64
target/arm: Add data argument to do_fp3_vector
65
target/arm: Convert FCADD to decodetree
66
target/arm: Convert FCMLA to decodetree
67
target/arm: Delete dead code from disas_simd_indexed
68
69
Sai Pavan Boddu (3):
70
hw/misc/zynq_slcr: Add boot-mode property
71
hw/arm/xilinx_zynq: Add boot-mode property
72
docs/system/arm: Add a doc for zynq board
73
74
MAINTAINERS | 3 +-
75
docs/system/arm/emulation.rst | 1 +
76
docs/system/arm/xlnx-zynq.rst | 47 ++
77
docs/system/target-arm.rst | 1 +
78
include/hw/arm/bcm2835_peripherals.h | 3 +-
79
include/hw/arm/raspberrypi-fw-defs.h | 2 +
80
include/hw/arm/smmu-common.h | 4 +-
81
include/hw/misc/bcm2835_property.h | 2 +
82
include/hw/misc/stm32l4x5_exti.h | 2 +
83
include/hw/nvram/bcm2835_otp.h | 68 +++
84
target/arm/cpu.h | 2 +
85
target/arm/helper.h | 10 +
86
target/arm/tcg/a64.decode | 43 ++
87
hw/arm/bcm2835_peripherals.c | 15 +-
88
hw/arm/smmu-common.c | 8 +-
89
hw/arm/smmuv3.c | 12 +-
90
hw/arm/xilinx_zynq.c | 31 ++
91
hw/misc/bcm2835_property.c | 87 ++++
92
hw/misc/stm32l4x5_exti.c | 28 +-
93
hw/misc/zynq_slcr.c | 22 +-
94
hw/nvram/bcm2835_otp.c | 187 +++++++
95
target/arm/tcg/cpu32.c | 35 +-
96
target/arm/tcg/cpu64.c | 4 +-
97
target/arm/tcg/translate-a64.c | 808 ++++++++++---------------------
98
target/arm/tcg/vec_helper.c | 100 +++-
99
target/arm/vfp_helper.c | 18 +-
100
tests/qtest/stm32l4x5_exti-test.c | 8 +
101
tests/qtest/stm32l4x5_syscfg-test.c | 16 +-
102
tests/tcg/aarch64/test-2375.c | 21 +
103
hw/nvram/meson.build | 1 +
104
tests/avocado/machine_aarch64_sbsaref.py | 16 +-
105
tests/tcg/aarch64/Makefile.target | 3 +-
106
32 files changed, 967 insertions(+), 641 deletions(-)
107
create mode 100644 docs/system/arm/xlnx-zynq.rst
108
create mode 100644 include/hw/nvram/bcm2835_otp.h
109
create mode 100644 hw/nvram/bcm2835_otp.c
110
create mode 100644 tests/tcg/aarch64/test-2375.c
111
diff view generated by jsdifflib
Deleted patch
1
From: Rayhan Faizel <rayhan.faizel@gmail.com>
2
1
3
The OTP device registers are currently stubbed. For now, the device
4
houses the OTP rows which will be accessed directly by other peripherals.
5
6
Signed-off-by: Rayhan Faizel <rayhan.faizel@gmail.com>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
include/hw/nvram/bcm2835_otp.h | 68 ++++++++++++
11
hw/nvram/bcm2835_otp.c | 187 +++++++++++++++++++++++++++++++++
12
hw/nvram/meson.build | 1 +
13
3 files changed, 256 insertions(+)
14
create mode 100644 include/hw/nvram/bcm2835_otp.h
15
create mode 100644 hw/nvram/bcm2835_otp.c
16
17
diff --git a/include/hw/nvram/bcm2835_otp.h b/include/hw/nvram/bcm2835_otp.h
18
new file mode 100644
19
index XXXXXXX..XXXXXXX
20
--- /dev/null
21
+++ b/include/hw/nvram/bcm2835_otp.h
22
@@ -XXX,XX +XXX,XX @@
23
+/*
24
+ * BCM2835 One-Time Programmable (OTP) Memory
25
+ *
26
+ * Copyright (c) 2024 Rayhan Faizel <rayhan.faizel@gmail.com>
27
+ *
28
+ * SPDX-License-Identifier: MIT
29
+ */
30
+
31
+#ifndef BCM2835_OTP_H
32
+#define BCM2835_OTP_H
33
+
34
+#include "hw/sysbus.h"
35
+#include "qom/object.h"
36
+
37
+#define TYPE_BCM2835_OTP "bcm2835-otp"
38
+OBJECT_DECLARE_SIMPLE_TYPE(BCM2835OTPState, BCM2835_OTP)
39
+
40
+#define BCM2835_OTP_ROW_COUNT 66
41
+
42
+/* https://elinux.org/BCM2835_registers#OTP */
43
+#define BCM2835_OTP_BOOTMODE_REG 0x00
44
+#define BCM2835_OTP_CONFIG_REG 0x04
45
+#define BCM2835_OTP_CTRL_LO_REG 0x08
46
+#define BCM2835_OTP_CTRL_HI_REG 0x0c
47
+#define BCM2835_OTP_STATUS_REG 0x10
48
+#define BCM2835_OTP_BITSEL_REG 0x14
49
+#define BCM2835_OTP_DATA_REG 0x18
50
+#define BCM2835_OTP_ADDR_REG 0x1c
51
+#define BCM2835_OTP_WRITE_DATA_READ_REG 0x20
52
+#define BCM2835_OTP_INIT_STATUS_REG 0x24
53
+
54
+
55
+/* -- Row 32: Undocumented -- */
56
+
57
+#define BCM2835_OTP_ROW_32 32
58
+
59
+/* Lock OTP Programming (Customer OTP and private key) */
60
+#define BCM2835_OTP_ROW_32_LOCK BIT(6)
61
+
62
+/* -- Row 36-43: Customer OTP -- */
63
+
64
+#define BCM2835_OTP_CUSTOMER_OTP 36
65
+#define BCM2835_OTP_CUSTOMER_OTP_LEN 8
66
+
67
+/* Magic numbers to lock programming of customer OTP and private key */
68
+#define BCM2835_OTP_LOCK_NUM1 0xffffffff
69
+#define BCM2835_OTP_LOCK_NUM2 0xaffe0000
70
+
71
+/* -- Row 56-63: Device-specific private key -- */
72
+
73
+#define BCM2835_OTP_PRIVATE_KEY 56
74
+#define BCM2835_OTP_PRIVATE_KEY_LEN 8
75
+
76
+
77
+struct BCM2835OTPState {
78
+ /* <private> */
79
+ SysBusDevice parent_obj;
80
+
81
+ /* <public> */
82
+ MemoryRegion iomem;
83
+ uint32_t otp_rows[BCM2835_OTP_ROW_COUNT];
84
+};
85
+
86
+
87
+uint32_t bcm2835_otp_get_row(BCM2835OTPState *s, unsigned int row);
88
+void bcm2835_otp_set_row(BCM2835OTPState *s, unsigned int row, uint32_t value);
89
+
90
+#endif
91
diff --git a/hw/nvram/bcm2835_otp.c b/hw/nvram/bcm2835_otp.c
92
new file mode 100644
93
index XXXXXXX..XXXXXXX
94
--- /dev/null
95
+++ b/hw/nvram/bcm2835_otp.c
96
@@ -XXX,XX +XXX,XX @@
97
+/*
98
+ * BCM2835 One-Time Programmable (OTP) Memory
99
+ *
100
+ * The OTP implementation is mostly a stub except for the OTP rows
101
+ * which are accessed directly by other peripherals such as the mailbox.
102
+ *
103
+ * The OTP registers are unimplemented due to lack of documentation.
104
+ *
105
+ * Copyright (c) 2024 Rayhan Faizel <rayhan.faizel@gmail.com>
106
+ *
107
+ * SPDX-License-Identifier: MIT
108
+ */
109
+
110
+#include "qemu/osdep.h"
111
+#include "qemu/log.h"
112
+#include "hw/nvram/bcm2835_otp.h"
113
+#include "migration/vmstate.h"
114
+
115
+/* OTP rows are 1-indexed */
116
+uint32_t bcm2835_otp_get_row(BCM2835OTPState *s, unsigned int row)
117
+{
118
+ assert(row <= BCM2835_OTP_ROW_COUNT && row >= 1);
119
+
120
+ return s->otp_rows[row - 1];
121
+}
122
+
123
+void bcm2835_otp_set_row(BCM2835OTPState *s, unsigned int row,
124
+ uint32_t value)
125
+{
126
+ assert(row <= BCM2835_OTP_ROW_COUNT && row >= 1);
127
+
128
+ /* Real OTP rows work as e-fuses */
129
+ s->otp_rows[row - 1] |= value;
130
+}
131
+
132
+static uint64_t bcm2835_otp_read(void *opaque, hwaddr addr, unsigned size)
133
+{
134
+ switch (addr) {
135
+ case BCM2835_OTP_BOOTMODE_REG:
136
+ qemu_log_mask(LOG_UNIMP,
137
+ "bcm2835_otp: BCM2835_OTP_BOOTMODE_REG\n");
138
+ break;
139
+ case BCM2835_OTP_CONFIG_REG:
140
+ qemu_log_mask(LOG_UNIMP,
141
+ "bcm2835_otp: BCM2835_OTP_CONFIG_REG\n");
142
+ break;
143
+ case BCM2835_OTP_CTRL_LO_REG:
144
+ qemu_log_mask(LOG_UNIMP,
145
+ "bcm2835_otp: BCM2835_OTP_CTRL_LO_REG\n");
146
+ break;
147
+ case BCM2835_OTP_CTRL_HI_REG:
148
+ qemu_log_mask(LOG_UNIMP,
149
+ "bcm2835_otp: BCM2835_OTP_CTRL_HI_REG\n");
150
+ break;
151
+ case BCM2835_OTP_STATUS_REG:
152
+ qemu_log_mask(LOG_UNIMP,
153
+ "bcm2835_otp: BCM2835_OTP_STATUS_REG\n");
154
+ break;
155
+ case BCM2835_OTP_BITSEL_REG:
156
+ qemu_log_mask(LOG_UNIMP,
157
+ "bcm2835_otp: BCM2835_OTP_BITSEL_REG\n");
158
+ break;
159
+ case BCM2835_OTP_DATA_REG:
160
+ qemu_log_mask(LOG_UNIMP,
161
+ "bcm2835_otp: BCM2835_OTP_DATA_REG\n");
162
+ break;
163
+ case BCM2835_OTP_ADDR_REG:
164
+ qemu_log_mask(LOG_UNIMP,
165
+ "bcm2835_otp: BCM2835_OTP_ADDR_REG\n");
166
+ break;
167
+ case BCM2835_OTP_WRITE_DATA_READ_REG:
168
+ qemu_log_mask(LOG_UNIMP,
169
+ "bcm2835_otp: BCM2835_OTP_WRITE_DATA_READ_REG\n");
170
+ break;
171
+ case BCM2835_OTP_INIT_STATUS_REG:
172
+ qemu_log_mask(LOG_UNIMP,
173
+ "bcm2835_otp: BCM2835_OTP_INIT_STATUS_REG\n");
174
+ break;
175
+ default:
176
+ qemu_log_mask(LOG_GUEST_ERROR,
177
+ "%s: Bad offset 0x%" HWADDR_PRIx "\n", __func__, addr);
178
+ }
179
+
180
+ return 0;
181
+}
182
+
183
+static void bcm2835_otp_write(void *opaque, hwaddr addr,
184
+ uint64_t value, unsigned int size)
185
+{
186
+ switch (addr) {
187
+ case BCM2835_OTP_BOOTMODE_REG:
188
+ qemu_log_mask(LOG_UNIMP,
189
+ "bcm2835_otp: BCM2835_OTP_BOOTMODE_REG\n");
190
+ break;
191
+ case BCM2835_OTP_CONFIG_REG:
192
+ qemu_log_mask(LOG_UNIMP,
193
+ "bcm2835_otp: BCM2835_OTP_CONFIG_REG\n");
194
+ break;
195
+ case BCM2835_OTP_CTRL_LO_REG:
196
+ qemu_log_mask(LOG_UNIMP,
197
+ "bcm2835_otp: BCM2835_OTP_CTRL_LO_REG\n");
198
+ break;
199
+ case BCM2835_OTP_CTRL_HI_REG:
200
+ qemu_log_mask(LOG_UNIMP,
201
+ "bcm2835_otp: BCM2835_OTP_CTRL_HI_REG\n");
202
+ break;
203
+ case BCM2835_OTP_STATUS_REG:
204
+ qemu_log_mask(LOG_UNIMP,
205
+ "bcm2835_otp: BCM2835_OTP_STATUS_REG\n");
206
+ break;
207
+ case BCM2835_OTP_BITSEL_REG:
208
+ qemu_log_mask(LOG_UNIMP,
209
+ "bcm2835_otp: BCM2835_OTP_BITSEL_REG\n");
210
+ break;
211
+ case BCM2835_OTP_DATA_REG:
212
+ qemu_log_mask(LOG_UNIMP,
213
+ "bcm2835_otp: BCM2835_OTP_DATA_REG\n");
214
+ break;
215
+ case BCM2835_OTP_ADDR_REG:
216
+ qemu_log_mask(LOG_UNIMP,
217
+ "bcm2835_otp: BCM2835_OTP_ADDR_REG\n");
218
+ break;
219
+ case BCM2835_OTP_WRITE_DATA_READ_REG:
220
+ qemu_log_mask(LOG_UNIMP,
221
+ "bcm2835_otp: BCM2835_OTP_WRITE_DATA_READ_REG\n");
222
+ break;
223
+ case BCM2835_OTP_INIT_STATUS_REG:
224
+ qemu_log_mask(LOG_UNIMP,
225
+ "bcm2835_otp: BCM2835_OTP_INIT_STATUS_REG\n");
226
+ break;
227
+ default:
228
+ qemu_log_mask(LOG_GUEST_ERROR,
229
+ "%s: Bad offset 0x%" HWADDR_PRIx "\n", __func__, addr);
230
+ }
231
+}
232
+
233
+static const MemoryRegionOps bcm2835_otp_ops = {
234
+ .read = bcm2835_otp_read,
235
+ .write = bcm2835_otp_write,
236
+ .endianness = DEVICE_NATIVE_ENDIAN,
237
+ .impl = {
238
+ .min_access_size = 4,
239
+ .max_access_size = 4,
240
+ },
241
+};
242
+
243
+static void bcm2835_otp_realize(DeviceState *dev, Error **errp)
244
+{
245
+ BCM2835OTPState *s = BCM2835_OTP(dev);
246
+ memory_region_init_io(&s->iomem, OBJECT(dev), &bcm2835_otp_ops, s,
247
+ TYPE_BCM2835_OTP, 0x80);
248
+ sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem);
249
+
250
+ memset(s->otp_rows, 0x00, sizeof(s->otp_rows));
251
+}
252
+
253
+static const VMStateDescription vmstate_bcm2835_otp = {
254
+ .name = TYPE_BCM2835_OTP,
255
+ .version_id = 1,
256
+ .minimum_version_id = 1,
257
+ .fields = (const VMStateField[]) {
258
+ VMSTATE_UINT32_ARRAY(otp_rows, BCM2835OTPState, BCM2835_OTP_ROW_COUNT),
259
+ VMSTATE_END_OF_LIST()
260
+ }
261
+};
262
+
263
+static void bcm2835_otp_class_init(ObjectClass *klass, void *data)
264
+{
265
+ DeviceClass *dc = DEVICE_CLASS(klass);
266
+
267
+ dc->realize = bcm2835_otp_realize;
268
+ dc->vmsd = &vmstate_bcm2835_otp;
269
+}
270
+
271
+static const TypeInfo bcm2835_otp_info = {
272
+ .name = TYPE_BCM2835_OTP,
273
+ .parent = TYPE_SYS_BUS_DEVICE,
274
+ .instance_size = sizeof(BCM2835OTPState),
275
+ .class_init = bcm2835_otp_class_init,
276
+};
277
+
278
+static void bcm2835_otp_register_types(void)
279
+{
280
+ type_register_static(&bcm2835_otp_info);
281
+}
282
+
283
+type_init(bcm2835_otp_register_types)
284
diff --git a/hw/nvram/meson.build b/hw/nvram/meson.build
285
index XXXXXXX..XXXXXXX 100644
286
--- a/hw/nvram/meson.build
287
+++ b/hw/nvram/meson.build
288
@@ -XXX,XX +XXX,XX @@
289
system_ss.add(files('fw_cfg-interface.c'))
290
system_ss.add(files('fw_cfg.c'))
291
+system_ss.add(when: 'CONFIG_RASPI', if_true: files('bcm2835_otp.c'))
292
system_ss.add(when: 'CONFIG_CHRP_NVRAM', if_true: files('chrp_nvram.c'))
293
system_ss.add(when: 'CONFIG_DS1225Y', if_true: files('ds1225y.c'))
294
system_ss.add(when: 'CONFIG_NMC93XX_EEPROM', if_true: files('eeprom93xx.c'))
295
--
296
2.34.1
diff view generated by jsdifflib
Deleted patch
1
From: Rayhan Faizel <rayhan.faizel@gmail.com>
2
1
3
Replace stubbed OTP memory region with the new OTP device.
4
5
Signed-off-by: Rayhan Faizel <rayhan.faizel@gmail.com>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
9
include/hw/arm/bcm2835_peripherals.h | 3 ++-
10
hw/arm/bcm2835_peripherals.c | 13 ++++++++++++-
11
2 files changed, 14 insertions(+), 2 deletions(-)
12
13
diff --git a/include/hw/arm/bcm2835_peripherals.h b/include/hw/arm/bcm2835_peripherals.h
14
index XXXXXXX..XXXXXXX 100644
15
--- a/include/hw/arm/bcm2835_peripherals.h
16
+++ b/include/hw/arm/bcm2835_peripherals.h
17
@@ -XXX,XX +XXX,XX @@
18
#include "hw/usb/hcd-dwc2.h"
19
#include "hw/ssi/bcm2835_spi.h"
20
#include "hw/i2c/bcm2835_i2c.h"
21
+#include "hw/nvram/bcm2835_otp.h"
22
#include "hw/misc/unimp.h"
23
#include "qom/object.h"
24
25
@@ -XXX,XX +XXX,XX @@ struct BCMSocPeripheralBaseState {
26
BCM2835SPIState spi[1];
27
BCM2835I2CState i2c[3];
28
OrIRQState orgated_i2c_irq;
29
- UnimplementedDeviceState otp;
30
+ BCM2835OTPState otp;
31
UnimplementedDeviceState dbus;
32
UnimplementedDeviceState ave0;
33
UnimplementedDeviceState v3d;
34
diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/hw/arm/bcm2835_peripherals.c
37
+++ b/hw/arm/bcm2835_peripherals.c
38
@@ -XXX,XX +XXX,XX @@ static void raspi_peripherals_base_init(Object *obj)
39
object_property_add_const_link(OBJECT(&s->fb), "dma-mr",
40
OBJECT(&s->gpu_bus_mr));
41
42
+ /* OTP */
43
+ object_initialize_child(obj, "bcm2835-otp", &s->otp,
44
+ TYPE_BCM2835_OTP);
45
+
46
/* Property channel */
47
object_initialize_child(obj, "property", &s->property,
48
TYPE_BCM2835_PROPERTY);
49
@@ -XXX,XX +XXX,XX @@ void bcm_soc_peripherals_common_realize(DeviceState *dev, Error **errp)
50
sysbus_connect_irq(SYS_BUS_DEVICE(&s->fb), 0,
51
qdev_get_gpio_in(DEVICE(&s->mboxes), MBOX_CHAN_FB));
52
53
+ /* OTP */
54
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->otp), errp)) {
55
+ return;
56
+ }
57
+
58
+ memory_region_add_subregion(&s->peri_mr, OTP_OFFSET,
59
+ sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->otp), 0));
60
+
61
/* Property channel */
62
if (!sysbus_realize(SYS_BUS_DEVICE(&s->property), errp)) {
63
return;
64
@@ -XXX,XX +XXX,XX @@ void bcm_soc_peripherals_common_realize(DeviceState *dev, Error **errp)
65
create_unimp(s, &s->i2s, "bcm2835-i2s", I2S_OFFSET, 0x100);
66
create_unimp(s, &s->smi, "bcm2835-smi", SMI_OFFSET, 0x100);
67
create_unimp(s, &s->bscsl, "bcm2835-spis", BSC_SL_OFFSET, 0x100);
68
- create_unimp(s, &s->otp, "bcm2835-otp", OTP_OFFSET, 0x80);
69
create_unimp(s, &s->dbus, "bcm2835-dbus", DBUS_OFFSET, 0x8000);
70
create_unimp(s, &s->ave0, "bcm2835-ave0", AVE0_OFFSET, 0x8000);
71
create_unimp(s, &s->v3d, "bcm2835-v3d", V3D_OFFSET, 0x1000);
72
--
73
2.34.1
diff view generated by jsdifflib
Deleted patch
1
From: Rayhan Faizel <rayhan.faizel@gmail.com>
2
1
3
Four mailbox properties are implemented as follows:
4
1. Customer OTP: GET_CUSTOMER_OTP and SET_CUSTOMER_OTP
5
2. Device-specific private key: GET_PRIVATE_KEY and
6
SET_PRIVATE_KEY.
7
8
The customer OTP is located in the rows 36-43. The device-specific private key
9
is located in the rows 56-63.
10
11
The customer OTP can be locked with the magic numbers 0xffffffff 0xaffe0000
12
when running the SET_CUSTOMER_OTP mailbox command. Bit 6 of row 32 indicates
13
this lock, which is undocumented. The lock also applies to the device-specific
14
private key.
15
16
Signed-off-by: Rayhan Faizel <rayhan.faizel@gmail.com>
17
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
---
20
include/hw/arm/raspberrypi-fw-defs.h | 2 +
21
include/hw/misc/bcm2835_property.h | 2 +
22
hw/arm/bcm2835_peripherals.c | 2 +
23
hw/misc/bcm2835_property.c | 87 ++++++++++++++++++++++++++++
24
4 files changed, 93 insertions(+)
25
26
diff --git a/include/hw/arm/raspberrypi-fw-defs.h b/include/hw/arm/raspberrypi-fw-defs.h
27
index XXXXXXX..XXXXXXX 100644
28
--- a/include/hw/arm/raspberrypi-fw-defs.h
29
+++ b/include/hw/arm/raspberrypi-fw-defs.h
30
@@ -XXX,XX +XXX,XX @@ enum rpi_firmware_property_tag {
31
RPI_FWREQ_GET_THROTTLED = 0x00030046,
32
RPI_FWREQ_GET_CLOCK_MEASURED = 0x00030047,
33
RPI_FWREQ_NOTIFY_REBOOT = 0x00030048,
34
+ RPI_FWREQ_GET_PRIVATE_KEY = 0x00030081,
35
RPI_FWREQ_SET_CLOCK_STATE = 0x00038001,
36
RPI_FWREQ_SET_CLOCK_RATE = 0x00038002,
37
RPI_FWREQ_SET_VOLTAGE = 0x00038003,
38
@@ -XXX,XX +XXX,XX @@ enum rpi_firmware_property_tag {
39
RPI_FWREQ_SET_PERIPH_REG = 0x00038045,
40
RPI_FWREQ_GET_POE_HAT_VAL = 0x00030049,
41
RPI_FWREQ_SET_POE_HAT_VAL = 0x00038049,
42
+ RPI_FWREQ_SET_PRIVATE_KEY = 0x00038081,
43
RPI_FWREQ_SET_POE_HAT_VAL_OLD = 0x00030050,
44
RPI_FWREQ_NOTIFY_XHCI_RESET = 0x00030058,
45
RPI_FWREQ_GET_REBOOT_FLAGS = 0x00030064,
46
diff --git a/include/hw/misc/bcm2835_property.h b/include/hw/misc/bcm2835_property.h
47
index XXXXXXX..XXXXXXX 100644
48
--- a/include/hw/misc/bcm2835_property.h
49
+++ b/include/hw/misc/bcm2835_property.h
50
@@ -XXX,XX +XXX,XX @@
51
#include "hw/sysbus.h"
52
#include "net/net.h"
53
#include "hw/display/bcm2835_fb.h"
54
+#include "hw/nvram/bcm2835_otp.h"
55
#include "qom/object.h"
56
57
#define TYPE_BCM2835_PROPERTY "bcm2835-property"
58
@@ -XXX,XX +XXX,XX @@ struct BCM2835PropertyState {
59
MemoryRegion iomem;
60
qemu_irq mbox_irq;
61
BCM2835FBState *fbdev;
62
+ BCM2835OTPState *otp;
63
64
MACAddr macaddr;
65
uint32_t board_rev;
66
diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
67
index XXXXXXX..XXXXXXX 100644
68
--- a/hw/arm/bcm2835_peripherals.c
69
+++ b/hw/arm/bcm2835_peripherals.c
70
@@ -XXX,XX +XXX,XX @@ static void raspi_peripherals_base_init(Object *obj)
71
OBJECT(&s->fb));
72
object_property_add_const_link(OBJECT(&s->property), "dma-mr",
73
OBJECT(&s->gpu_bus_mr));
74
+ object_property_add_const_link(OBJECT(&s->property), "otp",
75
+ OBJECT(&s->otp));
76
77
/* Extended Mass Media Controller */
78
object_initialize_child(obj, "sdhci", &s->sdhci, TYPE_SYSBUS_SDHCI);
79
diff --git a/hw/misc/bcm2835_property.c b/hw/misc/bcm2835_property.c
80
index XXXXXXX..XXXXXXX 100644
81
--- a/hw/misc/bcm2835_property.c
82
+++ b/hw/misc/bcm2835_property.c
83
@@ -XXX,XX +XXX,XX @@ static void bcm2835_property_mbox_push(BCM2835PropertyState *s, uint32_t value)
84
uint32_t tmp;
85
int n;
86
uint32_t offset, length, color;
87
+ uint32_t start_num, number, otp_row;
88
89
/*
90
* Copy the current state of the framebuffer config; we will update
91
@@ -XXX,XX +XXX,XX @@ static void bcm2835_property_mbox_push(BCM2835PropertyState *s, uint32_t value)
92
0);
93
resplen = VCHI_BUSADDR_SIZE;
94
break;
95
+
96
+ /* Customer OTP */
97
+
98
+ case RPI_FWREQ_GET_CUSTOMER_OTP:
99
+ start_num = ldl_le_phys(&s->dma_as, value + 12);
100
+ number = ldl_le_phys(&s->dma_as, value + 16);
101
+
102
+ resplen = 8 + 4 * number;
103
+
104
+ for (n = start_num; n < start_num + number &&
105
+ n < BCM2835_OTP_CUSTOMER_OTP_LEN; n++) {
106
+ otp_row = bcm2835_otp_get_row(s->otp,
107
+ BCM2835_OTP_CUSTOMER_OTP + n);
108
+ stl_le_phys(&s->dma_as,
109
+ value + 20 + ((n - start_num) << 2), otp_row);
110
+ }
111
+ break;
112
+ case RPI_FWREQ_SET_CUSTOMER_OTP:
113
+ start_num = ldl_le_phys(&s->dma_as, value + 12);
114
+ number = ldl_le_phys(&s->dma_as, value + 16);
115
+
116
+ resplen = 4;
117
+
118
+ /* Magic numbers to permanently lock customer OTP */
119
+ if (start_num == BCM2835_OTP_LOCK_NUM1 &&
120
+ number == BCM2835_OTP_LOCK_NUM2) {
121
+ bcm2835_otp_set_row(s->otp,
122
+ BCM2835_OTP_ROW_32,
123
+ BCM2835_OTP_ROW_32_LOCK);
124
+ break;
125
+ }
126
+
127
+ /* If row 32 has the lock bit, don't allow further writes */
128
+ if (bcm2835_otp_get_row(s->otp, BCM2835_OTP_ROW_32) &
129
+ BCM2835_OTP_ROW_32_LOCK) {
130
+ break;
131
+ }
132
+
133
+ for (n = start_num; n < start_num + number &&
134
+ n < BCM2835_OTP_CUSTOMER_OTP_LEN; n++) {
135
+ otp_row = ldl_le_phys(&s->dma_as,
136
+ value + 20 + ((n - start_num) << 2));
137
+ bcm2835_otp_set_row(s->otp,
138
+ BCM2835_OTP_CUSTOMER_OTP + n, otp_row);
139
+ }
140
+ break;
141
+
142
+ /* Device-specific private key */
143
+
144
+ case RPI_FWREQ_GET_PRIVATE_KEY:
145
+ start_num = ldl_le_phys(&s->dma_as, value + 12);
146
+ number = ldl_le_phys(&s->dma_as, value + 16);
147
+
148
+ resplen = 8 + 4 * number;
149
+
150
+ for (n = start_num; n < start_num + number &&
151
+ n < BCM2835_OTP_PRIVATE_KEY_LEN; n++) {
152
+ otp_row = bcm2835_otp_get_row(s->otp,
153
+ BCM2835_OTP_PRIVATE_KEY + n);
154
+ stl_le_phys(&s->dma_as,
155
+ value + 20 + ((n - start_num) << 2), otp_row);
156
+ }
157
+ break;
158
+ case RPI_FWREQ_SET_PRIVATE_KEY:
159
+ start_num = ldl_le_phys(&s->dma_as, value + 12);
160
+ number = ldl_le_phys(&s->dma_as, value + 16);
161
+
162
+ resplen = 4;
163
+
164
+ /* If row 32 has the lock bit, don't allow further writes */
165
+ if (bcm2835_otp_get_row(s->otp, BCM2835_OTP_ROW_32) &
166
+ BCM2835_OTP_ROW_32_LOCK) {
167
+ break;
168
+ }
169
+
170
+ for (n = start_num; n < start_num + number &&
171
+ n < BCM2835_OTP_PRIVATE_KEY_LEN; n++) {
172
+ otp_row = ldl_le_phys(&s->dma_as,
173
+ value + 20 + ((n - start_num) << 2));
174
+ bcm2835_otp_set_row(s->otp,
175
+ BCM2835_OTP_PRIVATE_KEY + n, otp_row);
176
+ }
177
+ break;
178
default:
179
qemu_log_mask(LOG_UNIMP,
180
"bcm2835_property: unhandled tag 0x%08x\n", tag);
181
@@ -XXX,XX +XXX,XX @@ static void bcm2835_property_realize(DeviceState *dev, Error **errp)
182
s->dma_mr = MEMORY_REGION(obj);
183
address_space_init(&s->dma_as, s->dma_mr, TYPE_BCM2835_PROPERTY "-memory");
184
185
+ obj = object_property_get_link(OBJECT(dev), "otp", &error_abort);
186
+ s->otp = BCM2835_OTP(obj);
187
+
188
/* TODO: connect to MAC address of USB NIC device, once we emulate it */
189
qemu_macaddr_default_if_unset(&s->macaddr);
190
191
--
192
2.34.1
diff view generated by jsdifflib
1
From: Gustavo Romero <gustavo.romero@linaro.org>
1
The pxa2xx CPUs are now only useful with user-mode emulation, because
2
we dropped all the machine types that used them in 9.2. (Technically
3
you could alse use "-cpu pxa270" with a board model like versatilepb
4
which doesn't sanity-check the CPU type, but that has never been a
5
supported config.)
2
6
3
Move the initialization of the debug ID registers to aa32_max_features,
7
To use them (or iwMMXt emulation) with QEMU user-mode you would need
4
which is used to set the 32-bit ID registers. This ensures that the
8
to explicitly select them with the -cpu option or the QEMU_CPU
5
debug ID registers are consistently set for the max CPU in a single
9
environment variable. A google search finds no examples of anybody
6
place.
10
doing this in the last decade; I don't believe the GCC folks are
11
using QEMU to test their iwMMXt codegen either. In fact, GCC is in
12
the process of dropping support for iwMMXT entirely.
7
13
8
Signed-off-by: Gustavo Romero <gustavo.romero@linaro.org>
14
The iwMMXt emulation is thousands of lines of code in QEMU, and
15
is now the only bit of Arm insn decode which doesn't use decodetree.
16
We have no way to test or validate changes to it. This code is
17
just dead weight that is almost certainly not being used by anybody.
18
Mark it as deprecated.
19
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
21
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20240624180915.4528-3-gustavo.romero@linaro.org
22
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
Message-id: 20250127112715.2936555-2-peter.maydell@linaro.org
12
---
24
---
13
target/arm/cpu.h | 2 ++
25
docs/about/deprecated.rst | 21 +++++++++++++++++++++
14
target/arm/tcg/cpu32.c | 31 ++++++++++++++++++++++++++++---
26
target/arm/cpu.h | 1 +
15
2 files changed, 30 insertions(+), 3 deletions(-)
27
target/arm/cpu.c | 3 +++
28
target/arm/tcg/cpu32.c | 36 ++++++++++++++++++++++++------------
29
4 files changed, 49 insertions(+), 12 deletions(-)
16
30
31
diff --git a/docs/about/deprecated.rst b/docs/about/deprecated.rst
32
index XXXXXXX..XXXXXXX 100644
33
--- a/docs/about/deprecated.rst
34
+++ b/docs/about/deprecated.rst
35
@@ -XXX,XX +XXX,XX @@ is going to be so much slower it wouldn't make sense for any serious
36
instrumentation. Due to implementation differences there will also be
37
anomalies in things like memory instrumentation.
38
39
+linux-user mode CPUs
40
+--------------------
41
+
42
+iwMMXt emulation and the ``pxa`` CPUs (since 10.0)
43
+''''''''''''''''''''''''''''''''''''''''''''''''''
44
+
45
+The ``pxa`` CPU family (``pxa250``, ``pxa255``, ``pxa260``,
46
+``pxa261``, ``pxa262``, ``pxa270-a0``, ``pxa270-a1``, ``pxa270``,
47
+``pxa270-b0``, ``pxa270-b1``, ``pxa270-c0``, ``pxa270-c5``) are no
48
+longer used in system emulation, because all the machine types which
49
+used these CPUs were removed in the QEMU 9.2 release. These CPUs can
50
+now only be used in linux-user mode, and to do that you would have to
51
+explicitly select one of these CPUs with the ``-cpu`` command line
52
+option or the ``QEMU_CPU`` environment variable.
53
+
54
+We don't believe that anybody is using the iwMMXt emulation, and we do
55
+not have any tests to validate it or any real hardware or similar
56
+known-good implementation to test against. GCC is in the process of
57
+dropping their support for iwMMXt codegen. These CPU types are
58
+therefore deprecated in QEMU, and will be removed in a future release.
59
+
60
System emulator CPUs
61
--------------------
62
17
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
63
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
18
index XXXXXXX..XXXXXXX 100644
64
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/cpu.h
65
--- a/target/arm/cpu.h
20
+++ b/target/arm/cpu.h
66
+++ b/target/arm/cpu.h
21
@@ -XXX,XX +XXX,XX @@ FIELD(DBGDEVID, DOUBLELOCK, 20, 4)
67
@@ -XXX,XX +XXX,XX @@ struct ArchCPU {
22
FIELD(DBGDEVID, AUXREGS, 24, 4)
68
23
FIELD(DBGDEVID, CIDMASK, 28, 4)
69
typedef struct ARMCPUInfo {
24
70
const char *name;
25
+FIELD(DBGDEVID1, PCSROFFSET, 0, 4)
71
+ const char *deprecation_note;
26
+
72
void (*initfn)(Object *obj);
27
FIELD(MVFR0, SIMDREG, 0, 4)
73
void (*class_init)(ObjectClass *oc, void *data);
28
FIELD(MVFR0, FPSP, 4, 4)
74
} ARMCPUInfo;
29
FIELD(MVFR0, FPDP, 8, 4)
75
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
76
index XXXXXXX..XXXXXXX 100644
77
--- a/target/arm/cpu.c
78
+++ b/target/arm/cpu.c
79
@@ -XXX,XX +XXX,XX @@ static void cpu_register_class_init(ObjectClass *oc, void *data)
80
81
acc->info = data;
82
cc->gdb_core_xml_file = "arm-core.xml";
83
+ if (acc->info->deprecation_note) {
84
+ cc->deprecation_note = acc->info->deprecation_note;
85
+ }
86
}
87
88
void arm_cpu_register(const ARMCPUInfo *info)
30
diff --git a/target/arm/tcg/cpu32.c b/target/arm/tcg/cpu32.c
89
diff --git a/target/arm/tcg/cpu32.c b/target/arm/tcg/cpu32.c
31
index XXXXXXX..XXXXXXX 100644
90
index XXXXXXX..XXXXXXX 100644
32
--- a/target/arm/tcg/cpu32.c
91
--- a/target/arm/tcg/cpu32.c
33
+++ b/target/arm/tcg/cpu32.c
92
+++ b/target/arm/tcg/cpu32.c
34
@@ -XXX,XX +XXX,XX @@ void aa32_max_features(ARMCPU *cpu)
93
@@ -XXX,XX +XXX,XX @@ static const ARMCPUInfo arm_tcg_cpus[] = {
35
t = FIELD_DP32(t, ID_DFR0, PERFMON, 6); /* FEAT_PMUv3p5 */
94
{ .name = "ti925t", .initfn = ti925t_initfn },
36
cpu->isar.id_dfr0 = t;
95
{ .name = "sa1100", .initfn = sa1100_initfn },
37
96
{ .name = "sa1110", .initfn = sa1110_initfn },
38
+ /* Debug ID registers. */
97
- { .name = "pxa250", .initfn = pxa250_initfn },
39
+
98
- { .name = "pxa255", .initfn = pxa255_initfn },
40
+ /* Bit[15] is RES1, Bit[13] and Bits[11:0] are RES0. */
99
- { .name = "pxa260", .initfn = pxa260_initfn },
41
+ t = 0x00008000;
100
- { .name = "pxa261", .initfn = pxa261_initfn },
42
+ t = FIELD_DP32(t, DBGDIDR, SE_IMP, 1);
101
- { .name = "pxa262", .initfn = pxa262_initfn },
43
+ t = FIELD_DP32(t, DBGDIDR, NSUHD_IMP, 1);
102
+ { .name = "pxa250", .initfn = pxa250_initfn,
44
+ t = FIELD_DP32(t, DBGDIDR, VERSION, 6); /* Armv8 debug */
103
+ .deprecation_note = "iwMMXt CPUs are no longer supported", },
45
+ t = FIELD_DP32(t, DBGDIDR, CTX_CMPS, 1);
104
+ { .name = "pxa255", .initfn = pxa255_initfn,
46
+ t = FIELD_DP32(t, DBGDIDR, BRPS, 5);
105
+ .deprecation_note = "iwMMXt CPUs are no longer supported", },
47
+ t = FIELD_DP32(t, DBGDIDR, WRPS, 3);
106
+ { .name = "pxa260", .initfn = pxa260_initfn,
48
+ cpu->isar.dbgdidr = t;
107
+ .deprecation_note = "iwMMXt CPUs are no longer supported", },
49
+
108
+ { .name = "pxa261", .initfn = pxa261_initfn,
50
+ t = 0;
109
+ .deprecation_note = "iwMMXt CPUs are no longer supported", },
51
+ t = FIELD_DP32(t, DBGDEVID, PCSAMPLE, 3);
110
+ { .name = "pxa262", .initfn = pxa262_initfn,
52
+ t = FIELD_DP32(t, DBGDEVID, WPADDRMASK, 1);
111
+ .deprecation_note = "iwMMXt CPUs are no longer supported", },
53
+ t = FIELD_DP32(t, DBGDEVID, BPADDRMASK, 15);
112
/* "pxa270" is an alias for "pxa270-a0" */
54
+ t = FIELD_DP32(t, DBGDEVID, VECTORCATCH, 0);
113
- { .name = "pxa270", .initfn = pxa270a0_initfn },
55
+ t = FIELD_DP32(t, DBGDEVID, VIRTEXTNS, 1);
114
- { .name = "pxa270-a0", .initfn = pxa270a0_initfn },
56
+ t = FIELD_DP32(t, DBGDEVID, DOUBLELOCK, 1);
115
- { .name = "pxa270-a1", .initfn = pxa270a1_initfn },
57
+ t = FIELD_DP32(t, DBGDEVID, AUXREGS, 0);
116
- { .name = "pxa270-b0", .initfn = pxa270b0_initfn },
58
+ t = FIELD_DP32(t, DBGDEVID, CIDMASK, 0);
117
- { .name = "pxa270-b1", .initfn = pxa270b1_initfn },
59
+ cpu->isar.dbgdevid = t;
118
- { .name = "pxa270-c0", .initfn = pxa270c0_initfn },
60
+
119
- { .name = "pxa270-c5", .initfn = pxa270c5_initfn },
61
+ /* Bits[31:4] are RES0. */
120
+ { .name = "pxa270", .initfn = pxa270a0_initfn,
62
+ t = 0;
121
+ .deprecation_note = "iwMMXt CPUs are no longer supported", },
63
+ t = FIELD_DP32(t, DBGDEVID1, PCSROFFSET, 2);
122
+ { .name = "pxa270-a0", .initfn = pxa270a0_initfn,
64
+ cpu->isar.dbgdevid1 = t;
123
+ .deprecation_note = "iwMMXt CPUs are no longer supported", },
65
+
124
+ { .name = "pxa270-a1", .initfn = pxa270a1_initfn,
66
t = cpu->isar.id_dfr1;
125
+ .deprecation_note = "iwMMXt CPUs are no longer supported", },
67
t = FIELD_DP32(t, ID_DFR1, HPMN0, 1); /* FEAT_HPMN0 */
126
+ { .name = "pxa270-b0", .initfn = pxa270b0_initfn,
68
cpu->isar.id_dfr1 = t;
127
+ .deprecation_note = "iwMMXt CPUs are no longer supported", },
69
@@ -XXX,XX +XXX,XX @@ static void arm_max_initfn(Object *obj)
128
+ { .name = "pxa270-b1", .initfn = pxa270b1_initfn,
70
cpu->isar.id_isar4 = 0x00011142;
129
+ .deprecation_note = "iwMMXt CPUs are no longer supported", },
71
cpu->isar.id_isar5 = 0x00011121;
130
+ { .name = "pxa270-c0", .initfn = pxa270c0_initfn,
72
cpu->isar.id_isar6 = 0;
131
+ .deprecation_note = "iwMMXt CPUs are no longer supported", },
73
- cpu->isar.dbgdidr = 0x3516d000;
132
+ { .name = "pxa270-c5", .initfn = pxa270c5_initfn,
74
- cpu->isar.dbgdevid = 0x00110f13;
133
+ .deprecation_note = "iwMMXt CPUs are no longer supported", },
75
- cpu->isar.dbgdevid1 = 0x2;
134
#ifndef TARGET_AARCH64
76
cpu->isar.reset_pmcr_el0 = 0x41013000;
135
{ .name = "max", .initfn = arm_max_initfn },
77
cpu->clidr = 0x0a200023;
136
#endif
78
cpu->ccsidr[0] = 0x701fe00a; /* 32KB L1 dcache */
79
--
137
--
80
2.34.1
138
2.34.1
139
140
diff view generated by jsdifflib
1
From: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
1
The test-arm-iwmmmxt test isn't testing what it thinks it's testing.
2
2
3
The version of the sbsa-ref EDK2 firmware we used to use in this test
3
If you run it with a CPU type that supports iwMMXt then it will crash
4
had a bug where it might make an unaligned access to the framebuffer,
4
immediately with a SIGILL, because (even with -marm) GCC will link it
5
which causes a guest crash on newer versions of QEMU where we enforce
5
against startup code that is in Thumb mode, and no iwMMXt CPU has
6
the architectural requirement that unaligned accesses to Device memory
6
Thumb:
7
should take an exception.
8
7
9
We happened to not notice this because our test was booting with "-smp
8
00010338 <_start>:
10
1" and through luck this didn't write the boot logo to the framebuffer
9
10338: f04f 0b00 mov.w fp, #0
11
at an unaligned address; but trying to boot the same firmware with two
10
1033c: f04f 0e00 mov.w lr, #0
12
CPUs would result in a guest crash. Now we have updated the firmware
13
we're using for the test, we can make the test use all the cores on the
14
board, so we are testing the SMP boot path.
15
11
16
Signed-off-by: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
12
If you run it with a CPU type which does *not* support iwMMXt, which
13
is what 'make check-tcg' does, then QEMU will not try to handle the
14
insns as iwMMXt. Instead the translator turns them into illegal
15
instructions. Then in the linux-user cpu_loop() code we identify
16
them as FPA11 instructions inside emulate_arm_fpa11(), because the
17
FPA11 happened to use the same coprocessor number as these iwMMXt
18
insns. So we execute a completely different set of FPA11 insns,
19
which means we don't crash, but we will print garbage to stdout.
20
Then the test binary always exits with a 0 return code, so 'make
21
check-tcg' thinks the test passes.
22
23
Modern gnueabihf toolchains assume in their startup code that the CPU
24
is not so old as to not support Thumb, so there's no way to get them
25
to generate a binary that actually does what the test wants. Since
26
we're deprecating iwMMXt emulation anyway, it's not worth trying to
27
salvage the test case to get it to really test the iwMMXt insns.
28
29
Delete the test entirely.
30
31
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
32
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
17
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
33
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
18
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
34
Message-id: 20250127112715.2936555-3-peter.maydell@linaro.org
19
Message-id: 20240620-b4-new-firmware-v3-2-29a3a2f1be1e@linaro.org
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
21
---
35
---
22
tests/avocado/machine_aarch64_sbsaref.py | 2 --
36
tests/tcg/arm/Makefile.target | 7 -----
23
1 file changed, 2 deletions(-)
37
tests/tcg/arm/README | 5 ----
38
tests/tcg/arm/test-arm-iwmmxt.S | 49 ---------------------------------
39
3 files changed, 61 deletions(-)
40
delete mode 100644 tests/tcg/arm/test-arm-iwmmxt.S
24
41
25
diff --git a/tests/avocado/machine_aarch64_sbsaref.py b/tests/avocado/machine_aarch64_sbsaref.py
42
diff --git a/tests/tcg/arm/Makefile.target b/tests/tcg/arm/Makefile.target
26
index XXXXXXX..XXXXXXX 100644
43
index XXXXXXX..XXXXXXX 100644
27
--- a/tests/avocado/machine_aarch64_sbsaref.py
44
--- a/tests/tcg/arm/Makefile.target
28
+++ b/tests/avocado/machine_aarch64_sbsaref.py
45
+++ b/tests/tcg/arm/Makefile.target
29
@@ -XXX,XX +XXX,XX @@ def fetch_firmware(self):
46
@@ -XXX,XX +XXX,XX @@ ARM_TESTS = hello-arm
30
f"if=pflash,file={fs0_path},format=raw",
47
hello-arm: CFLAGS+=-marm -ffreestanding -fno-stack-protector
31
"-drive",
48
hello-arm: LDFLAGS+=-nostdlib
32
f"if=pflash,file={fs1_path},format=raw",
49
33
- "-smp",
50
-# IWMXT floating point extensions
34
- "1",
51
-ARM_TESTS += test-arm-iwmmxt
35
"-machine",
52
-# Clang assembler does not support IWMXT, so use the external assembler.
36
"sbsa-ref",
53
-test-arm-iwmmxt: CFLAGS += -marm -march=iwmmxt -mabi=aapcs -mfpu=fpv4-sp-d16 $(CROSS_CC_HAS_FNIA)
37
)
54
-test-arm-iwmmxt: test-arm-iwmmxt.S
55
-    $(CC) $(CFLAGS) -Wa,--noexecstack $< -o $@ $(LDFLAGS)
56
-
57
# Float-convert Tests
58
ARM_TESTS += fcvt
59
fcvt: LDFLAGS += -lm
60
diff --git a/tests/tcg/arm/README b/tests/tcg/arm/README
61
index XXXXXXX..XXXXXXX 100644
62
--- a/tests/tcg/arm/README
63
+++ b/tests/tcg/arm/README
64
@@ -XXX,XX +XXX,XX @@ hello-arm
65
---------
66
67
A very simple inline assembly, write syscall based hello world
68
-
69
-test-arm-iwmmxt
70
----------------
71
-
72
-A simple test case for older iwmmxt extended ARMs
73
diff --git a/tests/tcg/arm/test-arm-iwmmxt.S b/tests/tcg/arm/test-arm-iwmmxt.S
74
deleted file mode 100644
75
index XXXXXXX..XXXXXXX
76
--- a/tests/tcg/arm/test-arm-iwmmxt.S
77
+++ /dev/null
78
@@ -XXX,XX +XXX,XX @@
79
-@ Checks whether iwMMXt is functional.
80
-.code    32
81
-.globl    main
82
-
83
-main:
84
-ldr    r0, =data0
85
-ldr    r1, =data1
86
-ldr    r2, =data2
87
-#ifndef FPA
88
-wldrd    wr0, [r0, #0]
89
-wldrd    wr1, [r0, #8]
90
-wldrd    wr2, [r1, #0]
91
-wldrd    wr3, [r1, #8]
92
-wsubb    wr2, wr2, wr0
93
-wsubb    wr3, wr3, wr1
94
-wldrd    wr0, [r2, #0]
95
-wldrd    wr1, [r2, #8]
96
-waddb    wr0, wr0, wr2
97
-waddb    wr1, wr1, wr3
98
-wstrd    wr0, [r2, #0]
99
-wstrd    wr1, [r2, #8]
100
-#else
101
-ldfe    f0, [r0, #0]
102
-ldfe    f1, [r0, #8]
103
-ldfe    f2, [r1, #0]
104
-ldfe    f3, [r1, #8]
105
-adfdp    f2, f2, f0
106
-adfdp    f3, f3, f1
107
-ldfe    f0, [r2, #0]
108
-ldfe    f1, [r2, #8]
109
-adfd    f0, f0, f2
110
-adfd    f1, f1, f3
111
-stfe    f0, [r2, #0]
112
-stfe    f1, [r2, #8]
113
-#endif
114
-mov    r0, #1
115
-mov    r1, r2
116
-mov    r2, #0x11
117
-swi    #0x900004
118
-mov    r0, #0
119
-swi    #0x900001
120
-
121
-.data
122
-data0:
123
-.string    "aaaabbbbccccdddd"
124
-data1:
125
-.string    "bbbbccccddddeeee"
126
-data2:
127
-.string    "hvLLWs\x1fsdrs9\x1fNJ-\n"
38
--
128
--
39
2.34.1
129
2.34.1
40
130
41
131
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
We removed the old table-based decoder in favour of decodetree, but
2
we left a couple of typedefs that are now unused; delete them.
2
3
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20240625183536.1672454-11-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20250128135046.4108775-1-peter.maydell@linaro.org
7
---
7
---
8
target/arm/tcg/translate-a64.c | 52 +++++++++++++++++-----------------
8
target/arm/tcg/translate-a64.c | 11 -----------
9
1 file changed, 26 insertions(+), 26 deletions(-)
9
1 file changed, 11 deletions(-)
10
10
11
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
11
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/tcg/translate-a64.c
13
--- a/target/arm/tcg/translate-a64.c
14
+++ b/target/arm/tcg/translate-a64.c
14
+++ b/target/arm/tcg/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ TRANS(CMHS_s, do_cmop_d, a, TCG_COND_GEU)
15
@@ -XXX,XX +XXX,XX @@ static int scale_by_log2_tag_granule(DisasContext *s, int x)
16
TRANS(CMEQ_s, do_cmop_d, a, TCG_COND_EQ)
16
#include "decode-sme-fa64.c.inc"
17
TRANS(CMTST_s, do_cmop_d, a, TCG_COND_TSTNE)
17
#include "decode-a64.c.inc"
18
18
19
-static bool do_fp3_vector(DisasContext *s, arg_qrrr_e *a,
19
-/* Table based decoder typedefs - used when the relevant bits for decode
20
+static bool do_fp3_vector(DisasContext *s, arg_qrrr_e *a, int data,
20
- * are too awkwardly scattered across the instruction (eg SIMD).
21
gen_helper_gvec_3_ptr * const fns[3])
21
- */
22
{
22
-typedef void AArch64DecodeFn(DisasContext *s, uint32_t insn);
23
MemOp esz = a->esz;
23
-
24
@@ -XXX,XX +XXX,XX @@ static bool do_fp3_vector(DisasContext *s, arg_qrrr_e *a,
24
-typedef struct AArch64DecodeTable {
25
}
25
- uint32_t pattern;
26
if (fp_access_check(s)) {
26
- uint32_t mask;
27
gen_gvec_op3_fpst(s, a->q, a->rd, a->rn, a->rm,
27
- AArch64DecodeFn *disas_fn;
28
- esz == MO_16, 0, fns[esz - 1]);
28
-} AArch64DecodeTable;
29
+ esz == MO_16, data, fns[esz - 1]);
29
-
30
}
30
/* initialize TCG globals. */
31
return true;
31
void a64_translate_init(void)
32
}
33
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_3_ptr * const f_vector_fadd[3] = {
34
gen_helper_gvec_fadd_s,
35
gen_helper_gvec_fadd_d,
36
};
37
-TRANS(FADD_v, do_fp3_vector, a, f_vector_fadd)
38
+TRANS(FADD_v, do_fp3_vector, a, 0, f_vector_fadd)
39
40
static gen_helper_gvec_3_ptr * const f_vector_fsub[3] = {
41
gen_helper_gvec_fsub_h,
42
gen_helper_gvec_fsub_s,
43
gen_helper_gvec_fsub_d,
44
};
45
-TRANS(FSUB_v, do_fp3_vector, a, f_vector_fsub)
46
+TRANS(FSUB_v, do_fp3_vector, a, 0, f_vector_fsub)
47
48
static gen_helper_gvec_3_ptr * const f_vector_fdiv[3] = {
49
gen_helper_gvec_fdiv_h,
50
gen_helper_gvec_fdiv_s,
51
gen_helper_gvec_fdiv_d,
52
};
53
-TRANS(FDIV_v, do_fp3_vector, a, f_vector_fdiv)
54
+TRANS(FDIV_v, do_fp3_vector, a, 0, f_vector_fdiv)
55
56
static gen_helper_gvec_3_ptr * const f_vector_fmul[3] = {
57
gen_helper_gvec_fmul_h,
58
gen_helper_gvec_fmul_s,
59
gen_helper_gvec_fmul_d,
60
};
61
-TRANS(FMUL_v, do_fp3_vector, a, f_vector_fmul)
62
+TRANS(FMUL_v, do_fp3_vector, a, 0, f_vector_fmul)
63
64
static gen_helper_gvec_3_ptr * const f_vector_fmax[3] = {
65
gen_helper_gvec_fmax_h,
66
gen_helper_gvec_fmax_s,
67
gen_helper_gvec_fmax_d,
68
};
69
-TRANS(FMAX_v, do_fp3_vector, a, f_vector_fmax)
70
+TRANS(FMAX_v, do_fp3_vector, a, 0, f_vector_fmax)
71
72
static gen_helper_gvec_3_ptr * const f_vector_fmin[3] = {
73
gen_helper_gvec_fmin_h,
74
gen_helper_gvec_fmin_s,
75
gen_helper_gvec_fmin_d,
76
};
77
-TRANS(FMIN_v, do_fp3_vector, a, f_vector_fmin)
78
+TRANS(FMIN_v, do_fp3_vector, a, 0, f_vector_fmin)
79
80
static gen_helper_gvec_3_ptr * const f_vector_fmaxnm[3] = {
81
gen_helper_gvec_fmaxnum_h,
82
gen_helper_gvec_fmaxnum_s,
83
gen_helper_gvec_fmaxnum_d,
84
};
85
-TRANS(FMAXNM_v, do_fp3_vector, a, f_vector_fmaxnm)
86
+TRANS(FMAXNM_v, do_fp3_vector, a, 0, f_vector_fmaxnm)
87
88
static gen_helper_gvec_3_ptr * const f_vector_fminnm[3] = {
89
gen_helper_gvec_fminnum_h,
90
gen_helper_gvec_fminnum_s,
91
gen_helper_gvec_fminnum_d,
92
};
93
-TRANS(FMINNM_v, do_fp3_vector, a, f_vector_fminnm)
94
+TRANS(FMINNM_v, do_fp3_vector, a, 0, f_vector_fminnm)
95
96
static gen_helper_gvec_3_ptr * const f_vector_fmulx[3] = {
97
gen_helper_gvec_fmulx_h,
98
gen_helper_gvec_fmulx_s,
99
gen_helper_gvec_fmulx_d,
100
};
101
-TRANS(FMULX_v, do_fp3_vector, a, f_vector_fmulx)
102
+TRANS(FMULX_v, do_fp3_vector, a, 0, f_vector_fmulx)
103
104
static gen_helper_gvec_3_ptr * const f_vector_fmla[3] = {
105
gen_helper_gvec_vfma_h,
106
gen_helper_gvec_vfma_s,
107
gen_helper_gvec_vfma_d,
108
};
109
-TRANS(FMLA_v, do_fp3_vector, a, f_vector_fmla)
110
+TRANS(FMLA_v, do_fp3_vector, a, 0, f_vector_fmla)
111
112
static gen_helper_gvec_3_ptr * const f_vector_fmls[3] = {
113
gen_helper_gvec_vfms_h,
114
gen_helper_gvec_vfms_s,
115
gen_helper_gvec_vfms_d,
116
};
117
-TRANS(FMLS_v, do_fp3_vector, a, f_vector_fmls)
118
+TRANS(FMLS_v, do_fp3_vector, a, 0, f_vector_fmls)
119
120
static gen_helper_gvec_3_ptr * const f_vector_fcmeq[3] = {
121
gen_helper_gvec_fceq_h,
122
gen_helper_gvec_fceq_s,
123
gen_helper_gvec_fceq_d,
124
};
125
-TRANS(FCMEQ_v, do_fp3_vector, a, f_vector_fcmeq)
126
+TRANS(FCMEQ_v, do_fp3_vector, a, 0, f_vector_fcmeq)
127
128
static gen_helper_gvec_3_ptr * const f_vector_fcmge[3] = {
129
gen_helper_gvec_fcge_h,
130
gen_helper_gvec_fcge_s,
131
gen_helper_gvec_fcge_d,
132
};
133
-TRANS(FCMGE_v, do_fp3_vector, a, f_vector_fcmge)
134
+TRANS(FCMGE_v, do_fp3_vector, a, 0, f_vector_fcmge)
135
136
static gen_helper_gvec_3_ptr * const f_vector_fcmgt[3] = {
137
gen_helper_gvec_fcgt_h,
138
gen_helper_gvec_fcgt_s,
139
gen_helper_gvec_fcgt_d,
140
};
141
-TRANS(FCMGT_v, do_fp3_vector, a, f_vector_fcmgt)
142
+TRANS(FCMGT_v, do_fp3_vector, a, 0, f_vector_fcmgt)
143
144
static gen_helper_gvec_3_ptr * const f_vector_facge[3] = {
145
gen_helper_gvec_facge_h,
146
gen_helper_gvec_facge_s,
147
gen_helper_gvec_facge_d,
148
};
149
-TRANS(FACGE_v, do_fp3_vector, a, f_vector_facge)
150
+TRANS(FACGE_v, do_fp3_vector, a, 0, f_vector_facge)
151
152
static gen_helper_gvec_3_ptr * const f_vector_facgt[3] = {
153
gen_helper_gvec_facgt_h,
154
gen_helper_gvec_facgt_s,
155
gen_helper_gvec_facgt_d,
156
};
157
-TRANS(FACGT_v, do_fp3_vector, a, f_vector_facgt)
158
+TRANS(FACGT_v, do_fp3_vector, a, 0, f_vector_facgt)
159
160
static gen_helper_gvec_3_ptr * const f_vector_fabd[3] = {
161
gen_helper_gvec_fabd_h,
162
gen_helper_gvec_fabd_s,
163
gen_helper_gvec_fabd_d,
164
};
165
-TRANS(FABD_v, do_fp3_vector, a, f_vector_fabd)
166
+TRANS(FABD_v, do_fp3_vector, a, 0, f_vector_fabd)
167
168
static gen_helper_gvec_3_ptr * const f_vector_frecps[3] = {
169
gen_helper_gvec_recps_h,
170
gen_helper_gvec_recps_s,
171
gen_helper_gvec_recps_d,
172
};
173
-TRANS(FRECPS_v, do_fp3_vector, a, f_vector_frecps)
174
+TRANS(FRECPS_v, do_fp3_vector, a, 0, f_vector_frecps)
175
176
static gen_helper_gvec_3_ptr * const f_vector_frsqrts[3] = {
177
gen_helper_gvec_rsqrts_h,
178
gen_helper_gvec_rsqrts_s,
179
gen_helper_gvec_rsqrts_d,
180
};
181
-TRANS(FRSQRTS_v, do_fp3_vector, a, f_vector_frsqrts)
182
+TRANS(FRSQRTS_v, do_fp3_vector, a, 0, f_vector_frsqrts)
183
184
static gen_helper_gvec_3_ptr * const f_vector_faddp[3] = {
185
gen_helper_gvec_faddp_h,
186
gen_helper_gvec_faddp_s,
187
gen_helper_gvec_faddp_d,
188
};
189
-TRANS(FADDP_v, do_fp3_vector, a, f_vector_faddp)
190
+TRANS(FADDP_v, do_fp3_vector, a, 0, f_vector_faddp)
191
192
static gen_helper_gvec_3_ptr * const f_vector_fmaxp[3] = {
193
gen_helper_gvec_fmaxp_h,
194
gen_helper_gvec_fmaxp_s,
195
gen_helper_gvec_fmaxp_d,
196
};
197
-TRANS(FMAXP_v, do_fp3_vector, a, f_vector_fmaxp)
198
+TRANS(FMAXP_v, do_fp3_vector, a, 0, f_vector_fmaxp)
199
200
static gen_helper_gvec_3_ptr * const f_vector_fminp[3] = {
201
gen_helper_gvec_fminp_h,
202
gen_helper_gvec_fminp_s,
203
gen_helper_gvec_fminp_d,
204
};
205
-TRANS(FMINP_v, do_fp3_vector, a, f_vector_fminp)
206
+TRANS(FMINP_v, do_fp3_vector, a, 0, f_vector_fminp)
207
208
static gen_helper_gvec_3_ptr * const f_vector_fmaxnmp[3] = {
209
gen_helper_gvec_fmaxnump_h,
210
gen_helper_gvec_fmaxnump_s,
211
gen_helper_gvec_fmaxnump_d,
212
};
213
-TRANS(FMAXNMP_v, do_fp3_vector, a, f_vector_fmaxnmp)
214
+TRANS(FMAXNMP_v, do_fp3_vector, a, 0, f_vector_fmaxnmp)
215
216
static gen_helper_gvec_3_ptr * const f_vector_fminnmp[3] = {
217
gen_helper_gvec_fminnump_h,
218
gen_helper_gvec_fminnump_s,
219
gen_helper_gvec_fminnump_d,
220
};
221
-TRANS(FMINNMP_v, do_fp3_vector, a, f_vector_fminnmp)
222
+TRANS(FMINNMP_v, do_fp3_vector, a, 0, f_vector_fminnmp)
223
224
static bool do_fmlal(DisasContext *s, arg_qrrr_e *a, bool is_s, bool is_2)
225
{
32
{
226
--
33
--
227
2.34.1
34
2.34.1
diff view generated by jsdifflib
1
From: Inès Varhol <ines.varhol@telecom-paris.fr>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
The QTest `test_irq_pin_multiplexer` makes the assumption that the
3
In heterogeneous setup the first vCPU might not be
4
reset state of irq line 15 is low, which is false since STM32L4x5 GPIO
4
the one expected, better pass it explicitly.
5
was implemented (the reset state of pin GPIOA15 is high because there's
6
pull-up and it results in the irq line 15 also being high at reset).
7
5
8
It wasn't triggering an error because `test_interrupt` was mistakenly
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
"resetting" the line low.
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
10
8
Message-id: 20250130112615.3219-2-philmd@linaro.org
11
This commit corrects these two mistakes by :
12
- not setting the line low in `test_interrupt`
13
- using an irq line in `test_irq_pin_multiplexer` which is low at reset
14
15
Signed-off-by: Inès Varhol <ines.varhol@telecom-paris.fr>
16
Message-id: 20240629104454.366283-1-ines.varhol@telecom-paris.fr
17
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
---
10
---
20
tests/qtest/stm32l4x5_syscfg-test.c | 14 +++++++-------
11
include/hw/arm/boot.h | 4 +++-
21
1 file changed, 7 insertions(+), 7 deletions(-)
12
hw/arm/boot.c | 11 ++++++-----
13
hw/arm/virt.c | 2 +-
14
3 files changed, 10 insertions(+), 7 deletions(-)
22
15
23
diff --git a/tests/qtest/stm32l4x5_syscfg-test.c b/tests/qtest/stm32l4x5_syscfg-test.c
16
diff --git a/include/hw/arm/boot.h b/include/hw/arm/boot.h
24
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
25
--- a/tests/qtest/stm32l4x5_syscfg-test.c
18
--- a/include/hw/arm/boot.h
26
+++ b/tests/qtest/stm32l4x5_syscfg-test.c
19
+++ b/include/hw/arm/boot.h
27
@@ -XXX,XX +XXX,XX @@ static void test_interrupt(void)
20
@@ -XXX,XX +XXX,XX @@ AddressSpace *arm_boot_address_space(ARMCPU *cpu,
28
/* Clean the test */
21
* @binfo: struct describing the boot environment
29
syscfg_writel(SYSCFG_EXTICR1, 0x00000000);
22
* @addr_limit: upper limit of the available memory area at @addr
30
syscfg_set_irq(0, 0);
23
* @as: address space to load image to
31
- syscfg_set_irq(15, 0);
24
+ * @cpu: ARM CPU object
32
+ /* irq 15 is high at reset because GPIOA15 is high at reset */
25
*
33
syscfg_set_irq(17, 0);
26
* Load a device tree supplied by the machine or by the user with the
27
* '-dtb' command line option, and put it at offset @addr in target
28
@@ -XXX,XX +XXX,XX @@ AddressSpace *arm_boot_address_space(ARMCPU *cpu,
29
* Note: Must not be called unless have_dtb(binfo) is true.
30
*/
31
int arm_load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
32
- hwaddr addr_limit, AddressSpace *as, MachineState *ms);
33
+ hwaddr addr_limit, AddressSpace *as, MachineState *ms,
34
+ ARMCPU *cpu);
35
36
/* Write a secure board setup routine with a dummy handler for SMCs */
37
void arm_write_secure_board_setup_dummy_smc(ARMCPU *cpu,
38
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/hw/arm/boot.c
41
+++ b/hw/arm/boot.c
42
@@ -XXX,XX +XXX,XX @@ out:
43
return ret;
34
}
44
}
35
45
36
@@ -XXX,XX +XXX,XX @@ static void test_irq_pin_multiplexer(void)
46
-static void fdt_add_psci_node(void *fdt)
37
47
+static void fdt_add_psci_node(void *fdt, ARMCPU *armcpu)
38
syscfg_set_irq(0, 1);
48
{
39
49
uint32_t cpu_suspend_fn;
40
- /* Check that irq 0 was set and irq 15 wasn't */
50
uint32_t cpu_off_fn;
41
+ /* Check that irq 0 was set and irq 2 wasn't */
51
uint32_t cpu_on_fn;
42
g_assert_true(get_irq(0));
52
uint32_t migrate_fn;
43
- g_assert_false(get_irq(15));
53
- ARMCPU *armcpu = ARM_CPU(qemu_get_cpu(0));
44
+ g_assert_false(get_irq(2));
54
const char *psci_method;
45
55
int64_t psci_conduit;
46
/* Clean the test */
56
int rc;
47
syscfg_set_irq(0, 0);
57
@@ -XXX,XX +XXX,XX @@ static void fdt_add_psci_node(void *fdt)
48
49
- syscfg_set_irq(15, 1);
50
+ syscfg_set_irq(2, 1);
51
52
- /* Check that irq 15 was set and irq 0 wasn't */
53
- g_assert_true(get_irq(15));
54
+ /* Check that irq 2 was set and irq 0 wasn't */
55
+ g_assert_true(get_irq(2));
56
g_assert_false(get_irq(0));
57
58
/* Clean the test */
59
- syscfg_set_irq(15, 0);
60
+ syscfg_set_irq(2, 0);
61
}
58
}
62
59
63
static void test_irq_gpio_multiplexer(void)
60
int arm_load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
61
- hwaddr addr_limit, AddressSpace *as, MachineState *ms)
62
+ hwaddr addr_limit, AddressSpace *as, MachineState *ms,
63
+ ARMCPU *cpu)
64
{
65
void *fdt = NULL;
66
int size, rc, n = 0;
67
@@ -XXX,XX +XXX,XX @@ int arm_load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
68
}
69
}
70
71
- fdt_add_psci_node(fdt);
72
+ fdt_add_psci_node(fdt, cpu);
73
74
if (binfo->modify_dtb) {
75
binfo->modify_dtb(binfo, fdt);
76
@@ -XXX,XX +XXX,XX @@ void arm_load_kernel(ARMCPU *cpu, MachineState *ms, struct arm_boot_info *info)
77
* decided whether to enable PSCI and set the psci-conduit CPU properties.
78
*/
79
if (!info->skip_dtb_autoload && have_dtb(info)) {
80
- if (arm_load_dtb(info->dtb_start, info, info->dtb_limit, as, ms) < 0) {
81
+ if (arm_load_dtb(info->dtb_start, info, info->dtb_limit,
82
+ as, ms, cpu) < 0) {
83
exit(1);
84
}
85
}
86
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
87
index XXXXXXX..XXXXXXX 100644
88
--- a/hw/arm/virt.c
89
+++ b/hw/arm/virt.c
90
@@ -XXX,XX +XXX,XX @@ void virt_machine_done(Notifier *notifier, void *data)
91
vms->memmap[VIRT_PLATFORM_BUS].size,
92
vms->irqmap[VIRT_PLATFORM_BUS]);
93
}
94
- if (arm_load_dtb(info->dtb_start, info, info->dtb_limit, as, ms) < 0) {
95
+ if (arm_load_dtb(info->dtb_start, info, info->dtb_limit, as, ms, cpu) < 0) {
96
exit(1);
97
}
98
64
--
99
--
65
2.34.1
100
2.34.1
66
101
67
102
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
3
The A9MPCore forward the IRQs from its internal GIC.
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
To make the code clearer, add the 'mpcore' and 'gic'
5
Message-id: 20240625183536.1672454-6-richard.henderson@linaro.org
5
variables.
6
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
Message-id: 20250130112615.3219-3-philmd@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
11
---
8
target/arm/tcg/a64.decode | 7 +++++
12
hw/arm/fsl-imx6.c | 52 +++++++++++++++++++----------------------------
9
target/arm/tcg/translate-a64.c | 54 ++++++++++++++++++----------------
13
1 file changed, 21 insertions(+), 31 deletions(-)
10
2 files changed, 35 insertions(+), 26 deletions(-)
11
14
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
15
diff --git a/hw/arm/fsl-imx6.c b/hw/arm/fsl-imx6.c
13
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/tcg/a64.decode
17
--- a/hw/arm/fsl-imx6.c
15
+++ b/target/arm/tcg/a64.decode
18
+++ b/hw/arm/fsl-imx6.c
16
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
17
20
uint16_t i;
18
@qrrr_b . q:1 ...... ... rm:5 ...... rn:5 rd:5 &qrrr_e esz=0
21
qemu_irq irq;
19
@qrrr_h . q:1 ...... ... rm:5 ...... rn:5 rd:5 &qrrr_e esz=1
22
unsigned int smp_cpus = ms->smp.cpus;
20
+@qrrr_s . q:1 ...... ... rm:5 ...... rn:5 rd:5 &qrrr_e esz=2
23
+ DeviceState *mpcore = DEVICE(&s->a9mpcore);
21
@qrrr_sd . q:1 ...... ... rm:5 ...... rn:5 rd:5 &qrrr_e esz=%esz_sd
24
+ DeviceState *gic;
22
@qrrr_e . q:1 ...... esz:2 . rm:5 ...... rn:5 rd:5 &qrrr_e
25
23
@qr2r_e . q:1 ...... esz:2 . ..... ...... rm:5 rd:5 &qrrr_e rn=%rd
26
if (smp_cpus > FSL_IMX6_NUM_CPUS) {
24
@@ -XXX,XX +XXX,XX @@ SQRDMULH_v 0.10 1110 ..1 ..... 10110 1 ..... ..... @qrrr_e
27
error_setg(errp, "%s: Only %d CPUs are supported (%d requested)",
25
SQRDMLAH_v 0.10 1110 ..0 ..... 10000 1 ..... ..... @qrrr_e
28
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
26
SQRDMLSH_v 0.10 1110 ..0 ..... 10001 1 ..... ..... @qrrr_e
27
28
+SDOT_v 0.00 1110 100 ..... 10010 1 ..... ..... @qrrr_s
29
+UDOT_v 0.10 1110 100 ..... 10010 1 ..... ..... @qrrr_s
30
+
31
### Advanced SIMD scalar x indexed element
32
33
FMUL_si 0101 1111 00 .. .... 1001 . 0 ..... ..... @rrx_h
34
@@ -XXX,XX +XXX,XX @@ SQRDMLAH_vi 0.10 1111 10 .. .... 1101 . 0 ..... ..... @qrrx_s
35
SQRDMLSH_vi 0.10 1111 01 .. .... 1111 . 0 ..... ..... @qrrx_h
36
SQRDMLSH_vi 0.10 1111 10 .. .... 1111 . 0 ..... ..... @qrrx_s
37
38
+SDOT_vi 0.00 1111 10 .. .... 1110 . 0 ..... ..... @qrrx_s
39
+UDOT_vi 0.10 1111 10 .. .... 1110 . 0 ..... ..... @qrrx_s
40
+
41
# Floating-point conditional select
42
43
FCSEL 0001 1110 .. 1 rm:5 cond:4 11 rn:5 rd:5 esz=%esz_hsd
44
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/target/arm/tcg/translate-a64.c
47
+++ b/target/arm/tcg/translate-a64.c
48
@@ -XXX,XX +XXX,XX @@ TRANS(SQRDMULH_v, do_gvec_fn3_no8_no64, a, gen_gvec_sqrdmulh_qc)
49
TRANS_FEAT(SQRDMLAH_v, aa64_rdm, do_gvec_fn3_no8_no64, a, gen_gvec_sqrdmlah_qc)
50
TRANS_FEAT(SQRDMLSH_v, aa64_rdm, do_gvec_fn3_no8_no64, a, gen_gvec_sqrdmlsh_qc)
51
52
+static bool do_dot_vector(DisasContext *s, arg_qrrr_e *a,
53
+ gen_helper_gvec_4 *fn)
54
+{
55
+ if (fp_access_check(s)) {
56
+ gen_gvec_op4_ool(s, a->q, a->rd, a->rn, a->rm, a->rd, 0, fn);
57
+ }
58
+ return true;
59
+}
60
+
61
+TRANS_FEAT(SDOT_v, aa64_dp, do_dot_vector, a, gen_helper_gvec_sdot_b)
62
+TRANS_FEAT(UDOT_v, aa64_dp, do_dot_vector, a, gen_helper_gvec_udot_b)
63
+
64
/*
65
* Advanced SIMD scalar/vector x indexed element
66
*/
67
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_4 * const f_vector_idx_sqrdmlsh[2] = {
68
TRANS_FEAT(SQRDMLSH_vi, aa64_rdm, do_int3_qc_vector_idx, a,
69
f_vector_idx_sqrdmlsh)
70
71
+static bool do_dot_vector_idx(DisasContext *s, arg_qrrx_e *a,
72
+ gen_helper_gvec_4 *fn)
73
+{
74
+ if (fp_access_check(s)) {
75
+ gen_gvec_op4_ool(s, a->q, a->rd, a->rn, a->rm, a->rd, a->idx, fn);
76
+ }
77
+ return true;
78
+}
79
+
80
+TRANS_FEAT(SDOT_vi, aa64_dp, do_dot_vector_idx, a, gen_helper_gvec_sdot_idx_b)
81
+TRANS_FEAT(UDOT_vi, aa64_dp, do_dot_vector_idx, a, gen_helper_gvec_udot_idx_b)
82
+
83
/*
84
* Advanced SIMD scalar pairwise
85
*/
86
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
87
int rot;
88
89
switch (u * 16 + opcode) {
90
- case 0x02: /* SDOT (vector) */
91
- case 0x12: /* UDOT (vector) */
92
- if (size != MO_32) {
93
- unallocated_encoding(s);
94
- return;
95
- }
96
- feature = dc_isar_feature(aa64_dp, s);
97
- break;
98
case 0x03: /* USDOT */
99
if (size != MO_32) {
100
unallocated_encoding(s);
101
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
102
}
29
}
103
break;
30
}
104
default:
31
105
+ case 0x02: /* SDOT (vector) */
32
- object_property_set_int(OBJECT(&s->a9mpcore), "num-cpu", smp_cpus,
106
case 0x10: /* SQRDMLAH (vector) */
33
- &error_abort);
107
case 0x11: /* SQRDMLSH (vector) */
34
+ object_property_set_int(OBJECT(mpcore), "num-cpu", smp_cpus, &error_abort);
108
+ case 0x12: /* UDOT (vector) */
35
109
unallocated_encoding(s);
36
- object_property_set_int(OBJECT(&s->a9mpcore), "num-irq",
37
+ object_property_set_int(OBJECT(mpcore), "num-irq",
38
FSL_IMX6_MAX_IRQ + GIC_INTERNAL, &error_abort);
39
40
- if (!sysbus_realize(SYS_BUS_DEVICE(&s->a9mpcore), errp)) {
41
+ if (!sysbus_realize(SYS_BUS_DEVICE(mpcore), errp)) {
110
return;
42
return;
111
}
43
}
112
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
44
- sysbus_mmio_map(SYS_BUS_DEVICE(&s->a9mpcore), 0, FSL_IMX6_A9MPCORE_ADDR);
45
+ sysbus_mmio_map(SYS_BUS_DEVICE(mpcore), 0, FSL_IMX6_A9MPCORE_ADDR);
46
47
+ gic = mpcore;
48
for (i = 0; i < smp_cpus; i++) {
49
- sysbus_connect_irq(SYS_BUS_DEVICE(&s->a9mpcore), i,
50
+ sysbus_connect_irq(SYS_BUS_DEVICE(gic), i,
51
qdev_get_gpio_in(DEVICE(&s->cpu[i]), ARM_CPU_IRQ));
52
- sysbus_connect_irq(SYS_BUS_DEVICE(&s->a9mpcore), i + smp_cpus,
53
+ sysbus_connect_irq(SYS_BUS_DEVICE(gic), i + smp_cpus,
54
qdev_get_gpio_in(DEVICE(&s->cpu[i]), ARM_CPU_FIQ));
113
}
55
}
114
56
115
switch (opcode) {
57
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
116
- case 0x2: /* SDOT / UDOT */
58
117
- gen_gvec_op4_ool(s, is_q, rd, rn, rm, rd, 0,
59
sysbus_mmio_map(SYS_BUS_DEVICE(&s->uart[i]), 0, serial_table[i].addr);
118
- u ? gen_helper_gvec_udot_b : gen_helper_gvec_sdot_b);
60
sysbus_connect_irq(SYS_BUS_DEVICE(&s->uart[i]), 0,
119
- return;
61
- qdev_get_gpio_in(DEVICE(&s->a9mpcore),
120
-
62
- serial_table[i].irq));
121
case 0x3: /* USDOT */
63
+ qdev_get_gpio_in(gic, serial_table[i].irq));
122
gen_gvec_op4_ool(s, is_q, rd, rn, rm, rd, 0, gen_helper_gvec_usdot_b);
123
return;
124
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
125
case 0x0b: /* SQDMULL, SQDMULL2 */
126
is_long = true;
127
break;
128
- case 0x0e: /* SDOT */
129
- case 0x1e: /* UDOT */
130
- if (is_scalar || size != MO_32 || !dc_isar_feature(aa64_dp, s)) {
131
- unallocated_encoding(s);
132
- return;
133
- }
134
- break;
135
case 0x0f:
136
switch (size) {
137
case 0: /* SUDOT */
138
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
139
case 0x09: /* FMUL */
140
case 0x0c: /* SQDMULH */
141
case 0x0d: /* SQRDMULH */
142
+ case 0x0e: /* SDOT */
143
case 0x10: /* MLA */
144
case 0x14: /* MLS */
145
case 0x18: /* FMLAL2 */
146
case 0x19: /* FMULX */
147
case 0x1c: /* FMLSL2 */
148
case 0x1d: /* SQRDMLAH */
149
+ case 0x1e: /* UDOT */
150
case 0x1f: /* SQRDMLSH */
151
unallocated_encoding(s);
152
return;
153
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
154
}
64
}
155
65
156
switch (16 * u + opcode) {
66
s->gpt.ccm = IMX_CCM(&s->ccm);
157
- case 0x0e: /* SDOT */
67
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
158
- case 0x1e: /* UDOT */
68
159
- gen_gvec_op4_ool(s, is_q, rd, rn, rm, rd, index,
69
sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpt), 0, FSL_IMX6_GPT_ADDR);
160
- u ? gen_helper_gvec_udot_idx_b
70
sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpt), 0,
161
- : gen_helper_gvec_sdot_idx_b);
71
- qdev_get_gpio_in(DEVICE(&s->a9mpcore),
162
- return;
72
- FSL_IMX6_GPT_IRQ));
163
case 0x0f:
73
+ qdev_get_gpio_in(gic, FSL_IMX6_GPT_IRQ));
164
switch (extract32(insn, 22, 2)) {
74
165
case 0: /* SUDOT */
75
/* Initialize all EPIT timers */
76
for (i = 0; i < FSL_IMX6_NUM_EPITS; i++) {
77
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
78
79
sysbus_mmio_map(SYS_BUS_DEVICE(&s->epit[i]), 0, epit_table[i].addr);
80
sysbus_connect_irq(SYS_BUS_DEVICE(&s->epit[i]), 0,
81
- qdev_get_gpio_in(DEVICE(&s->a9mpcore),
82
- epit_table[i].irq));
83
+ qdev_get_gpio_in(gic, epit_table[i].irq));
84
}
85
86
/* Initialize all I2C */
87
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
88
89
sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c[i]), 0, i2c_table[i].addr);
90
sysbus_connect_irq(SYS_BUS_DEVICE(&s->i2c[i]), 0,
91
- qdev_get_gpio_in(DEVICE(&s->a9mpcore),
92
- i2c_table[i].irq));
93
+ qdev_get_gpio_in(gic, i2c_table[i].irq));
94
}
95
96
/* Initialize all GPIOs */
97
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
98
99
sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio[i]), 0, gpio_table[i].addr);
100
sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio[i]), 0,
101
- qdev_get_gpio_in(DEVICE(&s->a9mpcore),
102
- gpio_table[i].irq_low));
103
+ qdev_get_gpio_in(gic, gpio_table[i].irq_low));
104
sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio[i]), 1,
105
- qdev_get_gpio_in(DEVICE(&s->a9mpcore),
106
- gpio_table[i].irq_high));
107
+ qdev_get_gpio_in(gic, gpio_table[i].irq_high));
108
}
109
110
/* Initialize all SDHC */
111
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
112
}
113
sysbus_mmio_map(SYS_BUS_DEVICE(&s->esdhc[i]), 0, esdhc_table[i].addr);
114
sysbus_connect_irq(SYS_BUS_DEVICE(&s->esdhc[i]), 0,
115
- qdev_get_gpio_in(DEVICE(&s->a9mpcore),
116
- esdhc_table[i].irq));
117
+ qdev_get_gpio_in(gic, esdhc_table[i].irq));
118
}
119
120
/* USB */
121
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
122
sysbus_mmio_map(SYS_BUS_DEVICE(&s->usb[i]), 0,
123
FSL_IMX6_USBOH3_USB_ADDR + i * 0x200);
124
sysbus_connect_irq(SYS_BUS_DEVICE(&s->usb[i]), 0,
125
- qdev_get_gpio_in(DEVICE(&s->a9mpcore),
126
- FSL_IMX6_USBn_IRQ[i]));
127
+ qdev_get_gpio_in(gic, FSL_IMX6_USBn_IRQ[i]));
128
}
129
130
/* Initialize all ECSPI */
131
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
132
133
sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 0, spi_table[i].addr);
134
sysbus_connect_irq(SYS_BUS_DEVICE(&s->spi[i]), 0,
135
- qdev_get_gpio_in(DEVICE(&s->a9mpcore),
136
- spi_table[i].irq));
137
+ qdev_get_gpio_in(gic, spi_table[i].irq));
138
}
139
140
object_property_set_uint(OBJECT(&s->eth), "phy-num", s->phy_num,
141
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
142
}
143
sysbus_mmio_map(SYS_BUS_DEVICE(&s->eth), 0, FSL_IMX6_ENET_ADDR);
144
sysbus_connect_irq(SYS_BUS_DEVICE(&s->eth), 0,
145
- qdev_get_gpio_in(DEVICE(&s->a9mpcore),
146
- FSL_IMX6_ENET_MAC_IRQ));
147
+ qdev_get_gpio_in(gic, FSL_IMX6_ENET_MAC_IRQ));
148
sysbus_connect_irq(SYS_BUS_DEVICE(&s->eth), 1,
149
- qdev_get_gpio_in(DEVICE(&s->a9mpcore),
150
- FSL_IMX6_ENET_MAC_1588_IRQ));
151
+ qdev_get_gpio_in(gic, FSL_IMX6_ENET_MAC_1588_IRQ));
152
153
/*
154
* SNVS
155
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
156
157
sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0, FSL_IMX6_WDOGn_ADDR[i]);
158
sysbus_connect_irq(SYS_BUS_DEVICE(&s->wdt[i]), 0,
159
- qdev_get_gpio_in(DEVICE(&s->a9mpcore),
160
- FSL_IMX6_WDOGn_IRQ[i]));
161
+ qdev_get_gpio_in(gic, FSL_IMX6_WDOGn_IRQ[i]));
162
}
163
164
/*
166
--
165
--
167
2.34.1
166
2.34.1
167
168
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
The A7MPCore forward the IRQs from its internal GIC.
4
Message-id: 20240625183536.1672454-13-richard.henderson@linaro.org
4
To make the code clearer, add the 'mpcore' and 'gic'
5
variables. Rename 'd' variable as 'cpu'.
6
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
Message-id: 20250130112615.3219-4-philmd@linaro.org
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
---
11
---
8
target/arm/tcg/a64.decode | 6 +
12
hw/arm/fsl-imx6ul.c | 64 +++++++++++++++++++--------------------------
9
target/arm/tcg/translate-a64.c | 238 ++++++++++-----------------------
13
1 file changed, 27 insertions(+), 37 deletions(-)
10
2 files changed, 74 insertions(+), 170 deletions(-)
11
14
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
15
diff --git a/hw/arm/fsl-imx6ul.c b/hw/arm/fsl-imx6ul.c
13
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/tcg/a64.decode
17
--- a/hw/arm/fsl-imx6ul.c
15
+++ b/target/arm/tcg/a64.decode
18
+++ b/hw/arm/fsl-imx6ul.c
16
@@ -XXX,XX +XXX,XX @@ USMMLA 0100 1110 100 ..... 10101 1 ..... ..... @rrr_q1e0
19
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
17
FCADD_90 0.10 1110 ..0 ..... 11100 1 ..... ..... @qrrr_e
20
{
18
FCADD_270 0.10 1110 ..0 ..... 11110 1 ..... ..... @qrrr_e
21
MachineState *ms = MACHINE(qdev_get_machine());
19
22
FslIMX6ULState *s = FSL_IMX6UL(dev);
20
+FCMLA_v 0 q:1 10 1110 esz:2 0 rm:5 110 rot:2 1 rn:5 rd:5
23
+ DeviceState *mpcore = DEVICE(&s->a7mpcore);
21
+
24
int i;
22
### Advanced SIMD scalar x indexed element
25
char name[NAME_SIZE];
23
26
- SysBusDevice *sbd;
24
FMUL_si 0101 1111 00 .. .... 1001 . 0 ..... ..... @rrx_h
27
- DeviceState *d;
25
@@ -XXX,XX +XXX,XX @@ USDOT_vi 0.00 1111 10 .. .... 1111 . 0 ..... ..... @qrrx_s
28
+ DeviceState *gic;
26
BFDOT_vi 0.00 1111 01 .. .... 1111 . 0 ..... ..... @qrrx_s
29
+ SysBusDevice *gicsbd;
27
BFMLAL_vi 0.00 1111 11 .. .... 1111 . 0 ..... ..... @qrrx_h
30
+ DeviceState *cpu;
28
31
29
+FCMLA_vi 0 0 10 1111 01 idx:1 rm:5 0 rot:2 1 0 0 rn:5 rd:5 esz=1 q=0
32
if (ms->smp.cpus > 1) {
30
+FCMLA_vi 0 1 10 1111 01 . rm:5 0 rot:2 1 . 0 rn:5 rd:5 esz=1 idx=%hl q=1
33
error_setg(errp, "%s: Only a single CPU is supported (%d requested)",
31
+FCMLA_vi 0 1 10 1111 10 0 rm:5 0 rot:2 1 idx:1 0 rn:5 rd:5 esz=2 q=1
34
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
32
+
35
/*
33
# Floating-point conditional select
36
* A7MPCORE
34
37
*/
35
FCSEL 0001 1110 .. 1 rm:5 cond:4 11 rn:5 rd:5 esz=%esz_hsd
38
- object_property_set_int(OBJECT(&s->a7mpcore), "num-cpu", 1, &error_abort);
36
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
39
- object_property_set_int(OBJECT(&s->a7mpcore), "num-irq",
37
index XXXXXXX..XXXXXXX 100644
40
+ object_property_set_int(OBJECT(mpcore), "num-cpu", 1, &error_abort);
38
--- a/target/arm/tcg/translate-a64.c
41
+ object_property_set_int(OBJECT(mpcore), "num-irq",
39
+++ b/target/arm/tcg/translate-a64.c
42
FSL_IMX6UL_MAX_IRQ + GIC_INTERNAL, &error_abort);
40
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_3_ptr * const f_vector_fcadd[3] = {
43
- sysbus_realize(SYS_BUS_DEVICE(&s->a7mpcore), &error_abort);
41
TRANS_FEAT(FCADD_90, aa64_fcma, do_fp3_vector, a, 0, f_vector_fcadd)
44
- sysbus_mmio_map(SYS_BUS_DEVICE(&s->a7mpcore), 0, FSL_IMX6UL_A7MPCORE_ADDR);
42
TRANS_FEAT(FCADD_270, aa64_fcma, do_fp3_vector, a, 1, f_vector_fcadd)
45
+ sysbus_realize(SYS_BUS_DEVICE(mpcore), &error_abort);
43
46
+ sysbus_mmio_map(SYS_BUS_DEVICE(mpcore), 0, FSL_IMX6UL_A7MPCORE_ADDR);
44
+static bool trans_FCMLA_v(DisasContext *s, arg_FCMLA_v *a)
47
45
+{
48
- sbd = SYS_BUS_DEVICE(&s->a7mpcore);
46
+ gen_helper_gvec_4_ptr *fn;
49
- d = DEVICE(&s->cpu);
47
+
50
-
48
+ if (!dc_isar_feature(aa64_fcma, s)) {
51
- sysbus_connect_irq(sbd, 0, qdev_get_gpio_in(d, ARM_CPU_IRQ));
49
+ return false;
52
- sysbus_connect_irq(sbd, 1, qdev_get_gpio_in(d, ARM_CPU_FIQ));
50
+ }
53
- sysbus_connect_irq(sbd, 2, qdev_get_gpio_in(d, ARM_CPU_VIRQ));
51
+ switch (a->esz) {
54
- sysbus_connect_irq(sbd, 3, qdev_get_gpio_in(d, ARM_CPU_VFIQ));
52
+ case MO_64:
55
+ gic = mpcore;
53
+ if (!a->q) {
56
+ gicsbd = SYS_BUS_DEVICE(gic);
54
+ return false;
57
+ cpu = DEVICE(&s->cpu);
55
+ }
58
+ sysbus_connect_irq(gicsbd, 0, qdev_get_gpio_in(cpu, ARM_CPU_IRQ));
56
+ fn = gen_helper_gvec_fcmlad;
59
+ sysbus_connect_irq(gicsbd, 1, qdev_get_gpio_in(cpu, ARM_CPU_FIQ));
57
+ break;
60
+ sysbus_connect_irq(gicsbd, 2, qdev_get_gpio_in(cpu, ARM_CPU_VIRQ));
58
+ case MO_32:
61
+ sysbus_connect_irq(gicsbd, 3, qdev_get_gpio_in(cpu, ARM_CPU_VFIQ));
59
+ fn = gen_helper_gvec_fcmlas;
62
60
+ break;
63
/*
61
+ case MO_16:
64
* A7MPCORE DAP
62
+ if (!dc_isar_feature(aa64_fp16, s)) {
65
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
63
+ return false;
66
FSL_IMX6UL_GPTn_ADDR[i]);
64
+ }
67
65
+ fn = gen_helper_gvec_fcmlah;
68
sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpt[i]), 0,
66
+ break;
69
- qdev_get_gpio_in(DEVICE(&s->a7mpcore),
67
+ default:
70
- FSL_IMX6UL_GPTn_IRQ[i]));
68
+ return false;
71
+ qdev_get_gpio_in(gic, FSL_IMX6UL_GPTn_IRQ[i]));
69
+ }
70
+ if (fp_access_check(s)) {
71
+ gen_gvec_op4_fpst(s, a->q, a->rd, a->rn, a->rm, a->rd,
72
+ a->esz == MO_16, a->rot, fn);
73
+ }
74
+ return true;
75
+}
76
+
77
/*
78
* Advanced SIMD scalar/vector x indexed element
79
*/
80
@@ -XXX,XX +XXX,XX @@ static bool trans_BFMLAL_vi(DisasContext *s, arg_qrrx_e *a)
81
return true;
82
}
83
84
+static bool trans_FCMLA_vi(DisasContext *s, arg_FCMLA_vi *a)
85
+{
86
+ gen_helper_gvec_4_ptr *fn;
87
+
88
+ if (!dc_isar_feature(aa64_fcma, s)) {
89
+ return false;
90
+ }
91
+ switch (a->esz) {
92
+ case MO_16:
93
+ if (!dc_isar_feature(aa64_fp16, s)) {
94
+ return false;
95
+ }
96
+ fn = gen_helper_gvec_fcmlah_idx;
97
+ break;
98
+ case MO_32:
99
+ fn = gen_helper_gvec_fcmlas_idx;
100
+ break;
101
+ default:
102
+ g_assert_not_reached();
103
+ }
104
+ if (fp_access_check(s)) {
105
+ gen_gvec_op4_fpst(s, a->q, a->rd, a->rn, a->rm, a->rd,
106
+ a->esz == MO_16, (a->idx << 2) | a->rot, fn);
107
+ }
108
+ return true;
109
+}
110
+
111
/*
112
* Advanced SIMD scalar pairwise
113
*/
114
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_diff(DisasContext *s, uint32_t insn)
115
}
72
}
116
}
73
117
74
/*
118
-/* AdvSIMD three same extra
75
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
119
- * 31 30 29 28 24 23 22 21 20 16 15 14 11 10 9 5 4 0
76
FSL_IMX6UL_EPITn_ADDR[i]);
120
- * +---+---+---+-----------+------+---+------+---+--------+---+----+----+
77
121
- * | 0 | Q | U | 0 1 1 1 0 | size | 0 | Rm | 1 | opcode | 1 | Rn | Rd |
78
sysbus_connect_irq(SYS_BUS_DEVICE(&s->epit[i]), 0,
122
- * +---+---+---+-----------+------+---+------+---+--------+---+----+----+
79
- qdev_get_gpio_in(DEVICE(&s->a7mpcore),
123
- */
80
- FSL_IMX6UL_EPITn_IRQ[i]));
124
-static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
81
+ qdev_get_gpio_in(gic, FSL_IMX6UL_EPITn_IRQ[i]));
125
-{
126
- int rd = extract32(insn, 0, 5);
127
- int rn = extract32(insn, 5, 5);
128
- int opcode = extract32(insn, 11, 4);
129
- int rm = extract32(insn, 16, 5);
130
- int size = extract32(insn, 22, 2);
131
- bool u = extract32(insn, 29, 1);
132
- bool is_q = extract32(insn, 30, 1);
133
- bool feature;
134
- int rot;
135
-
136
- switch (u * 16 + opcode) {
137
- case 0x18: /* FCMLA, #0 */
138
- case 0x19: /* FCMLA, #90 */
139
- case 0x1a: /* FCMLA, #180 */
140
- case 0x1b: /* FCMLA, #270 */
141
- if (size == 0
142
- || (size == 1 && !dc_isar_feature(aa64_fp16, s))
143
- || (size == 3 && !is_q)) {
144
- unallocated_encoding(s);
145
- return;
146
- }
147
- feature = dc_isar_feature(aa64_fcma, s);
148
- break;
149
- default:
150
- case 0x02: /* SDOT (vector) */
151
- case 0x03: /* USDOT */
152
- case 0x04: /* SMMLA */
153
- case 0x05: /* USMMLA */
154
- case 0x10: /* SQRDMLAH (vector) */
155
- case 0x11: /* SQRDMLSH (vector) */
156
- case 0x12: /* UDOT (vector) */
157
- case 0x14: /* UMMLA */
158
- case 0x1c: /* FCADD, #90 */
159
- case 0x1d: /* BFMMLA */
160
- case 0x1e: /* FCADD, #270 */
161
- case 0x1f: /* BFDOT / BFMLAL */
162
- unallocated_encoding(s);
163
- return;
164
- }
165
- if (!feature) {
166
- unallocated_encoding(s);
167
- return;
168
- }
169
- if (!fp_access_check(s)) {
170
- return;
171
- }
172
-
173
- switch (opcode) {
174
- case 0x8: /* FCMLA, #0 */
175
- case 0x9: /* FCMLA, #90 */
176
- case 0xa: /* FCMLA, #180 */
177
- case 0xb: /* FCMLA, #270 */
178
- rot = extract32(opcode, 0, 2);
179
- switch (size) {
180
- case 1:
181
- gen_gvec_op4_fpst(s, is_q, rd, rn, rm, rd, true, rot,
182
- gen_helper_gvec_fcmlah);
183
- break;
184
- case 2:
185
- gen_gvec_op4_fpst(s, is_q, rd, rn, rm, rd, false, rot,
186
- gen_helper_gvec_fcmlas);
187
- break;
188
- case 3:
189
- gen_gvec_op4_fpst(s, is_q, rd, rn, rm, rd, false, rot,
190
- gen_helper_gvec_fcmlad);
191
- break;
192
- default:
193
- g_assert_not_reached();
194
- }
195
- return;
196
-
197
- default:
198
- g_assert_not_reached();
199
- }
200
-}
201
-
202
static void handle_2misc_widening(DisasContext *s, int opcode, bool is_q,
203
int size, int rn, int rd)
204
{
205
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
206
int rn = extract32(insn, 5, 5);
207
int rd = extract32(insn, 0, 5);
208
bool is_long = false;
209
- int is_fp = 0;
210
- bool is_fp16 = false;
211
int index;
212
- TCGv_ptr fpst;
213
214
switch (16 * u + opcode) {
215
case 0x02: /* SMLAL, SMLAL2 */
216
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
217
case 0x0b: /* SQDMULL, SQDMULL2 */
218
is_long = true;
219
break;
220
- case 0x11: /* FCMLA #0 */
221
- case 0x13: /* FCMLA #90 */
222
- case 0x15: /* FCMLA #180 */
223
- case 0x17: /* FCMLA #270 */
224
- if (is_scalar || !dc_isar_feature(aa64_fcma, s)) {
225
- unallocated_encoding(s);
226
- return;
227
- }
228
- is_fp = 2;
229
- break;
230
default:
231
case 0x00: /* FMLAL */
232
case 0x01: /* FMLA */
233
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
234
case 0x0e: /* SDOT */
235
case 0x0f: /* SUDOT / BFDOT / USDOT / BFMLAL */
236
case 0x10: /* MLA */
237
+ case 0x11: /* FCMLA #0 */
238
+ case 0x13: /* FCMLA #90 */
239
case 0x14: /* MLS */
240
+ case 0x15: /* FCMLA #180 */
241
+ case 0x17: /* FCMLA #270 */
242
case 0x18: /* FMLAL2 */
243
case 0x19: /* FMULX */
244
case 0x1c: /* FMLSL2 */
245
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
246
return;
247
}
82
}
248
83
249
- switch (is_fp) {
84
/*
250
- case 1: /* normal fp */
85
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
251
- unallocated_encoding(s); /* in decodetree */
86
FSL_IMX6UL_GPIOn_ADDR[i]);
252
- return;
87
253
-
88
sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio[i]), 0,
254
- case 2: /* complex fp */
89
- qdev_get_gpio_in(DEVICE(&s->a7mpcore),
255
- /* Each indexable element is a complex pair. */
90
- FSL_IMX6UL_GPIOn_LOW_IRQ[i]));
256
- size += 1;
91
+ qdev_get_gpio_in(gic, FSL_IMX6UL_GPIOn_LOW_IRQ[i]));
257
- switch (size) {
92
258
- case MO_32:
93
sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio[i]), 1,
259
- if (h && !is_q) {
94
- qdev_get_gpio_in(DEVICE(&s->a7mpcore),
260
- unallocated_encoding(s);
95
- FSL_IMX6UL_GPIOn_HIGH_IRQ[i]));
261
- return;
96
+ qdev_get_gpio_in(gic, FSL_IMX6UL_GPIOn_HIGH_IRQ[i]));
262
- }
263
- is_fp16 = true;
264
- break;
265
- case MO_64:
266
- break;
267
- default:
268
- unallocated_encoding(s);
269
- return;
270
- }
271
- break;
272
-
273
- default: /* integer */
274
- switch (size) {
275
- case MO_8:
276
- case MO_64:
277
- unallocated_encoding(s);
278
- return;
279
- }
280
- break;
281
- }
282
- if (is_fp16 && !dc_isar_feature(aa64_fp16, s)) {
283
- unallocated_encoding(s);
284
- return;
285
- }
286
-
287
/* Given MemOp size, adjust register and indexing. */
288
switch (size) {
289
+ case MO_8:
290
+ case MO_64:
291
+ unallocated_encoding(s);
292
+ return;
293
case MO_16:
294
index = h << 2 | l << 1 | m;
295
break;
296
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
297
index = h << 1 | l;
298
rm |= m << 4;
299
break;
300
- case MO_64:
301
- if (l || !is_q) {
302
- unallocated_encoding(s);
303
- return;
304
- }
305
- index = h;
306
- rm |= m << 4;
307
- break;
308
default:
309
g_assert_not_reached();
310
}
97
}
311
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
98
312
return;
99
/*
100
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
101
FSL_IMX6UL_SPIn_ADDR[i]);
102
103
sysbus_connect_irq(SYS_BUS_DEVICE(&s->spi[i]), 0,
104
- qdev_get_gpio_in(DEVICE(&s->a7mpcore),
105
- FSL_IMX6UL_SPIn_IRQ[i]));
106
+ qdev_get_gpio_in(gic, FSL_IMX6UL_SPIn_IRQ[i]));
313
}
107
}
314
108
315
- if (is_fp) {
109
/*
316
- fpst = fpstatus_ptr(is_fp16 ? FPST_FPCR_F16 : FPST_FPCR);
110
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
317
- } else {
111
sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c[i]), 0, FSL_IMX6UL_I2Cn_ADDR[i]);
318
- fpst = NULL;
112
319
- }
113
sysbus_connect_irq(SYS_BUS_DEVICE(&s->i2c[i]), 0,
320
-
114
- qdev_get_gpio_in(DEVICE(&s->a7mpcore),
321
- switch (16 * u + opcode) {
115
- FSL_IMX6UL_I2Cn_IRQ[i]));
322
- case 0x11: /* FCMLA #0 */
116
+ qdev_get_gpio_in(gic, FSL_IMX6UL_I2Cn_IRQ[i]));
323
- case 0x13: /* FCMLA #90 */
117
}
324
- case 0x15: /* FCMLA #180 */
118
325
- case 0x17: /* FCMLA #270 */
119
/*
326
- {
120
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
327
- int rot = extract32(insn, 13, 2);
121
FSL_IMX6UL_UARTn_ADDR[i]);
328
- int data = (index << 2) | rot;
122
329
- tcg_gen_gvec_4_ptr(vec_full_reg_offset(s, rd),
123
sysbus_connect_irq(SYS_BUS_DEVICE(&s->uart[i]), 0,
330
- vec_full_reg_offset(s, rn),
124
- qdev_get_gpio_in(DEVICE(&s->a7mpcore),
331
- vec_full_reg_offset(s, rm),
125
- FSL_IMX6UL_UARTn_IRQ[i]));
332
- vec_full_reg_offset(s, rd), fpst,
126
+ qdev_get_gpio_in(gic, FSL_IMX6UL_UARTn_IRQ[i]));
333
- is_q ? 16 : 8, vec_full_reg_size(s), data,
127
}
334
- size == MO_64
128
335
- ? gen_helper_gvec_fcmlas_idx
129
/*
336
- : gen_helper_gvec_fcmlah_idx);
130
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
337
- }
131
FSL_IMX6UL_ENETn_ADDR[i]);
338
- return;
132
339
- }
133
sysbus_connect_irq(SYS_BUS_DEVICE(&s->eth[i]), 0,
340
-
134
- qdev_get_gpio_in(DEVICE(&s->a7mpcore),
341
if (size == 3) {
135
- FSL_IMX6UL_ENETn_IRQ[i]));
342
g_assert_not_reached();
136
+ qdev_get_gpio_in(gic, FSL_IMX6UL_ENETn_IRQ[i]));
343
} else if (!is_long) {
137
344
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
138
sysbus_connect_irq(SYS_BUS_DEVICE(&s->eth[i]), 1,
345
*/
139
- qdev_get_gpio_in(DEVICE(&s->a7mpcore),
346
static const AArch64DecodeTable data_proc_simd[] = {
140
- FSL_IMX6UL_ENETn_TIMER_IRQ[i]));
347
/* pattern , mask , fn */
141
+ qdev_get_gpio_in(gic, FSL_IMX6UL_ENETn_TIMER_IRQ[i]));
348
- { 0x0e008400, 0x9f208400, disas_simd_three_reg_same_extra },
142
}
349
{ 0x0e200000, 0x9f200c00, disas_simd_three_reg_diff },
143
350
{ 0x0e200800, 0x9f3e0c00, disas_simd_two_reg_misc },
144
/*
351
{ 0x0e300800, 0x9f3e0c00, disas_simd_across_lanes },
145
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
146
sysbus_mmio_map(SYS_BUS_DEVICE(&s->usb[i]), 0,
147
FSL_IMX6UL_USB02_USBn_ADDR[i]);
148
sysbus_connect_irq(SYS_BUS_DEVICE(&s->usb[i]), 0,
149
- qdev_get_gpio_in(DEVICE(&s->a7mpcore),
150
- FSL_IMX6UL_USBn_IRQ[i]));
151
+ qdev_get_gpio_in(gic, FSL_IMX6UL_USBn_IRQ[i]));
152
}
153
154
/*
155
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
156
FSL_IMX6UL_USDHCn_ADDR[i]);
157
158
sysbus_connect_irq(SYS_BUS_DEVICE(&s->usdhc[i]), 0,
159
- qdev_get_gpio_in(DEVICE(&s->a7mpcore),
160
- FSL_IMX6UL_USDHCn_IRQ[i]));
161
+ qdev_get_gpio_in(gic, FSL_IMX6UL_USDHCn_IRQ[i]));
162
}
163
164
/*
165
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
166
sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0,
167
FSL_IMX6UL_WDOGn_ADDR[i]);
168
sysbus_connect_irq(SYS_BUS_DEVICE(&s->wdt[i]), 0,
169
- qdev_get_gpio_in(DEVICE(&s->a7mpcore),
170
- FSL_IMX6UL_WDOGn_IRQ[i]));
171
+ qdev_get_gpio_in(gic, FSL_IMX6UL_WDOGn_IRQ[i]));
172
}
173
174
/*
352
--
175
--
353
2.34.1
176
2.34.1
177
178
diff view generated by jsdifflib
1
From: Inès Varhol <ines.varhol@telecom-paris.fr>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
The implementation of configurable interrupts (interrupts supporting
3
The A7MPCore forward the IRQs from its internal GIC.
4
edge selection) was incorrectly expecting alternating input levels :
4
To make the code clearer, add the 'mpcore' and 'gic'
5
this commits adds a new status field `irq_levels` to actually detect
5
variables.
6
edges.
7
6
8
Signed-off-by: Inès Varhol <ines.varhol@telecom-paris.fr>
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
9
Message-id: 20240629110800.539969-2-ines.varhol@telecom-paris.fr
8
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20250130112615.3219-5-philmd@linaro.org
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
11
---
13
include/hw/misc/stm32l4x5_exti.h | 2 ++
12
hw/arm/fsl-imx7.c | 52 +++++++++++++++++++++--------------------------
14
hw/misc/stm32l4x5_exti.c | 28 +++++++++++++---------------
13
1 file changed, 23 insertions(+), 29 deletions(-)
15
2 files changed, 15 insertions(+), 15 deletions(-)
16
14
17
diff --git a/include/hw/misc/stm32l4x5_exti.h b/include/hw/misc/stm32l4x5_exti.h
15
diff --git a/hw/arm/fsl-imx7.c b/hw/arm/fsl-imx7.c
18
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/misc/stm32l4x5_exti.h
17
--- a/hw/arm/fsl-imx7.c
20
+++ b/include/hw/misc/stm32l4x5_exti.h
18
+++ b/hw/arm/fsl-imx7.c
21
@@ -XXX,XX +XXX,XX @@ struct Stm32l4x5ExtiState {
19
@@ -XXX,XX +XXX,XX @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
22
uint32_t swier[EXTI_NUM_REGISTER];
20
{
23
uint32_t pr[EXTI_NUM_REGISTER];
21
MachineState *ms = MACHINE(qdev_get_machine());
24
22
FslIMX7State *s = FSL_IMX7(dev);
25
+ /* used for edge detection */
23
- Object *o;
26
+ uint32_t irq_levels[EXTI_NUM_REGISTER];
24
+ DeviceState *mpcore = DEVICE(&s->a7mpcore);
27
qemu_irq irq[EXTI_NUM_INTERRUPT_OUT_LINES];
25
+ DeviceState *gic;
28
};
26
int i;
29
27
qemu_irq irq;
30
diff --git a/hw/misc/stm32l4x5_exti.c b/hw/misc/stm32l4x5_exti.c
28
char name[NAME_SIZE];
31
index XXXXXXX..XXXXXXX 100644
29
@@ -XXX,XX +XXX,XX @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
32
--- a/hw/misc/stm32l4x5_exti.c
30
* CPUs
33
+++ b/hw/misc/stm32l4x5_exti.c
31
*/
34
@@ -XXX,XX +XXX,XX @@ static void stm32l4x5_exti_reset_hold(Object *obj, ResetType type)
32
for (i = 0; i < smp_cpus; i++) {
35
s->ftsr[bank] = 0x00000000;
33
- o = OBJECT(&s->cpu[i]);
36
s->swier[bank] = 0x00000000;
34
+ Object *o = OBJECT(&s->cpu[i]);
37
s->pr[bank] = 0x00000000;
35
38
+ s->irq_levels[bank] = 0x00000000;
36
/* On uniprocessor, the CBAR is set to 0 */
37
if (smp_cpus > 1) {
38
@@ -XXX,XX +XXX,XX @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
39
/*
40
* A7MPCORE
41
*/
42
- object_property_set_int(OBJECT(&s->a7mpcore), "num-cpu", smp_cpus,
43
- &error_abort);
44
- object_property_set_int(OBJECT(&s->a7mpcore), "num-irq",
45
+ object_property_set_int(OBJECT(mpcore), "num-cpu", smp_cpus, &error_abort);
46
+ object_property_set_int(OBJECT(mpcore), "num-irq",
47
FSL_IMX7_MAX_IRQ + GIC_INTERNAL, &error_abort);
48
+ sysbus_realize(SYS_BUS_DEVICE(mpcore), &error_abort);
49
+ sysbus_mmio_map(SYS_BUS_DEVICE(mpcore), 0, FSL_IMX7_A7MPCORE_ADDR);
50
51
- sysbus_realize(SYS_BUS_DEVICE(&s->a7mpcore), &error_abort);
52
- sysbus_mmio_map(SYS_BUS_DEVICE(&s->a7mpcore), 0, FSL_IMX7_A7MPCORE_ADDR);
53
-
54
+ gic = mpcore;
55
for (i = 0; i < smp_cpus; i++) {
56
- SysBusDevice *sbd = SYS_BUS_DEVICE(&s->a7mpcore);
57
+ SysBusDevice *sbd = SYS_BUS_DEVICE(gic);
58
DeviceState *d = DEVICE(qemu_get_cpu(i));
59
60
irq = qdev_get_gpio_in(d, ARM_CPU_IRQ);
61
@@ -XXX,XX +XXX,XX @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
62
sysbus_realize(SYS_BUS_DEVICE(&s->gpt[i]), &error_abort);
63
sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpt[i]), 0, FSL_IMX7_GPTn_ADDR[i]);
64
sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpt[i]), 0,
65
- qdev_get_gpio_in(DEVICE(&s->a7mpcore),
66
- FSL_IMX7_GPTn_IRQ[i]));
67
+ qdev_get_gpio_in(gic, FSL_IMX7_GPTn_IRQ[i]));
39
}
68
}
40
}
69
41
70
/*
42
@@ -XXX,XX +XXX,XX @@ static void stm32l4x5_exti_set_irq(void *opaque, int irq, int level)
71
@@ -XXX,XX +XXX,XX @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
43
/* Shift the value to enable access in x2 registers. */
72
FSL_IMX7_GPIOn_ADDR[i]);
44
irq %= EXTI_MAX_IRQ_PER_BANK;
73
45
74
sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio[i]), 0,
46
+ if (level == extract32(s->irq_levels[bank], irq, 1)) {
75
- qdev_get_gpio_in(DEVICE(&s->a7mpcore),
47
+ /* No change in IRQ line state: do nothing */
76
- FSL_IMX7_GPIOn_LOW_IRQ[i]));
48
+ return;
77
+ qdev_get_gpio_in(gic, FSL_IMX7_GPIOn_LOW_IRQ[i]));
49
+ }
78
50
+ s->irq_levels[bank] = deposit32(s->irq_levels[bank], irq, 1, level);
79
sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio[i]), 1,
51
+
80
- qdev_get_gpio_in(DEVICE(&s->a7mpcore),
52
/* If the interrupt is masked, pr won't be raised */
81
- FSL_IMX7_GPIOn_HIGH_IRQ[i]));
53
if (!extract32(s->imr[bank], irq, 1)) {
82
+ qdev_get_gpio_in(gic, FSL_IMX7_GPIOn_HIGH_IRQ[i]));
54
return;
55
}
83
}
56
84
57
- if (((1 << irq) & s->rtsr[bank]) && level) {
85
/*
58
- /* Rising Edge */
86
@@ -XXX,XX +XXX,XX @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
59
- s->pr[bank] |= 1 << irq;
87
sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 0,
60
- qemu_irq_pulse(s->irq[oirq]);
88
FSL_IMX7_SPIn_ADDR[i]);
61
- } else if (((1 << irq) & s->ftsr[bank]) && !level) {
89
sysbus_connect_irq(SYS_BUS_DEVICE(&s->spi[i]), 0,
62
- /* Falling Edge */
90
- qdev_get_gpio_in(DEVICE(&s->a7mpcore),
63
+ if ((level && extract32(s->rtsr[bank], irq, 1)) ||
91
- FSL_IMX7_SPIn_IRQ[i]));
64
+ (!level && extract32(s->ftsr[bank], irq, 1))) {
92
+ qdev_get_gpio_in(gic, FSL_IMX7_SPIn_IRQ[i]));
65
+
66
s->pr[bank] |= 1 << irq;
67
qemu_irq_pulse(s->irq[oirq]);
68
}
93
}
69
- /*
94
70
- * In the following situations :
95
/*
71
- * - falling edge but rising trigger selected
96
@@ -XXX,XX +XXX,XX @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
72
- * - rising edge but falling trigger selected
97
sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c[i]), 0, FSL_IMX7_I2Cn_ADDR[i]);
73
- * - no trigger selected
98
74
- * No action is required
99
sysbus_connect_irq(SYS_BUS_DEVICE(&s->i2c[i]), 0,
75
- */
100
- qdev_get_gpio_in(DEVICE(&s->a7mpcore),
76
}
101
- FSL_IMX7_I2Cn_IRQ[i]));
77
102
+ qdev_get_gpio_in(gic, FSL_IMX7_I2Cn_IRQ[i]));
78
static uint64_t stm32l4x5_exti_read(void *opaque, hwaddr addr,
79
@@ -XXX,XX +XXX,XX @@ static void stm32l4x5_exti_init(Object *obj)
80
81
static const VMStateDescription vmstate_stm32l4x5_exti = {
82
.name = TYPE_STM32L4X5_EXTI,
83
- .version_id = 1,
84
- .minimum_version_id = 1,
85
+ .version_id = 2,
86
+ .minimum_version_id = 2,
87
.fields = (VMStateField[]) {
88
VMSTATE_UINT32_ARRAY(imr, Stm32l4x5ExtiState, EXTI_NUM_REGISTER),
89
VMSTATE_UINT32_ARRAY(emr, Stm32l4x5ExtiState, EXTI_NUM_REGISTER),
90
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_stm32l4x5_exti = {
91
VMSTATE_UINT32_ARRAY(ftsr, Stm32l4x5ExtiState, EXTI_NUM_REGISTER),
92
VMSTATE_UINT32_ARRAY(swier, Stm32l4x5ExtiState, EXTI_NUM_REGISTER),
93
VMSTATE_UINT32_ARRAY(pr, Stm32l4x5ExtiState, EXTI_NUM_REGISTER),
94
+ VMSTATE_UINT32_ARRAY(irq_levels, Stm32l4x5ExtiState, EXTI_NUM_REGISTER),
95
VMSTATE_END_OF_LIST()
96
}
103
}
97
};
104
105
/*
106
@@ -XXX,XX +XXX,XX @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
107
108
sysbus_mmio_map(SYS_BUS_DEVICE(&s->uart[i]), 0, FSL_IMX7_UARTn_ADDR[i]);
109
110
- irq = qdev_get_gpio_in(DEVICE(&s->a7mpcore), FSL_IMX7_UARTn_IRQ[i]);
111
+ irq = qdev_get_gpio_in(gic, FSL_IMX7_UARTn_IRQ[i]);
112
sysbus_connect_irq(SYS_BUS_DEVICE(&s->uart[i]), 0, irq);
113
}
114
115
@@ -XXX,XX +XXX,XX @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
116
117
sysbus_mmio_map(SYS_BUS_DEVICE(&s->eth[i]), 0, FSL_IMX7_ENETn_ADDR[i]);
118
119
- irq = qdev_get_gpio_in(DEVICE(&s->a7mpcore), FSL_IMX7_ENET_IRQ(i, 0));
120
+ irq = qdev_get_gpio_in(gic, FSL_IMX7_ENET_IRQ(i, 0));
121
sysbus_connect_irq(SYS_BUS_DEVICE(&s->eth[i]), 0, irq);
122
- irq = qdev_get_gpio_in(DEVICE(&s->a7mpcore), FSL_IMX7_ENET_IRQ(i, 3));
123
+ irq = qdev_get_gpio_in(gic, FSL_IMX7_ENET_IRQ(i, 3));
124
sysbus_connect_irq(SYS_BUS_DEVICE(&s->eth[i]), 1, irq);
125
}
126
127
@@ -XXX,XX +XXX,XX @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
128
sysbus_mmio_map(SYS_BUS_DEVICE(&s->usdhc[i]), 0,
129
FSL_IMX7_USDHCn_ADDR[i]);
130
131
- irq = qdev_get_gpio_in(DEVICE(&s->a7mpcore), FSL_IMX7_USDHCn_IRQ[i]);
132
+ irq = qdev_get_gpio_in(gic, FSL_IMX7_USDHCn_IRQ[i]);
133
sysbus_connect_irq(SYS_BUS_DEVICE(&s->usdhc[i]), 0, irq);
134
}
135
136
@@ -XXX,XX +XXX,XX @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
137
138
sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0, FSL_IMX7_WDOGn_ADDR[i]);
139
sysbus_connect_irq(SYS_BUS_DEVICE(&s->wdt[i]), 0,
140
- qdev_get_gpio_in(DEVICE(&s->a7mpcore),
141
- FSL_IMX7_WDOGn_IRQ[i]));
142
+ qdev_get_gpio_in(gic, FSL_IMX7_WDOGn_IRQ[i]));
143
}
144
145
/*
146
@@ -XXX,XX +XXX,XX @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
147
irq = qdev_get_gpio_in(DEVICE(&s->a7mpcore), FSL_IMX7_PCI_INTD_MSI_IRQ);
148
qdev_connect_gpio_out(DEVICE(&s->pcie4_msi_irq), 0, irq);
149
150
- irq = qdev_get_gpio_in(DEVICE(&s->a7mpcore), FSL_IMX7_PCI_INTA_IRQ);
151
+ irq = qdev_get_gpio_in(gic, FSL_IMX7_PCI_INTA_IRQ);
152
sysbus_connect_irq(SYS_BUS_DEVICE(&s->pcie), 0, irq);
153
- irq = qdev_get_gpio_in(DEVICE(&s->a7mpcore), FSL_IMX7_PCI_INTB_IRQ);
154
+ irq = qdev_get_gpio_in(gic, FSL_IMX7_PCI_INTB_IRQ);
155
sysbus_connect_irq(SYS_BUS_DEVICE(&s->pcie), 1, irq);
156
- irq = qdev_get_gpio_in(DEVICE(&s->a7mpcore), FSL_IMX7_PCI_INTC_IRQ);
157
+ irq = qdev_get_gpio_in(gic, FSL_IMX7_PCI_INTC_IRQ);
158
sysbus_connect_irq(SYS_BUS_DEVICE(&s->pcie), 2, irq);
159
irq = qdev_get_gpio_in(DEVICE(&s->pcie4_msi_irq), 0);
160
sysbus_connect_irq(SYS_BUS_DEVICE(&s->pcie), 3, irq);
161
@@ -XXX,XX +XXX,XX @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
162
sysbus_mmio_map(SYS_BUS_DEVICE(&s->usb[i]), 0,
163
FSL_IMX7_USBn_ADDR[i]);
164
165
- irq = qdev_get_gpio_in(DEVICE(&s->a7mpcore), FSL_IMX7_USBn_IRQ[i]);
166
+ irq = qdev_get_gpio_in(gic, FSL_IMX7_USBn_IRQ[i]);
167
sysbus_connect_irq(SYS_BUS_DEVICE(&s->usb[i]), 0, irq);
168
169
snprintf(name, NAME_SIZE, "usbmisc%d", i);
98
--
170
--
99
2.34.1
171
2.34.1
100
172
101
173
diff view generated by jsdifflib
1
From: Inès Varhol <ines.varhol@telecom-paris.fr>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
EXTI's new field `irq_levels` tracks irq levels between tests when using
3
No need to duplicate and forward the 'num-cpu' property from
4
`global_qtest`.
4
TYPE_ARM11MPCORE_PRIV to TYPE_REALVIEW_MPCORE, alias it with
5
This happens in `stm32l4x5_exti-test.c`, `stm32l4x5_syscfg-test.c` and
5
QOM object_property_add_alias().
6
`stm32l4x5_gpio-test.c` (`dm163.c` doesn't use `global_qtest`).
7
6
8
To ensure that `irq_levels` has the same value before and after each
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
QTest, this commit toggles back the irq lines that were changed at the
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
10
end of each problematic test. Most QTests were already doing this.
9
Message-id: 20250130112615.3219-6-philmd@linaro.org
11
12
Signed-off-by: Inès Varhol <ines.varhol@telecom-paris.fr>
13
Message-id: 20240629110800.539969-3-ines.varhol@telecom-paris.fr
14
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
11
---
17
tests/qtest/stm32l4x5_exti-test.c | 8 ++++++++
12
hw/cpu/realview_mpcore.c | 8 +-------
18
tests/qtest/stm32l4x5_syscfg-test.c | 2 +-
13
1 file changed, 1 insertion(+), 7 deletions(-)
19
2 files changed, 9 insertions(+), 1 deletion(-)
20
14
21
diff --git a/tests/qtest/stm32l4x5_exti-test.c b/tests/qtest/stm32l4x5_exti-test.c
15
diff --git a/hw/cpu/realview_mpcore.c b/hw/cpu/realview_mpcore.c
22
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
23
--- a/tests/qtest/stm32l4x5_exti-test.c
17
--- a/hw/cpu/realview_mpcore.c
24
+++ b/tests/qtest/stm32l4x5_exti-test.c
18
+++ b/hw/cpu/realview_mpcore.c
25
@@ -XXX,XX +XXX,XX @@ static void test_masked_interrupt(void)
19
@@ -XXX,XX +XXX,XX @@
26
g_assert_cmphex(exti_readl(EXTI_PR1), ==, 0x00000000);
20
#include "hw/cpu/arm11mpcore.h"
27
/* Check that the interrupt isn't pending in NVIC */
21
#include "hw/intc/realview_gic.h"
28
g_assert_false(check_nvic_pending(EXTI1_IRQ));
22
#include "hw/irq.h"
29
+
23
-#include "hw/qdev-properties.h"
30
+ /* Clean EXTI */
24
#include "qom/object.h"
31
+ exti_set_irq(1, 0);
25
32
}
26
#define TYPE_REALVIEW_MPCORE_RIRQ "realview_mpcore"
33
27
@@ -XXX,XX +XXX,XX @@ static void realview_mpcore_realize(DeviceState *dev, Error **errp)
34
static void test_interrupt(void)
28
int n;
35
@@ -XXX,XX +XXX,XX @@ static void test_interrupt(void)
29
int i;
36
/* Clean NVIC */
30
37
unpend_nvic_irq(EXTI1_IRQ);
31
- qdev_prop_set_uint32(priv, "num-cpu", s->num_cpu);
38
g_assert_false(check_nvic_pending(EXTI1_IRQ));
32
if (!sysbus_realize(SYS_BUS_DEVICE(&s->priv), errp)) {
39
+
33
return;
40
+ /* Clean EXTI */
34
}
41
+ exti_set_irq(1, 0);
35
@@ -XXX,XX +XXX,XX @@ static void mpcore_rirq_init(Object *obj)
42
}
36
int i;
43
37
44
static void test_orred_interrupts(void)
38
object_initialize_child(obj, "a11priv", &s->priv, TYPE_ARM11MPCORE_PRIV);
45
@@ -XXX,XX +XXX,XX @@ static void test_orred_interrupts(void)
39
+ object_property_add_alias(obj, "num-cpu", OBJECT(&s->priv), "num-cpu");
46
40
privbusdev = SYS_BUS_DEVICE(&s->priv);
47
unpend_nvic_irq(EXTI5_9_IRQ);
41
sysbus_init_mmio(sbd, sysbus_mmio_get_region(privbusdev, 0));
48
g_assert_false(check_nvic_pending(EXTI5_9_IRQ));
42
49
+
43
@@ -XXX,XX +XXX,XX @@ static void mpcore_rirq_init(Object *obj)
50
+ exti_set_irq(i, 0);
51
}
44
}
52
}
45
}
53
46
54
diff --git a/tests/qtest/stm32l4x5_syscfg-test.c b/tests/qtest/stm32l4x5_syscfg-test.c
47
-static const Property mpcore_rirq_properties[] = {
55
index XXXXXXX..XXXXXXX 100644
48
- DEFINE_PROP_UINT32("num-cpu", mpcore_rirq_state, num_cpu, 1),
56
--- a/tests/qtest/stm32l4x5_syscfg-test.c
49
-};
57
+++ b/tests/qtest/stm32l4x5_syscfg-test.c
50
-
58
@@ -XXX,XX +XXX,XX @@ static void test_interrupt(void)
51
static void mpcore_rirq_class_init(ObjectClass *klass, void *data)
59
g_assert_true(get_irq(1));
52
{
60
53
DeviceClass *dc = DEVICE_CLASS(klass);
61
/* Clean the test */
54
62
- syscfg_writel(SYSCFG_EXTICR1, 0x00000000);
55
dc->realize = realview_mpcore_realize;
63
syscfg_set_irq(0, 0);
56
- device_class_set_props(dc, mpcore_rirq_properties);
64
/* irq 15 is high at reset because GPIOA15 is high at reset */
65
syscfg_set_irq(17, 0);
66
+ syscfg_writel(SYSCFG_EXTICR1, 0x00000000);
67
}
57
}
68
58
69
static void test_irq_pin_multiplexer(void)
59
static const TypeInfo mpcore_rirq_info = {
70
--
60
--
71
2.34.1
61
2.34.1
72
62
73
63
diff view generated by jsdifflib
1
From: Sai Pavan Boddu <sai.pavan.boddu@amd.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
boot-mode property sets user values into BOOT_MODE register, on hardware
3
When multiple QOM types are registered in the same file,
4
these are derived from board switches.
4
it is simpler to use the the DEFINE_TYPES() macro. In
5
particular because type array declared with such macro
6
are easier to review.
5
7
6
Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@amd.com>
8
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@amd.com>
9
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Reviewed-by: Francisco Iglesias <francisco.iglesias@amd.com>
10
Message-id: 20250130112615.3219-7-philmd@linaro.org
9
Message-id: 20240621125906.1300995-2-sai.pavan.boddu@amd.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
---
12
hw/misc/zynq_slcr.c | 22 +++++++++++++++++++++-
13
hw/cpu/a15mpcore.c | 21 +++++++++------------
13
1 file changed, 21 insertions(+), 1 deletion(-)
14
hw/cpu/a9mpcore.c | 21 +++++++++------------
15
hw/cpu/arm11mpcore.c | 21 +++++++++------------
16
hw/cpu/realview_mpcore.c | 21 +++++++++------------
17
4 files changed, 36 insertions(+), 48 deletions(-)
14
18
15
diff --git a/hw/misc/zynq_slcr.c b/hw/misc/zynq_slcr.c
19
diff --git a/hw/cpu/a15mpcore.c b/hw/cpu/a15mpcore.c
16
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/misc/zynq_slcr.c
21
--- a/hw/cpu/a15mpcore.c
18
+++ b/hw/misc/zynq_slcr.c
22
+++ b/hw/cpu/a15mpcore.c
19
@@ -XXX,XX +XXX,XX @@
23
@@ -XXX,XX +XXX,XX @@ static void a15mp_priv_class_init(ObjectClass *klass, void *data)
20
#include "hw/registerfields.h"
24
/* We currently have no saveable state */
21
#include "hw/qdev-clock.h"
25
}
22
#include "qom/object.h"
26
23
+#include "hw/qdev-properties.h"
27
-static const TypeInfo a15mp_priv_info = {
24
+#include "qapi/error.h"
28
- .name = TYPE_A15MPCORE_PRIV,
25
29
- .parent = TYPE_SYS_BUS_DEVICE,
26
#ifndef ZYNQ_SLCR_ERR_DEBUG
30
- .instance_size = sizeof(A15MPPrivState),
27
#define ZYNQ_SLCR_ERR_DEBUG 0
31
- .instance_init = a15mp_priv_initfn,
28
@@ -XXX,XX +XXX,XX @@ REG32(RST_REASON, 0x250)
32
- .class_init = a15mp_priv_class_init,
29
33
+static const TypeInfo a15mp_types[] = {
30
REG32(REBOOT_STATUS, 0x258)
34
+ {
31
REG32(BOOT_MODE, 0x25c)
35
+ .name = TYPE_A15MPCORE_PRIV,
32
+ FIELD(BOOT_MODE, BOOT_MODE, 0, 4)
36
+ .parent = TYPE_SYS_BUS_DEVICE,
33
37
+ .instance_size = sizeof(A15MPPrivState),
34
REG32(APU_CTRL, 0x300)
38
+ .instance_init = a15mp_priv_initfn,
35
REG32(WDT_CLK_SEL, 0x304)
39
+ .class_init = a15mp_priv_class_init,
36
@@ -XXX,XX +XXX,XX @@ struct ZynqSLCRState {
40
+ },
37
Clock *ps_clk;
38
Clock *uart0_ref_clk;
39
Clock *uart1_ref_clk;
40
+ uint8_t boot_mode;
41
};
41
};
42
42
43
/*
43
-static void a15mp_register_types(void)
44
@@ -XXX,XX +XXX,XX @@ static void zynq_slcr_reset_init(Object *obj, ResetType type)
44
-{
45
s->regs[R_FPGA_RST_CTRL] = 0x01F33F0F;
45
- type_register_static(&a15mp_priv_info);
46
s->regs[R_RST_REASON] = 0x00000040;
46
-}
47
47
-
48
- s->regs[R_BOOT_MODE] = 0x00000001;
48
-type_init(a15mp_register_types)
49
+ s->regs[R_BOOT_MODE] = s->boot_mode & R_BOOT_MODE_BOOT_MODE_MASK;
49
+DEFINE_TYPES(a15mp_types)
50
50
diff --git a/hw/cpu/a9mpcore.c b/hw/cpu/a9mpcore.c
51
/* 0x700 - 0x7D4 */
51
index XXXXXXX..XXXXXXX 100644
52
for (i = 0; i < 54; i++) {
52
--- a/hw/cpu/a9mpcore.c
53
@@ -XXX,XX +XXX,XX @@ static const ClockPortInitArray zynq_slcr_clocks = {
53
+++ b/hw/cpu/a9mpcore.c
54
QDEV_CLOCK_END
54
@@ -XXX,XX +XXX,XX @@ static void a9mp_priv_class_init(ObjectClass *klass, void *data)
55
device_class_set_props(dc, a9mp_priv_properties);
56
}
57
58
-static const TypeInfo a9mp_priv_info = {
59
- .name = TYPE_A9MPCORE_PRIV,
60
- .parent = TYPE_SYS_BUS_DEVICE,
61
- .instance_size = sizeof(A9MPPrivState),
62
- .instance_init = a9mp_priv_initfn,
63
- .class_init = a9mp_priv_class_init,
64
+static const TypeInfo a9mp_types[] = {
65
+ {
66
+ .name = TYPE_A9MPCORE_PRIV,
67
+ .parent = TYPE_SYS_BUS_DEVICE,
68
+ .instance_size = sizeof(A9MPPrivState),
69
+ .instance_init = a9mp_priv_initfn,
70
+ .class_init = a9mp_priv_class_init,
71
+ },
55
};
72
};
56
73
57
+static void zynq_slcr_realize(DeviceState *dev, Error **errp)
74
-static void a9mp_register_types(void)
58
+{
75
-{
59
+ ZynqSLCRState *s = ZYNQ_SLCR(dev);
76
- type_register_static(&a9mp_priv_info);
60
+
77
-}
61
+ if (s->boot_mode > 0xF) {
78
-
62
+ error_setg(errp, "Invalid boot mode %d specified", s->boot_mode);
79
-type_init(a9mp_register_types)
63
+ }
80
+DEFINE_TYPES(a9mp_types)
64
+}
81
diff --git a/hw/cpu/arm11mpcore.c b/hw/cpu/arm11mpcore.c
65
+
82
index XXXXXXX..XXXXXXX 100644
66
static void zynq_slcr_init(Object *obj)
83
--- a/hw/cpu/arm11mpcore.c
67
{
84
+++ b/hw/cpu/arm11mpcore.c
68
ZynqSLCRState *s = ZYNQ_SLCR(obj);
85
@@ -XXX,XX +XXX,XX @@ static void mpcore_priv_class_init(ObjectClass *klass, void *data)
69
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_zynq_slcr = {
86
device_class_set_props(dc, mpcore_priv_properties);
70
}
87
}
88
89
-static const TypeInfo mpcore_priv_info = {
90
- .name = TYPE_ARM11MPCORE_PRIV,
91
- .parent = TYPE_SYS_BUS_DEVICE,
92
- .instance_size = sizeof(ARM11MPCorePriveState),
93
- .instance_init = mpcore_priv_initfn,
94
- .class_init = mpcore_priv_class_init,
95
+static const TypeInfo arm11mp_types[] = {
96
+ {
97
+ .name = TYPE_ARM11MPCORE_PRIV,
98
+ .parent = TYPE_SYS_BUS_DEVICE,
99
+ .instance_size = sizeof(ARM11MPCorePriveState),
100
+ .instance_init = mpcore_priv_initfn,
101
+ .class_init = mpcore_priv_class_init,
102
+ },
71
};
103
};
72
104
73
+static Property zynq_slcr_props[] = {
105
-static void arm11mpcore_register_types(void)
74
+ DEFINE_PROP_UINT8("boot-mode", ZynqSLCRState, boot_mode, 1),
106
-{
75
+ DEFINE_PROP_END_OF_LIST(),
107
- type_register_static(&mpcore_priv_info);
76
+};
108
-}
77
+
109
-
78
static void zynq_slcr_class_init(ObjectClass *klass, void *data)
110
-type_init(arm11mpcore_register_types)
79
{
111
+DEFINE_TYPES(arm11mp_types)
80
DeviceClass *dc = DEVICE_CLASS(klass);
112
diff --git a/hw/cpu/realview_mpcore.c b/hw/cpu/realview_mpcore.c
81
ResettableClass *rc = RESETTABLE_CLASS(klass);
113
index XXXXXXX..XXXXXXX 100644
82
114
--- a/hw/cpu/realview_mpcore.c
83
dc->vmsd = &vmstate_zynq_slcr;
115
+++ b/hw/cpu/realview_mpcore.c
84
+ dc->realize = zynq_slcr_realize;
116
@@ -XXX,XX +XXX,XX @@ static void mpcore_rirq_class_init(ObjectClass *klass, void *data)
85
rc->phases.enter = zynq_slcr_reset_init;
117
dc->realize = realview_mpcore_realize;
86
rc->phases.hold = zynq_slcr_reset_hold;
87
rc->phases.exit = zynq_slcr_reset_exit;
88
+ device_class_set_props(dc, zynq_slcr_props);
89
}
118
}
90
119
91
static const TypeInfo zynq_slcr_info = {
120
-static const TypeInfo mpcore_rirq_info = {
121
- .name = TYPE_REALVIEW_MPCORE_RIRQ,
122
- .parent = TYPE_SYS_BUS_DEVICE,
123
- .instance_size = sizeof(mpcore_rirq_state),
124
- .instance_init = mpcore_rirq_init,
125
- .class_init = mpcore_rirq_class_init,
126
+static const TypeInfo realview_mpcore_types[] = {
127
+ {
128
+ .name = TYPE_REALVIEW_MPCORE_RIRQ,
129
+ .parent = TYPE_SYS_BUS_DEVICE,
130
+ .instance_size = sizeof(mpcore_rirq_state),
131
+ .instance_init = mpcore_rirq_init,
132
+ .class_init = mpcore_rirq_class_init,
133
+ },
134
};
135
136
-static void realview_mpcore_register_types(void)
137
-{
138
- type_register_static(&mpcore_rirq_info);
139
-}
140
-
141
-type_init(realview_mpcore_register_types)
142
+DEFINE_TYPES(realview_mpcore_types)
92
--
143
--
93
2.34.1
144
2.34.1
145
146
diff view generated by jsdifflib
1
From: Nicolin Chen <nicolinc@nvidia.com>
1
From: Andrew Yuan <andrew.yuan@jaguarmicro.com>
2
2
3
The caller of smmu_iommu_mr wants to get sdev for smmuv3_flush_config().
3
Our current handling of the mask/compare logic in the Cadence
4
GEM ethernet device is wrong:
5
(1) we load the same byte twice from rx_buf when
6
creating the compare value
7
(2) we ignore the DISABLE_MASK flag
4
8
5
Do it directly instead of bridging with an iommu mr pointer.
9
The "Cadence IP for Gigabit Ethernet MAC Part Number: IP7014 IP Rev:
10
R1p12 - Doc Rev: 1.3 User Guide" states that if the DISABLE_MASK bit
11
in type2_compare_x_word_1 is set, the mask_value field in
12
type2_compare_x_word_0 is used as an additional 2 byte Compare Value.
6
13
7
Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
14
Correct these bugs:
8
Message-id: 20240619002218.926674-1-nicolinc@nvidia.com
15
* in the !disable_mask codepath, use lduw_le_p() so we
16
correctly load a 16-bit value for comparison
17
* in the disable_mask codepath, we load a full 4-byte value
18
from rx_buf for the comparison, set the compare value to
19
the whole of the cr0 register (i.e. the concatenation of
20
the mask and compare fields), and set mask to 0xffffffff
21
to force a 32-bit comparison
22
23
Signed-off-by: Andrew Yuan <andrew.yuan@jaguarmicro.com>
24
Message-id: 20241219061658.805-1-andrew.yuan@jaguarmicro.com
25
Suggested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
26
[PMM: Expand commit message and comment]
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
27
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
28
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
29
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
30
---
12
include/hw/arm/smmu-common.h | 4 ++--
31
hw/net/cadence_gem.c | 26 +++++++++++++++++++++-----
13
hw/arm/smmu-common.c | 8 ++------
32
1 file changed, 21 insertions(+), 5 deletions(-)
14
hw/arm/smmuv3.c | 12 ++++--------
15
3 files changed, 8 insertions(+), 16 deletions(-)
16
33
17
diff --git a/include/hw/arm/smmu-common.h b/include/hw/arm/smmu-common.h
34
diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
18
index XXXXXXX..XXXXXXX 100644
35
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/arm/smmu-common.h
36
--- a/hw/net/cadence_gem.c
20
+++ b/include/hw/arm/smmu-common.h
37
+++ b/hw/net/cadence_gem.c
21
@@ -XXX,XX +XXX,XX @@ int smmu_ptw(SMMUTransCfg *cfg, dma_addr_t iova, IOMMUAccessFlags perm,
38
@@ -XXX,XX +XXX,XX @@ static int get_queue_from_screen(CadenceGEMState *s, uint8_t *rxbuf_ptr,
22
*/
39
23
SMMUTransTableInfo *select_tt(SMMUTransCfg *cfg, dma_addr_t iova);
40
/* Compare A, B, C */
24
41
for (j = 0; j < 3; j++) {
25
-/* Return the iommu mr associated to @sid, or NULL if none */
42
- uint32_t cr0, cr1, mask, compare;
26
-IOMMUMemoryRegion *smmu_iommu_mr(SMMUState *s, uint32_t sid);
43
- uint16_t rx_cmp;
27
+/* Return the SMMUDevice associated to @sid, or NULL if none */
44
+ uint32_t cr0, cr1, mask, compare, disable_mask;
28
+SMMUDevice *smmu_find_sdev(SMMUState *s, uint32_t sid);
45
+ uint32_t rx_cmp;
29
46
int offset;
30
#define SMMU_IOTLB_MAX_SIZE 256
47
int cr_idx = extract32(reg, R_SCREENING_TYPE2_REG0_COMPARE_A_SHIFT + j * 6,
31
48
R_SCREENING_TYPE2_REG0_COMPARE_A_LENGTH);
32
diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c
49
@@ -XXX,XX +XXX,XX @@ static int get_queue_from_screen(CadenceGEMState *s, uint8_t *rxbuf_ptr,
33
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/arm/smmu-common.c
35
+++ b/hw/arm/smmu-common.c
36
@@ -XXX,XX +XXX,XX @@ static const PCIIOMMUOps smmu_ops = {
37
.get_address_space = smmu_find_add_as,
38
};
39
40
-IOMMUMemoryRegion *smmu_iommu_mr(SMMUState *s, uint32_t sid)
41
+SMMUDevice *smmu_find_sdev(SMMUState *s, uint32_t sid)
42
{
43
uint8_t bus_n, devfn;
44
SMMUPciBus *smmu_bus;
45
- SMMUDevice *smmu;
46
47
bus_n = PCI_BUS_NUM(sid);
48
smmu_bus = smmu_find_smmu_pcibus(s, bus_n);
49
if (smmu_bus) {
50
devfn = SMMU_PCI_DEVFN(sid);
51
- smmu = smmu_bus->pbdev[devfn];
52
- if (smmu) {
53
- return &smmu->iommu;
54
- }
55
+ return smmu_bus->pbdev[devfn];
56
}
57
return NULL;
58
}
59
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
60
index XXXXXXX..XXXXXXX 100644
61
--- a/hw/arm/smmuv3.c
62
+++ b/hw/arm/smmuv3.c
63
@@ -XXX,XX +XXX,XX @@ static int smmuv3_cmdq_consume(SMMUv3State *s)
64
case SMMU_CMD_CFGI_STE:
65
{
66
uint32_t sid = CMD_SID(&cmd);
67
- IOMMUMemoryRegion *mr = smmu_iommu_mr(bs, sid);
68
- SMMUDevice *sdev;
69
+ SMMUDevice *sdev = smmu_find_sdev(bs, sid);
70
71
if (CMD_SSEC(&cmd)) {
72
cmd_error = SMMU_CERROR_ILL;
73
break;
50
break;
74
}
51
}
75
52
76
- if (!mr) {
53
- rx_cmp = rxbuf_ptr[offset] << 8 | rxbuf_ptr[offset];
77
+ if (!sdev) {
54
- mask = FIELD_EX32(cr0, TYPE2_COMPARE_0_WORD_0, MASK_VALUE);
78
break;
55
- compare = FIELD_EX32(cr0, TYPE2_COMPARE_0_WORD_0, COMPARE_VALUE);
79
}
56
+ disable_mask =
80
57
+ FIELD_EX32(cr1, TYPE2_COMPARE_0_WORD_1, DISABLE_MASK);
81
trace_smmuv3_cmdq_cfgi_ste(sid);
58
+ if (disable_mask) {
82
- sdev = container_of(mr, SMMUDevice, iommu);
59
+ /*
83
smmuv3_flush_config(sdev);
60
+ * If disable_mask is set, mask_value is used as an
84
61
+ * additional 2 byte Compare Value; that is equivalent
85
break;
62
+ * to using the whole cr0 register as the comparison value.
86
@@ -XXX,XX +XXX,XX @@ static int smmuv3_cmdq_consume(SMMUv3State *s)
63
+ * Load 32 bits of data from rx_buf, and set mask to
87
case SMMU_CMD_CFGI_CD_ALL:
64
+ * all-ones so we compare all 32 bits.
88
{
65
+ */
89
uint32_t sid = CMD_SID(&cmd);
66
+ rx_cmp = ldl_le_p(rxbuf_ptr + offset);
90
- IOMMUMemoryRegion *mr = smmu_iommu_mr(bs, sid);
67
+ mask = 0xFFFFFFFF;
91
- SMMUDevice *sdev;
68
+ compare = cr0;
92
+ SMMUDevice *sdev = smmu_find_sdev(bs, sid);
69
+ } else {
93
70
+ rx_cmp = lduw_le_p(rxbuf_ptr + offset);
94
if (CMD_SSEC(&cmd)) {
71
+ mask = FIELD_EX32(cr0, TYPE2_COMPARE_0_WORD_0, MASK_VALUE);
95
cmd_error = SMMU_CERROR_ILL;
72
+ compare =
96
break;
73
+ FIELD_EX32(cr0, TYPE2_COMPARE_0_WORD_0, COMPARE_VALUE);
97
}
74
+ }
98
75
99
- if (!mr) {
76
if ((rx_cmp & mask) == (compare & mask)) {
100
+ if (!sdev) {
77
matched = true;
101
break;
102
}
103
104
trace_smmuv3_cmdq_cfgi_cd(sid);
105
- sdev = container_of(mr, SMMUDevice, iommu);
106
smmuv3_flush_config(sdev);
107
break;
108
}
109
--
78
--
110
2.34.1
79
2.34.1
80
81
diff view generated by jsdifflib
1
From: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
1
The '-old-param' command line option is specific to Arm targets; it
2
is very briefly documented as "old param mode". What this option
3
actually does is change the behaviour when directly booting a guest
4
kernel, so that command line arguments are passed to the kernel using
5
the extremely old "param_struct" ABI, rather than the newer ATAGS or
6
even newer DTB mechanisms.
2
7
3
Update firmware to have graphics card memory fix from EDK2 commit
8
This support was added back in 2007 to support an old vendor kernel
4
c1d1910be6e04a8b1a73090cf2881fb698947a6e:
9
on the akita/terrier board types:
10
https://mail.gnu.org/archive/html/qemu-devel/2007-07/msg00344.html
11
Even then, it was an out-of-date mechanism from the kernel's
12
point of view -- the kernel has had a comment since 2001 marking
13
it as deprecated. As of mid-2024, the kernel only retained
14
param_struct support for the RiscPC and Footbridge platforms:
15
https://lore.kernel.org/linux-arm-kernel/2831c5a6-cfbf-4fe0-b51c-0396e5b0aeb7@app.fastmail.com/
5
16
6
OvmfPkg/QemuVideoDxe: add feature PCD to remap framebuffer W/C
17
None of the board types QEMU supports need param_struct support;
18
mark this option as deprecated.
7
19
8
Some platforms (such as SBSA-QEMU on recent builds of the emulator) only
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
tolerate misaligned accesses to normal memory, and raise alignment
21
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
10
faults on such accesses to device memory, which is the default for PCIe
22
Message-id: 20250127123113.2947620-1-peter.maydell@linaro.org
11
MMIO BARs.
23
---
24
docs/about/deprecated.rst | 13 +++++++++++++
25
system/vl.c | 1 +
26
2 files changed, 14 insertions(+)
12
27
13
When emulating a PCIe graphics controller, the framebuffer is typically
28
diff --git a/docs/about/deprecated.rst b/docs/about/deprecated.rst
14
exposed via a MMIO BAR, while the disposition of the region is closer to
15
memory (no side effects on reads or writes, except for the changing
16
picture on the screen; direct random access to any pixel in the image).
17
18
In order to permit the use of such controllers on platforms that only
19
tolerate these types of accesses for normal memory, it is necessary to
20
remap the memory. Use the DXE services to set the desired capabilities
21
and attributes.
22
23
Hide this behavior under a feature PCD so only platforms that really
24
need it can enable it. (OVMF on x86 has no need for this)
25
26
With this fix enabled we can boot sbsa-ref with more than one cpu core.
27
28
Signed-off-by: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
29
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
30
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
31
Message-id: 20240620-b4-new-firmware-v3-1-29a3a2f1be1e@linaro.org
32
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
33
---
34
tests/avocado/machine_aarch64_sbsaref.py | 14 +++++++-------
35
1 file changed, 7 insertions(+), 7 deletions(-)
36
37
diff --git a/tests/avocado/machine_aarch64_sbsaref.py b/tests/avocado/machine_aarch64_sbsaref.py
38
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
39
--- a/tests/avocado/machine_aarch64_sbsaref.py
30
--- a/docs/about/deprecated.rst
40
+++ b/tests/avocado/machine_aarch64_sbsaref.py
31
+++ b/docs/about/deprecated.rst
41
@@ -XXX,XX +XXX,XX @@ def fetch_firmware(self):
32
@@ -XXX,XX +XXX,XX @@ configurations (e.g. -smp drawers=1,books=1,clusters=1 for x86 PC machine) is
42
33
marked deprecated since 9.0, users have to ensure that all the topology members
43
Used components:
34
described with -smp are supported by the target machine.
44
35
45
- - Trusted Firmware 2.11.0
36
+``-old-param`` option for booting Arm kernels via param_struct (since 10.0)
46
- - Tianocore EDK2 stable202405
37
+'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
47
- - Tianocore EDK2-platforms commit 4bbd0ed
38
+
48
+ - Trusted Firmware v2.11.0
39
+The ``-old-param`` command line option is specific to Arm targets:
49
+ - Tianocore EDK2 4d4f569924
40
+it is used when directly booting a guest kernel to pass it the
50
+ - Tianocore EDK2-platforms 3f08401
41
+command line and other information via the old ``param_struct`` ABI,
51
42
+rather than the newer ATAGS or DTB mechanisms. This option was only
52
"""
43
+ever needed to support ancient kernels on some old board types
53
44
+like the ``akita`` or ``terrier``; it has been deprecated in the
54
# Secure BootRom (TF-A code)
45
+kernel since 2001. None of the board types QEMU supports need
55
fs0_xz_url = (
46
+``param_struct`` support, so this option has been deprecated and will
56
"https://artifacts.codelinaro.org/artifactory/linaro-419-sbsa-ref/"
47
+be removed in a future QEMU version.
57
- "20240528-140808/edk2/SBSA_FLASH0.fd.xz"
48
+
58
+ "20240619-148232/edk2/SBSA_FLASH0.fd.xz"
49
User-mode emulator command line arguments
59
)
50
-----------------------------------------
60
- fs0_xz_hash = "fa6004900b67172914c908b78557fec4d36a5f784f4c3dd08f49adb75e1892a9"
51
61
+ fs0_xz_hash = "0c954842a590988f526984de22e21ae0ab9cb351a0c99a8a58e928f0c7359cf7"
52
diff --git a/system/vl.c b/system/vl.c
62
tar_xz_path = self.fetch_asset(fs0_xz_url, asset_hash=fs0_xz_hash,
53
index XXXXXXX..XXXXXXX 100644
63
algorithm='sha256')
54
--- a/system/vl.c
64
archive.extract(tar_xz_path, self.workdir)
55
+++ b/system/vl.c
65
@@ -XXX,XX +XXX,XX @@ def fetch_firmware(self):
56
@@ -XXX,XX +XXX,XX @@ void qemu_init(int argc, char **argv)
66
# Non-secure rom (UEFI and EFI variables)
57
nb_prom_envs++;
67
fs1_xz_url = (
58
break;
68
"https://artifacts.codelinaro.org/artifactory/linaro-419-sbsa-ref/"
59
case QEMU_OPTION_old_param:
69
- "20240528-140808/edk2/SBSA_FLASH1.fd.xz"
60
+ warn_report("-old-param is deprecated");
70
+ "20240619-148232/edk2/SBSA_FLASH1.fd.xz"
61
old_param = 1;
71
)
62
break;
72
- fs1_xz_hash = "5f3747d4000bc416d9641e33ff4ac60c3cc8cb74ca51b6e932e58531c62eb6f7"
63
case QEMU_OPTION_rtc:
73
+ fs1_xz_hash = "c6ec39374c4d79bb9e9cdeeb6db44732d90bb4a334cec92002b3f4b9cac4b5ee"
74
tar_xz_path = self.fetch_asset(fs1_xz_url, asset_hash=fs1_xz_hash,
75
algorithm='sha256')
76
archive.extract(tar_xz_path, self.workdir)
77
--
64
--
78
2.34.1
65
2.34.1
79
66
80
67
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
The inner loop, bounded by eltspersegment, must not be
4
larger than the outer loop, bounded by elements.
5
6
Cc: qemu-stable@nongnu.org
7
Fixes: 18fc2405781 ("target/arm: Implement SVE fp complex multiply add (indexed)")
8
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2376
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 20240625183536.1672454-2-richard.henderson@linaro.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
target/arm/tcg/vec_helper.c | 4 ++--
15
1 file changed, 2 insertions(+), 2 deletions(-)
16
17
diff --git a/target/arm/tcg/vec_helper.c b/target/arm/tcg/vec_helper.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/tcg/vec_helper.c
20
+++ b/target/arm/tcg/vec_helper.c
21
@@ -XXX,XX +XXX,XX @@ void HELPER(gvec_fcmlah_idx)(void *vd, void *vn, void *vm, void *va,
22
intptr_t index = extract32(desc, SIMD_DATA_SHIFT + 2, 2);
23
uint32_t neg_real = flip ^ neg_imag;
24
intptr_t elements = opr_sz / sizeof(float16);
25
- intptr_t eltspersegment = 16 / sizeof(float16);
26
+ intptr_t eltspersegment = MIN(16 / sizeof(float16), elements);
27
intptr_t i, j;
28
29
/* Shift boolean to the sign bit so we can xor to negate. */
30
@@ -XXX,XX +XXX,XX @@ void HELPER(gvec_fcmlas_idx)(void *vd, void *vn, void *vm, void *va,
31
intptr_t index = extract32(desc, SIMD_DATA_SHIFT + 2, 2);
32
uint32_t neg_real = flip ^ neg_imag;
33
intptr_t elements = opr_sz / sizeof(float32);
34
- intptr_t eltspersegment = 16 / sizeof(float32);
35
+ intptr_t eltspersegment = MIN(16 / sizeof(float32), elements);
36
intptr_t i, j;
37
38
/* Shift boolean to the sign bit so we can xor to negate. */
39
--
40
2.34.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
The inner loop, bounded by eltspersegment, must not be
4
larger than the outer loop, bounded by elements.
5
6
Cc: qemu-stable@nongnu.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20240625183536.1672454-3-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/tcg/vec_helper.c | 24 ++++++++++++++++--------
13
1 file changed, 16 insertions(+), 8 deletions(-)
14
15
diff --git a/target/arm/tcg/vec_helper.c b/target/arm/tcg/vec_helper.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/tcg/vec_helper.c
18
+++ b/target/arm/tcg/vec_helper.c
19
@@ -XXX,XX +XXX,XX @@ void HELPER(neon_sqdmulh_idx_h)(void *vd, void *vn, void *vm,
20
intptr_t i, j, opr_sz = simd_oprsz(desc);
21
int idx = simd_data(desc);
22
int16_t *d = vd, *n = vn, *m = (int16_t *)vm + H2(idx);
23
+ intptr_t elements = opr_sz / 2;
24
+ intptr_t eltspersegment = MIN(16 / 2, elements);
25
26
- for (i = 0; i < opr_sz / 2; i += 16 / 2) {
27
+ for (i = 0; i < elements; i += 16 / 2) {
28
int16_t mm = m[i];
29
- for (j = 0; j < 16 / 2; ++j) {
30
+ for (j = 0; j < eltspersegment; ++j) {
31
d[i + j] = do_sqrdmlah_h(n[i + j], mm, 0, false, false, vq);
32
}
33
}
34
@@ -XXX,XX +XXX,XX @@ void HELPER(neon_sqrdmulh_idx_h)(void *vd, void *vn, void *vm,
35
intptr_t i, j, opr_sz = simd_oprsz(desc);
36
int idx = simd_data(desc);
37
int16_t *d = vd, *n = vn, *m = (int16_t *)vm + H2(idx);
38
+ intptr_t elements = opr_sz / 2;
39
+ intptr_t eltspersegment = MIN(16 / 2, elements);
40
41
- for (i = 0; i < opr_sz / 2; i += 16 / 2) {
42
+ for (i = 0; i < elements; i += 16 / 2) {
43
int16_t mm = m[i];
44
- for (j = 0; j < 16 / 2; ++j) {
45
+ for (j = 0; j < eltspersegment; ++j) {
46
d[i + j] = do_sqrdmlah_h(n[i + j], mm, 0, false, true, vq);
47
}
48
}
49
@@ -XXX,XX +XXX,XX @@ void HELPER(neon_sqdmulh_idx_s)(void *vd, void *vn, void *vm,
50
intptr_t i, j, opr_sz = simd_oprsz(desc);
51
int idx = simd_data(desc);
52
int32_t *d = vd, *n = vn, *m = (int32_t *)vm + H4(idx);
53
+ intptr_t elements = opr_sz / 4;
54
+ intptr_t eltspersegment = MIN(16 / 4, elements);
55
56
- for (i = 0; i < opr_sz / 4; i += 16 / 4) {
57
+ for (i = 0; i < elements; i += 16 / 4) {
58
int32_t mm = m[i];
59
- for (j = 0; j < 16 / 4; ++j) {
60
+ for (j = 0; j < eltspersegment; ++j) {
61
d[i + j] = do_sqrdmlah_s(n[i + j], mm, 0, false, false, vq);
62
}
63
}
64
@@ -XXX,XX +XXX,XX @@ void HELPER(neon_sqrdmulh_idx_s)(void *vd, void *vn, void *vm,
65
intptr_t i, j, opr_sz = simd_oprsz(desc);
66
int idx = simd_data(desc);
67
int32_t *d = vd, *n = vn, *m = (int32_t *)vm + H4(idx);
68
+ intptr_t elements = opr_sz / 4;
69
+ intptr_t eltspersegment = MIN(16 / 4, elements);
70
71
- for (i = 0; i < opr_sz / 4; i += 16 / 4) {
72
+ for (i = 0; i < elements; i += 16 / 4) {
73
int32_t mm = m[i];
74
- for (j = 0; j < 16 / 4; ++j) {
75
+ for (j = 0; j < eltspersegment; ++j) {
76
d[i + j] = do_sqrdmlah_s(n[i + j], mm, 0, false, true, vq);
77
}
78
}
79
--
80
2.34.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Input denormals cause the Javascript inexact bit
4
(output to Z) to be set.
5
6
Cc: qemu-stable@nongnu.org
7
Fixes: 6c1f6f2733a ("target/arm: Implement ARMv8.3-JSConv")
8
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2375
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 20240625183536.1672454-4-richard.henderson@linaro.org
12
[PMM: fixed hardcoded tab in test case]
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
15
target/arm/vfp_helper.c | 18 +++++++++---------
16
tests/tcg/aarch64/test-2375.c | 21 +++++++++++++++++++++
17
tests/tcg/aarch64/Makefile.target | 3 ++-
18
3 files changed, 32 insertions(+), 10 deletions(-)
19
create mode 100644 tests/tcg/aarch64/test-2375.c
20
21
diff --git a/target/arm/vfp_helper.c b/target/arm/vfp_helper.c
22
index XXXXXXX..XXXXXXX 100644
23
--- a/target/arm/vfp_helper.c
24
+++ b/target/arm/vfp_helper.c
25
@@ -XXX,XX +XXX,XX @@ const FloatRoundMode arm_rmode_to_sf_map[] = {
26
uint64_t HELPER(fjcvtzs)(float64 value, void *vstatus)
27
{
28
float_status *status = vstatus;
29
- uint32_t inexact, frac;
30
- uint32_t e_old, e_new;
31
+ uint32_t frac, e_old, e_new;
32
+ bool inexact;
33
34
e_old = get_float_exception_flags(status);
35
set_float_exception_flags(0, status);
36
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(fjcvtzs)(float64 value, void *vstatus)
37
e_new = get_float_exception_flags(status);
38
set_float_exception_flags(e_old | e_new, status);
39
40
- if (value == float64_chs(float64_zero)) {
41
- /* While not inexact for IEEE FP, -0.0 is inexact for JavaScript. */
42
- inexact = 1;
43
- } else {
44
- /* Normal inexact or overflow or NaN */
45
- inexact = e_new & (float_flag_inexact | float_flag_invalid);
46
- }
47
+ /* Normal inexact, denormal with flush-to-zero, or overflow or NaN */
48
+ inexact = e_new & (float_flag_inexact |
49
+ float_flag_input_denormal |
50
+ float_flag_invalid);
51
+
52
+ /* While not inexact for IEEE FP, -0.0 is inexact for JavaScript. */
53
+ inexact |= value == float64_chs(float64_zero);
54
55
/* Pack the result and the env->ZF representation of Z together. */
56
return deposit64(frac, 32, 32, inexact);
57
diff --git a/tests/tcg/aarch64/test-2375.c b/tests/tcg/aarch64/test-2375.c
58
new file mode 100644
59
index XXXXXXX..XXXXXXX
60
--- /dev/null
61
+++ b/tests/tcg/aarch64/test-2375.c
62
@@ -XXX,XX +XXX,XX @@
63
+/* SPDX-License-Identifier: GPL-2.0-or-later */
64
+/* Copyright (c) 2024 Linaro Ltd */
65
+/* See https://gitlab.com/qemu-project/qemu/-/issues/2375 */
66
+
67
+#include <assert.h>
68
+
69
+int main(void)
70
+{
71
+ int r, z;
72
+
73
+ asm("msr fpcr, %2\n\t"
74
+ "fjcvtzs %w0, %d3\n\t"
75
+ "cset %1, eq"
76
+ : "=r"(r), "=r"(z)
77
+ : "r"(0x01000000L), /* FZ = 1 */
78
+ "w"(0xfcff00L)); /* denormal */
79
+
80
+ assert(r == 0);
81
+ assert(z == 0);
82
+ return 0;
83
+}
84
diff --git a/tests/tcg/aarch64/Makefile.target b/tests/tcg/aarch64/Makefile.target
85
index XXXXXXX..XXXXXXX 100644
86
--- a/tests/tcg/aarch64/Makefile.target
87
+++ b/tests/tcg/aarch64/Makefile.target
88
@@ -XXX,XX +XXX,XX @@ endif
89
90
# Pauth Tests
91
ifneq ($(CROSS_CC_HAS_ARMV8_3),)
92
-AARCH64_TESTS += pauth-1 pauth-2 pauth-4 pauth-5
93
+AARCH64_TESTS += pauth-1 pauth-2 pauth-4 pauth-5 test-2375
94
pauth-%: CFLAGS += -march=armv8.3-a
95
+test-2375: CFLAGS += -march=armv8.3-a
96
run-pauth-1: QEMU_OPTS += -cpu max
97
run-pauth-2: QEMU_OPTS += -cpu max
98
# Choose a cpu with FEAT_Pauth but without FEAT_FPAC for pauth-[45].
99
--
100
2.34.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20240625183536.1672454-5-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/helper.h | 10 ++
9
target/arm/tcg/a64.decode | 16 +++
10
target/arm/tcg/translate-a64.c | 206 +++++++++++++--------------------
11
target/arm/tcg/vec_helper.c | 72 ++++++++++++
12
4 files changed, 180 insertions(+), 124 deletions(-)
13
14
diff --git a/target/arm/helper.h b/target/arm/helper.h
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/helper.h
17
+++ b/target/arm/helper.h
18
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_5(neon_sqrdmulh_idx_h, TCG_CALL_NO_RWG,
19
DEF_HELPER_FLAGS_5(neon_sqrdmulh_idx_s, TCG_CALL_NO_RWG,
20
void, ptr, ptr, ptr, ptr, i32)
21
22
+DEF_HELPER_FLAGS_5(neon_sqrdmlah_idx_h, TCG_CALL_NO_RWG,
23
+ void, ptr, ptr, ptr, ptr, i32)
24
+DEF_HELPER_FLAGS_5(neon_sqrdmlah_idx_s, TCG_CALL_NO_RWG,
25
+ void, ptr, ptr, ptr, ptr, i32)
26
+
27
+DEF_HELPER_FLAGS_5(neon_sqrdmlsh_idx_h, TCG_CALL_NO_RWG,
28
+ void, ptr, ptr, ptr, ptr, i32)
29
+DEF_HELPER_FLAGS_5(neon_sqrdmlsh_idx_s, TCG_CALL_NO_RWG,
30
+ void, ptr, ptr, ptr, ptr, i32)
31
+
32
DEF_HELPER_FLAGS_4(sve2_sqdmulh_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
33
DEF_HELPER_FLAGS_4(sve2_sqdmulh_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
34
DEF_HELPER_FLAGS_4(sve2_sqdmulh_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
35
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
36
index XXXXXXX..XXXXXXX 100644
37
--- a/target/arm/tcg/a64.decode
38
+++ b/target/arm/tcg/a64.decode
39
@@ -XXX,XX +XXX,XX @@ CMEQ_s 0111 1110 111 ..... 10001 1 ..... ..... @rrr_d
40
41
SQDMULH_s 0101 1110 ..1 ..... 10110 1 ..... ..... @rrr_e
42
SQRDMULH_s 0111 1110 ..1 ..... 10110 1 ..... ..... @rrr_e
43
+SQRDMLAH_s 0111 1110 ..0 ..... 10000 1 ..... ..... @rrr_e
44
+SQRDMLSH_s 0111 1110 ..0 ..... 10001 1 ..... ..... @rrr_e
45
46
### Advanced SIMD scalar pairwise
47
48
@@ -XXX,XX +XXX,XX @@ MLS_v 0.10 1110 ..1 ..... 10010 1 ..... ..... @qrrr_e
49
50
SQDMULH_v 0.00 1110 ..1 ..... 10110 1 ..... ..... @qrrr_e
51
SQRDMULH_v 0.10 1110 ..1 ..... 10110 1 ..... ..... @qrrr_e
52
+SQRDMLAH_v 0.10 1110 ..0 ..... 10000 1 ..... ..... @qrrr_e
53
+SQRDMLSH_v 0.10 1110 ..0 ..... 10001 1 ..... ..... @qrrr_e
54
55
### Advanced SIMD scalar x indexed element
56
57
@@ -XXX,XX +XXX,XX @@ SQDMULH_si 0101 1111 10 .. .... 1100 . 0 ..... ..... @rrx_s
58
SQRDMULH_si 0101 1111 01 .. .... 1101 . 0 ..... ..... @rrx_h
59
SQRDMULH_si 0101 1111 10 . ..... 1101 . 0 ..... ..... @rrx_s
60
61
+SQRDMLAH_si 0111 1111 01 .. .... 1101 . 0 ..... ..... @rrx_h
62
+SQRDMLAH_si 0111 1111 10 .. .... 1101 . 0 ..... ..... @rrx_s
63
+
64
+SQRDMLSH_si 0111 1111 01 .. .... 1111 . 0 ..... ..... @rrx_h
65
+SQRDMLSH_si 0111 1111 10 .. .... 1111 . 0 ..... ..... @rrx_s
66
+
67
### Advanced SIMD vector x indexed element
68
69
FMUL_vi 0.00 1111 00 .. .... 1001 . 0 ..... ..... @qrrx_h
70
@@ -XXX,XX +XXX,XX @@ SQDMULH_vi 0.00 1111 10 . ..... 1100 . 0 ..... ..... @qrrx_s
71
SQRDMULH_vi 0.00 1111 01 .. .... 1101 . 0 ..... ..... @qrrx_h
72
SQRDMULH_vi 0.00 1111 10 . ..... 1101 . 0 ..... ..... @qrrx_s
73
74
+SQRDMLAH_vi 0.10 1111 01 .. .... 1101 . 0 ..... ..... @qrrx_h
75
+SQRDMLAH_vi 0.10 1111 10 .. .... 1101 . 0 ..... ..... @qrrx_s
76
+
77
+SQRDMLSH_vi 0.10 1111 01 .. .... 1111 . 0 ..... ..... @qrrx_h
78
+SQRDMLSH_vi 0.10 1111 10 .. .... 1111 . 0 ..... ..... @qrrx_s
79
+
80
# Floating-point conditional select
81
82
FCSEL 0001 1110 .. 1 rm:5 cond:4 11 rn:5 rd:5 esz=%esz_hsd
83
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
84
index XXXXXXX..XXXXXXX 100644
85
--- a/target/arm/tcg/translate-a64.c
86
+++ b/target/arm/tcg/translate-a64.c
87
@@ -XXX,XX +XXX,XX @@ static const ENVScalar2 f_scalar_sqrdmulh = {
88
};
89
TRANS(SQRDMULH_s, do_env_scalar2_hs, a, &f_scalar_sqrdmulh)
90
91
+typedef struct ENVScalar3 {
92
+ NeonGenThreeOpEnvFn *gen_hs[2];
93
+} ENVScalar3;
94
+
95
+static bool do_env_scalar3_hs(DisasContext *s, arg_rrr_e *a,
96
+ const ENVScalar3 *f)
97
+{
98
+ TCGv_i32 t0, t1, t2;
99
+
100
+ if (a->esz != MO_16 && a->esz != MO_32) {
101
+ return false;
102
+ }
103
+ if (!fp_access_check(s)) {
104
+ return true;
105
+ }
106
+
107
+ t0 = tcg_temp_new_i32();
108
+ t1 = tcg_temp_new_i32();
109
+ t2 = tcg_temp_new_i32();
110
+ read_vec_element_i32(s, t0, a->rn, 0, a->esz);
111
+ read_vec_element_i32(s, t1, a->rm, 0, a->esz);
112
+ read_vec_element_i32(s, t2, a->rd, 0, a->esz);
113
+ f->gen_hs[a->esz - 1](t0, tcg_env, t0, t1, t2);
114
+ write_fp_sreg(s, a->rd, t0);
115
+ return true;
116
+}
117
+
118
+static const ENVScalar3 f_scalar_sqrdmlah = {
119
+ { gen_helper_neon_qrdmlah_s16, gen_helper_neon_qrdmlah_s32 }
120
+};
121
+TRANS_FEAT(SQRDMLAH_s, aa64_rdm, do_env_scalar3_hs, a, &f_scalar_sqrdmlah)
122
+
123
+static const ENVScalar3 f_scalar_sqrdmlsh = {
124
+ { gen_helper_neon_qrdmlsh_s16, gen_helper_neon_qrdmlsh_s32 }
125
+};
126
+TRANS_FEAT(SQRDMLSH_s, aa64_rdm, do_env_scalar3_hs, a, &f_scalar_sqrdmlsh)
127
+
128
static bool do_cmop_d(DisasContext *s, arg_rrr_e *a, TCGCond cond)
129
{
130
if (fp_access_check(s)) {
131
@@ -XXX,XX +XXX,XX @@ TRANS(CMTST_v, do_gvec_fn3, a, gen_gvec_cmtst)
132
133
TRANS(SQDMULH_v, do_gvec_fn3_no8_no64, a, gen_gvec_sqdmulh_qc)
134
TRANS(SQRDMULH_v, do_gvec_fn3_no8_no64, a, gen_gvec_sqrdmulh_qc)
135
+TRANS_FEAT(SQRDMLAH_v, aa64_rdm, do_gvec_fn3_no8_no64, a, gen_gvec_sqrdmlah_qc)
136
+TRANS_FEAT(SQRDMLSH_v, aa64_rdm, do_gvec_fn3_no8_no64, a, gen_gvec_sqrdmlsh_qc)
137
138
/*
139
* Advanced SIMD scalar/vector x indexed element
140
@@ -XXX,XX +XXX,XX @@ static bool do_env_scalar2_idx_hs(DisasContext *s, arg_rrx_e *a,
141
TRANS(SQDMULH_si, do_env_scalar2_idx_hs, a, &f_scalar_sqdmulh)
142
TRANS(SQRDMULH_si, do_env_scalar2_idx_hs, a, &f_scalar_sqrdmulh)
143
144
+static bool do_env_scalar3_idx_hs(DisasContext *s, arg_rrx_e *a,
145
+ const ENVScalar3 *f)
146
+{
147
+ if (a->esz < MO_16 || a->esz > MO_32) {
148
+ return false;
149
+ }
150
+ if (fp_access_check(s)) {
151
+ TCGv_i32 t0 = tcg_temp_new_i32();
152
+ TCGv_i32 t1 = tcg_temp_new_i32();
153
+ TCGv_i32 t2 = tcg_temp_new_i32();
154
+
155
+ read_vec_element_i32(s, t0, a->rn, 0, a->esz);
156
+ read_vec_element_i32(s, t1, a->rm, a->idx, a->esz);
157
+ read_vec_element_i32(s, t2, a->rd, 0, a->esz);
158
+ f->gen_hs[a->esz - 1](t0, tcg_env, t0, t1, t2);
159
+ write_fp_sreg(s, a->rd, t0);
160
+ }
161
+ return true;
162
+}
163
+
164
+TRANS_FEAT(SQRDMLAH_si, aa64_rdm, do_env_scalar3_idx_hs, a, &f_scalar_sqrdmlah)
165
+TRANS_FEAT(SQRDMLSH_si, aa64_rdm, do_env_scalar3_idx_hs, a, &f_scalar_sqrdmlsh)
166
+
167
static bool do_fp3_vector_idx(DisasContext *s, arg_qrrx_e *a,
168
gen_helper_gvec_3_ptr * const fns[3])
169
{
170
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_4 * const f_vector_idx_sqrdmulh[2] = {
171
};
172
TRANS(SQRDMULH_vi, do_int3_qc_vector_idx, a, f_vector_idx_sqrdmulh)
173
174
+static gen_helper_gvec_4 * const f_vector_idx_sqrdmlah[2] = {
175
+ gen_helper_neon_sqrdmlah_idx_h,
176
+ gen_helper_neon_sqrdmlah_idx_s,
177
+};
178
+TRANS_FEAT(SQRDMLAH_vi, aa64_rdm, do_int3_qc_vector_idx, a,
179
+ f_vector_idx_sqrdmlah)
180
+
181
+static gen_helper_gvec_4 * const f_vector_idx_sqrdmlsh[2] = {
182
+ gen_helper_neon_sqrdmlsh_idx_h,
183
+ gen_helper_neon_sqrdmlsh_idx_s,
184
+};
185
+TRANS_FEAT(SQRDMLSH_vi, aa64_rdm, do_int3_qc_vector_idx, a,
186
+ f_vector_idx_sqrdmlsh)
187
+
188
/*
189
* Advanced SIMD scalar pairwise
190
*/
191
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_three_reg_diff(DisasContext *s, uint32_t insn)
192
}
193
}
194
195
-/* AdvSIMD scalar three same extra
196
- * 31 30 29 28 24 23 22 21 20 16 15 14 11 10 9 5 4 0
197
- * +-----+---+-----------+------+---+------+---+--------+---+----+----+
198
- * | 0 1 | U | 1 1 1 1 0 | size | 0 | Rm | 1 | opcode | 1 | Rn | Rd |
199
- * +-----+---+-----------+------+---+------+---+--------+---+----+----+
200
- */
201
-static void disas_simd_scalar_three_reg_same_extra(DisasContext *s,
202
- uint32_t insn)
203
-{
204
- int rd = extract32(insn, 0, 5);
205
- int rn = extract32(insn, 5, 5);
206
- int opcode = extract32(insn, 11, 4);
207
- int rm = extract32(insn, 16, 5);
208
- int size = extract32(insn, 22, 2);
209
- bool u = extract32(insn, 29, 1);
210
- TCGv_i32 ele1, ele2, ele3;
211
- TCGv_i64 res;
212
- bool feature;
213
-
214
- switch (u * 16 + opcode) {
215
- case 0x10: /* SQRDMLAH (vector) */
216
- case 0x11: /* SQRDMLSH (vector) */
217
- if (size != 1 && size != 2) {
218
- unallocated_encoding(s);
219
- return;
220
- }
221
- feature = dc_isar_feature(aa64_rdm, s);
222
- break;
223
- default:
224
- unallocated_encoding(s);
225
- return;
226
- }
227
- if (!feature) {
228
- unallocated_encoding(s);
229
- return;
230
- }
231
- if (!fp_access_check(s)) {
232
- return;
233
- }
234
-
235
- /* Do a single operation on the lowest element in the vector.
236
- * We use the standard Neon helpers and rely on 0 OP 0 == 0
237
- * with no side effects for all these operations.
238
- * OPTME: special-purpose helpers would avoid doing some
239
- * unnecessary work in the helper for the 16 bit cases.
240
- */
241
- ele1 = tcg_temp_new_i32();
242
- ele2 = tcg_temp_new_i32();
243
- ele3 = tcg_temp_new_i32();
244
-
245
- read_vec_element_i32(s, ele1, rn, 0, size);
246
- read_vec_element_i32(s, ele2, rm, 0, size);
247
- read_vec_element_i32(s, ele3, rd, 0, size);
248
-
249
- switch (opcode) {
250
- case 0x0: /* SQRDMLAH */
251
- if (size == 1) {
252
- gen_helper_neon_qrdmlah_s16(ele3, tcg_env, ele1, ele2, ele3);
253
- } else {
254
- gen_helper_neon_qrdmlah_s32(ele3, tcg_env, ele1, ele2, ele3);
255
- }
256
- break;
257
- case 0x1: /* SQRDMLSH */
258
- if (size == 1) {
259
- gen_helper_neon_qrdmlsh_s16(ele3, tcg_env, ele1, ele2, ele3);
260
- } else {
261
- gen_helper_neon_qrdmlsh_s32(ele3, tcg_env, ele1, ele2, ele3);
262
- }
263
- break;
264
- default:
265
- g_assert_not_reached();
266
- }
267
-
268
- res = tcg_temp_new_i64();
269
- tcg_gen_extu_i32_i64(res, ele3);
270
- write_fp_dreg(s, rd, res);
271
-}
272
-
273
static void handle_2misc_64(DisasContext *s, int opcode, bool u,
274
TCGv_i64 tcg_rd, TCGv_i64 tcg_rn,
275
TCGv_i32 tcg_rmode, TCGv_ptr tcg_fpstatus)
276
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
277
int rot;
278
279
switch (u * 16 + opcode) {
280
- case 0x10: /* SQRDMLAH (vector) */
281
- case 0x11: /* SQRDMLSH (vector) */
282
- if (size != 1 && size != 2) {
283
- unallocated_encoding(s);
284
- return;
285
- }
286
- feature = dc_isar_feature(aa64_rdm, s);
287
- break;
288
case 0x02: /* SDOT (vector) */
289
case 0x12: /* UDOT (vector) */
290
if (size != MO_32) {
291
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
292
}
293
break;
294
default:
295
+ case 0x10: /* SQRDMLAH (vector) */
296
+ case 0x11: /* SQRDMLSH (vector) */
297
unallocated_encoding(s);
298
return;
299
}
300
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
301
}
302
303
switch (opcode) {
304
- case 0x0: /* SQRDMLAH (vector) */
305
- gen_gvec_fn3(s, is_q, rd, rn, rm, gen_gvec_sqrdmlah_qc, size);
306
- return;
307
-
308
- case 0x1: /* SQRDMLSH (vector) */
309
- gen_gvec_fn3(s, is_q, rd, rn, rm, gen_gvec_sqrdmlsh_qc, size);
310
- return;
311
-
312
case 0x2: /* SDOT / UDOT */
313
gen_gvec_op4_ool(s, is_q, rd, rn, rm, rd, 0,
314
u ? gen_helper_gvec_udot_b : gen_helper_gvec_sdot_b);
315
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
316
case 0x0b: /* SQDMULL, SQDMULL2 */
317
is_long = true;
318
break;
319
- case 0x1d: /* SQRDMLAH */
320
- case 0x1f: /* SQRDMLSH */
321
- if (!dc_isar_feature(aa64_rdm, s)) {
322
- unallocated_encoding(s);
323
- return;
324
- }
325
- break;
326
case 0x0e: /* SDOT */
327
case 0x1e: /* UDOT */
328
if (is_scalar || size != MO_32 || !dc_isar_feature(aa64_dp, s)) {
329
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
330
case 0x18: /* FMLAL2 */
331
case 0x19: /* FMULX */
332
case 0x1c: /* FMLSL2 */
333
+ case 0x1d: /* SQRDMLAH */
334
+ case 0x1f: /* SQRDMLSH */
335
unallocated_encoding(s);
336
return;
337
}
338
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
339
tcg_op, tcg_idx);
340
}
341
break;
342
- case 0x1d: /* SQRDMLAH */
343
- read_vec_element_i32(s, tcg_res, rd, pass,
344
- is_scalar ? size : MO_32);
345
- if (size == 1) {
346
- gen_helper_neon_qrdmlah_s16(tcg_res, tcg_env,
347
- tcg_op, tcg_idx, tcg_res);
348
- } else {
349
- gen_helper_neon_qrdmlah_s32(tcg_res, tcg_env,
350
- tcg_op, tcg_idx, tcg_res);
351
- }
352
- break;
353
- case 0x1f: /* SQRDMLSH */
354
- read_vec_element_i32(s, tcg_res, rd, pass,
355
- is_scalar ? size : MO_32);
356
- if (size == 1) {
357
- gen_helper_neon_qrdmlsh_s16(tcg_res, tcg_env,
358
- tcg_op, tcg_idx, tcg_res);
359
- } else {
360
- gen_helper_neon_qrdmlsh_s32(tcg_res, tcg_env,
361
- tcg_op, tcg_idx, tcg_res);
362
- }
363
- break;
364
default:
365
case 0x01: /* FMLA */
366
case 0x05: /* FMLS */
367
case 0x09: /* FMUL */
368
case 0x19: /* FMULX */
369
+ case 0x1d: /* SQRDMLAH */
370
+ case 0x1f: /* SQRDMLSH */
371
g_assert_not_reached();
372
}
373
374
@@ -XXX,XX +XXX,XX @@ static const AArch64DecodeTable data_proc_simd[] = {
375
{ 0x0e000000, 0xbf208c00, disas_simd_tb },
376
{ 0x0e000800, 0xbf208c00, disas_simd_zip_trn },
377
{ 0x2e000000, 0xbf208400, disas_simd_ext },
378
- { 0x5e008400, 0xdf208400, disas_simd_scalar_three_reg_same_extra },
379
{ 0x5e200000, 0xdf200c00, disas_simd_scalar_three_reg_diff },
380
{ 0x5e200800, 0xdf3e0c00, disas_simd_scalar_two_reg_misc },
381
{ 0x5f000000, 0xdf000400, disas_simd_indexed }, /* scalar indexed */
382
diff --git a/target/arm/tcg/vec_helper.c b/target/arm/tcg/vec_helper.c
383
index XXXXXXX..XXXXXXX 100644
384
--- a/target/arm/tcg/vec_helper.c
385
+++ b/target/arm/tcg/vec_helper.c
386
@@ -XXX,XX +XXX,XX @@ void HELPER(neon_sqrdmulh_idx_h)(void *vd, void *vn, void *vm,
387
clear_tail(d, opr_sz, simd_maxsz(desc));
388
}
389
390
+void HELPER(neon_sqrdmlah_idx_h)(void *vd, void *vn, void *vm,
391
+ void *vq, uint32_t desc)
392
+{
393
+ intptr_t i, j, opr_sz = simd_oprsz(desc);
394
+ int idx = simd_data(desc);
395
+ int16_t *d = vd, *n = vn, *m = (int16_t *)vm + H2(idx);
396
+ intptr_t elements = opr_sz / 2;
397
+ intptr_t eltspersegment = MIN(16 / 2, elements);
398
+
399
+ for (i = 0; i < elements; i += 16 / 2) {
400
+ int16_t mm = m[i];
401
+ for (j = 0; j < eltspersegment; ++j) {
402
+ d[i + j] = do_sqrdmlah_h(n[i + j], mm, d[i + j], false, true, vq);
403
+ }
404
+ }
405
+ clear_tail(d, opr_sz, simd_maxsz(desc));
406
+}
407
+
408
+void HELPER(neon_sqrdmlsh_idx_h)(void *vd, void *vn, void *vm,
409
+ void *vq, uint32_t desc)
410
+{
411
+ intptr_t i, j, opr_sz = simd_oprsz(desc);
412
+ int idx = simd_data(desc);
413
+ int16_t *d = vd, *n = vn, *m = (int16_t *)vm + H2(idx);
414
+ intptr_t elements = opr_sz / 2;
415
+ intptr_t eltspersegment = MIN(16 / 2, elements);
416
+
417
+ for (i = 0; i < elements; i += 16 / 2) {
418
+ int16_t mm = m[i];
419
+ for (j = 0; j < eltspersegment; ++j) {
420
+ d[i + j] = do_sqrdmlah_h(n[i + j], mm, d[i + j], true, true, vq);
421
+ }
422
+ }
423
+ clear_tail(d, opr_sz, simd_maxsz(desc));
424
+}
425
+
426
void HELPER(sve2_sqrdmlah_h)(void *vd, void *vn, void *vm,
427
void *va, uint32_t desc)
428
{
429
@@ -XXX,XX +XXX,XX @@ void HELPER(neon_sqrdmulh_idx_s)(void *vd, void *vn, void *vm,
430
clear_tail(d, opr_sz, simd_maxsz(desc));
431
}
432
433
+void HELPER(neon_sqrdmlah_idx_s)(void *vd, void *vn, void *vm,
434
+ void *vq, uint32_t desc)
435
+{
436
+ intptr_t i, j, opr_sz = simd_oprsz(desc);
437
+ int idx = simd_data(desc);
438
+ int32_t *d = vd, *n = vn, *m = (int32_t *)vm + H4(idx);
439
+ intptr_t elements = opr_sz / 4;
440
+ intptr_t eltspersegment = MIN(16 / 4, elements);
441
+
442
+ for (i = 0; i < elements; i += 16 / 4) {
443
+ int32_t mm = m[i];
444
+ for (j = 0; j < eltspersegment; ++j) {
445
+ d[i + j] = do_sqrdmlah_s(n[i + j], mm, d[i + j], false, true, vq);
446
+ }
447
+ }
448
+ clear_tail(d, opr_sz, simd_maxsz(desc));
449
+}
450
+
451
+void HELPER(neon_sqrdmlsh_idx_s)(void *vd, void *vn, void *vm,
452
+ void *vq, uint32_t desc)
453
+{
454
+ intptr_t i, j, opr_sz = simd_oprsz(desc);
455
+ int idx = simd_data(desc);
456
+ int32_t *d = vd, *n = vn, *m = (int32_t *)vm + H4(idx);
457
+ intptr_t elements = opr_sz / 4;
458
+ intptr_t eltspersegment = MIN(16 / 4, elements);
459
+
460
+ for (i = 0; i < elements; i += 16 / 4) {
461
+ int32_t mm = m[i];
462
+ for (j = 0; j < eltspersegment; ++j) {
463
+ d[i + j] = do_sqrdmlah_s(n[i + j], mm, d[i + j], true, true, vq);
464
+ }
465
+ }
466
+ clear_tail(d, opr_sz, simd_maxsz(desc));
467
+}
468
+
469
void HELPER(sve2_sqrdmlah_s)(void *vd, void *vn, void *vm,
470
void *va, uint32_t desc)
471
{
472
--
473
2.34.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20240625183536.1672454-7-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/tcg/a64.decode | 3 +++
9
target/arm/tcg/translate-a64.c | 35 ++++++++--------------------------
10
2 files changed, 11 insertions(+), 27 deletions(-)
11
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
13
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/tcg/a64.decode
15
+++ b/target/arm/tcg/a64.decode
16
@@ -XXX,XX +XXX,XX @@ SQRDMLSH_v 0.10 1110 ..0 ..... 10001 1 ..... ..... @qrrr_e
17
18
SDOT_v 0.00 1110 100 ..... 10010 1 ..... ..... @qrrr_s
19
UDOT_v 0.10 1110 100 ..... 10010 1 ..... ..... @qrrr_s
20
+USDOT_v 0.00 1110 100 ..... 10011 1 ..... ..... @qrrr_s
21
22
### Advanced SIMD scalar x indexed element
23
24
@@ -XXX,XX +XXX,XX @@ SQRDMLSH_vi 0.10 1111 10 .. .... 1111 . 0 ..... ..... @qrrx_s
25
26
SDOT_vi 0.00 1111 10 .. .... 1110 . 0 ..... ..... @qrrx_s
27
UDOT_vi 0.10 1111 10 .. .... 1110 . 0 ..... ..... @qrrx_s
28
+SUDOT_vi 0.00 1111 00 .. .... 1111 . 0 ..... ..... @qrrx_s
29
+USDOT_vi 0.00 1111 10 .. .... 1111 . 0 ..... ..... @qrrx_s
30
31
# Floating-point conditional select
32
33
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/target/arm/tcg/translate-a64.c
36
+++ b/target/arm/tcg/translate-a64.c
37
@@ -XXX,XX +XXX,XX @@ static bool do_dot_vector(DisasContext *s, arg_qrrr_e *a,
38
39
TRANS_FEAT(SDOT_v, aa64_dp, do_dot_vector, a, gen_helper_gvec_sdot_b)
40
TRANS_FEAT(UDOT_v, aa64_dp, do_dot_vector, a, gen_helper_gvec_udot_b)
41
+TRANS_FEAT(USDOT_v, aa64_i8mm, do_dot_vector, a, gen_helper_gvec_usdot_b)
42
43
/*
44
* Advanced SIMD scalar/vector x indexed element
45
@@ -XXX,XX +XXX,XX @@ static bool do_dot_vector_idx(DisasContext *s, arg_qrrx_e *a,
46
47
TRANS_FEAT(SDOT_vi, aa64_dp, do_dot_vector_idx, a, gen_helper_gvec_sdot_idx_b)
48
TRANS_FEAT(UDOT_vi, aa64_dp, do_dot_vector_idx, a, gen_helper_gvec_udot_idx_b)
49
+TRANS_FEAT(SUDOT_vi, aa64_i8mm, do_dot_vector_idx, a,
50
+ gen_helper_gvec_sudot_idx_b)
51
+TRANS_FEAT(USDOT_vi, aa64_i8mm, do_dot_vector_idx, a,
52
+ gen_helper_gvec_usdot_idx_b)
53
54
/*
55
* Advanced SIMD scalar pairwise
56
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
57
int rot;
58
59
switch (u * 16 + opcode) {
60
- case 0x03: /* USDOT */
61
- if (size != MO_32) {
62
- unallocated_encoding(s);
63
- return;
64
- }
65
- feature = dc_isar_feature(aa64_i8mm, s);
66
- break;
67
case 0x04: /* SMMLA */
68
case 0x14: /* UMMLA */
69
case 0x05: /* USMMLA */
70
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
71
break;
72
default:
73
case 0x02: /* SDOT (vector) */
74
+ case 0x03: /* USDOT */
75
case 0x10: /* SQRDMLAH (vector) */
76
case 0x11: /* SQRDMLSH (vector) */
77
case 0x12: /* UDOT (vector) */
78
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
79
}
80
81
switch (opcode) {
82
- case 0x3: /* USDOT */
83
- gen_gvec_op4_ool(s, is_q, rd, rn, rm, rd, 0, gen_helper_gvec_usdot_b);
84
- return;
85
-
86
case 0x04: /* SMMLA, UMMLA */
87
gen_gvec_op4_ool(s, 1, rd, rn, rm, rd, 0,
88
u ? gen_helper_gvec_ummla_b
89
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
90
break;
91
case 0x0f:
92
switch (size) {
93
- case 0: /* SUDOT */
94
- case 2: /* USDOT */
95
- if (is_scalar || !dc_isar_feature(aa64_i8mm, s)) {
96
- unallocated_encoding(s);
97
- return;
98
- }
99
- size = MO_32;
100
- break;
101
case 1: /* BFDOT */
102
if (is_scalar || !dc_isar_feature(aa64_bf16, s)) {
103
unallocated_encoding(s);
104
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
105
size = MO_16;
106
break;
107
default:
108
+ case 0: /* SUDOT */
109
+ case 2: /* USDOT */
110
unallocated_encoding(s);
111
return;
112
}
113
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
114
switch (16 * u + opcode) {
115
case 0x0f:
116
switch (extract32(insn, 22, 2)) {
117
- case 0: /* SUDOT */
118
- gen_gvec_op4_ool(s, is_q, rd, rn, rm, rd, index,
119
- gen_helper_gvec_sudot_idx_b);
120
- return;
121
case 1: /* BFDOT */
122
gen_gvec_op4_ool(s, is_q, rd, rn, rm, rd, index,
123
gen_helper_gvec_bfdot_idx);
124
return;
125
- case 2: /* USDOT */
126
- gen_gvec_op4_ool(s, is_q, rd, rn, rm, rd, index,
127
- gen_helper_gvec_usdot_idx_b);
128
- return;
129
case 3: /* BFMLAL{B,T} */
130
gen_gvec_op4_fpst(s, 1, rd, rn, rm, rd, 0, (index << 1) | is_q,
131
gen_helper_gvec_bfmlal_idx);
132
--
133
2.34.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20240625183536.1672454-8-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/tcg/a64.decode | 2 ++
9
target/arm/tcg/translate-a64.c | 20 +++++---------------
10
2 files changed, 7 insertions(+), 15 deletions(-)
11
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
13
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/tcg/a64.decode
15
+++ b/target/arm/tcg/a64.decode
16
@@ -XXX,XX +XXX,XX @@ SQRDMLSH_v 0.10 1110 ..0 ..... 10001 1 ..... ..... @qrrr_e
17
SDOT_v 0.00 1110 100 ..... 10010 1 ..... ..... @qrrr_s
18
UDOT_v 0.10 1110 100 ..... 10010 1 ..... ..... @qrrr_s
19
USDOT_v 0.00 1110 100 ..... 10011 1 ..... ..... @qrrr_s
20
+BFDOT_v 0.10 1110 010 ..... 11111 1 ..... ..... @qrrr_s
21
22
### Advanced SIMD scalar x indexed element
23
24
@@ -XXX,XX +XXX,XX @@ SDOT_vi 0.00 1111 10 .. .... 1110 . 0 ..... ..... @qrrx_s
25
UDOT_vi 0.10 1111 10 .. .... 1110 . 0 ..... ..... @qrrx_s
26
SUDOT_vi 0.00 1111 00 .. .... 1111 . 0 ..... ..... @qrrx_s
27
USDOT_vi 0.00 1111 10 .. .... 1111 . 0 ..... ..... @qrrx_s
28
+BFDOT_vi 0.00 1111 01 .. .... 1111 . 0 ..... ..... @qrrx_s
29
30
# Floating-point conditional select
31
32
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/target/arm/tcg/translate-a64.c
35
+++ b/target/arm/tcg/translate-a64.c
36
@@ -XXX,XX +XXX,XX @@ static bool do_dot_vector(DisasContext *s, arg_qrrr_e *a,
37
TRANS_FEAT(SDOT_v, aa64_dp, do_dot_vector, a, gen_helper_gvec_sdot_b)
38
TRANS_FEAT(UDOT_v, aa64_dp, do_dot_vector, a, gen_helper_gvec_udot_b)
39
TRANS_FEAT(USDOT_v, aa64_i8mm, do_dot_vector, a, gen_helper_gvec_usdot_b)
40
+TRANS_FEAT(BFDOT_v, aa64_bf16, do_dot_vector, a, gen_helper_gvec_bfdot)
41
42
/*
43
* Advanced SIMD scalar/vector x indexed element
44
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(SUDOT_vi, aa64_i8mm, do_dot_vector_idx, a,
45
gen_helper_gvec_sudot_idx_b)
46
TRANS_FEAT(USDOT_vi, aa64_i8mm, do_dot_vector_idx, a,
47
gen_helper_gvec_usdot_idx_b)
48
+TRANS_FEAT(BFDOT_vi, aa64_bf16, do_dot_vector_idx, a,
49
+ gen_helper_gvec_bfdot_idx)
50
51
/*
52
* Advanced SIMD scalar pairwise
53
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
54
break;
55
case 0x1f:
56
switch (size) {
57
- case 1: /* BFDOT */
58
case 3: /* BFMLAL{B,T} */
59
feature = dc_isar_feature(aa64_bf16, s);
60
break;
61
default:
62
+ case 1: /* BFDOT */
63
unallocated_encoding(s);
64
return;
65
}
66
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
67
return;
68
case 0xf:
69
switch (size) {
70
- case 1: /* BFDOT */
71
- gen_gvec_op4_ool(s, is_q, rd, rn, rm, rd, 0, gen_helper_gvec_bfdot);
72
- break;
73
case 3: /* BFMLAL{B,T} */
74
gen_gvec_op4_fpst(s, 1, rd, rn, rm, rd, false, is_q,
75
gen_helper_gvec_bfmlal);
76
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
77
break;
78
case 0x0f:
79
switch (size) {
80
- case 1: /* BFDOT */
81
- if (is_scalar || !dc_isar_feature(aa64_bf16, s)) {
82
- unallocated_encoding(s);
83
- return;
84
- }
85
- size = MO_32;
86
- break;
87
case 3: /* BFMLAL{B,T} */
88
if (is_scalar || !dc_isar_feature(aa64_bf16, s)) {
89
unallocated_encoding(s);
90
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
91
break;
92
default:
93
case 0: /* SUDOT */
94
+ case 1: /* BFDOT */
95
case 2: /* USDOT */
96
unallocated_encoding(s);
97
return;
98
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
99
switch (16 * u + opcode) {
100
case 0x0f:
101
switch (extract32(insn, 22, 2)) {
102
- case 1: /* BFDOT */
103
- gen_gvec_op4_ool(s, is_q, rd, rn, rm, rd, index,
104
- gen_helper_gvec_bfdot_idx);
105
- return;
106
case 3: /* BFMLAL{B,T} */
107
gen_gvec_op4_fpst(s, 1, rd, rn, rm, rd, 0, (index << 1) | is_q,
108
gen_helper_gvec_bfmlal_idx);
109
--
110
2.34.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20240625183536.1672454-9-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/tcg/a64.decode | 2 +
9
target/arm/tcg/translate-a64.c | 77 +++++++++++++---------------------
10
2 files changed, 31 insertions(+), 48 deletions(-)
11
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
13
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/tcg/a64.decode
15
+++ b/target/arm/tcg/a64.decode
16
@@ -XXX,XX +XXX,XX @@ SDOT_v 0.00 1110 100 ..... 10010 1 ..... ..... @qrrr_s
17
UDOT_v 0.10 1110 100 ..... 10010 1 ..... ..... @qrrr_s
18
USDOT_v 0.00 1110 100 ..... 10011 1 ..... ..... @qrrr_s
19
BFDOT_v 0.10 1110 010 ..... 11111 1 ..... ..... @qrrr_s
20
+BFMLAL_v 0.10 1110 110 ..... 11111 1 ..... ..... @qrrr_h
21
22
### Advanced SIMD scalar x indexed element
23
24
@@ -XXX,XX +XXX,XX @@ UDOT_vi 0.10 1111 10 .. .... 1110 . 0 ..... ..... @qrrx_s
25
SUDOT_vi 0.00 1111 00 .. .... 1111 . 0 ..... ..... @qrrx_s
26
USDOT_vi 0.00 1111 10 .. .... 1111 . 0 ..... ..... @qrrx_s
27
BFDOT_vi 0.00 1111 01 .. .... 1111 . 0 ..... ..... @qrrx_s
28
+BFMLAL_vi 0.00 1111 11 .. .... 1111 . 0 ..... ..... @qrrx_h
29
30
# Floating-point conditional select
31
32
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/target/arm/tcg/translate-a64.c
35
+++ b/target/arm/tcg/translate-a64.c
36
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(UDOT_v, aa64_dp, do_dot_vector, a, gen_helper_gvec_udot_b)
37
TRANS_FEAT(USDOT_v, aa64_i8mm, do_dot_vector, a, gen_helper_gvec_usdot_b)
38
TRANS_FEAT(BFDOT_v, aa64_bf16, do_dot_vector, a, gen_helper_gvec_bfdot)
39
40
+static bool trans_BFMLAL_v(DisasContext *s, arg_qrrr_e *a)
41
+{
42
+ if (!dc_isar_feature(aa64_bf16, s)) {
43
+ return false;
44
+ }
45
+ if (fp_access_check(s)) {
46
+ /* Q bit selects BFMLALB vs BFMLALT. */
47
+ gen_gvec_op4_fpst(s, true, a->rd, a->rn, a->rm, a->rd, false, a->q,
48
+ gen_helper_gvec_bfmlal);
49
+ }
50
+ return true;
51
+}
52
+
53
/*
54
* Advanced SIMD scalar/vector x indexed element
55
*/
56
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(USDOT_vi, aa64_i8mm, do_dot_vector_idx, a,
57
TRANS_FEAT(BFDOT_vi, aa64_bf16, do_dot_vector_idx, a,
58
gen_helper_gvec_bfdot_idx)
59
60
+static bool trans_BFMLAL_vi(DisasContext *s, arg_qrrx_e *a)
61
+{
62
+ if (!dc_isar_feature(aa64_bf16, s)) {
63
+ return false;
64
+ }
65
+ if (fp_access_check(s)) {
66
+ /* Q bit selects BFMLALB vs BFMLALT. */
67
+ gen_gvec_op4_fpst(s, true, a->rd, a->rn, a->rm, a->rd, 0,
68
+ (a->idx << 1) | a->q,
69
+ gen_helper_gvec_bfmlal_idx);
70
+ }
71
+ return true;
72
+}
73
+
74
/*
75
* Advanced SIMD scalar pairwise
76
*/
77
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
78
}
79
feature = dc_isar_feature(aa64_bf16, s);
80
break;
81
- case 0x1f:
82
- switch (size) {
83
- case 3: /* BFMLAL{B,T} */
84
- feature = dc_isar_feature(aa64_bf16, s);
85
- break;
86
- default:
87
- case 1: /* BFDOT */
88
- unallocated_encoding(s);
89
- return;
90
- }
91
- break;
92
default:
93
case 0x02: /* SDOT (vector) */
94
case 0x03: /* USDOT */
95
case 0x10: /* SQRDMLAH (vector) */
96
case 0x11: /* SQRDMLSH (vector) */
97
case 0x12: /* UDOT (vector) */
98
+ case 0x1f: /* BFDOT / BFMLAL */
99
unallocated_encoding(s);
100
return;
101
}
102
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
103
case 0xd: /* BFMMLA */
104
gen_gvec_op4_ool(s, is_q, rd, rn, rm, rd, 0, gen_helper_gvec_bfmmla);
105
return;
106
- case 0xf:
107
- switch (size) {
108
- case 3: /* BFMLAL{B,T} */
109
- gen_gvec_op4_fpst(s, 1, rd, rn, rm, rd, false, is_q,
110
- gen_helper_gvec_bfmlal);
111
- break;
112
- default:
113
- g_assert_not_reached();
114
- }
115
- return;
116
-
117
default:
118
g_assert_not_reached();
119
}
120
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
121
case 0x0b: /* SQDMULL, SQDMULL2 */
122
is_long = true;
123
break;
124
- case 0x0f:
125
- switch (size) {
126
- case 3: /* BFMLAL{B,T} */
127
- if (is_scalar || !dc_isar_feature(aa64_bf16, s)) {
128
- unallocated_encoding(s);
129
- return;
130
- }
131
- /* can't set is_fp without other incorrect size checks */
132
- size = MO_16;
133
- break;
134
- default:
135
- case 0: /* SUDOT */
136
- case 1: /* BFDOT */
137
- case 2: /* USDOT */
138
- unallocated_encoding(s);
139
- return;
140
- }
141
- break;
142
case 0x11: /* FCMLA #0 */
143
case 0x13: /* FCMLA #90 */
144
case 0x15: /* FCMLA #180 */
145
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
146
case 0x0c: /* SQDMULH */
147
case 0x0d: /* SQRDMULH */
148
case 0x0e: /* SDOT */
149
+ case 0x0f: /* SUDOT / BFDOT / USDOT / BFMLAL */
150
case 0x10: /* MLA */
151
case 0x14: /* MLS */
152
case 0x18: /* FMLAL2 */
153
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
154
}
155
156
switch (16 * u + opcode) {
157
- case 0x0f:
158
- switch (extract32(insn, 22, 2)) {
159
- case 3: /* BFMLAL{B,T} */
160
- gen_gvec_op4_fpst(s, 1, rd, rn, rm, rd, 0, (index << 1) | is_q,
161
- gen_helper_gvec_bfmlal_idx);
162
- return;
163
- }
164
- g_assert_not_reached();
165
case 0x11: /* FCMLA #0 */
166
case 0x13: /* FCMLA #90 */
167
case 0x15: /* FCMLA #180 */
168
--
169
2.34.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20240625183536.1672454-10-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/tcg/a64.decode | 4 ++++
9
target/arm/tcg/translate-a64.c | 36 ++++++++--------------------------
10
2 files changed, 12 insertions(+), 28 deletions(-)
11
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
13
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/tcg/a64.decode
15
+++ b/target/arm/tcg/a64.decode
16
@@ -XXX,XX +XXX,XX @@ UDOT_v 0.10 1110 100 ..... 10010 1 ..... ..... @qrrr_s
17
USDOT_v 0.00 1110 100 ..... 10011 1 ..... ..... @qrrr_s
18
BFDOT_v 0.10 1110 010 ..... 11111 1 ..... ..... @qrrr_s
19
BFMLAL_v 0.10 1110 110 ..... 11111 1 ..... ..... @qrrr_h
20
+BFMMLA 0110 1110 010 ..... 11101 1 ..... ..... @rrr_q1e0
21
+SMMLA 0100 1110 100 ..... 10100 1 ..... ..... @rrr_q1e0
22
+UMMLA 0110 1110 100 ..... 10100 1 ..... ..... @rrr_q1e0
23
+USMMLA 0100 1110 100 ..... 10101 1 ..... ..... @rrr_q1e0
24
25
### Advanced SIMD scalar x indexed element
26
27
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
28
index XXXXXXX..XXXXXXX 100644
29
--- a/target/arm/tcg/translate-a64.c
30
+++ b/target/arm/tcg/translate-a64.c
31
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(SDOT_v, aa64_dp, do_dot_vector, a, gen_helper_gvec_sdot_b)
32
TRANS_FEAT(UDOT_v, aa64_dp, do_dot_vector, a, gen_helper_gvec_udot_b)
33
TRANS_FEAT(USDOT_v, aa64_i8mm, do_dot_vector, a, gen_helper_gvec_usdot_b)
34
TRANS_FEAT(BFDOT_v, aa64_bf16, do_dot_vector, a, gen_helper_gvec_bfdot)
35
+TRANS_FEAT(BFMMLA, aa64_bf16, do_dot_vector, a, gen_helper_gvec_bfmmla)
36
+TRANS_FEAT(SMMLA, aa64_i8mm, do_dot_vector, a, gen_helper_gvec_smmla_b)
37
+TRANS_FEAT(UMMLA, aa64_i8mm, do_dot_vector, a, gen_helper_gvec_ummla_b)
38
+TRANS_FEAT(USMMLA, aa64_i8mm, do_dot_vector, a, gen_helper_gvec_usmmla_b)
39
40
static bool trans_BFMLAL_v(DisasContext *s, arg_qrrr_e *a)
41
{
42
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
43
int rot;
44
45
switch (u * 16 + opcode) {
46
- case 0x04: /* SMMLA */
47
- case 0x14: /* UMMLA */
48
- case 0x05: /* USMMLA */
49
- if (!is_q || size != MO_32) {
50
- unallocated_encoding(s);
51
- return;
52
- }
53
- feature = dc_isar_feature(aa64_i8mm, s);
54
- break;
55
case 0x18: /* FCMLA, #0 */
56
case 0x19: /* FCMLA, #90 */
57
case 0x1a: /* FCMLA, #180 */
58
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
59
}
60
feature = dc_isar_feature(aa64_fcma, s);
61
break;
62
- case 0x1d: /* BFMMLA */
63
- if (size != MO_16 || !is_q) {
64
- unallocated_encoding(s);
65
- return;
66
- }
67
- feature = dc_isar_feature(aa64_bf16, s);
68
- break;
69
default:
70
case 0x02: /* SDOT (vector) */
71
case 0x03: /* USDOT */
72
+ case 0x04: /* SMMLA */
73
+ case 0x05: /* USMMLA */
74
case 0x10: /* SQRDMLAH (vector) */
75
case 0x11: /* SQRDMLSH (vector) */
76
case 0x12: /* UDOT (vector) */
77
+ case 0x14: /* UMMLA */
78
+ case 0x1d: /* BFMMLA */
79
case 0x1f: /* BFDOT / BFMLAL */
80
unallocated_encoding(s);
81
return;
82
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
83
}
84
85
switch (opcode) {
86
- case 0x04: /* SMMLA, UMMLA */
87
- gen_gvec_op4_ool(s, 1, rd, rn, rm, rd, 0,
88
- u ? gen_helper_gvec_ummla_b
89
- : gen_helper_gvec_smmla_b);
90
- return;
91
- case 0x05: /* USMMLA */
92
- gen_gvec_op4_ool(s, 1, rd, rn, rm, rd, 0, gen_helper_gvec_usmmla_b);
93
- return;
94
-
95
case 0x8: /* FCMLA, #0 */
96
case 0x9: /* FCMLA, #90 */
97
case 0xa: /* FCMLA, #180 */
98
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
99
}
100
return;
101
102
- case 0xd: /* BFMMLA */
103
- gen_gvec_op4_ool(s, is_q, rd, rn, rm, rd, 0, gen_helper_gvec_bfmmla);
104
- return;
105
default:
106
g_assert_not_reached();
107
}
108
--
109
2.34.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20240625183536.1672454-12-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/tcg/a64.decode | 3 +++
9
target/arm/tcg/translate-a64.c | 33 ++++++++++-----------------------
10
2 files changed, 13 insertions(+), 23 deletions(-)
11
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
13
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/tcg/a64.decode
15
+++ b/target/arm/tcg/a64.decode
16
@@ -XXX,XX +XXX,XX @@ SMMLA 0100 1110 100 ..... 10100 1 ..... ..... @rrr_q1e0
17
UMMLA 0110 1110 100 ..... 10100 1 ..... ..... @rrr_q1e0
18
USMMLA 0100 1110 100 ..... 10101 1 ..... ..... @rrr_q1e0
19
20
+FCADD_90 0.10 1110 ..0 ..... 11100 1 ..... ..... @qrrr_e
21
+FCADD_270 0.10 1110 ..0 ..... 11110 1 ..... ..... @qrrr_e
22
+
23
### Advanced SIMD scalar x indexed element
24
25
FMUL_si 0101 1111 00 .. .... 1001 . 0 ..... ..... @rrx_h
26
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
27
index XXXXXXX..XXXXXXX 100644
28
--- a/target/arm/tcg/translate-a64.c
29
+++ b/target/arm/tcg/translate-a64.c
30
@@ -XXX,XX +XXX,XX @@ static bool trans_BFMLAL_v(DisasContext *s, arg_qrrr_e *a)
31
return true;
32
}
33
34
+static gen_helper_gvec_3_ptr * const f_vector_fcadd[3] = {
35
+ gen_helper_gvec_fcaddh,
36
+ gen_helper_gvec_fcadds,
37
+ gen_helper_gvec_fcaddd,
38
+};
39
+TRANS_FEAT(FCADD_90, aa64_fcma, do_fp3_vector, a, 0, f_vector_fcadd)
40
+TRANS_FEAT(FCADD_270, aa64_fcma, do_fp3_vector, a, 1, f_vector_fcadd)
41
+
42
/*
43
* Advanced SIMD scalar/vector x indexed element
44
*/
45
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
46
case 0x19: /* FCMLA, #90 */
47
case 0x1a: /* FCMLA, #180 */
48
case 0x1b: /* FCMLA, #270 */
49
- case 0x1c: /* FCADD, #90 */
50
- case 0x1e: /* FCADD, #270 */
51
if (size == 0
52
|| (size == 1 && !dc_isar_feature(aa64_fp16, s))
53
|| (size == 3 && !is_q)) {
54
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
55
case 0x11: /* SQRDMLSH (vector) */
56
case 0x12: /* UDOT (vector) */
57
case 0x14: /* UMMLA */
58
+ case 0x1c: /* FCADD, #90 */
59
case 0x1d: /* BFMMLA */
60
+ case 0x1e: /* FCADD, #270 */
61
case 0x1f: /* BFDOT / BFMLAL */
62
unallocated_encoding(s);
63
return;
64
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
65
}
66
return;
67
68
- case 0xc: /* FCADD, #90 */
69
- case 0xe: /* FCADD, #270 */
70
- rot = extract32(opcode, 1, 1);
71
- switch (size) {
72
- case 1:
73
- gen_gvec_op3_fpst(s, is_q, rd, rn, rm, size == 1, rot,
74
- gen_helper_gvec_fcaddh);
75
- break;
76
- case 2:
77
- gen_gvec_op3_fpst(s, is_q, rd, rn, rm, size == 1, rot,
78
- gen_helper_gvec_fcadds);
79
- break;
80
- case 3:
81
- gen_gvec_op3_fpst(s, is_q, rd, rn, rm, size == 1, rot,
82
- gen_helper_gvec_fcaddd);
83
- break;
84
- default:
85
- g_assert_not_reached();
86
- }
87
- return;
88
-
89
default:
90
g_assert_not_reached();
91
}
92
--
93
2.34.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
MLA, MLS, SQDMULH, SQRDMULH, were converted with 8db93dcd3def
4
and f80701cb44d, and this code should have been removed then.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20240625183536.1672454-14-richard.henderson@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/tcg/translate-a64.c | 93 ----------------------------------
12
1 file changed, 93 deletions(-)
13
14
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/tcg/translate-a64.c
17
+++ b/target/arm/tcg/translate-a64.c
18
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
19
int h = extract32(insn, 11, 1);
20
int rn = extract32(insn, 5, 5);
21
int rd = extract32(insn, 0, 5);
22
- bool is_long = false;
23
int index;
24
25
switch (16 * u + opcode) {
26
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
27
unallocated_encoding(s);
28
return;
29
}
30
- is_long = true;
31
break;
32
case 0x03: /* SQDMLAL, SQDMLAL2 */
33
case 0x07: /* SQDMLSL, SQDMLSL2 */
34
case 0x0b: /* SQDMULL, SQDMULL2 */
35
- is_long = true;
36
break;
37
default:
38
case 0x00: /* FMLAL */
39
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
40
41
if (size == 3) {
42
g_assert_not_reached();
43
- } else if (!is_long) {
44
- /* 32 bit floating point, or 16 or 32 bit integer.
45
- * For the 16 bit scalar case we use the usual Neon helpers and
46
- * rely on the fact that 0 op 0 == 0 with no side effects.
47
- */
48
- TCGv_i32 tcg_idx = tcg_temp_new_i32();
49
- int pass, maxpasses;
50
-
51
- if (is_scalar) {
52
- maxpasses = 1;
53
- } else {
54
- maxpasses = is_q ? 4 : 2;
55
- }
56
-
57
- read_vec_element_i32(s, tcg_idx, rm, index, size);
58
-
59
- if (size == 1 && !is_scalar) {
60
- /* The simplest way to handle the 16x16 indexed ops is to duplicate
61
- * the index into both halves of the 32 bit tcg_idx and then use
62
- * the usual Neon helpers.
63
- */
64
- tcg_gen_deposit_i32(tcg_idx, tcg_idx, tcg_idx, 16, 16);
65
- }
66
-
67
- for (pass = 0; pass < maxpasses; pass++) {
68
- TCGv_i32 tcg_op = tcg_temp_new_i32();
69
- TCGv_i32 tcg_res = tcg_temp_new_i32();
70
-
71
- read_vec_element_i32(s, tcg_op, rn, pass, is_scalar ? size : MO_32);
72
-
73
- switch (16 * u + opcode) {
74
- case 0x10: /* MLA */
75
- case 0x14: /* MLS */
76
- {
77
- static NeonGenTwoOpFn * const fns[2][2] = {
78
- { gen_helper_neon_add_u16, gen_helper_neon_sub_u16 },
79
- { tcg_gen_add_i32, tcg_gen_sub_i32 },
80
- };
81
- NeonGenTwoOpFn *genfn;
82
- bool is_sub = opcode == 0x4;
83
-
84
- if (size == 1) {
85
- gen_helper_neon_mul_u16(tcg_res, tcg_op, tcg_idx);
86
- } else {
87
- tcg_gen_mul_i32(tcg_res, tcg_op, tcg_idx);
88
- }
89
- if (opcode == 0x8) {
90
- break;
91
- }
92
- read_vec_element_i32(s, tcg_op, rd, pass, MO_32);
93
- genfn = fns[size - 1][is_sub];
94
- genfn(tcg_res, tcg_op, tcg_res);
95
- break;
96
- }
97
- case 0x0c: /* SQDMULH */
98
- if (size == 1) {
99
- gen_helper_neon_qdmulh_s16(tcg_res, tcg_env,
100
- tcg_op, tcg_idx);
101
- } else {
102
- gen_helper_neon_qdmulh_s32(tcg_res, tcg_env,
103
- tcg_op, tcg_idx);
104
- }
105
- break;
106
- case 0x0d: /* SQRDMULH */
107
- if (size == 1) {
108
- gen_helper_neon_qrdmulh_s16(tcg_res, tcg_env,
109
- tcg_op, tcg_idx);
110
- } else {
111
- gen_helper_neon_qrdmulh_s32(tcg_res, tcg_env,
112
- tcg_op, tcg_idx);
113
- }
114
- break;
115
- default:
116
- case 0x01: /* FMLA */
117
- case 0x05: /* FMLS */
118
- case 0x09: /* FMUL */
119
- case 0x19: /* FMULX */
120
- case 0x1d: /* SQRDMLAH */
121
- case 0x1f: /* SQRDMLSH */
122
- g_assert_not_reached();
123
- }
124
-
125
- if (is_scalar) {
126
- write_fp_sreg(s, rd, tcg_res);
127
- } else {
128
- write_vec_element_i32(s, tcg_res, rd, pass, MO_32);
129
- }
130
- }
131
-
132
- clear_vec_high(s, is_q, rd);
133
} else {
134
/* long ops: 16x16->32 or 32x32->64 */
135
TCGv_i64 tcg_res[2];
136
--
137
2.34.1
diff view generated by jsdifflib
Deleted patch
1
From: Gustavo Romero <gustavo.romero@linaro.org>
2
1
3
Fix comment indentation adding a missing space.
4
5
Signed-off-by: Gustavo Romero <gustavo.romero@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20240624180915.4528-2-gustavo.romero@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/tcg/cpu64.c | 2 +-
11
1 file changed, 1 insertion(+), 1 deletion(-)
12
13
diff --git a/target/arm/tcg/cpu64.c b/target/arm/tcg/cpu64.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/tcg/cpu64.c
16
+++ b/target/arm/tcg/cpu64.c
17
@@ -XXX,XX +XXX,XX @@ void aarch64_max_tcg_initfn(Object *obj)
18
19
t = cpu->isar.id_aa64isar2;
20
t = FIELD_DP64(t, ID_AA64ISAR2, MOPS, 1); /* FEAT_MOPS */
21
- t = FIELD_DP64(t, ID_AA64ISAR2, BC, 1); /* FEAT_HBC */
22
+ t = FIELD_DP64(t, ID_AA64ISAR2, BC, 1); /* FEAT_HBC */
23
t = FIELD_DP64(t, ID_AA64ISAR2, WFXT, 2); /* FEAT_WFxT */
24
cpu->isar.id_aa64isar2 = t;
25
26
--
27
2.34.1
diff view generated by jsdifflib
Deleted patch
1
From: Gustavo Romero <gustavo.romero@linaro.org>
2
1
3
Enable FEAT_Debugv8p8 for max CPU. This feature is out of scope for QEMU
4
since it concerns the external debug interface for JTAG, but is
5
mandatory in Armv8.8 implementations, hence it is reported as supported
6
in the ID registers.
7
8
Signed-off-by: Gustavo Romero <gustavo.romero@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20240624180915.4528-4-gustavo.romero@linaro.org
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
docs/system/arm/emulation.rst | 1 +
14
target/arm/tcg/cpu32.c | 6 +++---
15
target/arm/tcg/cpu64.c | 2 +-
16
3 files changed, 5 insertions(+), 4 deletions(-)
17
18
diff --git a/docs/system/arm/emulation.rst b/docs/system/arm/emulation.rst
19
index XXXXXXX..XXXXXXX 100644
20
--- a/docs/system/arm/emulation.rst
21
+++ b/docs/system/arm/emulation.rst
22
@@ -XXX,XX +XXX,XX @@ the following architecture extensions:
23
- FEAT_Debugv8p1 (Debug with VHE)
24
- FEAT_Debugv8p2 (Debug changes for v8.2)
25
- FEAT_Debugv8p4 (Debug changes for v8.4)
26
+- FEAT_Debugv8p8 (Debug changes for v8.8)
27
- FEAT_DotProd (Advanced SIMD dot product instructions)
28
- FEAT_DoubleFault (Double Fault Extension)
29
- FEAT_E0PD (Preventing EL0 access to halves of address maps)
30
diff --git a/target/arm/tcg/cpu32.c b/target/arm/tcg/cpu32.c
31
index XXXXXXX..XXXXXXX 100644
32
--- a/target/arm/tcg/cpu32.c
33
+++ b/target/arm/tcg/cpu32.c
34
@@ -XXX,XX +XXX,XX @@ void aa32_max_features(ARMCPU *cpu)
35
cpu->isar.id_pfr2 = t;
36
37
t = cpu->isar.id_dfr0;
38
- t = FIELD_DP32(t, ID_DFR0, COPDBG, 9); /* FEAT_Debugv8p4 */
39
- t = FIELD_DP32(t, ID_DFR0, COPSDBG, 9); /* FEAT_Debugv8p4 */
40
+ t = FIELD_DP32(t, ID_DFR0, COPDBG, 10); /* FEAT_Debugv8p8 */
41
+ t = FIELD_DP32(t, ID_DFR0, COPSDBG, 10); /* FEAT_Debugv8p8 */
42
t = FIELD_DP32(t, ID_DFR0, PERFMON, 6); /* FEAT_PMUv3p5 */
43
cpu->isar.id_dfr0 = t;
44
45
@@ -XXX,XX +XXX,XX @@ void aa32_max_features(ARMCPU *cpu)
46
t = 0x00008000;
47
t = FIELD_DP32(t, DBGDIDR, SE_IMP, 1);
48
t = FIELD_DP32(t, DBGDIDR, NSUHD_IMP, 1);
49
- t = FIELD_DP32(t, DBGDIDR, VERSION, 6); /* Armv8 debug */
50
+ t = FIELD_DP32(t, DBGDIDR, VERSION, 10); /* FEAT_Debugv8p8 */
51
t = FIELD_DP32(t, DBGDIDR, CTX_CMPS, 1);
52
t = FIELD_DP32(t, DBGDIDR, BRPS, 5);
53
t = FIELD_DP32(t, DBGDIDR, WRPS, 3);
54
diff --git a/target/arm/tcg/cpu64.c b/target/arm/tcg/cpu64.c
55
index XXXXXXX..XXXXXXX 100644
56
--- a/target/arm/tcg/cpu64.c
57
+++ b/target/arm/tcg/cpu64.c
58
@@ -XXX,XX +XXX,XX @@ void aarch64_max_tcg_initfn(Object *obj)
59
cpu->isar.id_aa64zfr0 = t;
60
61
t = cpu->isar.id_aa64dfr0;
62
- t = FIELD_DP64(t, ID_AA64DFR0, DEBUGVER, 9); /* FEAT_Debugv8p4 */
63
+ t = FIELD_DP64(t, ID_AA64DFR0, DEBUGVER, 10); /* FEAT_Debugv8p8 */
64
t = FIELD_DP64(t, ID_AA64DFR0, PMUVER, 6); /* FEAT_PMUv3p5 */
65
t = FIELD_DP64(t, ID_AA64DFR0, HPMN0, 1); /* FEAT_HPMN0 */
66
cpu->isar.id_aa64dfr0 = t;
67
--
68
2.34.1
diff view generated by jsdifflib
1
From: Patrick Leis <venture@google.com>
1
From: Khem Raj <raj.khem@gmail.com>
2
2
3
Signed-off-by: Patrick Leis <venture@google.com>
3
glibc 2.41+ has added [1] definitions for sched_setattr and
4
Message-id: 20240626211623.3510701-1-venture@google.com
4
sched_getattr functions and struct sched_attr. Therefore, it needs
5
to be checked for here as well before defining sched_attr, to avoid
6
a compilation failure.
7
8
Define sched_attr conditionally only when SCHED_ATTR_SIZE_VER0 is
9
not defined.
10
11
[1] https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=21571ca0d70302909cf72707b2a7736cf12190a0;hp=298bc488fdc047da37482f4003023cb9adef78f8
12
13
Signed-off-by: Khem Raj <raj.khem@gmail.com>
14
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2799
15
Cc: qemu-stable@nongnu.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
18
---
8
MAINTAINERS | 2 +-
19
linux-user/syscall.c | 4 +++-
9
1 file changed, 1 insertion(+), 1 deletion(-)
20
1 file changed, 3 insertions(+), 1 deletion(-)
10
21
11
diff --git a/MAINTAINERS b/MAINTAINERS
22
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
12
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
13
--- a/MAINTAINERS
24
--- a/linux-user/syscall.c
14
+++ b/MAINTAINERS
25
+++ b/linux-user/syscall.c
15
@@ -XXX,XX +XXX,XX @@ F: hw/net/tulip.c
26
@@ -XXX,XX +XXX,XX @@ _syscall3(int, sys_sched_getaffinity, pid_t, pid, unsigned int, len,
16
F: hw/net/tulip.h
27
#define __NR_sys_sched_setaffinity __NR_sched_setaffinity
17
28
_syscall3(int, sys_sched_setaffinity, pid_t, pid, unsigned int, len,
18
pca954x
29
unsigned long *, user_mask_ptr);
19
-M: Patrick Venture <venture@google.com>
30
-/* sched_attr is not defined in glibc */
20
+M: Patrick Leis <venture@google.com>
31
+/* sched_attr is not defined in glibc < 2.41 */
21
S: Maintained
32
+#ifndef SCHED_ATTR_SIZE_VER0
22
F: hw/i2c/i2c_mux_pca954x.c
33
struct sched_attr {
23
F: include/hw/i2c/i2c_mux_pca954x.h
34
uint32_t size;
35
uint32_t sched_policy;
36
@@ -XXX,XX +XXX,XX @@ struct sched_attr {
37
uint32_t sched_util_min;
38
uint32_t sched_util_max;
39
};
40
+#endif
41
#define __NR_sys_sched_getattr __NR_sched_getattr
42
_syscall4(int, sys_sched_getattr, pid_t, pid, struct sched_attr *, attr,
43
unsigned int, size, unsigned int, flags);
24
--
44
--
25
2.34.1
45
2.34.1
diff view generated by jsdifflib
Deleted patch
1
From: Sai Pavan Boddu <sai.pavan.boddu@amd.com>
2
1
3
Read boot-mode value as machine property and propagate that to
4
SLCR.BOOT_MODE register.
5
6
Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@amd.com>
7
Acked-by: Edgar E. Iglesias <edgar.iglesias@amd.com>
8
Reviewed-by: Francisco Iglesias <francisco.iglesias@amd.com>
9
Message-id: 20240621125906.1300995-3-sai.pavan.boddu@amd.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/arm/xilinx_zynq.c | 31 +++++++++++++++++++++++++++++++
13
1 file changed, 31 insertions(+)
14
15
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/xilinx_zynq.c
18
+++ b/hw/arm/xilinx_zynq.c
19
@@ -XXX,XX +XXX,XX @@
20
#include "qom/object.h"
21
#include "exec/tswap.h"
22
#include "target/arm/cpu-qom.h"
23
+#include "qapi/visitor.h"
24
25
#define TYPE_ZYNQ_MACHINE MACHINE_TYPE_NAME("xilinx-zynq-a9")
26
OBJECT_DECLARE_SIMPLE_TYPE(ZynqMachineState, ZYNQ_MACHINE)
27
@@ -XXX,XX +XXX,XX @@ struct ZynqMachineState {
28
MachineState parent;
29
Clock *ps_clk;
30
ARMCPU *cpu[ZYNQ_MAX_CPUS];
31
+ uint8_t boot_mode;
32
};
33
34
static void zynq_write_board_setup(ARMCPU *cpu,
35
@@ -XXX,XX +XXX,XX @@ static inline int zynq_init_spi_flashes(uint32_t base_addr, qemu_irq irq,
36
return unit;
37
}
38
39
+static void zynq_set_boot_mode(Object *obj, const char *str,
40
+ Error **errp)
41
+{
42
+ ZynqMachineState *m = ZYNQ_MACHINE(obj);
43
+ uint8_t mode = 0;
44
+
45
+ if (!strncasecmp(str, "qspi", 4)) {
46
+ mode = 1;
47
+ } else if (!strncasecmp(str, "sd", 2)) {
48
+ mode = 5;
49
+ } else if (!strncasecmp(str, "nor", 3)) {
50
+ mode = 2;
51
+ } else if (!strncasecmp(str, "jtag", 4)) {
52
+ mode = 0;
53
+ } else {
54
+ error_setg(errp, "%s boot mode not supported", str);
55
+ return;
56
+ }
57
+ m->boot_mode = mode;
58
+}
59
+
60
static void zynq_init(MachineState *machine)
61
{
62
ZynqMachineState *zynq_machine = ZYNQ_MACHINE(machine);
63
@@ -XXX,XX +XXX,XX @@ static void zynq_init(MachineState *machine)
64
/* Create slcr, keep a pointer to connect clocks */
65
slcr = qdev_new("xilinx-zynq_slcr");
66
qdev_connect_clock_in(slcr, "ps_clk", zynq_machine->ps_clk);
67
+ qdev_prop_set_uint8(slcr, "boot-mode", zynq_machine->boot_mode);
68
sysbus_realize_and_unref(SYS_BUS_DEVICE(slcr), &error_fatal);
69
sysbus_mmio_map(SYS_BUS_DEVICE(slcr), 0, 0xF8000000);
70
71
@@ -XXX,XX +XXX,XX @@ static void zynq_machine_class_init(ObjectClass *oc, void *data)
72
NULL
73
};
74
MachineClass *mc = MACHINE_CLASS(oc);
75
+ ObjectProperty *prop;
76
mc->desc = "Xilinx Zynq Platform Baseboard for Cortex-A9";
77
mc->init = zynq_init;
78
mc->max_cpus = ZYNQ_MAX_CPUS;
79
@@ -XXX,XX +XXX,XX @@ static void zynq_machine_class_init(ObjectClass *oc, void *data)
80
mc->ignore_memory_transaction_failures = true;
81
mc->valid_cpu_types = valid_cpu_types;
82
mc->default_ram_id = "zynq.ext_ram";
83
+ prop = object_class_property_add_str(oc, "boot-mode", NULL,
84
+ zynq_set_boot_mode);
85
+ object_class_property_set_description(oc, "boot-mode",
86
+ "Supported boot modes:"
87
+ " jtag qspi sd nor");
88
+ object_property_set_default_str(prop, "qspi");
89
}
90
91
static const TypeInfo zynq_machine_type = {
92
--
93
2.34.1
diff view generated by jsdifflib
Deleted patch
1
From: Sai Pavan Boddu <sai.pavan.boddu@amd.com>
2
1
3
Added the supported device list and an example command.
4
5
Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@amd.com>
6
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@amd.com>
7
Reviewed-by: Francisco Iglesias <francisco.iglesias@amd.com>
8
Message-id: 20240621125906.1300995-4-sai.pavan.boddu@amd.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
MAINTAINERS | 1 +
12
docs/system/arm/xlnx-zynq.rst | 47 +++++++++++++++++++++++++++++++++++
13
docs/system/target-arm.rst | 1 +
14
3 files changed, 49 insertions(+)
15
create mode 100644 docs/system/arm/xlnx-zynq.rst
16
17
diff --git a/MAINTAINERS b/MAINTAINERS
18
index XXXXXXX..XXXXXXX 100644
19
--- a/MAINTAINERS
20
+++ b/MAINTAINERS
21
@@ -XXX,XX +XXX,XX @@ F: hw/adc/zynq-xadc.c
22
F: include/hw/misc/zynq_slcr.h
23
F: include/hw/adc/zynq-xadc.h
24
X: hw/ssi/xilinx_*
25
+F: docs/system/arm/xlnx-zynq.rst
26
27
Xilinx ZynqMP and Versal
28
M: Alistair Francis <alistair@alistair23.me>
29
diff --git a/docs/system/arm/xlnx-zynq.rst b/docs/system/arm/xlnx-zynq.rst
30
new file mode 100644
31
index XXXXXXX..XXXXXXX
32
--- /dev/null
33
+++ b/docs/system/arm/xlnx-zynq.rst
34
@@ -XXX,XX +XXX,XX @@
35
+Xilinx Zynq board (``xilinx-zynq-a9``)
36
+======================================
37
+The Zynq 7000 family is based on the AMD SoC architecture. These products
38
+integrate a feature-rich dual or single-core Arm Cortex-A9 MPCore based
39
+processing system (PS) and AMD programmable logic (PL) in a single device.
40
+
41
+More details here:
42
+https://docs.amd.com/r/en-US/ug585-zynq-7000-SoC-TRM/Zynq-7000-SoC-Technical-Reference-Manual
43
+
44
+QEMU xilinx-zynq-a9 board supports following devices:
45
+ - A9 MPCORE
46
+ - cortex-a9
47
+ - GIC v1
48
+ - Generic timer
49
+ - wdt
50
+ - OCM 256KB
51
+ - SMC SRAM@0xe2000000 64MB
52
+ - Zynq SLCR
53
+ - SPI x2
54
+ - QSPI
55
+ - UART
56
+ - TTC x2
57
+ - Gigabit Ethernet Controller x2
58
+ - SD Controller x2
59
+ - XADC
60
+ - Arm PrimeCell DMA Controller
61
+ - DDR Memory
62
+ - USB 2.0 x2
63
+
64
+Running
65
+"""""""
66
+Direct Linux boot of a generic ARM upstream Linux kernel:
67
+
68
+.. code-block:: bash
69
+
70
+ $ qemu-system-aarch64 -M xilinx-zynq-a9 \
71
+ -dtb zynq-zc702.dtb -serial null -serial mon:stdio \
72
+ -display none -m 1024 \
73
+ -initrd rootfs.cpio.gz -kernel zImage
74
+
75
+For configuring the boot-mode provide the following on the command line:
76
+
77
+.. code-block:: bash
78
+
79
+ -machine boot-mode=qspi
80
+
81
+Supported values are jtag, sd, qspi, nor.
82
diff --git a/docs/system/target-arm.rst b/docs/system/target-arm.rst
83
index XXXXXXX..XXXXXXX 100644
84
--- a/docs/system/target-arm.rst
85
+++ b/docs/system/target-arm.rst
86
@@ -XXX,XX +XXX,XX @@ undocumented; you can get a complete list by running
87
arm/virt
88
arm/xenpvh
89
arm/xlnx-versal-virt
90
+ arm/xlnx-zynq
91
92
Emulated CPU architecture support
93
=================================
94
--
95
2.34.1
diff view generated by jsdifflib