1
The following changes since commit ad1b4ec39caa5b3f17cbd8160283a03a3dcfe2ae:
1
Mostly straightforward bugfixes. The new Xilinx devices are
2
arguably 'new feature', but they're fixing a regression where
3
our changes to PSCI in commit 3f37979bf mean that EL3 guest
4
code now needs to talk to a proper emulated power-controller
5
device to turn on secondary CPUs; and it's not yet rc1 and
6
they only affect the Xilinx board, so it seems OK to me.
2
7
3
Merge remote-tracking branch 'remotes/kraxel/tags/input-20180515-pull-request' into staging (2018-05-15 12:50:06 +0100)
8
thanks
9
-- PMM
10
11
The following changes since commit 1d60bb4b14601e38ed17384277aa4c30c57925d3:
12
13
Merge tag 'pull-request-2022-03-15v2' of https://gitlab.com/thuth/qemu into staging (2022-03-16 10:43:58 +0000)
4
14
5
are available in the Git repository at:
15
are available in the Git repository at:
6
16
7
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180515
17
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20220318
8
18
9
for you to fetch changes up to ae7651804748c6b479d5ae09aeac4edb9c44f76e:
19
for you to fetch changes up to 79d54c9eac04c554e3c081589542f801ace71797:
10
20
11
tcg: Optionally log FPU state in TCG -d cpu logging (2018-05-15 14:58:44 +0100)
21
util/osdep: Remove some early cruft (2022-03-18 11:32:13 +0000)
12
22
13
----------------------------------------------------------------
23
----------------------------------------------------------------
14
target-arm queue:
24
target-arm queue:
15
* Fix coverity nit in int_to_float code
25
* Fix sve2 ldnt1 and stnt1
16
* Don't set Invalid for float-to-int(MAXINT)
26
* Fix pauth_check_trap vs SEL2
17
* Fix fp_status_f16 tininess before rounding
27
* Fix handling of LPAE block descriptors
18
* Add various missing insns from the v8.2-FP16 extension
28
* hw/dma/xlnx_csu_dma: Set TYPE_XLNX_CSU_DMA class_size
19
* Fix sqrt_f16 exception raising
29
* hw/misc/npcm7xx_clk: Don't leak string in npcm7xx_clk_sel_init()
20
* sdcard: Correct CRC16 offset in sd_function_switch()
30
* nsis installer: List emulators in alphabetical order
21
* tcg: Optionally log FPU state in TCG -d cpu logging
31
* nsis installer: Suppress "ANSI targets are deprecated" warning
32
* nsis installer: Fix mouse-over descriptions for emulators
33
* hw/arm/virt: Fix gic-version=max when CONFIG_ARM_GICV3_TCG is unset
34
* Improve M-profile vector table access logging
35
* Xilinx ZynqMP: model CRF and APU control
36
* Fix compile issues on modern Solaris
22
37
23
----------------------------------------------------------------
38
----------------------------------------------------------------
24
Alex Bennée (5):
39
Andrew Deason (3):
25
fpu/softfloat: int_to_float ensure r fully initialised
40
util/osdep: Avoid madvise proto on modern Solaris
26
target/arm: Implement FCMP for fp16
41
hw/i386/acpi-build: Avoid 'sun' identifier
27
target/arm: Implement FCSEL for fp16
42
util/osdep: Remove some early cruft
28
target/arm: Implement FMOV (immediate) for fp16
29
target/arm: Fix sqrt_f16 exception raising
30
43
31
Peter Maydell (3):
44
Edgar E. Iglesias (6):
32
fpu/softfloat: Don't set Invalid for float-to-int(MAXINT)
45
hw/arm/xlnx-zynqmp: Add an unimplemented SERDES area
33
target/arm: Fix fp_status_f16 tininess before rounding
46
target/arm: Make rvbar settable after realize
34
tcg: Optionally log FPU state in TCG -d cpu logging
47
hw/misc: Add a model of the Xilinx ZynqMP CRF
48
hw/arm/xlnx-zynqmp: Connect the ZynqMP CRF
49
hw/misc: Add a model of the Xilinx ZynqMP APU Control
50
hw/arm/xlnx-zynqmp: Connect the ZynqMP APU Control
35
51
36
Philippe Mathieu-Daudé (1):
52
Eric Auger (2):
37
sdcard: Correct CRC16 offset in sd_function_switch()
53
hw/intc: Rename CONFIG_ARM_GIC_TCG into CONFIG_ARM_GICV3_TCG
54
hw/arm/virt: Fix gic-version=max when CONFIG_ARM_GICV3_TCG is unset
38
55
39
Richard Henderson (7):
56
Peter Maydell (8):
40
target/arm: Implement FMOV (general) for fp16
57
target/arm: Fix handling of LPAE block descriptors
41
target/arm: Early exit after unallocated_encoding in disas_fp_int_conv
58
hw/dma/xlnx_csu_dma: Set TYPE_XLNX_CSU_DMA class_size
42
target/arm: Implement FCVT (scalar, integer) for fp16
59
hw/misc/npcm7xx_clk: Don't leak string in npcm7xx_clk_sel_init()
43
target/arm: Implement FCVT (scalar, fixed-point) for fp16
60
nsis installer: List emulators in alphabetical order
44
target/arm: Introduce and use read_fp_hreg
61
nsis installer: Suppress "ANSI targets are deprecated" warning
45
target/arm: Implement FP data-processing (2 source) for fp16
62
nsis installer: Fix mouse-over descriptions for emulators
46
target/arm: Implement FP data-processing (3 source) for fp16
63
target/arm: Log M-profile vector table accesses
64
target/arm: Log fault address for M-profile faults
47
65
48
include/qemu/log.h | 1 +
66
Richard Henderson (2):
49
target/arm/helper-a64.h | 2 +
67
target/arm: Fix sve2 ldnt1 and stnt1
50
target/arm/helper.h | 6 +
68
target/arm: Fix pauth_check_trap vs SEL2
51
accel/tcg/cpu-exec.c | 9 +-
52
fpu/softfloat.c | 6 +-
53
hw/sd/sd.c | 2 +-
54
target/arm/cpu.c | 2 +
55
target/arm/helper-a64.c | 10 ++
56
target/arm/helper.c | 38 +++-
57
target/arm/translate-a64.c | 421 ++++++++++++++++++++++++++++++++++++++-------
58
util/log.c | 2 +
59
11 files changed, 428 insertions(+), 71 deletions(-)
60
69
70
meson.build | 23 ++-
71
include/hw/arm/xlnx-zynqmp.h | 4 +
72
include/hw/misc/xlnx-zynqmp-apu-ctrl.h | 93 ++++++++++++
73
include/hw/misc/xlnx-zynqmp-crf.h | 211 ++++++++++++++++++++++++++
74
include/qemu/osdep.h | 8 +
75
target/arm/cpu.h | 3 +-
76
target/arm/sve.decode | 5 +-
77
hw/arm/virt.c | 7 +-
78
hw/arm/xlnx-zynqmp.c | 46 +++++-
79
hw/dma/xlnx_csu_dma.c | 1 +
80
hw/i386/acpi-build.c | 4 +-
81
hw/misc/npcm7xx_clk.c | 4 +-
82
hw/misc/xlnx-zynqmp-apu-ctrl.c | 253 +++++++++++++++++++++++++++++++
83
hw/misc/xlnx-zynqmp-crf.c | 266 +++++++++++++++++++++++++++++++++
84
target/arm/cpu.c | 17 ++-
85
target/arm/helper.c | 20 ++-
86
target/arm/m_helper.c | 11 ++
87
target/arm/pauth_helper.c | 2 +-
88
target/arm/translate-sve.c | 51 ++++++-
89
tests/tcg/aarch64/test-826.c | 50 +++++++
90
util/osdep.c | 10 --
91
hw/intc/Kconfig | 2 +-
92
hw/intc/meson.build | 4 +-
93
hw/misc/meson.build | 2 +
94
qemu.nsi | 8 +-
95
scripts/nsis.py | 17 ++-
96
tests/tcg/aarch64/Makefile.target | 4 +
97
tests/tcg/configure.sh | 4 +
98
28 files changed, 1084 insertions(+), 46 deletions(-)
99
create mode 100644 include/hw/misc/xlnx-zynqmp-apu-ctrl.h
100
create mode 100644 include/hw/misc/xlnx-zynqmp-crf.h
101
create mode 100644 hw/misc/xlnx-zynqmp-apu-ctrl.c
102
create mode 100644 hw/misc/xlnx-zynqmp-crf.c
103
create mode 100644 tests/tcg/aarch64/test-826.c
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
We missed all of the scalar fp16 binary operations.
3
For both ldnt1 and stnt1, the meaning of the Rn and Rm are different
4
4
from ld1 and st1: the vector and integer registers are reversed, and
5
Cc: qemu-stable@nongnu.org
5
the integer register 31 refers to XZR instead of SP.
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
7
Secondly, the 64-bit version of ldnt1 was being interpreted as
8
32-bit unpacked unscaled offset instead of 64-bit unscaled offset,
9
which discarded the upper 32 bits of the address coming from
10
the vector argument.
11
12
Thirdly, validate that the memory element size is in range for the
13
vector element size for ldnt1. For ld1, we do this via independent
14
decode patterns, but for ldnt1 we need to do it manually.
15
16
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/826
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
17
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Tested-by: Alex Bennée <alex.bennee@linaro.org>
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20180512003217.9105-7-richard.henderson@linaro.org
19
Message-id: 20220308031655.240710-1-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
21
---
12
target/arm/translate-a64.c | 65 ++++++++++++++++++++++++++++++++++++++
22
target/arm/sve.decode | 5 ++-
13
1 file changed, 65 insertions(+)
23
target/arm/translate-sve.c | 51 +++++++++++++++++++++++++++++--
14
24
tests/tcg/aarch64/test-826.c | 50 ++++++++++++++++++++++++++++++
15
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
25
tests/tcg/aarch64/Makefile.target | 4 +++
26
tests/tcg/configure.sh | 4 +++
27
5 files changed, 109 insertions(+), 5 deletions(-)
28
create mode 100644 tests/tcg/aarch64/test-826.c
29
30
diff --git a/target/arm/sve.decode b/target/arm/sve.decode
16
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-a64.c
32
--- a/target/arm/sve.decode
18
+++ b/target/arm/translate-a64.c
33
+++ b/target/arm/sve.decode
19
@@ -XXX,XX +XXX,XX @@ static void handle_fp_2src_double(DisasContext *s, int opcode,
34
@@ -XXX,XX +XXX,XX @@ USDOT_zzzz 01000100 .. 0 ..... 011 110 ..... ..... @rda_rn_rm
20
tcg_temp_free_i64(tcg_res);
35
36
### SVE2 Memory Gather Load Group
37
38
-# SVE2 64-bit gather non-temporal load
39
-# (scalar plus unpacked 32-bit unscaled offsets)
40
+# SVE2 64-bit gather non-temporal load (scalar plus 64-bit unscaled offsets)
41
LDNT1_zprz 1100010 msz:2 00 rm:5 1 u:1 0 pg:3 rn:5 rd:5 \
42
- &rprr_gather_load xs=0 esz=3 scale=0 ff=0
43
+ &rprr_gather_load xs=2 esz=3 scale=0 ff=0
44
45
# SVE2 32-bit gather non-temporal load (scalar plus 32-bit unscaled offsets)
46
LDNT1_zprz 1000010 msz:2 00 rm:5 10 u:1 pg:3 rn:5 rd:5 \
47
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
48
index XXXXXXX..XXXXXXX 100644
49
--- a/target/arm/translate-sve.c
50
+++ b/target/arm/translate-sve.c
51
@@ -XXX,XX +XXX,XX @@ static bool trans_LD1_zpiz(DisasContext *s, arg_LD1_zpiz *a)
52
53
static bool trans_LDNT1_zprz(DisasContext *s, arg_LD1_zprz *a)
54
{
55
+ gen_helper_gvec_mem_scatter *fn = NULL;
56
+ bool be = s->be_data == MO_BE;
57
+ bool mte = s->mte_active[0];
58
+
59
+ if (a->esz < a->msz + !a->u) {
60
+ return false;
61
+ }
62
if (!dc_isar_feature(aa64_sve2, s)) {
63
return false;
64
}
65
- return trans_LD1_zprz(s, a);
66
+ if (!sve_access_check(s)) {
67
+ return true;
68
+ }
69
+
70
+ switch (a->esz) {
71
+ case MO_32:
72
+ fn = gather_load_fn32[mte][be][0][0][a->u][a->msz];
73
+ break;
74
+ case MO_64:
75
+ fn = gather_load_fn64[mte][be][0][2][a->u][a->msz];
76
+ break;
77
+ }
78
+ assert(fn != NULL);
79
+
80
+ do_mem_zpz(s, a->rd, a->pg, a->rn, 0,
81
+ cpu_reg(s, a->rm), a->msz, false, fn);
82
+ return true;
21
}
83
}
22
84
23
+/* Floating-point data-processing (2 source) - half precision */
85
/* Indexed by [mte][be][xs][msz]. */
24
+static void handle_fp_2src_half(DisasContext *s, int opcode,
86
@@ -XXX,XX +XXX,XX @@ static bool trans_ST1_zpiz(DisasContext *s, arg_ST1_zpiz *a)
25
+ int rd, int rn, int rm)
87
26
+{
88
static bool trans_STNT1_zprz(DisasContext *s, arg_ST1_zprz *a)
27
+ TCGv_i32 tcg_op1;
89
{
28
+ TCGv_i32 tcg_op2;
90
+ gen_helper_gvec_mem_scatter *fn;
29
+ TCGv_i32 tcg_res;
91
+ bool be = s->be_data == MO_BE;
30
+ TCGv_ptr fpst;
92
+ bool mte = s->mte_active[0];
31
+
93
+
32
+ tcg_res = tcg_temp_new_i32();
94
+ if (a->esz < a->msz) {
33
+ fpst = get_fpstatus_ptr(true);
95
+ return false;
34
+ tcg_op1 = read_fp_hreg(s, rn);
96
+ }
35
+ tcg_op2 = read_fp_hreg(s, rm);
97
if (!dc_isar_feature(aa64_sve2, s)) {
36
+
98
return false;
37
+ switch (opcode) {
99
}
38
+ case 0x0: /* FMUL */
100
- return trans_ST1_zprz(s, a);
39
+ gen_helper_advsimd_mulh(tcg_res, tcg_op1, tcg_op2, fpst);
101
+ if (!sve_access_check(s)) {
40
+ break;
102
+ return true;
41
+ case 0x1: /* FDIV */
103
+ }
42
+ gen_helper_advsimd_divh(tcg_res, tcg_op1, tcg_op2, fpst);
104
+
43
+ break;
105
+ switch (a->esz) {
44
+ case 0x2: /* FADD */
106
+ case MO_32:
45
+ gen_helper_advsimd_addh(tcg_res, tcg_op1, tcg_op2, fpst);
107
+ fn = scatter_store_fn32[mte][be][0][a->msz];
46
+ break;
108
+ break;
47
+ case 0x3: /* FSUB */
109
+ case MO_64:
48
+ gen_helper_advsimd_subh(tcg_res, tcg_op1, tcg_op2, fpst);
110
+ fn = scatter_store_fn64[mte][be][2][a->msz];
49
+ break;
50
+ case 0x4: /* FMAX */
51
+ gen_helper_advsimd_maxh(tcg_res, tcg_op1, tcg_op2, fpst);
52
+ break;
53
+ case 0x5: /* FMIN */
54
+ gen_helper_advsimd_minh(tcg_res, tcg_op1, tcg_op2, fpst);
55
+ break;
56
+ case 0x6: /* FMAXNM */
57
+ gen_helper_advsimd_maxnumh(tcg_res, tcg_op1, tcg_op2, fpst);
58
+ break;
59
+ case 0x7: /* FMINNM */
60
+ gen_helper_advsimd_minnumh(tcg_res, tcg_op1, tcg_op2, fpst);
61
+ break;
62
+ case 0x8: /* FNMUL */
63
+ gen_helper_advsimd_mulh(tcg_res, tcg_op1, tcg_op2, fpst);
64
+ tcg_gen_xori_i32(tcg_res, tcg_res, 0x8000);
65
+ break;
111
+ break;
66
+ default:
112
+ default:
67
+ g_assert_not_reached();
113
+ g_assert_not_reached();
68
+ }
114
+ }
69
+
115
+
70
+ write_fp_sreg(s, rd, tcg_res);
116
+ do_mem_zpz(s, a->rd, a->pg, a->rn, 0,
71
+
117
+ cpu_reg(s, a->rm), a->msz, true, fn);
72
+ tcg_temp_free_ptr(fpst);
118
+ return true;
73
+ tcg_temp_free_i32(tcg_op1);
119
}
74
+ tcg_temp_free_i32(tcg_op2);
120
75
+ tcg_temp_free_i32(tcg_res);
121
/*
122
diff --git a/tests/tcg/aarch64/test-826.c b/tests/tcg/aarch64/test-826.c
123
new file mode 100644
124
index XXXXXXX..XXXXXXX
125
--- /dev/null
126
+++ b/tests/tcg/aarch64/test-826.c
127
@@ -XXX,XX +XXX,XX @@
128
+#include <sys/mman.h>
129
+#include <unistd.h>
130
+#include <signal.h>
131
+#include <stdlib.h>
132
+#include <stdio.h>
133
+#include <assert.h>
134
+
135
+static void *expected;
136
+
137
+void sigsegv(int sig, siginfo_t *info, void *vuc)
138
+{
139
+ ucontext_t *uc = vuc;
140
+
141
+ assert(info->si_addr == expected);
142
+ uc->uc_mcontext.pc += 4;
76
+}
143
+}
77
+
144
+
78
/* Floating point data-processing (2 source)
145
+int main()
79
* 31 30 29 28 24 23 22 21 20 16 15 12 11 10 9 5 4 0
146
+{
80
* +---+---+---+-----------+------+---+------+--------+-----+------+------+
147
+ struct sigaction sa = {
81
@@ -XXX,XX +XXX,XX @@ static void disas_fp_2src(DisasContext *s, uint32_t insn)
148
+ .sa_sigaction = sigsegv,
82
}
149
+ .sa_flags = SA_SIGINFO
83
handle_fp_2src_double(s, opcode, rd, rn, rm);
150
+ };
84
break;
151
+
85
+ case 3:
152
+ void *page;
86
+ if (!arm_dc_feature(s, ARM_FEATURE_V8_FP16)) {
153
+ long ofs;
87
+ unallocated_encoding(s);
154
+
88
+ return;
155
+ if (sigaction(SIGSEGV, &sa, NULL) < 0) {
89
+ }
156
+ perror("sigaction");
90
+ if (!fp_access_check(s)) {
157
+ return EXIT_FAILURE;
91
+ return;
158
+ }
92
+ }
159
+
93
+ handle_fp_2src_half(s, opcode, rd, rn, rm);
160
+ page = mmap(0, getpagesize(), PROT_NONE, MAP_PRIVATE | MAP_ANON, -1, 0);
94
+ break;
161
+ if (page == MAP_FAILED) {
95
default:
162
+ perror("mmap");
96
unallocated_encoding(s);
163
+ return EXIT_FAILURE;
97
}
164
+ }
165
+
166
+ ofs = 0x124;
167
+ expected = page + ofs;
168
+
169
+ asm("ptrue p0.d, vl1\n\t"
170
+ "dup z0.d, %0\n\t"
171
+ "ldnt1h {z1.d}, p0/z, [z0.d, %1]\n\t"
172
+ "dup z1.d, %1\n\t"
173
+ "ldnt1h {z0.d}, p0/z, [z1.d, %0]"
174
+ : : "r"(page), "r"(ofs) : "v0", "v1");
175
+
176
+ return EXIT_SUCCESS;
177
+}
178
diff --git a/tests/tcg/aarch64/Makefile.target b/tests/tcg/aarch64/Makefile.target
179
index XXXXXXX..XXXXXXX 100644
180
--- a/tests/tcg/aarch64/Makefile.target
181
+++ b/tests/tcg/aarch64/Makefile.target
182
@@ -XXX,XX +XXX,XX @@ run-gdbstub-sve-ioctls: sve-ioctls
183
184
EXTRA_RUNS += run-gdbstub-sysregs run-gdbstub-sve-ioctls
185
endif
186
+endif
187
188
+ifneq ($(DOCKER_IMAGE)$(CROSS_CC_HAS_SVE2),)
189
+AARCH64_TESTS += test-826
190
+test-826: CFLAGS+=-march=armv8.1-a+sve2
191
endif
192
193
TESTS += $(AARCH64_TESTS)
194
diff --git a/tests/tcg/configure.sh b/tests/tcg/configure.sh
195
index XXXXXXX..XXXXXXX 100755
196
--- a/tests/tcg/configure.sh
197
+++ b/tests/tcg/configure.sh
198
@@ -XXX,XX +XXX,XX @@ for target in $target_list; do
199
-march=armv8.1-a+sve -o $TMPE $TMPC; then
200
echo "CROSS_CC_HAS_SVE=y" >> $config_target_mak
201
fi
202
+ if do_compiler "$target_compiler" $target_compiler_cflags \
203
+ -march=armv8.1-a+sve2 -o $TMPE $TMPC; then
204
+ echo "CROSS_CC_HAS_SVE2=y" >> $config_target_mak
205
+ fi
206
if do_compiler "$target_compiler" $target_compiler_cflags \
207
-march=armv8.3-a -o $TMPE $TMPC; then
208
echo "CROSS_CC_HAS_ARMV8_3=y" >> $config_target_mak
98
--
209
--
99
2.17.0
210
2.25.1
100
101
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
No sense in emitting code after the exception.
3
When arm_is_el2_enabled was introduced, we missed
4
updating pauth_check_trap.
4
5
6
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/788
7
Fixes: e6ef0169264b ("target/arm: use arm_is_el2_enabled() where applicable")
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Tested-by: Alex Bennée <alex.bennee@linaro.org>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20180512003217.9105-3-richard.henderson@linaro.org
10
Message-id: 20220315021205.342768-1-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
12
---
11
target/arm/translate-a64.c | 2 +-
13
target/arm/pauth_helper.c | 2 +-
12
1 file changed, 1 insertion(+), 1 deletion(-)
14
1 file changed, 1 insertion(+), 1 deletion(-)
13
15
14
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
16
diff --git a/target/arm/pauth_helper.c b/target/arm/pauth_helper.c
15
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-a64.c
18
--- a/target/arm/pauth_helper.c
17
+++ b/target/arm/translate-a64.c
19
+++ b/target/arm/pauth_helper.c
18
@@ -XXX,XX +XXX,XX @@ static void disas_fp_int_conv(DisasContext *s, uint32_t insn)
20
@@ -XXX,XX +XXX,XX @@ static void QEMU_NORETURN pauth_trap(CPUARMState *env, int target_el,
19
default:
21
20
/* all other sf/type/rmode combinations are invalid */
22
static void pauth_check_trap(CPUARMState *env, int el, uintptr_t ra)
21
unallocated_encoding(s);
23
{
22
- break;
24
- if (el < 2 && arm_feature(env, ARM_FEATURE_EL2)) {
23
+ return;
25
+ if (el < 2 && arm_is_el2_enabled(env)) {
24
}
26
uint64_t hcr = arm_hcr_el2_eff(env);
25
27
bool trap = !(hcr & HCR_API);
26
if (!fp_access_check(s)) {
28
if (el == 0) {
27
--
29
--
28
2.17.0
30
2.25.1
29
31
30
32
diff view generated by jsdifflib
New patch
1
LPAE descriptors come in three forms:
1
2
3
* table descriptors, giving the address of the next level page table
4
* page descriptors, which occur only at level 3 and describe the
5
mapping of one page (which might be 4K, 16K or 64K)
6
* block descriptors, which occur at higher page table levels, and
7
describe the mapping of huge pages
8
9
QEMU's page-table-walk code treats block and page entries
10
identically, simply ORing in a number of bits from the input virtual
11
address that depends on the level of the page table that we stopped
12
at; we depend on the previous masking of descaddr with descaddrmask
13
to have already cleared out the low bits of the descriptor word.
14
15
This is not quite right: the address field in a block descriptor is
16
smaller, and so there are bits which are valid address bits in a page
17
descriptor or a table descriptor but which are not supposed to be
18
part of the address in a block descriptor, and descaddrmask does not
19
clear them. We previously mostly got away with this because those
20
descriptor bits are RES0; however with FEAT_BBM (part of Armv8.4)
21
block descriptor bit 16 is defined to be the nT bit. No emulated
22
QEMU CPU has FEAT_BBM yet, but if the host CPU has it then we might
23
see it when using KVM or hvf.
24
25
Explicitly zero out all the descaddr bits we're about to OR vaddr
26
bits into.
27
28
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/790
29
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
30
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
31
Message-id: 20220304165628.2345765-1-peter.maydell@linaro.org
32
---
33
target/arm/helper.c | 10 ++++++++--
34
1 file changed, 8 insertions(+), 2 deletions(-)
35
36
diff --git a/target/arm/helper.c b/target/arm/helper.c
37
index XXXXXXX..XXXXXXX 100644
38
--- a/target/arm/helper.c
39
+++ b/target/arm/helper.c
40
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, uint64_t address,
41
indexmask = indexmask_grainsize;
42
continue;
43
}
44
- /* Block entry at level 1 or 2, or page entry at level 3.
45
+ /*
46
+ * Block entry at level 1 or 2, or page entry at level 3.
47
* These are basically the same thing, although the number
48
- * of bits we pull in from the vaddr varies.
49
+ * of bits we pull in from the vaddr varies. Note that although
50
+ * descaddrmask masks enough of the low bits of the descriptor
51
+ * to give a correct page or table address, the address field
52
+ * in a block descriptor is smaller; so we need to explicitly
53
+ * clear the lower bits here before ORing in the low vaddr bits.
54
*/
55
page_size = (1ULL << ((stride * (4 - level)) + 3));
56
+ descaddr &= ~(page_size - 1);
57
descaddr |= (address & (page_size - 1));
58
/* Extract attributes from the descriptor */
59
attrs = extract64(descriptor, 2, 10)
60
--
61
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
In commit 00f05c02f9e7342f we gave the TYPE_XLNX_CSU_DMA object its
2
own class struct, but forgot to update the TypeInfo::class_size
3
accordingly. This meant that not enough memory was allocated for the
4
class struct, and the initialization of xcdc->read in the class init
5
function wrote off the end of the memory. Add the missing line.
2
6
3
Cc: qemu-stable@nongnu.org
7
Found by running 'check-qtest-aarch64' with a clang
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
address-sanitizer build, which complains:
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
6
Tested-by: Alex Bennée <alex.bennee@linaro.org>
10
==2542634==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x61000000ab00 at pc 0x559a20aebc29 bp 0x7fff97df74d0 sp 0x7fff97df74c8
7
Message-id: 20180512003217.9105-6-richard.henderson@linaro.org
11
WRITE of size 8 at 0x61000000ab00 thread T0
12
#0 0x559a20aebc28 in xlnx_csu_dma_class_init /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/../../hw/dma/xlnx_csu_dma.c:722:16
13
#1 0x559a21bf297c in type_initialize /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/../../qom/object.c:365:9
14
#2 0x559a21bf3442 in object_class_foreach_tramp /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/../../qom/object.c:1070:5
15
#3 0x7f09bcb641b7 in g_hash_table_foreach (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x401b7)
16
#4 0x559a21bf3c27 in object_class_foreach /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/../../qom/object.c:1092:5
17
#5 0x559a21bf3c27 in object_class_get_list /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/../../qom/object.c:1149:5
18
#6 0x559a2081a2fd in select_machine /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/../../softmmu/vl.c:1661:24
19
#7 0x559a2081a2fd in qemu_create_machine /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/../../softmmu/vl.c:2146:35
20
#8 0x559a2081a2fd in qemu_init /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/../../softmmu/vl.c:3706:5
21
#9 0x559a20720ed5 in main /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/../../softmmu/main.c:49:5
22
#10 0x7f09baec00b2 in __libc_start_main /build/glibc-sMfBJT/glibc-2.31/csu/../csu/libc-start.c:308:16
23
#11 0x559a2067673d in _start (/mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/qemu-system-aarch64+0xf4b73d)
24
25
0x61000000ab00 is located 0 bytes to the right of 192-byte region [0x61000000aa40,0x61000000ab00)
26
allocated by thread T0 here:
27
#0 0x559a206eeff2 in calloc (/mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/qemu-system-aarch64+0xfc3ff2)
28
#1 0x7f09bcb7bef0 in g_malloc0 (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x57ef0)
29
#2 0x559a21bf3442 in object_class_foreach_tramp /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/../../qom/object.c:1070:5
30
31
Fixes: 00f05c02f9e7342f ("hw/dma/xlnx_csu_dma: Support starting a read transfer through a class method")
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
32
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
33
Reviewed-by: Francisco Iglesias <francisco.iglesias@xilinx.com>
34
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
35
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
36
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
37
Message-id: 20220308150207.2546272-1-peter.maydell@linaro.org
9
---
38
---
10
target/arm/translate-a64.c | 30 ++++++++++++++----------------
39
hw/dma/xlnx_csu_dma.c | 1 +
11
1 file changed, 14 insertions(+), 16 deletions(-)
40
1 file changed, 1 insertion(+)
12
41
13
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
42
diff --git a/hw/dma/xlnx_csu_dma.c b/hw/dma/xlnx_csu_dma.c
14
index XXXXXXX..XXXXXXX 100644
43
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-a64.c
44
--- a/hw/dma/xlnx_csu_dma.c
16
+++ b/target/arm/translate-a64.c
45
+++ b/hw/dma/xlnx_csu_dma.c
17
@@ -XXX,XX +XXX,XX @@ static TCGv_i32 read_fp_sreg(DisasContext *s, int reg)
46
@@ -XXX,XX +XXX,XX @@ static const TypeInfo xlnx_csu_dma_info = {
18
return v;
47
.parent = TYPE_SYS_BUS_DEVICE,
19
}
48
.instance_size = sizeof(XlnxCSUDMA),
20
49
.class_init = xlnx_csu_dma_class_init,
21
+static TCGv_i32 read_fp_hreg(DisasContext *s, int reg)
50
+ .class_size = sizeof(XlnxCSUDMAClass),
22
+{
51
.instance_init = xlnx_csu_dma_init,
23
+ TCGv_i32 v = tcg_temp_new_i32();
52
.interfaces = (InterfaceInfo[]) {
24
+
53
{ TYPE_STREAM_SINK },
25
+ tcg_gen_ld16u_i32(v, cpu_env, fp_reg_offset(s, reg, MO_16));
26
+ return v;
27
+}
28
+
29
/* Clear the bits above an N-bit vector, for N = (is_q ? 128 : 64).
30
* If SVE is not enabled, then there are only 128 bits in the vector.
31
*/
32
@@ -XXX,XX +XXX,XX @@ static void disas_fp_csel(DisasContext *s, uint32_t insn)
33
static void handle_fp_1src_half(DisasContext *s, int opcode, int rd, int rn)
34
{
35
TCGv_ptr fpst = NULL;
36
- TCGv_i32 tcg_op = tcg_temp_new_i32();
37
+ TCGv_i32 tcg_op = read_fp_hreg(s, rn);
38
TCGv_i32 tcg_res = tcg_temp_new_i32();
39
40
- read_vec_element_i32(s, tcg_op, rn, 0, MO_16);
41
-
42
switch (opcode) {
43
case 0x0: /* FMOV */
44
tcg_gen_mov_i32(tcg_res, tcg_op);
45
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_three_reg_diff(DisasContext *s, uint32_t insn)
46
tcg_temp_free_i64(tcg_op2);
47
tcg_temp_free_i64(tcg_res);
48
} else {
49
- TCGv_i32 tcg_op1 = tcg_temp_new_i32();
50
- TCGv_i32 tcg_op2 = tcg_temp_new_i32();
51
+ TCGv_i32 tcg_op1 = read_fp_hreg(s, rn);
52
+ TCGv_i32 tcg_op2 = read_fp_hreg(s, rm);
53
TCGv_i64 tcg_res = tcg_temp_new_i64();
54
55
- read_vec_element_i32(s, tcg_op1, rn, 0, MO_16);
56
- read_vec_element_i32(s, tcg_op2, rm, 0, MO_16);
57
-
58
gen_helper_neon_mull_s16(tcg_res, tcg_op1, tcg_op2);
59
gen_helper_neon_addl_saturate_s32(tcg_res, cpu_env, tcg_res, tcg_res);
60
61
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_three_reg_same_fp16(DisasContext *s,
62
63
fpst = get_fpstatus_ptr(true);
64
65
- tcg_op1 = tcg_temp_new_i32();
66
- tcg_op2 = tcg_temp_new_i32();
67
+ tcg_op1 = read_fp_hreg(s, rn);
68
+ tcg_op2 = read_fp_hreg(s, rm);
69
tcg_res = tcg_temp_new_i32();
70
71
- read_vec_element_i32(s, tcg_op1, rn, 0, MO_16);
72
- read_vec_element_i32(s, tcg_op2, rm, 0, MO_16);
73
-
74
switch (fpopcode) {
75
case 0x03: /* FMULX */
76
gen_helper_advsimd_mulxh(tcg_res, tcg_op1, tcg_op2, fpst);
77
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
78
}
79
80
if (is_scalar) {
81
- TCGv_i32 tcg_op = tcg_temp_new_i32();
82
+ TCGv_i32 tcg_op = read_fp_hreg(s, rn);
83
TCGv_i32 tcg_res = tcg_temp_new_i32();
84
85
- read_vec_element_i32(s, tcg_op, rn, 0, MO_16);
86
-
87
switch (fpop) {
88
case 0x1a: /* FCVTNS */
89
case 0x1b: /* FCVTMS */
90
--
54
--
91
2.17.0
55
2.25.1
92
56
93
57
diff view generated by jsdifflib
1
Usually the logging of the CPU state produced by -d cpu is sufficient
1
In npcm7xx_clk_sel_init() we allocate a string with g_strdup_printf().
2
to diagnose problems, but sometimes you want to see the state of
2
Use g_autofree so we free it rather than leaking it.
3
the floating point registers as well. We don't want to enable that
3
4
by default as it adds a lot of extra data to the log; instead,
4
(Detected with the clang leak sanitizer.)
5
allow it to be optionally enabled via -d fpu.
6
5
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180510130024.31678-1-peter.maydell@linaro.org
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 20220308170302.2582820-1-peter.maydell@linaro.org
10
---
10
---
11
include/qemu/log.h | 1 +
11
hw/misc/npcm7xx_clk.c | 4 ++--
12
accel/tcg/cpu-exec.c | 9 ++++++---
12
1 file changed, 2 insertions(+), 2 deletions(-)
13
util/log.c | 2 ++
14
3 files changed, 9 insertions(+), 3 deletions(-)
15
13
16
diff --git a/include/qemu/log.h b/include/qemu/log.h
14
diff --git a/hw/misc/npcm7xx_clk.c b/hw/misc/npcm7xx_clk.c
17
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
18
--- a/include/qemu/log.h
16
--- a/hw/misc/npcm7xx_clk.c
19
+++ b/include/qemu/log.h
17
+++ b/hw/misc/npcm7xx_clk.c
20
@@ -XXX,XX +XXX,XX @@ static inline bool qemu_log_separate(void)
18
@@ -XXX,XX +XXX,XX @@ static void npcm7xx_clk_sel_init(Object *obj)
21
#define CPU_LOG_PAGE (1 << 14)
19
NPCM7xxClockSELState *sel = NPCM7XX_CLOCK_SEL(obj);
22
/* LOG_TRACE (1 << 15) is defined in log-for-trace.h */
20
23
#define CPU_LOG_TB_OP_IND (1 << 16)
21
for (i = 0; i < NPCM7XX_CLK_SEL_MAX_INPUT; ++i) {
24
+#define CPU_LOG_TB_FPU (1 << 17)
22
- sel->clock_in[i] = qdev_init_clock_in(DEVICE(sel),
25
23
- g_strdup_printf("clock-in[%d]", i),
26
/* Lock output for a series of related logs. Since this is not needed
24
+ g_autofree char *s = g_strdup_printf("clock-in[%d]", i);
27
* for a single qemu_log / qemu_log_mask / qemu_log_mask_and_addr, we
25
+ sel->clock_in[i] = qdev_init_clock_in(DEVICE(sel), s,
28
diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
26
npcm7xx_clk_update_sel_cb, sel, ClockUpdate);
29
index XXXXXXX..XXXXXXX 100644
30
--- a/accel/tcg/cpu-exec.c
31
+++ b/accel/tcg/cpu-exec.c
32
@@ -XXX,XX +XXX,XX @@ static inline tcg_target_ulong cpu_tb_exec(CPUState *cpu, TranslationBlock *itb)
33
if (qemu_loglevel_mask(CPU_LOG_TB_CPU)
34
&& qemu_log_in_addr_range(itb->pc)) {
35
qemu_log_lock();
36
+ int flags = 0;
37
+ if (qemu_loglevel_mask(CPU_LOG_TB_FPU)) {
38
+ flags |= CPU_DUMP_FPU;
39
+ }
40
#if defined(TARGET_I386)
41
- log_cpu_state(cpu, CPU_DUMP_CCOP);
42
-#else
43
- log_cpu_state(cpu, 0);
44
+ flags |= CPU_DUMP_CCOP;
45
#endif
46
+ log_cpu_state(cpu, flags);
47
qemu_log_unlock();
48
}
27
}
49
#endif /* DEBUG_DISAS */
28
sel->clock_out = qdev_init_clock_out(DEVICE(sel), "clock-out");
50
diff --git a/util/log.c b/util/log.c
51
index XXXXXXX..XXXXXXX 100644
52
--- a/util/log.c
53
+++ b/util/log.c
54
@@ -XXX,XX +XXX,XX @@ const QEMULogItem qemu_log_items[] = {
55
"show trace before each executed TB (lots of logs)" },
56
{ CPU_LOG_TB_CPU, "cpu",
57
"show CPU registers before entering a TB (lots of logs)" },
58
+ { CPU_LOG_TB_FPU, "fpu",
59
+ "include FPU registers in the 'cpu' logging" },
60
{ CPU_LOG_MMU, "mmu",
61
"log MMU-related activities" },
62
{ CPU_LOG_PCALL, "pcall",
63
--
29
--
64
2.17.0
30
2.25.1
65
31
66
32
diff view generated by jsdifflib
1
In float-to-integer conversion, if the floating point input
1
We currently list the emulators in the Windows installer's dialog
2
converts exactly to the largest or smallest integer that
2
in an essentially random order (it's whatever glob.glob() returns
3
fits in to the result type, this is not an overflow.
3
them to, which is filesystem-implementation-dependent). Add a
4
In this situation we were producing the correct result value,
4
call to sorted() so they appear in alphabetical order.
5
but were incorrectly setting the Invalid flag.
6
For example for Arm A64, "FCVTAS w0, d0" on an input of
7
0x41dfffffffc00000 should produce 0x7fffffff and set no flags.
8
5
9
Fix the boundary case to take the right half of the if()
10
statements.
11
12
This fixes a regression from 2.11 introduced by the softfloat
13
refactoring.
14
15
Cc: qemu-stable@nongnu.org
16
Fixes: ab52f973a50
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
19
Message-id: 20180510140141.12120-1-peter.maydell@linaro.org
8
Reviewed-by: Stefan Weil <sw@weilnetz.de>
9
Reviewed-by: John Snow <jsnow@redhat.com>
10
Message-id: 20220305105743.2384766-2-peter.maydell@linaro.org
20
---
11
---
21
fpu/softfloat.c | 4 ++--
12
scripts/nsis.py | 4 ++--
22
1 file changed, 2 insertions(+), 2 deletions(-)
13
1 file changed, 2 insertions(+), 2 deletions(-)
23
14
24
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
15
diff --git a/scripts/nsis.py b/scripts/nsis.py
25
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
26
--- a/fpu/softfloat.c
17
--- a/scripts/nsis.py
27
+++ b/fpu/softfloat.c
18
+++ b/scripts/nsis.py
28
@@ -XXX,XX +XXX,XX @@ static int64_t round_to_int_and_pack(FloatParts in, int rmode,
19
@@ -XXX,XX +XXX,XX @@ def main():
29
r = UINT64_MAX;
20
with open(
30
}
21
os.path.join(destdir + args.prefix, "system-emulations.nsh"), "w"
31
if (p.sign) {
22
) as nsh:
32
- if (r < -(uint64_t) min) {
23
- for exe in glob.glob(
33
+ if (r <= -(uint64_t) min) {
24
+ for exe in sorted(glob.glob(
34
return -r;
25
os.path.join(destdir + args.prefix, "qemu-system-*.exe")
35
} else {
26
- ):
36
s->float_exception_flags = orig_flags | float_flag_invalid;
27
+ )):
37
return min;
28
exe = os.path.basename(exe)
38
}
29
arch = exe[12:-4]
39
} else {
30
nsh.write(
40
- if (r < max) {
41
+ if (r <= max) {
42
return r;
43
} else {
44
s->float_exception_flags = orig_flags | float_flag_invalid;
45
--
31
--
46
2.17.0
32
2.25.1
47
33
48
34
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
When we build our Windows installer, it emits the warning:
2
2
3
Per the Physical Layer Simplified Spec. "4.3.10.4 Switch Function Status":
3
warning 7998: ANSI targets are deprecated
4
4
5
The block length is predefined to 512 bits
5
Fix this by making our installer a Unicode installer instead. These
6
won't work on Win95/98/ME, but we already do not support those.
6
7
7
and "4.10.2 SD Status":
8
See
9
https://nsis.sourceforge.io/Docs/Chapter4.html#aunicodetarget
10
for the documentation of the Unicode directive.
8
11
9
The SD Status contains status bits that are related to the SD Memory Card
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
proprietary features and may be used for future application-specific usage.
13
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
The size of the SD Status is one data block of 512 bit. The content of this
14
Reviewed-by: Stefan Weil <sw@weilnetz.de>
12
register is transmitted to the Host over the DAT bus along with a 16-bit CRC.
15
Message-id: 20220305105743.2384766-3-peter.maydell@linaro.org
16
---
17
qemu.nsi | 3 +++
18
1 file changed, 3 insertions(+)
13
19
14
Thus the 16-bit CRC goes at offset 64.
20
diff --git a/qemu.nsi b/qemu.nsi
15
16
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
17
Message-id: 20180509060104.4458-3-f4bug@amsat.org
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
---
21
hw/sd/sd.c | 2 +-
22
1 file changed, 1 insertion(+), 1 deletion(-)
23
24
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
25
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/sd/sd.c
22
--- a/qemu.nsi
27
+++ b/hw/sd/sd.c
23
+++ b/qemu.nsi
28
@@ -XXX,XX +XXX,XX @@ static void sd_function_switch(SDState *sd, uint32_t arg)
24
@@ -XXX,XX +XXX,XX @@
29
sd->data[14 + (i >> 1)] = new_func << ((i * 4) & 4);
25
!define OUTFILE "qemu-setup.exe"
30
}
26
!endif
31
memset(&sd->data[17], 0, 47);
27
32
- stw_be_p(sd->data + 65, sd_crc16(sd->data, 64));
28
+; Build a unicode installer
33
+ stw_be_p(sd->data + 64, sd_crc16(sd->data, 64));
29
+Unicode true
34
}
30
+
35
31
; Use maximum compression.
36
static inline bool sd_wp_addr(SDState *sd, uint64_t addr)
32
SetCompressor /SOLID lzma
33
37
--
34
--
38
2.17.0
35
2.25.1
39
36
40
37
diff view generated by jsdifflib
1
From: Alex Bennée <alex.bennee@linaro.org>
1
We use the nsis.py script to write out an installer script Section
2
for each emulator executable, so the exact set of Sections depends on
3
which executables were built. However the part of qemu.nsi which
4
specifies mouse-over descriptions for each Section still has a
5
hard-coded and very outdated list (with just i386 and alpha). This
6
causes two problems. Firstly, if you build the installer for a
7
configuration where you didn't build the i386 binaries you get
8
warnings like this:
9
warning 6000: unknown variable/constant "{Section_i386}" detected, ignoring (macro:_==:1)
10
warning 6000: unknown variable/constant "{Section_i386w}" detected, ignoring (macro:_==:1)
11
(this happens in our gitlab CI jobs, for instance).
12
Secondly, most of the emulators in the generated installer don't have
13
any mouseover text.
2
14
3
We are meant to explicitly pass fpst, not cpu_env.
15
Make nsis.py generate a second output file which has the necessary
16
MUI_DESCRIPTION_TEXT lines for each Section it creates, so we can
17
include that at the right point in qemu.nsi to set the mouse-over
18
text.
4
19
5
Cc: qemu-stable@nongnu.org
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Tested-by: Alex Bennée <alex.bennee@linaro.org>
10
Message-id: 20180512003217.9105-12-richard.henderson@linaro.org
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
21
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
22
Reviewed-by: John Snow <jsnow@redhat.com>
23
Message-id: 20220305105743.2384766-4-peter.maydell@linaro.org
12
---
24
---
13
target/arm/translate-a64.c | 3 ++-
25
qemu.nsi | 5 +----
14
1 file changed, 2 insertions(+), 1 deletion(-)
26
scripts/nsis.py | 13 ++++++++++++-
27
2 files changed, 13 insertions(+), 5 deletions(-)
15
28
16
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
29
diff --git a/qemu.nsi b/qemu.nsi
17
index XXXXXXX..XXXXXXX 100644
30
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/translate-a64.c
31
--- a/qemu.nsi
19
+++ b/target/arm/translate-a64.c
32
+++ b/qemu.nsi
20
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_half(DisasContext *s, int opcode, int rd, int rn)
33
@@ -XXX,XX +XXX,XX @@ SectionEnd
21
tcg_gen_xori_i32(tcg_res, tcg_op, 0x8000);
34
; Descriptions (mouse-over).
22
break;
35
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
23
case 0x3: /* FSQRT */
36
!insertmacro MUI_DESCRIPTION_TEXT ${SectionSystem} "System emulation."
24
- gen_helper_sqrt_f16(tcg_res, tcg_op, cpu_env);
37
- !insertmacro MUI_DESCRIPTION_TEXT ${Section_alpha} "Alpha system emulation."
25
+ fpst = get_fpstatus_ptr(true);
38
- !insertmacro MUI_DESCRIPTION_TEXT ${Section_alphaw} "Alpha system emulation (GUI)."
26
+ gen_helper_sqrt_f16(tcg_res, tcg_op, fpst);
39
- !insertmacro MUI_DESCRIPTION_TEXT ${Section_i386} "PC i386 system emulation."
27
break;
40
- !insertmacro MUI_DESCRIPTION_TEXT ${Section_i386w} "PC i386 system emulation (GUI)."
28
case 0x8: /* FRINTN */
41
+!include "${BINDIR}\system-mui-text.nsh"
29
case 0x9: /* FRINTP */
42
!insertmacro MUI_DESCRIPTION_TEXT ${SectionTools} "Tools."
43
!ifdef DLLDIR
44
!insertmacro MUI_DESCRIPTION_TEXT ${SectionDll} "Runtime Libraries (DLL)."
45
diff --git a/scripts/nsis.py b/scripts/nsis.py
46
index XXXXXXX..XXXXXXX 100644
47
--- a/scripts/nsis.py
48
+++ b/scripts/nsis.py
49
@@ -XXX,XX +XXX,XX @@ def main():
50
subprocess.run(["make", "install", "DESTDIR=" + destdir + os.path.sep])
51
with open(
52
os.path.join(destdir + args.prefix, "system-emulations.nsh"), "w"
53
- ) as nsh:
54
+ ) as nsh, open(
55
+ os.path.join(destdir + args.prefix, "system-mui-text.nsh"), "w"
56
+ ) as muinsh:
57
for exe in sorted(glob.glob(
58
os.path.join(destdir + args.prefix, "qemu-system-*.exe")
59
)):
60
@@ -XXX,XX +XXX,XX @@ def main():
61
arch, exe
62
)
63
)
64
+ if arch.endswith('w'):
65
+ desc = arch[:-1] + " emulation (GUI)."
66
+ else:
67
+ desc = arch + " emulation."
68
+
69
+ muinsh.write(
70
+ """
71
+ !insertmacro MUI_DESCRIPTION_TEXT ${{Section_{0}}} "{1}"
72
+ """.format(arch, desc))
73
74
for exe in glob.glob(os.path.join(destdir + args.prefix, "*.exe")):
75
signcode(exe)
30
--
76
--
31
2.17.0
77
2.25.1
32
78
33
79
diff view generated by jsdifflib
New patch
1
From: Eric Auger <eric.auger@redhat.com>
1
2
3
CONFIG_ARM_GIC_TCG actually guards the compilation of TCG GICv3
4
specific files. So let's rename it into CONFIG_ARM_GICV3_TCG
5
6
Signed-off-by: Eric Auger <eric.auger@redhat.com>
7
Reviewed-by: Andrew Jones <drjones@redhat.com>
8
Message-id: 20220308182452.223473-2-eric.auger@redhat.com
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/intc/Kconfig | 2 +-
13
hw/intc/meson.build | 4 ++--
14
2 files changed, 3 insertions(+), 3 deletions(-)
15
16
diff --git a/hw/intc/Kconfig b/hw/intc/Kconfig
17
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/intc/Kconfig
19
+++ b/hw/intc/Kconfig
20
@@ -XXX,XX +XXX,XX @@ config APIC
21
select MSI_NONBROKEN
22
select I8259
23
24
-config ARM_GIC_TCG
25
+config ARM_GICV3_TCG
26
bool
27
default y
28
depends on ARM_GIC && TCG
29
diff --git a/hw/intc/meson.build b/hw/intc/meson.build
30
index XXXXXXX..XXXXXXX 100644
31
--- a/hw/intc/meson.build
32
+++ b/hw/intc/meson.build
33
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_ARM_GIC', if_true: files(
34
'arm_gicv3_common.c',
35
'arm_gicv3_its_common.c',
36
))
37
-softmmu_ss.add(when: 'CONFIG_ARM_GIC_TCG', if_true: files(
38
+softmmu_ss.add(when: 'CONFIG_ARM_GICV3_TCG', if_true: files(
39
'arm_gicv3.c',
40
'arm_gicv3_dist.c',
41
'arm_gicv3_its.c',
42
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_XLNX_ZYNQMP_PMU', if_true: files('xlnx-pmu-iomod-in
43
specific_ss.add(when: 'CONFIG_ALLWINNER_A10_PIC', if_true: files('allwinner-a10-pic.c'))
44
specific_ss.add(when: 'CONFIG_APIC', if_true: files('apic.c', 'apic_common.c'))
45
specific_ss.add(when: 'CONFIG_ARM_GIC', if_true: files('arm_gicv3_cpuif_common.c'))
46
-specific_ss.add(when: 'CONFIG_ARM_GIC_TCG', if_true: files('arm_gicv3_cpuif.c'))
47
+specific_ss.add(when: 'CONFIG_ARM_GICV3_TCG', if_true: files('arm_gicv3_cpuif.c'))
48
specific_ss.add(when: 'CONFIG_ARM_GIC_KVM', if_true: files('arm_gic_kvm.c'))
49
specific_ss.add(when: ['CONFIG_ARM_GIC_KVM', 'TARGET_AARCH64'], if_true: files('arm_gicv3_kvm.c', 'arm_gicv3_its_kvm.c'))
50
specific_ss.add(when: 'CONFIG_ARM_V7M', if_true: files('armv7m_nvic.c'))
51
--
52
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
Adding the fp16 moves to/from general registers.
3
In TCG mode, if gic-version=max we always select GICv3 even if
4
CONFIG_ARM_GICV3_TCG is unset. We shall rather select GICv2.
5
This also brings the benefit of fixing qos tests errors for tests
6
using gic-version=max with CONFIG_ARM_GICV3_TCG unset.
4
7
5
Cc: qemu-stable@nongnu.org
8
Signed-off-by: Eric Auger <eric.auger@redhat.com>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Andrew Jones <drjones@redhat.com>
7
Tested-by: Alex Bennée <alex.bennee@linaro.org>
10
Message-id: 20220308182452.223473-3-eric.auger@redhat.com
8
Message-id: 20180512003217.9105-2-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
13
---
12
target/arm/translate-a64.c | 21 +++++++++++++++++++++
14
hw/arm/virt.c | 7 ++++++-
13
1 file changed, 21 insertions(+)
15
1 file changed, 6 insertions(+), 1 deletion(-)
14
16
15
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
17
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
16
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-a64.c
19
--- a/hw/arm/virt.c
18
+++ b/target/arm/translate-a64.c
20
+++ b/hw/arm/virt.c
19
@@ -XXX,XX +XXX,XX @@ static void handle_fmov(DisasContext *s, int rd, int rn, int type, bool itof)
21
@@ -XXX,XX +XXX,XX @@ static void finalize_gic_version(VirtMachineState *vms)
20
tcg_gen_st_i64(tcg_rn, cpu_env, fp_reg_hi_offset(s, rd));
22
vms->gic_version = VIRT_GIC_VERSION_2;
21
clear_vec_high(s, true, rd);
23
break;
22
break;
24
case VIRT_GIC_VERSION_MAX:
23
+ case 3:
25
- vms->gic_version = VIRT_GIC_VERSION_3;
24
+ /* 16 bit */
26
+ if (module_object_class_by_name("arm-gicv3")) {
25
+ tmp = tcg_temp_new_i64();
27
+ /* CONFIG_ARM_GICV3_TCG was set */
26
+ tcg_gen_ext16u_i64(tmp, tcg_rn);
28
+ vms->gic_version = VIRT_GIC_VERSION_3;
27
+ write_fp_dreg(s, rd, tmp);
29
+ } else {
28
+ tcg_temp_free_i64(tmp);
30
+ vms->gic_version = VIRT_GIC_VERSION_2;
29
+ break;
31
+ }
30
+ default:
32
break;
31
+ g_assert_not_reached();
33
case VIRT_GIC_VERSION_HOST:
32
}
34
error_report("gic-version=host requires KVM");
33
} else {
34
TCGv_i64 tcg_rd = cpu_reg(s, rd);
35
@@ -XXX,XX +XXX,XX @@ static void handle_fmov(DisasContext *s, int rd, int rn, int type, bool itof)
36
/* 64 bits from top half */
37
tcg_gen_ld_i64(tcg_rd, cpu_env, fp_reg_hi_offset(s, rn));
38
break;
39
+ case 3:
40
+ /* 16 bit */
41
+ tcg_gen_ld16u_i64(tcg_rd, cpu_env, fp_reg_offset(s, rn, MO_16));
42
+ break;
43
+ default:
44
+ g_assert_not_reached();
45
}
46
}
47
}
48
@@ -XXX,XX +XXX,XX @@ static void disas_fp_int_conv(DisasContext *s, uint32_t insn)
49
case 0xa: /* 64 bit */
50
case 0xd: /* 64 bit to top half of quad */
51
break;
52
+ case 0x6: /* 16-bit float, 32-bit int */
53
+ case 0xe: /* 16-bit float, 64-bit int */
54
+ if (arm_dc_feature(s, ARM_FEATURE_V8_FP16)) {
55
+ break;
56
+ }
57
+ /* fallthru */
58
default:
59
/* all other sf/type/rmode combinations are invalid */
60
unallocated_encoding(s);
61
--
35
--
62
2.17.0
36
2.25.1
63
64
diff view generated by jsdifflib
1
In commit d81ce0ef2c4f105 we added an extra float_status field
1
Currently the CPU_LOG_INT logging misses some useful information
2
fp_status_fp16 for Arm, but forgot to initialize it correctly
2
about loads from the vector table. Add logging where we load vector
3
by setting it to float_tininess_before_rounding. This currently
3
table entries. This is particularly helpful for cases where the user
4
will only cause problems for the new V8_FP16 feature, since the
4
has accidentally not put a vector table in their image at all, which
5
float-to-float conversion code doesn't use it yet. The effect
5
can result in confusing guest crashes at startup.
6
would be that we failed to set the Underflow IEEE exception flag
7
in all the cases where we should.
8
6
9
Add the missing initialization.
7
Here's an example of the new logging for a case where
8
the vector table contains garbage:
10
9
11
Fixes: d81ce0ef2c4f105
10
Loaded reset SP 0x0 PC 0x0 from vector table
12
Cc: qemu-stable@nongnu.org
11
Loaded reset SP 0xd008f8df PC 0xf000bf00 from vector table
12
Taking exception 3 [Prefetch Abort] on CPU 0
13
...with CFSR.IACCVIOL
14
...BusFault with BFSR.STKERR
15
...taking pending nonsecure exception 3
16
...loading from element 3 of non-secure vector table at 0xc
17
...loaded new PC 0x20000558
18
----------------
19
IN:
20
0x20000558: 08000079 stmdaeq r0, {r0, r3, r4, r5, r6}
21
22
(The double reset logging is the result of our long-standing
23
"CPUs all get reset twice" weirdness; it looks a bit ugly
24
but it'll go away if we ever fix that :-))
25
26
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
27
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
28
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
29
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
30
Message-id: 20220315204306.2797684-2-peter.maydell@linaro.org
16
Message-id: 20180512004311.9299-16-richard.henderson@linaro.org
17
---
31
---
18
target/arm/cpu.c | 2 ++
32
target/arm/cpu.c | 5 +++++
19
1 file changed, 2 insertions(+)
33
target/arm/m_helper.c | 5 +++++
34
2 files changed, 10 insertions(+)
20
35
21
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
36
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
22
index XXXXXXX..XXXXXXX 100644
37
index XXXXXXX..XXXXXXX 100644
23
--- a/target/arm/cpu.c
38
--- a/target/arm/cpu.c
24
+++ b/target/arm/cpu.c
39
+++ b/target/arm/cpu.c
25
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(CPUState *s)
40
@@ -XXX,XX +XXX,XX @@
26
&env->vfp.fp_status);
41
#include "qemu/osdep.h"
27
set_float_detect_tininess(float_tininess_before_rounding,
42
#include "qemu/qemu-print.h"
28
&env->vfp.standard_fp_status);
43
#include "qemu/timer.h"
29
+ set_float_detect_tininess(float_tininess_before_rounding,
44
+#include "qemu/log.h"
30
+ &env->vfp.fp_status_f16);
45
#include "qemu-common.h"
31
#ifndef CONFIG_USER_ONLY
46
#include "target/arm/idau.h"
32
if (kvm_enabled()) {
47
#include "qemu/module.h"
33
kvm_arm_reset_vcpu(cpu);
48
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(DeviceState *dev)
49
initial_pc = ldl_phys(s->as, vecbase + 4);
50
}
51
52
+ qemu_log_mask(CPU_LOG_INT,
53
+ "Loaded reset SP 0x%x PC 0x%x from vector table\n",
54
+ initial_msp, initial_pc);
55
+
56
env->regs[13] = initial_msp & 0xFFFFFFFC;
57
env->regs[15] = initial_pc & ~1;
58
env->thumb = initial_pc & 1;
59
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
60
index XXXXXXX..XXXXXXX 100644
61
--- a/target/arm/m_helper.c
62
+++ b/target/arm/m_helper.c
63
@@ -XXX,XX +XXX,XX @@ static bool arm_v7m_load_vector(ARMCPU *cpu, int exc, bool targets_secure,
64
ARMMMUIdx mmu_idx;
65
bool exc_secure;
66
67
+ qemu_log_mask(CPU_LOG_INT,
68
+ "...loading from element %d of %s vector table at 0x%x\n",
69
+ exc, targets_secure ? "secure" : "non-secure", addr);
70
+
71
mmu_idx = arm_v7m_mmu_idx_for_secstate_and_priv(env, targets_secure, true);
72
73
/*
74
@@ -XXX,XX +XXX,XX @@ static bool arm_v7m_load_vector(ARMCPU *cpu, int exc, bool targets_secure,
75
goto load_fail;
76
}
77
*pvec = vector_entry;
78
+ qemu_log_mask(CPU_LOG_INT, "...loaded new PC 0x%x\n", *pvec);
79
return true;
80
81
load_fail:
34
--
82
--
35
2.17.0
83
2.25.1
36
84
37
85
diff view generated by jsdifflib
1
From: Alex Bennée <alex.bennee@linaro.org>
1
For M-profile, the fault address is not always exposed to the guest
2
in a fault register (for instance the BFAR bus fault address register
3
is only updated for bus faults on data accesses, not instruction
4
accesses). Currently we log the address only if we're putting it
5
into a particular guest-visible register. Since we always have it,
6
log it generically, to make logs of i-side faults a bit clearer.
2
7
3
All the hard work is already done by vfp_expand_imm, we just need to
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
make sure we pick up the correct size.
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
12
Message-id: 20220315204306.2797684-3-peter.maydell@linaro.org
13
---
14
target/arm/m_helper.c | 6 ++++++
15
1 file changed, 6 insertions(+)
5
16
6
Cc: qemu-stable@nongnu.org
17
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
9
Tested-by: Alex Bennée <alex.bennee@linaro.org>
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 20180512003217.9105-11-richard.henderson@linaro.org
12
[rth: Merge unallocated_encoding check with TCGMemOp conversion.]
13
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
16
target/arm/translate-a64.c | 20 +++++++++++++++++---
17
1 file changed, 17 insertions(+), 3 deletions(-)
18
19
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
20
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
21
--- a/target/arm/translate-a64.c
19
--- a/target/arm/m_helper.c
22
+++ b/target/arm/translate-a64.c
20
+++ b/target/arm/m_helper.c
23
@@ -XXX,XX +XXX,XX @@ static void disas_fp_imm(DisasContext *s, uint32_t insn)
21
@@ -XXX,XX +XXX,XX @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
24
{
22
* Note that for M profile we don't have a guest facing FSR, but
25
int rd = extract32(insn, 0, 5);
23
* the env->exception.fsr will be populated by the code that
26
int imm8 = extract32(insn, 13, 8);
24
* raises the fault, in the A profile short-descriptor format.
27
- int is_double = extract32(insn, 22, 2);
25
+ *
28
+ int type = extract32(insn, 22, 2);
26
+ * Log the exception.vaddress now regardless of subtype, because
29
uint64_t imm;
27
+ * logging below only logs it when it goes into a guest visible
30
TCGv_i64 tcg_res;
28
+ * register.
31
+ TCGMemOp sz;
29
*/
32
30
+ qemu_log_mask(CPU_LOG_INT, "...at fault address 0x%x\n",
33
- if (is_double > 1) {
31
+ (uint32_t)env->exception.vaddress);
34
+ switch (type) {
32
switch (env->exception.fsr & 0xf) {
35
+ case 0:
33
case M_FAKE_FSR_NSC_EXEC:
36
+ sz = MO_32;
34
/*
37
+ break;
38
+ case 1:
39
+ sz = MO_64;
40
+ break;
41
+ case 3:
42
+ sz = MO_16;
43
+ if (arm_dc_feature(s, ARM_FEATURE_V8_FP16)) {
44
+ break;
45
+ }
46
+ /* fallthru */
47
+ default:
48
unallocated_encoding(s);
49
return;
50
}
51
@@ -XXX,XX +XXX,XX @@ static void disas_fp_imm(DisasContext *s, uint32_t insn)
52
return;
53
}
54
55
- imm = vfp_expand_imm(MO_32 + is_double, imm8);
56
+ imm = vfp_expand_imm(sz, imm8);
57
58
tcg_res = tcg_const_i64(imm);
59
write_fp_dreg(s, rd, tcg_res);
60
--
35
--
61
2.17.0
36
2.25.1
62
37
63
38
diff view generated by jsdifflib
1
From: Alex Bennée <alex.bennee@linaro.org>
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
2
2
3
These were missed out from the rest of the half-precision work.
3
Add an unimplemented SERDES (Serializer/Deserializer) area.
4
4
5
Cc: qemu-stable@nongnu.org
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Francisco Iglesias <francisco.iglesias@xilinx.com>
7
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
7
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
8
Tested-by: Alex Bennée <alex.bennee@linaro.org>
8
Message-id: 20220316164645.2303510-2-edgar.iglesias@gmail.com
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20180512003217.9105-10-richard.henderson@linaro.org
11
[rth: Fix erroneous check vs type]
12
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
10
---
15
target/arm/translate-a64.c | 31 +++++++++++++++++++++++++------
11
include/hw/arm/xlnx-zynqmp.h | 2 +-
16
1 file changed, 25 insertions(+), 6 deletions(-)
12
hw/arm/xlnx-zynqmp.c | 5 +++++
13
2 files changed, 6 insertions(+), 1 deletion(-)
17
14
18
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
15
diff --git a/include/hw/arm/xlnx-zynqmp.h b/include/hw/arm/xlnx-zynqmp.h
19
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/translate-a64.c
17
--- a/include/hw/arm/xlnx-zynqmp.h
21
+++ b/target/arm/translate-a64.c
18
+++ b/include/hw/arm/xlnx-zynqmp.h
22
@@ -XXX,XX +XXX,XX @@ static void disas_fp_csel(DisasContext *s, uint32_t insn)
19
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPState, XLNX_ZYNQMP)
23
unsigned int mos, type, rm, cond, rn, rd;
20
/*
24
TCGv_i64 t_true, t_false, t_zero;
21
* Unimplemented mmio regions needed to boot some images.
25
DisasCompare64 c;
22
*/
26
+ TCGMemOp sz;
23
-#define XLNX_ZYNQMP_NUM_UNIMP_AREAS 1
27
24
+#define XLNX_ZYNQMP_NUM_UNIMP_AREAS 2
28
mos = extract32(insn, 29, 3);
25
29
- type = extract32(insn, 22, 2); /* 0 = single, 1 = double */
26
struct XlnxZynqMPState {
30
+ type = extract32(insn, 22, 2);
27
/*< private >*/
31
rm = extract32(insn, 16, 5);
28
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
32
cond = extract32(insn, 12, 4);
29
index XXXXXXX..XXXXXXX 100644
33
rn = extract32(insn, 5, 5);
30
--- a/hw/arm/xlnx-zynqmp.c
34
rd = extract32(insn, 0, 5);
31
+++ b/hw/arm/xlnx-zynqmp.c
35
32
@@ -XXX,XX +XXX,XX @@
36
- if (mos || type > 1) {
33
#define QSPI_DMA_ADDR 0xff0f0800
37
+ if (mos) {
34
#define NUM_QSPI_IRQ_LINES 2
38
+ unallocated_encoding(s);
35
39
+ return;
36
+/* Serializer/Deserializer. */
40
+ }
37
+#define SERDES_ADDR 0xfd400000
38
+#define SERDES_SIZE 0x20000
41
+
39
+
42
+ switch (type) {
40
#define DP_ADDR 0xfd4a0000
43
+ case 0:
41
#define DP_IRQ 113
44
+ sz = MO_32;
42
45
+ break;
43
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_create_unimp_mmio(XlnxZynqMPState *s)
46
+ case 1:
44
hwaddr size;
47
+ sz = MO_64;
45
} unimp_areas[ARRAY_SIZE(s->mr_unimp)] = {
48
+ break;
46
{ .name = "apu", APU_ADDR, APU_SIZE },
49
+ case 3:
47
+ { .name = "serdes", SERDES_ADDR, SERDES_SIZE },
50
+ sz = MO_16;
48
};
51
+ if (arm_dc_feature(s, ARM_FEATURE_V8_FP16)) {
49
unsigned int nr;
52
+ break;
50
53
+ }
54
+ /* fallthru */
55
+ default:
56
unallocated_encoding(s);
57
return;
58
}
59
@@ -XXX,XX +XXX,XX @@ static void disas_fp_csel(DisasContext *s, uint32_t insn)
60
return;
61
}
62
63
- /* Zero extend sreg inputs to 64 bits now. */
64
+ /* Zero extend sreg & hreg inputs to 64 bits now. */
65
t_true = tcg_temp_new_i64();
66
t_false = tcg_temp_new_i64();
67
- read_vec_element(s, t_true, rn, 0, type ? MO_64 : MO_32);
68
- read_vec_element(s, t_false, rm, 0, type ? MO_64 : MO_32);
69
+ read_vec_element(s, t_true, rn, 0, sz);
70
+ read_vec_element(s, t_false, rm, 0, sz);
71
72
a64_test_cc(&c, cond);
73
t_zero = tcg_const_i64(0);
74
@@ -XXX,XX +XXX,XX @@ static void disas_fp_csel(DisasContext *s, uint32_t insn)
75
tcg_temp_free_i64(t_false);
76
a64_free_cc(&c);
77
78
- /* Note that sregs write back zeros to the high bits,
79
+ /* Note that sregs & hregs write back zeros to the high bits,
80
and we've already done the zero-extension. */
81
write_fp_dreg(s, rd, t_true);
82
tcg_temp_free_i64(t_true);
83
--
51
--
84
2.17.0
52
2.25.1
85
53
86
54
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
2
2
3
Cc: qemu-stable@nongnu.org
3
Make the rvbar property settable after realize. This is done
4
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
4
in preparation to model the ZynqMP's runtime configurable rvbar.
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
6
Tested-by: Alex Bennée <alex.bennee@linaro.org>
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
7
Message-id: 20180512003217.9105-4-richard.henderson@linaro.org
7
Message-id: 20220316164645.2303510-3-edgar.iglesias@gmail.com
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
---
10
target/arm/helper.h | 6 +++
11
target/arm/cpu.h | 3 ++-
11
target/arm/helper.c | 38 ++++++++++++++-
12
target/arm/cpu.c | 12 +++++++-----
12
target/arm/translate-a64.c | 96 +++++++++++++++++++++++++++++++-------
13
target/arm/helper.c | 10 +++++++---
13
3 files changed, 122 insertions(+), 18 deletions(-)
14
3 files changed, 16 insertions(+), 9 deletions(-)
14
15
15
diff --git a/target/arm/helper.h b/target/arm/helper.h
16
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
16
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper.h
18
--- a/target/arm/cpu.h
18
+++ b/target/arm/helper.h
19
+++ b/target/arm/cpu.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_3(vfp_touhd_round_to_zero, i64, f64, i32, ptr)
20
@@ -XXX,XX +XXX,XX @@ typedef struct CPUArchState {
20
DEF_HELPER_3(vfp_tould_round_to_zero, i64, f64, i32, ptr)
21
uint64_t vbar_el[4];
21
DEF_HELPER_3(vfp_touhh, i32, f16, i32, ptr)
22
};
22
DEF_HELPER_3(vfp_toshh, i32, f16, i32, ptr)
23
uint32_t mvbar; /* (monitor) vector base address register */
23
+DEF_HELPER_3(vfp_toulh, i32, f16, i32, ptr)
24
+ uint64_t rvbar; /* rvbar sampled from rvbar property at reset */
24
+DEF_HELPER_3(vfp_toslh, i32, f16, i32, ptr)
25
struct { /* FCSE PID. */
25
+DEF_HELPER_3(vfp_touqh, i64, f16, i32, ptr)
26
uint32_t fcseidr_ns;
26
+DEF_HELPER_3(vfp_tosqh, i64, f16, i32, ptr)
27
uint32_t fcseidr_s;
27
DEF_HELPER_3(vfp_toshs, i32, f32, i32, ptr)
28
@@ -XXX,XX +XXX,XX @@ struct ArchCPU {
28
DEF_HELPER_3(vfp_tosls, i32, f32, i32, ptr)
29
29
DEF_HELPER_3(vfp_tosqs, i64, f32, i32, ptr)
30
/* DCZ blocksize, in log_2(words), ie low 4 bits of DCZID_EL0 */
30
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_3(vfp_ultod, f64, i64, i32, ptr)
31
uint32_t dcz_blocksize;
31
DEF_HELPER_3(vfp_uqtod, f64, i64, i32, ptr)
32
- uint64_t rvbar;
32
DEF_HELPER_3(vfp_sltoh, f16, i32, i32, ptr)
33
+ uint64_t rvbar_prop; /* Property/input signals. */
33
DEF_HELPER_3(vfp_ultoh, f16, i32, i32, ptr)
34
34
+DEF_HELPER_3(vfp_sqtoh, f16, i64, i32, ptr)
35
/* Configurable aspects of GIC cpu interface (which is part of the CPU) */
35
+DEF_HELPER_3(vfp_uqtoh, f16, i64, i32, ptr)
36
int gic_num_lrs; /* number of list registers */
36
37
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
37
DEF_HELPER_FLAGS_2(set_rmode, TCG_CALL_NO_RWG, i32, i32, ptr)
38
index XXXXXXX..XXXXXXX 100644
38
DEF_HELPER_FLAGS_2(set_neon_rmode, TCG_CALL_NO_RWG, i32, i32, env)
39
--- a/target/arm/cpu.c
40
+++ b/target/arm/cpu.c
41
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(DeviceState *dev)
42
} else {
43
env->pstate = PSTATE_MODE_EL1h;
44
}
45
- env->pc = cpu->rvbar;
46
+
47
+ /* Sample rvbar at reset. */
48
+ env->cp15.rvbar = cpu->rvbar_prop;
49
+ env->pc = env->cp15.rvbar;
50
#endif
51
} else {
52
#if defined(CONFIG_USER_ONLY)
53
@@ -XXX,XX +XXX,XX @@ static Property arm_cpu_reset_cbar_property =
54
static Property arm_cpu_reset_hivecs_property =
55
DEFINE_PROP_BOOL("reset-hivecs", ARMCPU, reset_hivecs, false);
56
57
-static Property arm_cpu_rvbar_property =
58
- DEFINE_PROP_UINT64("rvbar", ARMCPU, rvbar, 0);
59
-
60
#ifndef CONFIG_USER_ONLY
61
static Property arm_cpu_has_el2_property =
62
DEFINE_PROP_BOOL("has_el2", ARMCPU, has_el2, true);
63
@@ -XXX,XX +XXX,XX @@ void arm_cpu_post_init(Object *obj)
64
}
65
66
if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) {
67
- qdev_property_add_static(DEVICE(obj), &arm_cpu_rvbar_property);
68
+ object_property_add_uint64_ptr(obj, "rvbar",
69
+ &cpu->rvbar_prop,
70
+ OBJ_PROP_FLAG_READWRITE);
71
}
72
73
#ifndef CONFIG_USER_ONLY
39
diff --git a/target/arm/helper.c b/target/arm/helper.c
74
diff --git a/target/arm/helper.c b/target/arm/helper.c
40
index XXXXXXX..XXXXXXX 100644
75
index XXXXXXX..XXXXXXX 100644
41
--- a/target/arm/helper.c
76
--- a/target/arm/helper.c
42
+++ b/target/arm/helper.c
77
+++ b/target/arm/helper.c
43
@@ -XXX,XX +XXX,XX @@ VFP_CONV_FIX_A64(uq, s, 32, 64, uint64)
78
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
44
#undef VFP_CONV_FIX_A64
79
ARMCPRegInfo rvbar = {
45
80
.name = "RVBAR_EL1", .state = ARM_CP_STATE_AA64,
46
/* Conversion to/from f16 can overflow to infinity before/after scaling.
81
.opc0 = 3, .opc1 = 0, .crn = 12, .crm = 0, .opc2 = 1,
47
- * Therefore we convert to f64 (which does not round), scale,
82
- .type = ARM_CP_CONST, .access = PL1_R, .resetvalue = cpu->rvbar
48
- * and then convert f64 to f16 (which may round).
83
+ .access = PL1_R,
49
+ * Therefore we convert to f64, scale, and then convert f64 to f16; or
84
+ .fieldoffset = offsetof(CPUARMState, cp15.rvbar),
50
+ * vice versa for conversion to integer.
85
};
51
+ *
86
define_one_arm_cp_reg(cpu, &rvbar);
52
+ * For 16- and 32-bit integers, the conversion to f64 never rounds.
53
+ * For 64-bit integers, any integer that would cause rounding will also
54
+ * overflow to f16 infinity, so there is no double rounding problem.
55
*/
56
57
static float16 do_postscale_fp16(float64 f, int shift, float_status *fpst)
58
@@ -XXX,XX +XXX,XX @@ float16 HELPER(vfp_ultoh)(uint32_t x, uint32_t shift, void *fpst)
59
return do_postscale_fp16(uint32_to_float64(x, fpst), shift, fpst);
60
}
61
62
+float16 HELPER(vfp_sqtoh)(uint64_t x, uint32_t shift, void *fpst)
63
+{
64
+ return do_postscale_fp16(int64_to_float64(x, fpst), shift, fpst);
65
+}
66
+
67
+float16 HELPER(vfp_uqtoh)(uint64_t x, uint32_t shift, void *fpst)
68
+{
69
+ return do_postscale_fp16(uint64_to_float64(x, fpst), shift, fpst);
70
+}
71
+
72
static float64 do_prescale_fp16(float16 f, int shift, float_status *fpst)
73
{
74
if (unlikely(float16_is_any_nan(f))) {
75
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(vfp_touhh)(float16 x, uint32_t shift, void *fpst)
76
return float64_to_uint16(do_prescale_fp16(x, shift, fpst), fpst);
77
}
78
79
+uint32_t HELPER(vfp_toslh)(float16 x, uint32_t shift, void *fpst)
80
+{
81
+ return float64_to_int32(do_prescale_fp16(x, shift, fpst), fpst);
82
+}
83
+
84
+uint32_t HELPER(vfp_toulh)(float16 x, uint32_t shift, void *fpst)
85
+{
86
+ return float64_to_uint32(do_prescale_fp16(x, shift, fpst), fpst);
87
+}
88
+
89
+uint64_t HELPER(vfp_tosqh)(float16 x, uint32_t shift, void *fpst)
90
+{
91
+ return float64_to_int64(do_prescale_fp16(x, shift, fpst), fpst);
92
+}
93
+
94
+uint64_t HELPER(vfp_touqh)(float16 x, uint32_t shift, void *fpst)
95
+{
96
+ return float64_to_uint64(do_prescale_fp16(x, shift, fpst), fpst);
97
+}
98
+
99
/* Set the current fp rounding mode and return the old one.
100
* The argument is a softfloat float_round_ value.
101
*/
102
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
103
index XXXXXXX..XXXXXXX 100644
104
--- a/target/arm/translate-a64.c
105
+++ b/target/arm/translate-a64.c
106
@@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode,
107
bool itof, int rmode, int scale, int sf, int type)
108
{
109
bool is_signed = !(opcode & 1);
110
- bool is_double = type;
111
TCGv_ptr tcg_fpstatus;
112
- TCGv_i32 tcg_shift;
113
+ TCGv_i32 tcg_shift, tcg_single;
114
+ TCGv_i64 tcg_double;
115
116
- tcg_fpstatus = get_fpstatus_ptr(false);
117
+ tcg_fpstatus = get_fpstatus_ptr(type == 3);
118
119
tcg_shift = tcg_const_i32(64 - scale);
120
121
@@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode,
122
tcg_int = tcg_extend;
123
}
87
}
124
88
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
125
- if (is_double) {
89
ARMCPRegInfo rvbar = {
126
- TCGv_i64 tcg_double = tcg_temp_new_i64();
90
.name = "RVBAR_EL2", .state = ARM_CP_STATE_AA64,
127
+ switch (type) {
91
.opc0 = 3, .opc1 = 4, .crn = 12, .crm = 0, .opc2 = 1,
128
+ case 1: /* float64 */
92
- .type = ARM_CP_CONST, .access = PL2_R, .resetvalue = cpu->rvbar
129
+ tcg_double = tcg_temp_new_i64();
93
+ .access = PL2_R,
130
if (is_signed) {
94
+ .fieldoffset = offsetof(CPUARMState, cp15.rvbar),
131
gen_helper_vfp_sqtod(tcg_double, tcg_int,
95
};
132
tcg_shift, tcg_fpstatus);
96
define_one_arm_cp_reg(cpu, &rvbar);
133
@@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode,
134
}
135
write_fp_dreg(s, rd, tcg_double);
136
tcg_temp_free_i64(tcg_double);
137
- } else {
138
- TCGv_i32 tcg_single = tcg_temp_new_i32();
139
+ break;
140
+
141
+ case 0: /* float32 */
142
+ tcg_single = tcg_temp_new_i32();
143
if (is_signed) {
144
gen_helper_vfp_sqtos(tcg_single, tcg_int,
145
tcg_shift, tcg_fpstatus);
146
@@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode,
147
}
148
write_fp_sreg(s, rd, tcg_single);
149
tcg_temp_free_i32(tcg_single);
150
+ break;
151
+
152
+ case 3: /* float16 */
153
+ tcg_single = tcg_temp_new_i32();
154
+ if (is_signed) {
155
+ gen_helper_vfp_sqtoh(tcg_single, tcg_int,
156
+ tcg_shift, tcg_fpstatus);
157
+ } else {
158
+ gen_helper_vfp_uqtoh(tcg_single, tcg_int,
159
+ tcg_shift, tcg_fpstatus);
160
+ }
161
+ write_fp_sreg(s, rd, tcg_single);
162
+ tcg_temp_free_i32(tcg_single);
163
+ break;
164
+
165
+ default:
166
+ g_assert_not_reached();
167
}
97
}
168
} else {
98
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
169
TCGv_i64 tcg_int = cpu_reg(s, rd);
99
ARMCPRegInfo el3_regs[] = {
170
@@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode,
100
{ .name = "RVBAR_EL3", .state = ARM_CP_STATE_AA64,
171
101
.opc0 = 3, .opc1 = 6, .crn = 12, .crm = 0, .opc2 = 1,
172
gen_helper_set_rmode(tcg_rmode, tcg_rmode, tcg_fpstatus);
102
- .type = ARM_CP_CONST, .access = PL3_R, .resetvalue = cpu->rvbar },
173
103
+ .access = PL3_R,
174
- if (is_double) {
104
+ .fieldoffset = offsetof(CPUARMState, cp15.rvbar),
175
- TCGv_i64 tcg_double = read_fp_dreg(s, rn);
105
+ },
176
+ switch (type) {
106
{ .name = "SCTLR_EL3", .state = ARM_CP_STATE_AA64,
177
+ case 1: /* float64 */
107
.opc0 = 3, .opc1 = 6, .crn = 1, .crm = 0, .opc2 = 0,
178
+ tcg_double = read_fp_dreg(s, rn);
108
.access = PL3_RW,
179
if (is_signed) {
180
if (!sf) {
181
gen_helper_vfp_tosld(tcg_int, tcg_double,
182
@@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode,
183
tcg_shift, tcg_fpstatus);
184
}
185
}
186
+ if (!sf) {
187
+ tcg_gen_ext32u_i64(tcg_int, tcg_int);
188
+ }
189
tcg_temp_free_i64(tcg_double);
190
- } else {
191
- TCGv_i32 tcg_single = read_fp_sreg(s, rn);
192
+ break;
193
+
194
+ case 0: /* float32 */
195
+ tcg_single = read_fp_sreg(s, rn);
196
if (sf) {
197
if (is_signed) {
198
gen_helper_vfp_tosqs(tcg_int, tcg_single,
199
@@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode,
200
tcg_temp_free_i32(tcg_dest);
201
}
202
tcg_temp_free_i32(tcg_single);
203
+ break;
204
+
205
+ case 3: /* float16 */
206
+ tcg_single = read_fp_sreg(s, rn);
207
+ if (sf) {
208
+ if (is_signed) {
209
+ gen_helper_vfp_tosqh(tcg_int, tcg_single,
210
+ tcg_shift, tcg_fpstatus);
211
+ } else {
212
+ gen_helper_vfp_touqh(tcg_int, tcg_single,
213
+ tcg_shift, tcg_fpstatus);
214
+ }
215
+ } else {
216
+ TCGv_i32 tcg_dest = tcg_temp_new_i32();
217
+ if (is_signed) {
218
+ gen_helper_vfp_toslh(tcg_dest, tcg_single,
219
+ tcg_shift, tcg_fpstatus);
220
+ } else {
221
+ gen_helper_vfp_toulh(tcg_dest, tcg_single,
222
+ tcg_shift, tcg_fpstatus);
223
+ }
224
+ tcg_gen_extu_i32_i64(tcg_int, tcg_dest);
225
+ tcg_temp_free_i32(tcg_dest);
226
+ }
227
+ tcg_temp_free_i32(tcg_single);
228
+ break;
229
+
230
+ default:
231
+ g_assert_not_reached();
232
}
233
234
gen_helper_set_rmode(tcg_rmode, tcg_rmode, tcg_fpstatus);
235
tcg_temp_free_i32(tcg_rmode);
236
-
237
- if (!sf) {
238
- tcg_gen_ext32u_i64(tcg_int, tcg_int);
239
- }
240
}
241
242
tcg_temp_free_ptr(tcg_fpstatus);
243
@@ -XXX,XX +XXX,XX @@ static void disas_fp_int_conv(DisasContext *s, uint32_t insn)
244
/* actual FP conversions */
245
bool itof = extract32(opcode, 1, 1);
246
247
- if (type > 1 || (rmode != 0 && opcode > 1)) {
248
+ if (rmode != 0 && opcode > 1) {
249
+ unallocated_encoding(s);
250
+ return;
251
+ }
252
+ switch (type) {
253
+ case 0: /* float32 */
254
+ case 1: /* float64 */
255
+ break;
256
+ case 3: /* float16 */
257
+ if (arm_dc_feature(s, ARM_FEATURE_V8_FP16)) {
258
+ break;
259
+ }
260
+ /* fallthru */
261
+ default:
262
unallocated_encoding(s);
263
return;
264
}
265
--
109
--
266
2.17.0
110
2.25.1
267
268
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
2
2
3
Cc: qemu-stable@nongnu.org
3
Add a model of the Xilinx ZynqMP CRF. At the moment this
4
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
4
is mostly a stub model.
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
6
Tested-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20180512003217.9105-5-richard.henderson@linaro.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
9
Message-id: 20220316164645.2303510-4-edgar.iglesias@gmail.com
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
11
---
10
target/arm/translate-a64.c | 17 +++++++++++++++--
12
include/hw/misc/xlnx-zynqmp-crf.h | 211 ++++++++++++++++++++++++
11
1 file changed, 15 insertions(+), 2 deletions(-)
13
hw/misc/xlnx-zynqmp-crf.c | 266 ++++++++++++++++++++++++++++++
14
hw/misc/meson.build | 1 +
15
3 files changed, 478 insertions(+)
16
create mode 100644 include/hw/misc/xlnx-zynqmp-crf.h
17
create mode 100644 hw/misc/xlnx-zynqmp-crf.c
12
18
13
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
19
diff --git a/include/hw/misc/xlnx-zynqmp-crf.h b/include/hw/misc/xlnx-zynqmp-crf.h
20
new file mode 100644
21
index XXXXXXX..XXXXXXX
22
--- /dev/null
23
+++ b/include/hw/misc/xlnx-zynqmp-crf.h
24
@@ -XXX,XX +XXX,XX @@
25
+/*
26
+ * QEMU model of the CRF - Clock Reset FPD.
27
+ *
28
+ * Copyright (c) 2022 Xilinx Inc.
29
+ * SPDX-License-Identifier: GPL-2.0-or-later
30
+ * Written by Edgar E. Iglesias <edgar.iglesias@xilinx.com>
31
+ */
32
+#ifndef HW_MISC_XLNX_ZYNQMP_CRF_H
33
+#define HW_MISC_XLNX_ZYNQMP_CRF_H
34
+
35
+#include "hw/sysbus.h"
36
+#include "hw/register.h"
37
+
38
+#define TYPE_XLNX_ZYNQMP_CRF "xlnx.zynqmp_crf"
39
+OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPCRF, XLNX_ZYNQMP_CRF)
40
+
41
+REG32(ERR_CTRL, 0x0)
42
+ FIELD(ERR_CTRL, SLVERR_ENABLE, 0, 1)
43
+REG32(IR_STATUS, 0x4)
44
+ FIELD(IR_STATUS, ADDR_DECODE_ERR, 0, 1)
45
+REG32(IR_MASK, 0x8)
46
+ FIELD(IR_MASK, ADDR_DECODE_ERR, 0, 1)
47
+REG32(IR_ENABLE, 0xc)
48
+ FIELD(IR_ENABLE, ADDR_DECODE_ERR, 0, 1)
49
+REG32(IR_DISABLE, 0x10)
50
+ FIELD(IR_DISABLE, ADDR_DECODE_ERR, 0, 1)
51
+REG32(CRF_WPROT, 0x1c)
52
+ FIELD(CRF_WPROT, ACTIVE, 0, 1)
53
+REG32(APLL_CTRL, 0x20)
54
+ FIELD(APLL_CTRL, POST_SRC, 24, 3)
55
+ FIELD(APLL_CTRL, PRE_SRC, 20, 3)
56
+ FIELD(APLL_CTRL, CLKOUTDIV, 17, 1)
57
+ FIELD(APLL_CTRL, DIV2, 16, 1)
58
+ FIELD(APLL_CTRL, FBDIV, 8, 7)
59
+ FIELD(APLL_CTRL, BYPASS, 3, 1)
60
+ FIELD(APLL_CTRL, RESET, 0, 1)
61
+REG32(APLL_CFG, 0x24)
62
+ FIELD(APLL_CFG, LOCK_DLY, 25, 7)
63
+ FIELD(APLL_CFG, LOCK_CNT, 13, 10)
64
+ FIELD(APLL_CFG, LFHF, 10, 2)
65
+ FIELD(APLL_CFG, CP, 5, 4)
66
+ FIELD(APLL_CFG, RES, 0, 4)
67
+REG32(APLL_FRAC_CFG, 0x28)
68
+ FIELD(APLL_FRAC_CFG, ENABLED, 31, 1)
69
+ FIELD(APLL_FRAC_CFG, SEED, 22, 3)
70
+ FIELD(APLL_FRAC_CFG, ALGRTHM, 19, 1)
71
+ FIELD(APLL_FRAC_CFG, ORDER, 18, 1)
72
+ FIELD(APLL_FRAC_CFG, DATA, 0, 16)
73
+REG32(DPLL_CTRL, 0x2c)
74
+ FIELD(DPLL_CTRL, POST_SRC, 24, 3)
75
+ FIELD(DPLL_CTRL, PRE_SRC, 20, 3)
76
+ FIELD(DPLL_CTRL, CLKOUTDIV, 17, 1)
77
+ FIELD(DPLL_CTRL, DIV2, 16, 1)
78
+ FIELD(DPLL_CTRL, FBDIV, 8, 7)
79
+ FIELD(DPLL_CTRL, BYPASS, 3, 1)
80
+ FIELD(DPLL_CTRL, RESET, 0, 1)
81
+REG32(DPLL_CFG, 0x30)
82
+ FIELD(DPLL_CFG, LOCK_DLY, 25, 7)
83
+ FIELD(DPLL_CFG, LOCK_CNT, 13, 10)
84
+ FIELD(DPLL_CFG, LFHF, 10, 2)
85
+ FIELD(DPLL_CFG, CP, 5, 4)
86
+ FIELD(DPLL_CFG, RES, 0, 4)
87
+REG32(DPLL_FRAC_CFG, 0x34)
88
+ FIELD(DPLL_FRAC_CFG, ENABLED, 31, 1)
89
+ FIELD(DPLL_FRAC_CFG, SEED, 22, 3)
90
+ FIELD(DPLL_FRAC_CFG, ALGRTHM, 19, 1)
91
+ FIELD(DPLL_FRAC_CFG, ORDER, 18, 1)
92
+ FIELD(DPLL_FRAC_CFG, DATA, 0, 16)
93
+REG32(VPLL_CTRL, 0x38)
94
+ FIELD(VPLL_CTRL, POST_SRC, 24, 3)
95
+ FIELD(VPLL_CTRL, PRE_SRC, 20, 3)
96
+ FIELD(VPLL_CTRL, CLKOUTDIV, 17, 1)
97
+ FIELD(VPLL_CTRL, DIV2, 16, 1)
98
+ FIELD(VPLL_CTRL, FBDIV, 8, 7)
99
+ FIELD(VPLL_CTRL, BYPASS, 3, 1)
100
+ FIELD(VPLL_CTRL, RESET, 0, 1)
101
+REG32(VPLL_CFG, 0x3c)
102
+ FIELD(VPLL_CFG, LOCK_DLY, 25, 7)
103
+ FIELD(VPLL_CFG, LOCK_CNT, 13, 10)
104
+ FIELD(VPLL_CFG, LFHF, 10, 2)
105
+ FIELD(VPLL_CFG, CP, 5, 4)
106
+ FIELD(VPLL_CFG, RES, 0, 4)
107
+REG32(VPLL_FRAC_CFG, 0x40)
108
+ FIELD(VPLL_FRAC_CFG, ENABLED, 31, 1)
109
+ FIELD(VPLL_FRAC_CFG, SEED, 22, 3)
110
+ FIELD(VPLL_FRAC_CFG, ALGRTHM, 19, 1)
111
+ FIELD(VPLL_FRAC_CFG, ORDER, 18, 1)
112
+ FIELD(VPLL_FRAC_CFG, DATA, 0, 16)
113
+REG32(PLL_STATUS, 0x44)
114
+ FIELD(PLL_STATUS, VPLL_STABLE, 5, 1)
115
+ FIELD(PLL_STATUS, DPLL_STABLE, 4, 1)
116
+ FIELD(PLL_STATUS, APLL_STABLE, 3, 1)
117
+ FIELD(PLL_STATUS, VPLL_LOCK, 2, 1)
118
+ FIELD(PLL_STATUS, DPLL_LOCK, 1, 1)
119
+ FIELD(PLL_STATUS, APLL_LOCK, 0, 1)
120
+REG32(APLL_TO_LPD_CTRL, 0x48)
121
+ FIELD(APLL_TO_LPD_CTRL, DIVISOR0, 8, 6)
122
+REG32(DPLL_TO_LPD_CTRL, 0x4c)
123
+ FIELD(DPLL_TO_LPD_CTRL, DIVISOR0, 8, 6)
124
+REG32(VPLL_TO_LPD_CTRL, 0x50)
125
+ FIELD(VPLL_TO_LPD_CTRL, DIVISOR0, 8, 6)
126
+REG32(ACPU_CTRL, 0x60)
127
+ FIELD(ACPU_CTRL, CLKACT_HALF, 25, 1)
128
+ FIELD(ACPU_CTRL, CLKACT_FULL, 24, 1)
129
+ FIELD(ACPU_CTRL, DIVISOR0, 8, 6)
130
+ FIELD(ACPU_CTRL, SRCSEL, 0, 3)
131
+REG32(DBG_TRACE_CTRL, 0x64)
132
+ FIELD(DBG_TRACE_CTRL, CLKACT, 24, 1)
133
+ FIELD(DBG_TRACE_CTRL, DIVISOR0, 8, 6)
134
+ FIELD(DBG_TRACE_CTRL, SRCSEL, 0, 3)
135
+REG32(DBG_FPD_CTRL, 0x68)
136
+ FIELD(DBG_FPD_CTRL, CLKACT, 24, 1)
137
+ FIELD(DBG_FPD_CTRL, DIVISOR0, 8, 6)
138
+ FIELD(DBG_FPD_CTRL, SRCSEL, 0, 3)
139
+REG32(DP_VIDEO_REF_CTRL, 0x70)
140
+ FIELD(DP_VIDEO_REF_CTRL, CLKACT, 24, 1)
141
+ FIELD(DP_VIDEO_REF_CTRL, DIVISOR1, 16, 6)
142
+ FIELD(DP_VIDEO_REF_CTRL, DIVISOR0, 8, 6)
143
+ FIELD(DP_VIDEO_REF_CTRL, SRCSEL, 0, 3)
144
+REG32(DP_AUDIO_REF_CTRL, 0x74)
145
+ FIELD(DP_AUDIO_REF_CTRL, CLKACT, 24, 1)
146
+ FIELD(DP_AUDIO_REF_CTRL, DIVISOR1, 16, 6)
147
+ FIELD(DP_AUDIO_REF_CTRL, DIVISOR0, 8, 6)
148
+ FIELD(DP_AUDIO_REF_CTRL, SRCSEL, 0, 3)
149
+REG32(DP_STC_REF_CTRL, 0x7c)
150
+ FIELD(DP_STC_REF_CTRL, CLKACT, 24, 1)
151
+ FIELD(DP_STC_REF_CTRL, DIVISOR1, 16, 6)
152
+ FIELD(DP_STC_REF_CTRL, DIVISOR0, 8, 6)
153
+ FIELD(DP_STC_REF_CTRL, SRCSEL, 0, 3)
154
+REG32(DDR_CTRL, 0x80)
155
+ FIELD(DDR_CTRL, CLKACT, 24, 1)
156
+ FIELD(DDR_CTRL, DIVISOR0, 8, 6)
157
+ FIELD(DDR_CTRL, SRCSEL, 0, 3)
158
+REG32(GPU_REF_CTRL, 0x84)
159
+ FIELD(GPU_REF_CTRL, PP1_CLKACT, 26, 1)
160
+ FIELD(GPU_REF_CTRL, PP0_CLKACT, 25, 1)
161
+ FIELD(GPU_REF_CTRL, CLKACT, 24, 1)
162
+ FIELD(GPU_REF_CTRL, DIVISOR0, 8, 6)
163
+ FIELD(GPU_REF_CTRL, SRCSEL, 0, 3)
164
+REG32(SATA_REF_CTRL, 0xa0)
165
+ FIELD(SATA_REF_CTRL, CLKACT, 24, 1)
166
+ FIELD(SATA_REF_CTRL, DIVISOR0, 8, 6)
167
+ FIELD(SATA_REF_CTRL, SRCSEL, 0, 3)
168
+REG32(PCIE_REF_CTRL, 0xb4)
169
+ FIELD(PCIE_REF_CTRL, CLKACT, 24, 1)
170
+ FIELD(PCIE_REF_CTRL, DIVISOR0, 8, 6)
171
+ FIELD(PCIE_REF_CTRL, SRCSEL, 0, 3)
172
+REG32(GDMA_REF_CTRL, 0xb8)
173
+ FIELD(GDMA_REF_CTRL, CLKACT, 24, 1)
174
+ FIELD(GDMA_REF_CTRL, DIVISOR0, 8, 6)
175
+ FIELD(GDMA_REF_CTRL, SRCSEL, 0, 3)
176
+REG32(DPDMA_REF_CTRL, 0xbc)
177
+ FIELD(DPDMA_REF_CTRL, CLKACT, 24, 1)
178
+ FIELD(DPDMA_REF_CTRL, DIVISOR0, 8, 6)
179
+ FIELD(DPDMA_REF_CTRL, SRCSEL, 0, 3)
180
+REG32(TOPSW_MAIN_CTRL, 0xc0)
181
+ FIELD(TOPSW_MAIN_CTRL, CLKACT, 24, 1)
182
+ FIELD(TOPSW_MAIN_CTRL, DIVISOR0, 8, 6)
183
+ FIELD(TOPSW_MAIN_CTRL, SRCSEL, 0, 3)
184
+REG32(TOPSW_LSBUS_CTRL, 0xc4)
185
+ FIELD(TOPSW_LSBUS_CTRL, CLKACT, 24, 1)
186
+ FIELD(TOPSW_LSBUS_CTRL, DIVISOR0, 8, 6)
187
+ FIELD(TOPSW_LSBUS_CTRL, SRCSEL, 0, 3)
188
+REG32(DBG_TSTMP_CTRL, 0xf8)
189
+ FIELD(DBG_TSTMP_CTRL, DIVISOR0, 8, 6)
190
+ FIELD(DBG_TSTMP_CTRL, SRCSEL, 0, 3)
191
+REG32(RST_FPD_TOP, 0x100)
192
+ FIELD(RST_FPD_TOP, PCIE_CFG_RESET, 19, 1)
193
+ FIELD(RST_FPD_TOP, PCIE_BRIDGE_RESET, 18, 1)
194
+ FIELD(RST_FPD_TOP, PCIE_CTRL_RESET, 17, 1)
195
+ FIELD(RST_FPD_TOP, DP_RESET, 16, 1)
196
+ FIELD(RST_FPD_TOP, SWDT_RESET, 15, 1)
197
+ FIELD(RST_FPD_TOP, AFI_FM5_RESET, 12, 1)
198
+ FIELD(RST_FPD_TOP, AFI_FM4_RESET, 11, 1)
199
+ FIELD(RST_FPD_TOP, AFI_FM3_RESET, 10, 1)
200
+ FIELD(RST_FPD_TOP, AFI_FM2_RESET, 9, 1)
201
+ FIELD(RST_FPD_TOP, AFI_FM1_RESET, 8, 1)
202
+ FIELD(RST_FPD_TOP, AFI_FM0_RESET, 7, 1)
203
+ FIELD(RST_FPD_TOP, GDMA_RESET, 6, 1)
204
+ FIELD(RST_FPD_TOP, GPU_PP1_RESET, 5, 1)
205
+ FIELD(RST_FPD_TOP, GPU_PP0_RESET, 4, 1)
206
+ FIELD(RST_FPD_TOP, GPU_RESET, 3, 1)
207
+ FIELD(RST_FPD_TOP, GT_RESET, 2, 1)
208
+ FIELD(RST_FPD_TOP, SATA_RESET, 1, 1)
209
+REG32(RST_FPD_APU, 0x104)
210
+ FIELD(RST_FPD_APU, ACPU3_PWRON_RESET, 13, 1)
211
+ FIELD(RST_FPD_APU, ACPU2_PWRON_RESET, 12, 1)
212
+ FIELD(RST_FPD_APU, ACPU1_PWRON_RESET, 11, 1)
213
+ FIELD(RST_FPD_APU, ACPU0_PWRON_RESET, 10, 1)
214
+ FIELD(RST_FPD_APU, APU_L2_RESET, 8, 1)
215
+ FIELD(RST_FPD_APU, ACPU3_RESET, 3, 1)
216
+ FIELD(RST_FPD_APU, ACPU2_RESET, 2, 1)
217
+ FIELD(RST_FPD_APU, ACPU1_RESET, 1, 1)
218
+ FIELD(RST_FPD_APU, ACPU0_RESET, 0, 1)
219
+REG32(RST_DDR_SS, 0x108)
220
+ FIELD(RST_DDR_SS, DDR_RESET, 3, 1)
221
+ FIELD(RST_DDR_SS, APM_RESET, 2, 1)
222
+
223
+#define CRF_R_MAX (R_RST_DDR_SS + 1)
224
+
225
+struct XlnxZynqMPCRF {
226
+ SysBusDevice parent_obj;
227
+ MemoryRegion iomem;
228
+ qemu_irq irq_ir;
229
+
230
+ RegisterInfoArray *reg_array;
231
+ uint32_t regs[CRF_R_MAX];
232
+ RegisterInfo regs_info[CRF_R_MAX];
233
+};
234
+
235
+#endif
236
diff --git a/hw/misc/xlnx-zynqmp-crf.c b/hw/misc/xlnx-zynqmp-crf.c
237
new file mode 100644
238
index XXXXXXX..XXXXXXX
239
--- /dev/null
240
+++ b/hw/misc/xlnx-zynqmp-crf.c
241
@@ -XXX,XX +XXX,XX @@
242
+/*
243
+ * QEMU model of the CRF - Clock Reset FPD.
244
+ *
245
+ * Copyright (c) 2022 Xilinx Inc.
246
+ * SPDX-License-Identifier: GPL-2.0-or-later
247
+ * Written by Edgar E. Iglesias <edgar.iglesias@xilinx.com>
248
+ */
249
+
250
+#include "qemu/osdep.h"
251
+#include "hw/sysbus.h"
252
+#include "hw/register.h"
253
+#include "qemu/bitops.h"
254
+#include "qemu/log.h"
255
+#include "migration/vmstate.h"
256
+#include "hw/irq.h"
257
+#include "hw/misc/xlnx-zynqmp-crf.h"
258
+#include "target/arm/arm-powerctl.h"
259
+
260
+#ifndef XLNX_ZYNQMP_CRF_ERR_DEBUG
261
+#define XLNX_ZYNQMP_CRF_ERR_DEBUG 0
262
+#endif
263
+
264
+#define CRF_MAX_CPU 4
265
+
266
+static void ir_update_irq(XlnxZynqMPCRF *s)
267
+{
268
+ bool pending = s->regs[R_IR_STATUS] & ~s->regs[R_IR_MASK];
269
+ qemu_set_irq(s->irq_ir, pending);
270
+}
271
+
272
+static void ir_status_postw(RegisterInfo *reg, uint64_t val64)
273
+{
274
+ XlnxZynqMPCRF *s = XLNX_ZYNQMP_CRF(reg->opaque);
275
+ ir_update_irq(s);
276
+}
277
+
278
+static uint64_t ir_enable_prew(RegisterInfo *reg, uint64_t val64)
279
+{
280
+ XlnxZynqMPCRF *s = XLNX_ZYNQMP_CRF(reg->opaque);
281
+ uint32_t val = val64;
282
+
283
+ s->regs[R_IR_MASK] &= ~val;
284
+ ir_update_irq(s);
285
+ return 0;
286
+}
287
+
288
+static uint64_t ir_disable_prew(RegisterInfo *reg, uint64_t val64)
289
+{
290
+ XlnxZynqMPCRF *s = XLNX_ZYNQMP_CRF(reg->opaque);
291
+ uint32_t val = val64;
292
+
293
+ s->regs[R_IR_MASK] |= val;
294
+ ir_update_irq(s);
295
+ return 0;
296
+}
297
+
298
+static uint64_t rst_fpd_apu_prew(RegisterInfo *reg, uint64_t val64)
299
+{
300
+ XlnxZynqMPCRF *s = XLNX_ZYNQMP_CRF(reg->opaque);
301
+ uint32_t val = val64;
302
+ uint32_t val_old = s->regs[R_RST_FPD_APU];
303
+ unsigned int i;
304
+
305
+ for (i = 0; i < CRF_MAX_CPU; i++) {
306
+ uint32_t mask = (1 << (R_RST_FPD_APU_ACPU0_RESET_SHIFT + i));
307
+
308
+ if ((val ^ val_old) & mask) {
309
+ if (val & mask) {
310
+ arm_set_cpu_off(i);
311
+ } else {
312
+ arm_set_cpu_on_and_reset(i);
313
+ }
314
+ }
315
+ }
316
+ return val64;
317
+}
318
+
319
+static const RegisterAccessInfo crf_regs_info[] = {
320
+ { .name = "ERR_CTRL", .addr = A_ERR_CTRL,
321
+ },{ .name = "IR_STATUS", .addr = A_IR_STATUS,
322
+ .w1c = 0x1,
323
+ .post_write = ir_status_postw,
324
+ },{ .name = "IR_MASK", .addr = A_IR_MASK,
325
+ .reset = 0x1,
326
+ .ro = 0x1,
327
+ },{ .name = "IR_ENABLE", .addr = A_IR_ENABLE,
328
+ .pre_write = ir_enable_prew,
329
+ },{ .name = "IR_DISABLE", .addr = A_IR_DISABLE,
330
+ .pre_write = ir_disable_prew,
331
+ },{ .name = "CRF_WPROT", .addr = A_CRF_WPROT,
332
+ },{ .name = "APLL_CTRL", .addr = A_APLL_CTRL,
333
+ .reset = 0x12c09,
334
+ .rsvd = 0xf88c80f6,
335
+ },{ .name = "APLL_CFG", .addr = A_APLL_CFG,
336
+ .rsvd = 0x1801210,
337
+ },{ .name = "APLL_FRAC_CFG", .addr = A_APLL_FRAC_CFG,
338
+ .rsvd = 0x7e330000,
339
+ },{ .name = "DPLL_CTRL", .addr = A_DPLL_CTRL,
340
+ .reset = 0x2c09,
341
+ .rsvd = 0xf88c80f6,
342
+ },{ .name = "DPLL_CFG", .addr = A_DPLL_CFG,
343
+ .rsvd = 0x1801210,
344
+ },{ .name = "DPLL_FRAC_CFG", .addr = A_DPLL_FRAC_CFG,
345
+ .rsvd = 0x7e330000,
346
+ },{ .name = "VPLL_CTRL", .addr = A_VPLL_CTRL,
347
+ .reset = 0x12809,
348
+ .rsvd = 0xf88c80f6,
349
+ },{ .name = "VPLL_CFG", .addr = A_VPLL_CFG,
350
+ .rsvd = 0x1801210,
351
+ },{ .name = "VPLL_FRAC_CFG", .addr = A_VPLL_FRAC_CFG,
352
+ .rsvd = 0x7e330000,
353
+ },{ .name = "PLL_STATUS", .addr = A_PLL_STATUS,
354
+ .reset = 0x3f,
355
+ .rsvd = 0xc0,
356
+ .ro = 0x3f,
357
+ },{ .name = "APLL_TO_LPD_CTRL", .addr = A_APLL_TO_LPD_CTRL,
358
+ .reset = 0x400,
359
+ .rsvd = 0xc0ff,
360
+ },{ .name = "DPLL_TO_LPD_CTRL", .addr = A_DPLL_TO_LPD_CTRL,
361
+ .reset = 0x400,
362
+ .rsvd = 0xc0ff,
363
+ },{ .name = "VPLL_TO_LPD_CTRL", .addr = A_VPLL_TO_LPD_CTRL,
364
+ .reset = 0x400,
365
+ .rsvd = 0xc0ff,
366
+ },{ .name = "ACPU_CTRL", .addr = A_ACPU_CTRL,
367
+ .reset = 0x3000400,
368
+ .rsvd = 0xfcffc0f8,
369
+ },{ .name = "DBG_TRACE_CTRL", .addr = A_DBG_TRACE_CTRL,
370
+ .reset = 0x2500,
371
+ .rsvd = 0xfeffc0f8,
372
+ },{ .name = "DBG_FPD_CTRL", .addr = A_DBG_FPD_CTRL,
373
+ .reset = 0x1002500,
374
+ .rsvd = 0xfeffc0f8,
375
+ },{ .name = "DP_VIDEO_REF_CTRL", .addr = A_DP_VIDEO_REF_CTRL,
376
+ .reset = 0x1002300,
377
+ .rsvd = 0xfec0c0f8,
378
+ },{ .name = "DP_AUDIO_REF_CTRL", .addr = A_DP_AUDIO_REF_CTRL,
379
+ .reset = 0x1032300,
380
+ .rsvd = 0xfec0c0f8,
381
+ },{ .name = "DP_STC_REF_CTRL", .addr = A_DP_STC_REF_CTRL,
382
+ .reset = 0x1203200,
383
+ .rsvd = 0xfec0c0f8,
384
+ },{ .name = "DDR_CTRL", .addr = A_DDR_CTRL,
385
+ .reset = 0x1000500,
386
+ .rsvd = 0xfeffc0f8,
387
+ },{ .name = "GPU_REF_CTRL", .addr = A_GPU_REF_CTRL,
388
+ .reset = 0x1500,
389
+ .rsvd = 0xf8ffc0f8,
390
+ },{ .name = "SATA_REF_CTRL", .addr = A_SATA_REF_CTRL,
391
+ .reset = 0x1001600,
392
+ .rsvd = 0xfeffc0f8,
393
+ },{ .name = "PCIE_REF_CTRL", .addr = A_PCIE_REF_CTRL,
394
+ .reset = 0x1500,
395
+ .rsvd = 0xfeffc0f8,
396
+ },{ .name = "GDMA_REF_CTRL", .addr = A_GDMA_REF_CTRL,
397
+ .reset = 0x1000500,
398
+ .rsvd = 0xfeffc0f8,
399
+ },{ .name = "DPDMA_REF_CTRL", .addr = A_DPDMA_REF_CTRL,
400
+ .reset = 0x1000500,
401
+ .rsvd = 0xfeffc0f8,
402
+ },{ .name = "TOPSW_MAIN_CTRL", .addr = A_TOPSW_MAIN_CTRL,
403
+ .reset = 0x1000400,
404
+ .rsvd = 0xfeffc0f8,
405
+ },{ .name = "TOPSW_LSBUS_CTRL", .addr = A_TOPSW_LSBUS_CTRL,
406
+ .reset = 0x1000800,
407
+ .rsvd = 0xfeffc0f8,
408
+ },{ .name = "DBG_TSTMP_CTRL", .addr = A_DBG_TSTMP_CTRL,
409
+ .reset = 0xa00,
410
+ .rsvd = 0xffffc0f8,
411
+ },
412
+ { .name = "RST_FPD_TOP", .addr = A_RST_FPD_TOP,
413
+ .reset = 0xf9ffe,
414
+ .rsvd = 0xf06001,
415
+ },{ .name = "RST_FPD_APU", .addr = A_RST_FPD_APU,
416
+ .reset = 0x3d0f,
417
+ .rsvd = 0xc2f0,
418
+ .pre_write = rst_fpd_apu_prew,
419
+ },{ .name = "RST_DDR_SS", .addr = A_RST_DDR_SS,
420
+ .reset = 0xf,
421
+ .rsvd = 0xf3,
422
+ }
423
+};
424
+
425
+static void crf_reset_enter(Object *obj, ResetType type)
426
+{
427
+ XlnxZynqMPCRF *s = XLNX_ZYNQMP_CRF(obj);
428
+ unsigned int i;
429
+
430
+ for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) {
431
+ register_reset(&s->regs_info[i]);
432
+ }
433
+}
434
+
435
+static void crf_reset_hold(Object *obj)
436
+{
437
+ XlnxZynqMPCRF *s = XLNX_ZYNQMP_CRF(obj);
438
+ ir_update_irq(s);
439
+}
440
+
441
+static const MemoryRegionOps crf_ops = {
442
+ .read = register_read_memory,
443
+ .write = register_write_memory,
444
+ .endianness = DEVICE_LITTLE_ENDIAN,
445
+ .valid = {
446
+ .min_access_size = 4,
447
+ .max_access_size = 4,
448
+ },
449
+};
450
+
451
+static void crf_init(Object *obj)
452
+{
453
+ XlnxZynqMPCRF *s = XLNX_ZYNQMP_CRF(obj);
454
+ SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
455
+
456
+ s->reg_array =
457
+ register_init_block32(DEVICE(obj), crf_regs_info,
458
+ ARRAY_SIZE(crf_regs_info),
459
+ s->regs_info, s->regs,
460
+ &crf_ops,
461
+ XLNX_ZYNQMP_CRF_ERR_DEBUG,
462
+ CRF_R_MAX * 4);
463
+ sysbus_init_mmio(sbd, &s->reg_array->mem);
464
+ sysbus_init_irq(sbd, &s->irq_ir);
465
+}
466
+
467
+static void crf_finalize(Object *obj)
468
+{
469
+ XlnxZynqMPCRF *s = XLNX_ZYNQMP_CRF(obj);
470
+ register_finalize_block(s->reg_array);
471
+}
472
+
473
+static const VMStateDescription vmstate_crf = {
474
+ .name = TYPE_XLNX_ZYNQMP_CRF,
475
+ .version_id = 1,
476
+ .minimum_version_id = 1,
477
+ .fields = (VMStateField[]) {
478
+ VMSTATE_UINT32_ARRAY(regs, XlnxZynqMPCRF, CRF_R_MAX),
479
+ VMSTATE_END_OF_LIST(),
480
+ }
481
+};
482
+
483
+static void crf_class_init(ObjectClass *klass, void *data)
484
+{
485
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
486
+ DeviceClass *dc = DEVICE_CLASS(klass);
487
+
488
+ dc->vmsd = &vmstate_crf;
489
+ rc->phases.enter = crf_reset_enter;
490
+ rc->phases.hold = crf_reset_hold;
491
+}
492
+
493
+static const TypeInfo crf_info = {
494
+ .name = TYPE_XLNX_ZYNQMP_CRF,
495
+ .parent = TYPE_SYS_BUS_DEVICE,
496
+ .instance_size = sizeof(XlnxZynqMPCRF),
497
+ .class_init = crf_class_init,
498
+ .instance_init = crf_init,
499
+ .instance_finalize = crf_finalize,
500
+};
501
+
502
+static void crf_register_types(void)
503
+{
504
+ type_register_static(&crf_info);
505
+}
506
+
507
+type_init(crf_register_types)
508
diff --git a/hw/misc/meson.build b/hw/misc/meson.build
14
index XXXXXXX..XXXXXXX 100644
509
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-a64.c
510
--- a/hw/misc/meson.build
16
+++ b/target/arm/translate-a64.c
511
+++ b/hw/misc/meson.build
17
@@ -XXX,XX +XXX,XX @@ static void disas_fp_fixed_conv(DisasContext *s, uint32_t insn)
512
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_RASPI', if_true: files(
18
bool sf = extract32(insn, 31, 1);
513
))
19
bool itof;
514
softmmu_ss.add(when: 'CONFIG_SLAVIO', if_true: files('slavio_misc.c'))
20
515
softmmu_ss.add(when: 'CONFIG_ZYNQ', if_true: files('zynq_slcr.c'))
21
- if (sbit || (type > 1)
516
+specific_ss.add(when: 'CONFIG_XLNX_ZYNQMP_ARM', if_true: files('xlnx-zynqmp-crf.c'))
22
- || (!sf && scale < 32)) {
517
softmmu_ss.add(when: 'CONFIG_XLNX_VERSAL', if_true: files(
23
+ if (sbit || (!sf && scale < 32)) {
518
'xlnx-versal-xramc.c',
24
+ unallocated_encoding(s);
519
'xlnx-versal-pmc-iou-slcr.c',
25
+ return;
26
+ }
27
+
28
+ switch (type) {
29
+ case 0: /* float32 */
30
+ case 1: /* float64 */
31
+ break;
32
+ case 3: /* float16 */
33
+ if (arm_dc_feature(s, ARM_FEATURE_V8_FP16)) {
34
+ break;
35
+ }
36
+ /* fallthru */
37
+ default:
38
unallocated_encoding(s);
39
return;
40
}
41
--
520
--
42
2.17.0
521
2.25.1
43
522
44
523
diff view generated by jsdifflib
1
From: Alex Bennée <alex.bennee@linaro.org>
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
2
2
3
These where missed out from the rest of the half-precision work.
3
Connect the ZynqMP CRF - Clock Reset FPD device.
4
4
5
Cc: qemu-stable@nongnu.org
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Francisco Iglesias <francisco.iglesias@xilinx.com>
7
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
7
Reviewed-by: Luc Michel <luc@lmichel.fr>
8
Tested-by: Alex Bennée <alex.bennee@linaro.org>
8
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20220316164645.2303510-5-edgar.iglesias@gmail.com
10
Message-id: 20180512003217.9105-9-richard.henderson@linaro.org
11
[rth: Diagnose lack of FP16 before fp_access_check]
12
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
11
---
15
target/arm/helper-a64.h | 2 +
12
include/hw/arm/xlnx-zynqmp.h | 2 ++
16
target/arm/helper-a64.c | 10 +++++
13
hw/arm/xlnx-zynqmp.c | 16 ++++++++++++++++
17
target/arm/translate-a64.c | 88 ++++++++++++++++++++++++++++++--------
14
2 files changed, 18 insertions(+)
18
3 files changed, 83 insertions(+), 17 deletions(-)
19
15
20
diff --git a/target/arm/helper-a64.h b/target/arm/helper-a64.h
16
diff --git a/include/hw/arm/xlnx-zynqmp.h b/include/hw/arm/xlnx-zynqmp.h
21
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
22
--- a/target/arm/helper-a64.h
18
--- a/include/hw/arm/xlnx-zynqmp.h
23
+++ b/target/arm/helper-a64.h
19
+++ b/include/hw/arm/xlnx-zynqmp.h
24
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@
25
DEF_HELPER_FLAGS_2(udiv64, TCG_CALL_NO_RWG_SE, i64, i64, i64)
21
#include "hw/nvram/xlnx-bbram.h"
26
DEF_HELPER_FLAGS_2(sdiv64, TCG_CALL_NO_RWG_SE, s64, s64, s64)
22
#include "hw/nvram/xlnx-zynqmp-efuse.h"
27
DEF_HELPER_FLAGS_1(rbit64, TCG_CALL_NO_RWG_SE, i64, i64)
23
#include "hw/or-irq.h"
28
+DEF_HELPER_3(vfp_cmph_a64, i64, f16, f16, ptr)
24
+#include "hw/misc/xlnx-zynqmp-crf.h"
29
+DEF_HELPER_3(vfp_cmpeh_a64, i64, f16, f16, ptr)
25
30
DEF_HELPER_3(vfp_cmps_a64, i64, f32, f32, ptr)
26
#define TYPE_XLNX_ZYNQMP "xlnx-zynqmp"
31
DEF_HELPER_3(vfp_cmpes_a64, i64, f32, f32, ptr)
27
OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPState, XLNX_ZYNQMP)
32
DEF_HELPER_3(vfp_cmpd_a64, i64, f64, f64, ptr)
28
@@ -XXX,XX +XXX,XX @@ struct XlnxZynqMPState {
33
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
29
XlnxZDMA adma[XLNX_ZYNQMP_NUM_ADMA_CH];
30
XlnxCSUDMA qspi_dma;
31
qemu_or_irq qspi_irq_orgate;
32
+ XlnxZynqMPCRF crf;
33
34
char *boot_cpu;
35
ARMCPU *boot_cpu_ptr;
36
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
34
index XXXXXXX..XXXXXXX 100644
37
index XXXXXXX..XXXXXXX 100644
35
--- a/target/arm/helper-a64.c
38
--- a/hw/arm/xlnx-zynqmp.c
36
+++ b/target/arm/helper-a64.c
39
+++ b/hw/arm/xlnx-zynqmp.c
37
@@ -XXX,XX +XXX,XX @@ static inline uint32_t float_rel_to_flags(int res)
40
@@ -XXX,XX +XXX,XX @@
38
return flags;
41
#define QSPI_DMA_ADDR 0xff0f0800
42
#define NUM_QSPI_IRQ_LINES 2
43
44
+#define CRF_ADDR 0xfd1a0000
45
+#define CRF_IRQ 120
46
+
47
/* Serializer/Deserializer. */
48
#define SERDES_ADDR 0xfd400000
49
#define SERDES_SIZE 0x20000
50
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_create_efuse(XlnxZynqMPState *s, qemu_irq *gic)
51
sysbus_connect_irq(sbd, 0, gic[EFUSE_IRQ]);
39
}
52
}
40
53
41
+uint64_t HELPER(vfp_cmph_a64)(float16 x, float16 y, void *fp_status)
54
+static void xlnx_zynqmp_create_crf(XlnxZynqMPState *s, qemu_irq *gic)
42
+{
55
+{
43
+ return float_rel_to_flags(float16_compare_quiet(x, y, fp_status));
56
+ SysBusDevice *sbd;
57
+
58
+ object_initialize_child(OBJECT(s), "crf", &s->crf, TYPE_XLNX_ZYNQMP_CRF);
59
+ sbd = SYS_BUS_DEVICE(&s->crf);
60
+
61
+ sysbus_realize(sbd, &error_fatal);
62
+ sysbus_mmio_map(sbd, 0, CRF_ADDR);
63
+ sysbus_connect_irq(sbd, 0, gic[CRF_IRQ]);
44
+}
64
+}
45
+
65
+
46
+uint64_t HELPER(vfp_cmpeh_a64)(float16 x, float16 y, void *fp_status)
66
static void xlnx_zynqmp_create_unimp_mmio(XlnxZynqMPState *s)
47
+{
48
+ return float_rel_to_flags(float16_compare(x, y, fp_status));
49
+}
50
+
51
uint64_t HELPER(vfp_cmps_a64)(float32 x, float32 y, void *fp_status)
52
{
67
{
53
return float_rel_to_flags(float32_compare_quiet(x, y, fp_status));
68
static const struct UnimpInfo {
54
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
69
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
55
index XXXXXXX..XXXXXXX 100644
70
56
--- a/target/arm/translate-a64.c
71
xlnx_zynqmp_create_bbram(s, gic_spi);
57
+++ b/target/arm/translate-a64.c
72
xlnx_zynqmp_create_efuse(s, gic_spi);
58
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_reg(DisasContext *s, uint32_t insn)
73
+ xlnx_zynqmp_create_crf(s, gic_spi);
59
}
74
xlnx_zynqmp_create_unimp_mmio(s);
60
}
75
61
76
for (i = 0; i < XLNX_ZYNQMP_NUM_GDMA_CH; i++) {
62
-static void handle_fp_compare(DisasContext *s, bool is_double,
63
+static void handle_fp_compare(DisasContext *s, int size,
64
unsigned int rn, unsigned int rm,
65
bool cmp_with_zero, bool signal_all_nans)
66
{
67
TCGv_i64 tcg_flags = tcg_temp_new_i64();
68
- TCGv_ptr fpst = get_fpstatus_ptr(false);
69
+ TCGv_ptr fpst = get_fpstatus_ptr(size == MO_16);
70
71
- if (is_double) {
72
+ if (size == MO_64) {
73
TCGv_i64 tcg_vn, tcg_vm;
74
75
tcg_vn = read_fp_dreg(s, rn);
76
@@ -XXX,XX +XXX,XX @@ static void handle_fp_compare(DisasContext *s, bool is_double,
77
tcg_temp_free_i64(tcg_vn);
78
tcg_temp_free_i64(tcg_vm);
79
} else {
80
- TCGv_i32 tcg_vn, tcg_vm;
81
+ TCGv_i32 tcg_vn = tcg_temp_new_i32();
82
+ TCGv_i32 tcg_vm = tcg_temp_new_i32();
83
84
- tcg_vn = read_fp_sreg(s, rn);
85
+ read_vec_element_i32(s, tcg_vn, rn, 0, size);
86
if (cmp_with_zero) {
87
- tcg_vm = tcg_const_i32(0);
88
+ tcg_gen_movi_i32(tcg_vm, 0);
89
} else {
90
- tcg_vm = read_fp_sreg(s, rm);
91
+ read_vec_element_i32(s, tcg_vm, rm, 0, size);
92
}
93
- if (signal_all_nans) {
94
- gen_helper_vfp_cmpes_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
95
- } else {
96
- gen_helper_vfp_cmps_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
97
+
98
+ switch (size) {
99
+ case MO_32:
100
+ if (signal_all_nans) {
101
+ gen_helper_vfp_cmpes_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
102
+ } else {
103
+ gen_helper_vfp_cmps_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
104
+ }
105
+ break;
106
+ case MO_16:
107
+ if (signal_all_nans) {
108
+ gen_helper_vfp_cmpeh_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
109
+ } else {
110
+ gen_helper_vfp_cmph_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
111
+ }
112
+ break;
113
+ default:
114
+ g_assert_not_reached();
115
}
116
+
117
tcg_temp_free_i32(tcg_vn);
118
tcg_temp_free_i32(tcg_vm);
119
}
120
@@ -XXX,XX +XXX,XX @@ static void handle_fp_compare(DisasContext *s, bool is_double,
121
static void disas_fp_compare(DisasContext *s, uint32_t insn)
122
{
123
unsigned int mos, type, rm, op, rn, opc, op2r;
124
+ int size;
125
126
mos = extract32(insn, 29, 3);
127
- type = extract32(insn, 22, 2); /* 0 = single, 1 = double */
128
+ type = extract32(insn, 22, 2);
129
rm = extract32(insn, 16, 5);
130
op = extract32(insn, 14, 2);
131
rn = extract32(insn, 5, 5);
132
opc = extract32(insn, 3, 2);
133
op2r = extract32(insn, 0, 3);
134
135
- if (mos || op || op2r || type > 1) {
136
+ if (mos || op || op2r) {
137
+ unallocated_encoding(s);
138
+ return;
139
+ }
140
+
141
+ switch (type) {
142
+ case 0:
143
+ size = MO_32;
144
+ break;
145
+ case 1:
146
+ size = MO_64;
147
+ break;
148
+ case 3:
149
+ size = MO_16;
150
+ if (arm_dc_feature(s, ARM_FEATURE_V8_FP16)) {
151
+ break;
152
+ }
153
+ /* fallthru */
154
+ default:
155
unallocated_encoding(s);
156
return;
157
}
158
@@ -XXX,XX +XXX,XX @@ static void disas_fp_compare(DisasContext *s, uint32_t insn)
159
return;
160
}
161
162
- handle_fp_compare(s, type, rn, rm, opc & 1, opc & 2);
163
+ handle_fp_compare(s, size, rn, rm, opc & 1, opc & 2);
164
}
165
166
/* Floating point conditional compare
167
@@ -XXX,XX +XXX,XX @@ static void disas_fp_ccomp(DisasContext *s, uint32_t insn)
168
unsigned int mos, type, rm, cond, rn, op, nzcv;
169
TCGv_i64 tcg_flags;
170
TCGLabel *label_continue = NULL;
171
+ int size;
172
173
mos = extract32(insn, 29, 3);
174
- type = extract32(insn, 22, 2); /* 0 = single, 1 = double */
175
+ type = extract32(insn, 22, 2);
176
rm = extract32(insn, 16, 5);
177
cond = extract32(insn, 12, 4);
178
rn = extract32(insn, 5, 5);
179
op = extract32(insn, 4, 1);
180
nzcv = extract32(insn, 0, 4);
181
182
- if (mos || type > 1) {
183
+ if (mos) {
184
+ unallocated_encoding(s);
185
+ return;
186
+ }
187
+
188
+ switch (type) {
189
+ case 0:
190
+ size = MO_32;
191
+ break;
192
+ case 1:
193
+ size = MO_64;
194
+ break;
195
+ case 3:
196
+ size = MO_16;
197
+ if (arm_dc_feature(s, ARM_FEATURE_V8_FP16)) {
198
+ break;
199
+ }
200
+ /* fallthru */
201
+ default:
202
unallocated_encoding(s);
203
return;
204
}
205
@@ -XXX,XX +XXX,XX @@ static void disas_fp_ccomp(DisasContext *s, uint32_t insn)
206
gen_set_label(label_match);
207
}
208
209
- handle_fp_compare(s, type, rn, rm, false, op);
210
+ handle_fp_compare(s, size, rn, rm, false, op);
211
212
if (cond < 0x0e) {
213
gen_set_label(label_continue);
214
--
77
--
215
2.17.0
78
2.25.1
216
79
217
80
diff view generated by jsdifflib
New patch
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
2
3
Add a model of the Xilinx ZynqMP APU Control.
4
5
Reviewed-by: Luc Michel <luc@lmichel.fr>
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
7
Message-id: 20220316164645.2303510-6-edgar.iglesias@gmail.com
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
include/hw/misc/xlnx-zynqmp-apu-ctrl.h | 93 +++++++++
11
hw/misc/xlnx-zynqmp-apu-ctrl.c | 253 +++++++++++++++++++++++++
12
hw/misc/meson.build | 1 +
13
3 files changed, 347 insertions(+)
14
create mode 100644 include/hw/misc/xlnx-zynqmp-apu-ctrl.h
15
create mode 100644 hw/misc/xlnx-zynqmp-apu-ctrl.c
16
17
diff --git a/include/hw/misc/xlnx-zynqmp-apu-ctrl.h b/include/hw/misc/xlnx-zynqmp-apu-ctrl.h
18
new file mode 100644
19
index XXXXXXX..XXXXXXX
20
--- /dev/null
21
+++ b/include/hw/misc/xlnx-zynqmp-apu-ctrl.h
22
@@ -XXX,XX +XXX,XX @@
23
+/*
24
+ * QEMU model of ZynqMP APU Control.
25
+ *
26
+ * Copyright (c) 2013-2022 Xilinx Inc
27
+ * SPDX-License-Identifier: GPL-2.0-or-later
28
+ *
29
+ * Written by Peter Crosthwaite <peter.crosthwaite@xilinx.com> and
30
+ * Edgar E. Iglesias <edgar.iglesias@xilinx.com>
31
+ *
32
+ */
33
+#ifndef HW_MISC_XLNX_ZYNQMP_APU_CTRL_H
34
+#define HW_MISC_XLNX_ZYNQMP_APU_CTRL_H
35
+
36
+#include "hw/sysbus.h"
37
+#include "hw/register.h"
38
+#include "target/arm/cpu.h"
39
+
40
+#define TYPE_XLNX_ZYNQMP_APU_CTRL "xlnx.apu-ctrl"
41
+OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPAPUCtrl, XLNX_ZYNQMP_APU_CTRL)
42
+
43
+REG32(APU_ERR_CTRL, 0x0)
44
+ FIELD(APU_ERR_CTRL, PSLVERR, 0, 1)
45
+REG32(ISR, 0x10)
46
+ FIELD(ISR, INV_APB, 0, 1)
47
+REG32(IMR, 0x14)
48
+ FIELD(IMR, INV_APB, 0, 1)
49
+REG32(IEN, 0x18)
50
+ FIELD(IEN, INV_APB, 0, 1)
51
+REG32(IDS, 0x1c)
52
+ FIELD(IDS, INV_APB, 0, 1)
53
+REG32(CONFIG_0, 0x20)
54
+ FIELD(CONFIG_0, CFGTE, 24, 4)
55
+ FIELD(CONFIG_0, CFGEND, 16, 4)
56
+ FIELD(CONFIG_0, VINITHI, 8, 4)
57
+ FIELD(CONFIG_0, AA64NAA32, 0, 4)
58
+REG32(CONFIG_1, 0x24)
59
+ FIELD(CONFIG_1, L2RSTDISABLE, 29, 1)
60
+ FIELD(CONFIG_1, L1RSTDISABLE, 28, 1)
61
+ FIELD(CONFIG_1, CP15DISABLE, 0, 4)
62
+REG32(RVBARADDR0L, 0x40)
63
+ FIELD(RVBARADDR0L, ADDR, 2, 30)
64
+REG32(RVBARADDR0H, 0x44)
65
+ FIELD(RVBARADDR0H, ADDR, 0, 8)
66
+REG32(RVBARADDR1L, 0x48)
67
+ FIELD(RVBARADDR1L, ADDR, 2, 30)
68
+REG32(RVBARADDR1H, 0x4c)
69
+ FIELD(RVBARADDR1H, ADDR, 0, 8)
70
+REG32(RVBARADDR2L, 0x50)
71
+ FIELD(RVBARADDR2L, ADDR, 2, 30)
72
+REG32(RVBARADDR2H, 0x54)
73
+ FIELD(RVBARADDR2H, ADDR, 0, 8)
74
+REG32(RVBARADDR3L, 0x58)
75
+ FIELD(RVBARADDR3L, ADDR, 2, 30)
76
+REG32(RVBARADDR3H, 0x5c)
77
+ FIELD(RVBARADDR3H, ADDR, 0, 8)
78
+REG32(ACE_CTRL, 0x60)
79
+ FIELD(ACE_CTRL, AWQOS, 16, 4)
80
+ FIELD(ACE_CTRL, ARQOS, 0, 4)
81
+REG32(SNOOP_CTRL, 0x80)
82
+ FIELD(SNOOP_CTRL, ACE_INACT, 4, 1)
83
+ FIELD(SNOOP_CTRL, ACP_INACT, 0, 1)
84
+REG32(PWRCTL, 0x90)
85
+ FIELD(PWRCTL, CLREXMONREQ, 17, 1)
86
+ FIELD(PWRCTL, L2FLUSHREQ, 16, 1)
87
+ FIELD(PWRCTL, CPUPWRDWNREQ, 0, 4)
88
+REG32(PWRSTAT, 0x94)
89
+ FIELD(PWRSTAT, CLREXMONACK, 17, 1)
90
+ FIELD(PWRSTAT, L2FLUSHDONE, 16, 1)
91
+ FIELD(PWRSTAT, DBGNOPWRDWN, 0, 4)
92
+
93
+#define APU_R_MAX ((R_PWRSTAT) + 1)
94
+
95
+#define APU_MAX_CPU 4
96
+
97
+struct XlnxZynqMPAPUCtrl {
98
+ SysBusDevice busdev;
99
+
100
+ ARMCPU *cpus[APU_MAX_CPU];
101
+ /* WFIs towards PMU. */
102
+ qemu_irq wfi_out[4];
103
+ /* CPU Power status towards INTC Redirect. */
104
+ qemu_irq cpu_power_status[4];
105
+ qemu_irq irq_imr;
106
+
107
+ uint8_t cpu_pwrdwn_req;
108
+ uint8_t cpu_in_wfi;
109
+
110
+ RegisterInfoArray *reg_array;
111
+ uint32_t regs[APU_R_MAX];
112
+ RegisterInfo regs_info[APU_R_MAX];
113
+};
114
+
115
+#endif
116
diff --git a/hw/misc/xlnx-zynqmp-apu-ctrl.c b/hw/misc/xlnx-zynqmp-apu-ctrl.c
117
new file mode 100644
118
index XXXXXXX..XXXXXXX
119
--- /dev/null
120
+++ b/hw/misc/xlnx-zynqmp-apu-ctrl.c
121
@@ -XXX,XX +XXX,XX @@
122
+/*
123
+ * QEMU model of the ZynqMP APU Control.
124
+ *
125
+ * Copyright (c) 2013-2022 Xilinx Inc
126
+ * SPDX-License-Identifier: GPL-2.0-or-later
127
+ *
128
+ * Written by Peter Crosthwaite <peter.crosthwaite@xilinx.com> and
129
+ * Edgar E. Iglesias <edgar.iglesias@xilinx.com>
130
+ */
131
+
132
+#include "qemu/osdep.h"
133
+#include "qapi/error.h"
134
+#include "qemu/log.h"
135
+#include "migration/vmstate.h"
136
+#include "hw/qdev-properties.h"
137
+#include "hw/sysbus.h"
138
+#include "hw/irq.h"
139
+#include "hw/register.h"
140
+
141
+#include "qemu/bitops.h"
142
+#include "qapi/qmp/qerror.h"
143
+
144
+#include "hw/misc/xlnx-zynqmp-apu-ctrl.h"
145
+
146
+#ifndef XILINX_ZYNQMP_APU_ERR_DEBUG
147
+#define XILINX_ZYNQMP_APU_ERR_DEBUG 0
148
+#endif
149
+
150
+static void update_wfi_out(void *opaque)
151
+{
152
+ XlnxZynqMPAPUCtrl *s = XLNX_ZYNQMP_APU_CTRL(opaque);
153
+ unsigned int i, wfi_pending;
154
+
155
+ wfi_pending = s->cpu_pwrdwn_req & s->cpu_in_wfi;
156
+ for (i = 0; i < APU_MAX_CPU; i++) {
157
+ qemu_set_irq(s->wfi_out[i], !!(wfi_pending & (1 << i)));
158
+ }
159
+}
160
+
161
+static void zynqmp_apu_rvbar_post_write(RegisterInfo *reg, uint64_t val)
162
+{
163
+ XlnxZynqMPAPUCtrl *s = XLNX_ZYNQMP_APU_CTRL(reg->opaque);
164
+ int i;
165
+
166
+ for (i = 0; i < APU_MAX_CPU; ++i) {
167
+ uint64_t rvbar = s->regs[R_RVBARADDR0L + 2 * i] +
168
+ ((uint64_t)s->regs[R_RVBARADDR0H + 2 * i] << 32);
169
+ if (s->cpus[i]) {
170
+ object_property_set_int(OBJECT(s->cpus[i]), "rvbar", rvbar,
171
+ &error_abort);
172
+ }
173
+ }
174
+}
175
+
176
+static void zynqmp_apu_pwrctl_post_write(RegisterInfo *reg, uint64_t val)
177
+{
178
+ XlnxZynqMPAPUCtrl *s = XLNX_ZYNQMP_APU_CTRL(reg->opaque);
179
+ unsigned int i, new;
180
+
181
+ for (i = 0; i < APU_MAX_CPU; i++) {
182
+ new = val & (1 << i);
183
+ /* Check if CPU's CPUPWRDNREQ has changed. If yes, update GPIOs. */
184
+ if (new != (s->cpu_pwrdwn_req & (1 << i))) {
185
+ qemu_set_irq(s->cpu_power_status[i], !!new);
186
+ }
187
+ s->cpu_pwrdwn_req &= ~(1 << i);
188
+ s->cpu_pwrdwn_req |= new;
189
+ }
190
+ update_wfi_out(s);
191
+}
192
+
193
+static void imr_update_irq(XlnxZynqMPAPUCtrl *s)
194
+{
195
+ bool pending = s->regs[R_ISR] & ~s->regs[R_IMR];
196
+ qemu_set_irq(s->irq_imr, pending);
197
+}
198
+
199
+static void isr_postw(RegisterInfo *reg, uint64_t val64)
200
+{
201
+ XlnxZynqMPAPUCtrl *s = XLNX_ZYNQMP_APU_CTRL(reg->opaque);
202
+ imr_update_irq(s);
203
+}
204
+
205
+static uint64_t ien_prew(RegisterInfo *reg, uint64_t val64)
206
+{
207
+ XlnxZynqMPAPUCtrl *s = XLNX_ZYNQMP_APU_CTRL(reg->opaque);
208
+ uint32_t val = val64;
209
+
210
+ s->regs[R_IMR] &= ~val;
211
+ imr_update_irq(s);
212
+ return 0;
213
+}
214
+
215
+static uint64_t ids_prew(RegisterInfo *reg, uint64_t val64)
216
+{
217
+ XlnxZynqMPAPUCtrl *s = XLNX_ZYNQMP_APU_CTRL(reg->opaque);
218
+ uint32_t val = val64;
219
+
220
+ s->regs[R_IMR] |= val;
221
+ imr_update_irq(s);
222
+ return 0;
223
+}
224
+
225
+static const RegisterAccessInfo zynqmp_apu_regs_info[] = {
226
+#define RVBAR_REGDEF(n) \
227
+ { .name = "RVBAR CPU " #n " Low", .addr = A_RVBARADDR ## n ## L, \
228
+ .reset = 0xffff0000ul, \
229
+ .post_write = zynqmp_apu_rvbar_post_write, \
230
+ },{ .name = "RVBAR CPU " #n " High", .addr = A_RVBARADDR ## n ## H, \
231
+ .post_write = zynqmp_apu_rvbar_post_write, \
232
+ }
233
+ { .name = "ERR_CTRL", .addr = A_APU_ERR_CTRL,
234
+ },{ .name = "ISR", .addr = A_ISR,
235
+ .w1c = 0x1,
236
+ .post_write = isr_postw,
237
+ },{ .name = "IMR", .addr = A_IMR,
238
+ .reset = 0x1,
239
+ .ro = 0x1,
240
+ },{ .name = "IEN", .addr = A_IEN,
241
+ .pre_write = ien_prew,
242
+ },{ .name = "IDS", .addr = A_IDS,
243
+ .pre_write = ids_prew,
244
+ },{ .name = "CONFIG_0", .addr = A_CONFIG_0,
245
+ .reset = 0xf0f,
246
+ },{ .name = "CONFIG_1", .addr = A_CONFIG_1,
247
+ },
248
+ RVBAR_REGDEF(0),
249
+ RVBAR_REGDEF(1),
250
+ RVBAR_REGDEF(2),
251
+ RVBAR_REGDEF(3),
252
+ { .name = "ACE_CTRL", .addr = A_ACE_CTRL,
253
+ .reset = 0xf000f,
254
+ },{ .name = "SNOOP_CTRL", .addr = A_SNOOP_CTRL,
255
+ },{ .name = "PWRCTL", .addr = A_PWRCTL,
256
+ .post_write = zynqmp_apu_pwrctl_post_write,
257
+ },{ .name = "PWRSTAT", .addr = A_PWRSTAT,
258
+ .ro = 0x3000f,
259
+ }
260
+};
261
+
262
+static void zynqmp_apu_reset_enter(Object *obj, ResetType type)
263
+{
264
+ XlnxZynqMPAPUCtrl *s = XLNX_ZYNQMP_APU_CTRL(obj);
265
+ int i;
266
+
267
+ for (i = 0; i < APU_R_MAX; ++i) {
268
+ register_reset(&s->regs_info[i]);
269
+ }
270
+
271
+ s->cpu_pwrdwn_req = 0;
272
+ s->cpu_in_wfi = 0;
273
+}
274
+
275
+static void zynqmp_apu_reset_hold(Object *obj)
276
+{
277
+ XlnxZynqMPAPUCtrl *s = XLNX_ZYNQMP_APU_CTRL(obj);
278
+
279
+ update_wfi_out(s);
280
+ imr_update_irq(s);
281
+}
282
+
283
+static const MemoryRegionOps zynqmp_apu_ops = {
284
+ .read = register_read_memory,
285
+ .write = register_write_memory,
286
+ .endianness = DEVICE_LITTLE_ENDIAN,
287
+ .valid = {
288
+ .min_access_size = 4,
289
+ .max_access_size = 4,
290
+ }
291
+};
292
+
293
+static void zynqmp_apu_handle_wfi(void *opaque, int irq, int level)
294
+{
295
+ XlnxZynqMPAPUCtrl *s = XLNX_ZYNQMP_APU_CTRL(opaque);
296
+
297
+ s->cpu_in_wfi = deposit32(s->cpu_in_wfi, irq, 1, level);
298
+ update_wfi_out(s);
299
+}
300
+
301
+static void zynqmp_apu_init(Object *obj)
302
+{
303
+ XlnxZynqMPAPUCtrl *s = XLNX_ZYNQMP_APU_CTRL(obj);
304
+ int i;
305
+
306
+ s->reg_array =
307
+ register_init_block32(DEVICE(obj), zynqmp_apu_regs_info,
308
+ ARRAY_SIZE(zynqmp_apu_regs_info),
309
+ s->regs_info, s->regs,
310
+ &zynqmp_apu_ops,
311
+ XILINX_ZYNQMP_APU_ERR_DEBUG,
312
+ APU_R_MAX * 4);
313
+ sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->reg_array->mem);
314
+ sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->irq_imr);
315
+
316
+ for (i = 0; i < APU_MAX_CPU; ++i) {
317
+ g_autofree gchar *prop_name = g_strdup_printf("cpu%d", i);
318
+ object_property_add_link(obj, prop_name, TYPE_ARM_CPU,
319
+ (Object **)&s->cpus[i],
320
+ qdev_prop_allow_set_link_before_realize,
321
+ OBJ_PROP_LINK_STRONG);
322
+ }
323
+
324
+ /* wfi_out is used to connect to PMU GPIs. */
325
+ qdev_init_gpio_out_named(DEVICE(obj), s->wfi_out, "wfi_out", 4);
326
+ /* CPU_POWER_STATUS is used to connect to INTC redirect. */
327
+ qdev_init_gpio_out_named(DEVICE(obj), s->cpu_power_status,
328
+ "CPU_POWER_STATUS", 4);
329
+ /* wfi_in is used as input from CPUs as wfi request. */
330
+ qdev_init_gpio_in_named(DEVICE(obj), zynqmp_apu_handle_wfi, "wfi_in", 4);
331
+}
332
+
333
+static void zynqmp_apu_finalize(Object *obj)
334
+{
335
+ XlnxZynqMPAPUCtrl *s = XLNX_ZYNQMP_APU_CTRL(obj);
336
+ register_finalize_block(s->reg_array);
337
+}
338
+
339
+static const VMStateDescription vmstate_zynqmp_apu = {
340
+ .name = TYPE_XLNX_ZYNQMP_APU_CTRL,
341
+ .version_id = 1,
342
+ .minimum_version_id = 1,
343
+ .fields = (VMStateField[]) {
344
+ VMSTATE_UINT32_ARRAY(regs, XlnxZynqMPAPUCtrl, APU_R_MAX),
345
+ VMSTATE_END_OF_LIST(),
346
+ }
347
+};
348
+
349
+static void zynqmp_apu_class_init(ObjectClass *klass, void *data)
350
+{
351
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
352
+ DeviceClass *dc = DEVICE_CLASS(klass);
353
+
354
+ dc->vmsd = &vmstate_zynqmp_apu;
355
+
356
+ rc->phases.enter = zynqmp_apu_reset_enter;
357
+ rc->phases.hold = zynqmp_apu_reset_hold;
358
+}
359
+
360
+static const TypeInfo zynqmp_apu_info = {
361
+ .name = TYPE_XLNX_ZYNQMP_APU_CTRL,
362
+ .parent = TYPE_SYS_BUS_DEVICE,
363
+ .instance_size = sizeof(XlnxZynqMPAPUCtrl),
364
+ .class_init = zynqmp_apu_class_init,
365
+ .instance_init = zynqmp_apu_init,
366
+ .instance_finalize = zynqmp_apu_finalize,
367
+};
368
+
369
+static void zynqmp_apu_register_types(void)
370
+{
371
+ type_register_static(&zynqmp_apu_info);
372
+}
373
+
374
+type_init(zynqmp_apu_register_types)
375
diff --git a/hw/misc/meson.build b/hw/misc/meson.build
376
index XXXXXXX..XXXXXXX 100644
377
--- a/hw/misc/meson.build
378
+++ b/hw/misc/meson.build
379
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_RASPI', if_true: files(
380
softmmu_ss.add(when: 'CONFIG_SLAVIO', if_true: files('slavio_misc.c'))
381
softmmu_ss.add(when: 'CONFIG_ZYNQ', if_true: files('zynq_slcr.c'))
382
specific_ss.add(when: 'CONFIG_XLNX_ZYNQMP_ARM', if_true: files('xlnx-zynqmp-crf.c'))
383
+specific_ss.add(when: 'CONFIG_XLNX_ZYNQMP_ARM', if_true: files('xlnx-zynqmp-apu-ctrl.c'))
384
softmmu_ss.add(when: 'CONFIG_XLNX_VERSAL', if_true: files(
385
'xlnx-versal-xramc.c',
386
'xlnx-versal-pmc-iou-slcr.c',
387
--
388
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
2
2
3
We missed all of the scalar fp16 fma operations.
3
Connect the ZynqMP APU Control device.
4
4
5
Cc: qemu-stable@nongnu.org
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Francisco Iglesias <francisco.iglesias@xilinx.com>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Luc Michel <luc@lmichel.fr>
8
Tested-by: Alex Bennée <alex.bennee@linaro.org>
8
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
9
Message-id: 20180512003217.9105-8-richard.henderson@linaro.org
9
Message-id: 20220316164645.2303510-7-edgar.iglesias@gmail.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
11
---
12
target/arm/translate-a64.c | 48 ++++++++++++++++++++++++++++++++++++++
12
include/hw/arm/xlnx-zynqmp.h | 4 +++-
13
1 file changed, 48 insertions(+)
13
hw/arm/xlnx-zynqmp.c | 25 +++++++++++++++++++++++--
14
2 files changed, 26 insertions(+), 3 deletions(-)
14
15
15
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
16
diff --git a/include/hw/arm/xlnx-zynqmp.h b/include/hw/arm/xlnx-zynqmp.h
16
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-a64.c
18
--- a/include/hw/arm/xlnx-zynqmp.h
18
+++ b/target/arm/translate-a64.c
19
+++ b/include/hw/arm/xlnx-zynqmp.h
19
@@ -XXX,XX +XXX,XX @@ static void handle_fp_3src_double(DisasContext *s, bool o0, bool o1,
20
@@ -XXX,XX +XXX,XX @@
20
tcg_temp_free_i64(tcg_res);
21
#include "hw/nvram/xlnx-bbram.h"
22
#include "hw/nvram/xlnx-zynqmp-efuse.h"
23
#include "hw/or-irq.h"
24
+#include "hw/misc/xlnx-zynqmp-apu-ctrl.h"
25
#include "hw/misc/xlnx-zynqmp-crf.h"
26
27
#define TYPE_XLNX_ZYNQMP "xlnx-zynqmp"
28
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPState, XLNX_ZYNQMP)
29
/*
30
* Unimplemented mmio regions needed to boot some images.
31
*/
32
-#define XLNX_ZYNQMP_NUM_UNIMP_AREAS 2
33
+#define XLNX_ZYNQMP_NUM_UNIMP_AREAS 1
34
35
struct XlnxZynqMPState {
36
/*< private >*/
37
@@ -XXX,XX +XXX,XX @@ struct XlnxZynqMPState {
38
XlnxZDMA adma[XLNX_ZYNQMP_NUM_ADMA_CH];
39
XlnxCSUDMA qspi_dma;
40
qemu_or_irq qspi_irq_orgate;
41
+ XlnxZynqMPAPUCtrl apu_ctrl;
42
XlnxZynqMPCRF crf;
43
44
char *boot_cpu;
45
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
46
index XXXXXXX..XXXXXXX 100644
47
--- a/hw/arm/xlnx-zynqmp.c
48
+++ b/hw/arm/xlnx-zynqmp.c
49
@@ -XXX,XX +XXX,XX @@
50
#define DPDMA_IRQ 116
51
52
#define APU_ADDR 0xfd5c0000
53
-#define APU_SIZE 0x100
54
+#define APU_IRQ 153
55
56
#define IPI_ADDR 0xFF300000
57
#define IPI_IRQ 64
58
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_create_efuse(XlnxZynqMPState *s, qemu_irq *gic)
59
sysbus_connect_irq(sbd, 0, gic[EFUSE_IRQ]);
21
}
60
}
22
61
23
+/* Floating-point data-processing (3 source) - half precision */
62
+static void xlnx_zynqmp_create_apu_ctrl(XlnxZynqMPState *s, qemu_irq *gic)
24
+static void handle_fp_3src_half(DisasContext *s, bool o0, bool o1,
25
+ int rd, int rn, int rm, int ra)
26
+{
63
+{
27
+ TCGv_i32 tcg_op1, tcg_op2, tcg_op3;
64
+ SysBusDevice *sbd;
28
+ TCGv_i32 tcg_res = tcg_temp_new_i32();
65
+ int i;
29
+ TCGv_ptr fpst = get_fpstatus_ptr(true);
30
+
66
+
31
+ tcg_op1 = read_fp_hreg(s, rn);
67
+ object_initialize_child(OBJECT(s), "apu-ctrl", &s->apu_ctrl,
32
+ tcg_op2 = read_fp_hreg(s, rm);
68
+ TYPE_XLNX_ZYNQMP_APU_CTRL);
33
+ tcg_op3 = read_fp_hreg(s, ra);
69
+ sbd = SYS_BUS_DEVICE(&s->apu_ctrl);
34
+
70
+
35
+ /* These are fused multiply-add, and must be done as one
71
+ for (i = 0; i < XLNX_ZYNQMP_NUM_APU_CPUS; i++) {
36
+ * floating point operation with no rounding between the
72
+ g_autofree gchar *name = g_strdup_printf("cpu%d", i);
37
+ * multiplication and addition steps.
73
+
38
+ * NB that doing the negations here as separate steps is
74
+ object_property_set_link(OBJECT(&s->apu_ctrl), name,
39
+ * correct : an input NaN should come out with its sign bit
75
+ OBJECT(&s->apu_cpu[i]), &error_abort);
40
+ * flipped if it is a negated-input.
41
+ */
42
+ if (o1 == true) {
43
+ tcg_gen_xori_i32(tcg_op3, tcg_op3, 0x8000);
44
+ }
76
+ }
45
+
77
+
46
+ if (o0 != o1) {
78
+ sysbus_realize(sbd, &error_fatal);
47
+ tcg_gen_xori_i32(tcg_op1, tcg_op1, 0x8000);
79
+ sysbus_mmio_map(sbd, 0, APU_ADDR);
48
+ }
80
+ sysbus_connect_irq(sbd, 0, gic[APU_IRQ]);
49
+
50
+ gen_helper_advsimd_muladdh(tcg_res, tcg_op1, tcg_op2, tcg_op3, fpst);
51
+
52
+ write_fp_sreg(s, rd, tcg_res);
53
+
54
+ tcg_temp_free_ptr(fpst);
55
+ tcg_temp_free_i32(tcg_op1);
56
+ tcg_temp_free_i32(tcg_op2);
57
+ tcg_temp_free_i32(tcg_op3);
58
+ tcg_temp_free_i32(tcg_res);
59
+}
81
+}
60
+
82
+
61
/* Floating point data-processing (3 source)
83
static void xlnx_zynqmp_create_crf(XlnxZynqMPState *s, qemu_irq *gic)
62
* 31 30 29 28 24 23 22 21 20 16 15 14 10 9 5 4 0
84
{
63
* +---+---+---+-----------+------+----+------+----+------+------+------+
85
SysBusDevice *sbd;
64
@@ -XXX,XX +XXX,XX @@ static void disas_fp_3src(DisasContext *s, uint32_t insn)
86
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_create_unimp_mmio(XlnxZynqMPState *s)
65
}
87
hwaddr base;
66
handle_fp_3src_double(s, o0, o1, rd, rn, rm, ra);
88
hwaddr size;
67
break;
89
} unimp_areas[ARRAY_SIZE(s->mr_unimp)] = {
68
+ case 3:
90
- { .name = "apu", APU_ADDR, APU_SIZE },
69
+ if (!arm_dc_feature(s, ARM_FEATURE_V8_FP16)) {
91
{ .name = "serdes", SERDES_ADDR, SERDES_SIZE },
70
+ unallocated_encoding(s);
92
};
71
+ return;
93
unsigned int nr;
72
+ }
94
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
73
+ if (!fp_access_check(s)) {
95
74
+ return;
96
xlnx_zynqmp_create_bbram(s, gic_spi);
75
+ }
97
xlnx_zynqmp_create_efuse(s, gic_spi);
76
+ handle_fp_3src_half(s, o0, o1, rd, rn, rm, ra);
98
+ xlnx_zynqmp_create_apu_ctrl(s, gic_spi);
77
+ break;
99
xlnx_zynqmp_create_crf(s, gic_spi);
78
default:
100
xlnx_zynqmp_create_unimp_mmio(s);
79
unallocated_encoding(s);
101
80
}
81
--
102
--
82
2.17.0
103
2.25.1
83
104
84
105
diff view generated by jsdifflib
1
From: Alex Bennée <alex.bennee@linaro.org>
1
From: Andrew Deason <adeason@sinenomine.net>
2
2
3
Reported by Coverity (CID1390635). We ensure this for uint_to_float
3
On older Solaris releases (before Solaris 11), we didn't get a
4
later on so we might as well mirror that.
4
prototype for madvise, and so util/osdep.c provides its own prototype.
5
Some time between the public Solaris 11.4 release and Solaris 11.4.42
6
CBE, we started getting an madvise prototype that looks like this:
5
7
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
8
extern int madvise(void *, size_t, int);
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
10
which conflicts with the prototype in util/osdeps.c. Instead of always
11
declaring this prototype, check if we're missing the madvise()
12
prototype, and only declare it ourselves if the prototype is missing.
13
Move the prototype to include/qemu/osdep.h, the normal place to handle
14
platform-specific header quirks.
15
16
The 'missing_madvise_proto' meson check contains an obviously wrong
17
prototype for madvise. So if that code compiles and links, we must be
18
missing the actual prototype for madvise.
19
20
Signed-off-by: Andrew Deason <adeason@sinenomine.net>
21
Message-id: 20220316035227.3702-2-adeason@sinenomine.net
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
22
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
24
---
11
fpu/softfloat.c | 2 +-
25
meson.build | 23 +++++++++++++++++++++--
12
1 file changed, 1 insertion(+), 1 deletion(-)
26
include/qemu/osdep.h | 8 ++++++++
27
util/osdep.c | 3 ---
28
3 files changed, 29 insertions(+), 5 deletions(-)
13
29
14
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
30
diff --git a/meson.build b/meson.build
15
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
16
--- a/fpu/softfloat.c
32
--- a/meson.build
17
+++ b/fpu/softfloat.c
33
+++ b/meson.build
18
@@ -XXX,XX +XXX,XX @@ FLOAT_TO_UINT(64, 64)
34
@@ -XXX,XX +XXX,XX @@ config_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
19
35
#error Not supported
20
static FloatParts int_to_float(int64_t a, float_status *status)
36
#endif
21
{
37
}'''))
22
- FloatParts r;
38
-config_host_data.set('CONFIG_MADVISE', cc.links(gnu_source_prefix + '''
23
+ FloatParts r = {};
39
+
24
if (a == 0) {
40
+has_madvise = cc.links(gnu_source_prefix + '''
25
r.cls = float_class_zero;
41
#include <sys/types.h>
26
r.sign = false;
42
#include <sys/mman.h>
43
#include <stddef.h>
44
- int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }'''))
45
+ int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''')
46
+missing_madvise_proto = false
47
+if has_madvise
48
+ # Some platforms (illumos and Solaris before Solaris 11) provide madvise()
49
+ # but forget to prototype it. In this case, has_madvise will be true (the
50
+ # test program links despite a compile warning). To detect the
51
+ # missing-prototype case, we try again with a definitely-bogus prototype.
52
+ # This will only compile if the system headers don't provide the prototype;
53
+ # otherwise the conflicting prototypes will cause a compiler error.
54
+ missing_madvise_proto = cc.links(gnu_source_prefix + '''
55
+ #include <sys/types.h>
56
+ #include <sys/mman.h>
57
+ #include <stddef.h>
58
+ extern int madvise(int);
59
+ int main(void) { return madvise(0); }''')
60
+endif
61
+config_host_data.set('CONFIG_MADVISE', has_madvise)
62
+config_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto)
63
+
64
config_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + '''
65
#include <sys/mman.h>
66
int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
67
diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
68
index XXXXXXX..XXXXXXX 100644
69
--- a/include/qemu/osdep.h
70
+++ b/include/qemu/osdep.h
71
@@ -XXX,XX +XXX,XX @@ void qemu_anon_ram_free(void *ptr, size_t size);
72
#define SIGIO SIGPOLL
73
#endif
74
75
+#ifdef HAVE_MADVISE_WITHOUT_PROTOTYPE
76
+/*
77
+ * See MySQL bug #7156 (http://bugs.mysql.com/bug.php?id=7156) for discussion
78
+ * about Solaris missing the madvise() prototype.
79
+ */
80
+extern int madvise(char *, size_t, int);
81
+#endif
82
+
83
#if defined(CONFIG_LINUX)
84
#ifndef BUS_MCEERR_AR
85
#define BUS_MCEERR_AR 4
86
diff --git a/util/osdep.c b/util/osdep.c
87
index XXXXXXX..XXXXXXX 100644
88
--- a/util/osdep.c
89
+++ b/util/osdep.c
90
@@ -XXX,XX +XXX,XX @@
91
92
#ifdef CONFIG_SOLARIS
93
#include <sys/statvfs.h>
94
-/* See MySQL bug #7156 (http://bugs.mysql.com/bug.php?id=7156) for
95
- discussion about Solaris header problems */
96
-extern int madvise(char *, size_t, int);
97
#endif
98
99
#include "qemu-common.h"
27
--
100
--
28
2.17.0
101
2.25.1
29
30
diff view generated by jsdifflib
New patch
1
From: Andrew Deason <adeason@sinenomine.net>
1
2
3
On Solaris, 'sun' is #define'd to 1, which causes errors if a variable
4
is named 'sun'. Slightly change the name of the var for the Slot User
5
Number so we can build on Solaris.
6
7
Reviewed-by: Ani Sinha <ani@anisinha.ca>
8
Signed-off-by: Andrew Deason <adeason@sinenomine.net>
9
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
10
Message-id: 20220316035227.3702-3-adeason@sinenomine.net
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
hw/i386/acpi-build.c | 4 ++--
14
1 file changed, 2 insertions(+), 2 deletions(-)
15
16
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/i386/acpi-build.c
19
+++ b/hw/i386/acpi-build.c
20
@@ -XXX,XX +XXX,XX @@ Aml *aml_pci_device_dsm(void)
21
Aml *bnum = aml_arg(4);
22
Aml *func = aml_arg(2);
23
Aml *rev = aml_arg(1);
24
- Aml *sun = aml_arg(5);
25
+ Aml *sunum = aml_arg(5);
26
27
method = aml_method("PDSM", 6, AML_SERIALIZED);
28
29
@@ -XXX,XX +XXX,XX @@ Aml *aml_pci_device_dsm(void)
30
UUID = aml_touuid("E5C937D0-3553-4D7A-9117-EA4D19C3434D");
31
ifctx = aml_if(aml_equal(aml_arg(0), UUID));
32
{
33
- aml_append(ifctx, aml_store(aml_call2("AIDX", bnum, sun), acpi_index));
34
+ aml_append(ifctx, aml_store(aml_call2("AIDX", bnum, sunum), acpi_index));
35
ifctx1 = aml_if(aml_equal(func, zero));
36
{
37
uint8_t byte_list[1];
38
--
39
2.25.1
diff view generated by jsdifflib
New patch
1
From: Andrew Deason <adeason@sinenomine.net>
1
2
3
The include for statvfs.h has not been needed since all statvfs calls
4
were removed in commit 4a1418e07bdc ("Unbreak large mem support by
5
removing kqemu").
6
7
The comment mentioning CONFIG_BSD hasn't made sense since an include
8
for config-host.h was removed in commit aafd75841001 ("util: Clean up
9
includes").
10
11
Remove this cruft.
12
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Andrew Deason <adeason@sinenomine.net>
15
Message-id: 20220316035227.3702-4-adeason@sinenomine.net
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
18
util/osdep.c | 7 -------
19
1 file changed, 7 deletions(-)
20
21
diff --git a/util/osdep.c b/util/osdep.c
22
index XXXXXXX..XXXXXXX 100644
23
--- a/util/osdep.c
24
+++ b/util/osdep.c
25
@@ -XXX,XX +XXX,XX @@
26
*/
27
#include "qemu/osdep.h"
28
#include "qapi/error.h"
29
-
30
-/* Needed early for CONFIG_BSD etc. */
31
-
32
-#ifdef CONFIG_SOLARIS
33
-#include <sys/statvfs.h>
34
-#endif
35
-
36
#include "qemu-common.h"
37
#include "qemu/cutils.h"
38
#include "qemu/sockets.h"
39
--
40
2.25.1
diff view generated by jsdifflib