1
Arm queue; bugfixes only.
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
thanks
8
thanks
4
-- PMM
9
-- PMM
5
10
6
The following changes since commit 48aa8f0ac536db3550a35c295ff7de94e4c33739:
11
The following changes since commit 1d60bb4b14601e38ed17384277aa4c30c57925d3:
7
12
8
Merge remote-tracking branch 'remotes/ericb/tags/pull-nbd-2020-11-16' into staging (2020-11-17 11:07:00 +0000)
13
Merge tag 'pull-request-2022-03-15v2' of https://gitlab.com/thuth/qemu into staging (2022-03-16 10:43:58 +0000)
9
14
10
are available in the Git repository at:
15
are available in the Git repository at:
11
16
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20201117
17
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20220318
13
18
14
for you to fetch changes up to ab135622cf478585bdfcb68b85e4a817d74a0c42:
19
for you to fetch changes up to 79d54c9eac04c554e3c081589542f801ace71797:
15
20
16
tmp105: Correct handling of temperature limit checks (2020-11-17 12:56:33 +0000)
21
util/osdep: Remove some early cruft (2022-03-18 11:32:13 +0000)
17
22
18
----------------------------------------------------------------
23
----------------------------------------------------------------
19
target-arm queue:
24
target-arm queue:
20
* hw/arm/virt: ARM_VIRT must select ARM_GIC
25
* Fix sve2 ldnt1 and stnt1
21
* exynos: Fix bad printf format specifiers
26
* Fix pauth_check_trap vs SEL2
22
* hw/input/ps2.c: Remove remnants of printf debug
27
* Fix handling of LPAE block descriptors
23
* target/openrisc: Remove dead code attempting to check "is timer disabled"
28
* hw/dma/xlnx_csu_dma: Set TYPE_XLNX_CSU_DMA class_size
24
* register: Remove unnecessary NULL check
29
* hw/misc/npcm7xx_clk: Don't leak string in npcm7xx_clk_sel_init()
25
* util/cutils: Fix Coverity array overrun in freq_to_str()
30
* nsis installer: List emulators in alphabetical order
26
* configure: Make "does libgio work" test pull in some actual functions
31
* nsis installer: Suppress "ANSI targets are deprecated" warning
27
* tmp105: reset the T_low and T_High registers
32
* nsis installer: Fix mouse-over descriptions for emulators
28
* tmp105: Correct handling of temperature limit checks
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
29
37
30
----------------------------------------------------------------
38
----------------------------------------------------------------
31
Alex Chen (1):
39
Andrew Deason (3):
32
exynos: Fix bad printf format specifiers
40
util/osdep: Avoid madvise proto on modern Solaris
41
hw/i386/acpi-build: Avoid 'sun' identifier
42
util/osdep: Remove some early cruft
33
43
34
Alistair Francis (1):
44
Edgar E. Iglesias (6):
35
register: Remove unnecessary NULL check
45
hw/arm/xlnx-zynqmp: Add an unimplemented SERDES area
46
target/arm: Make rvbar settable after realize
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
36
51
37
Andrew Jones (1):
52
Eric Auger (2):
38
hw/arm/virt: ARM_VIRT must select ARM_GIC
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
39
55
40
Peter Maydell (5):
56
Peter Maydell (8):
41
hw/input/ps2.c: Remove remnants of printf debug
57
target/arm: Fix handling of LPAE block descriptors
42
target/openrisc: Remove dead code attempting to check "is timer disabled"
58
hw/dma/xlnx_csu_dma: Set TYPE_XLNX_CSU_DMA class_size
43
configure: Make "does libgio work" test pull in some actual functions
59
hw/misc/npcm7xx_clk: Don't leak string in npcm7xx_clk_sel_init()
44
hw/misc/tmp105: reset the T_low and T_High registers
60
nsis installer: List emulators in alphabetical order
45
tmp105: Correct handling of temperature limit checks
61
nsis installer: Suppress "ANSI targets are deprecated" warning
62
nsis installer: Fix mouse-over descriptions for emulators
63
target/arm: Log M-profile vector table accesses
64
target/arm: Log fault address for M-profile faults
46
65
47
Philippe Mathieu-Daudé (1):
66
Richard Henderson (2):
48
util/cutils: Fix Coverity array overrun in freq_to_str()
67
target/arm: Fix sve2 ldnt1 and stnt1
68
target/arm: Fix pauth_check_trap vs SEL2
49
69
50
configure | 11 +++++--
70
meson.build | 23 ++-
51
hw/misc/tmp105.h | 7 +++++
71
include/hw/arm/xlnx-zynqmp.h | 4 +
52
hw/core/register.c | 4 ---
72
include/hw/misc/xlnx-zynqmp-apu-ctrl.h | 93 ++++++++++++
53
hw/input/ps2.c | 9 ------
73
include/hw/misc/xlnx-zynqmp-crf.h | 211 ++++++++++++++++++++++++++
54
hw/misc/tmp105.c | 73 ++++++++++++++++++++++++++++++++++++++------
74
include/qemu/osdep.h | 8 +
55
hw/timer/exynos4210_mct.c | 4 +--
75
target/arm/cpu.h | 3 +-
56
hw/timer/exynos4210_pwm.c | 8 ++---
76
target/arm/sve.decode | 5 +-
57
target/openrisc/sys_helper.c | 3 --
77
hw/arm/virt.c | 7 +-
58
util/cutils.c | 3 +-
78
hw/arm/xlnx-zynqmp.c | 46 +++++-
59
hw/arm/Kconfig | 1 +
79
hw/dma/xlnx_csu_dma.c | 1 +
60
10 files changed, 89 insertions(+), 34 deletions(-)
80
hw/i386/acpi-build.c | 4 +-
61
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
New patch
1
1
From: Richard Henderson <richard.henderson@linaro.org>
2
3
For both ldnt1 and stnt1, the meaning of the Rn and Rm are different
4
from ld1 and st1: the vector and integer registers are reversed, and
5
the integer register 31 refers to XZR instead of SP.
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
17
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
19
Message-id: 20220308031655.240710-1-richard.henderson@linaro.org
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
21
---
22
target/arm/sve.decode | 5 ++-
23
target/arm/translate-sve.c | 51 +++++++++++++++++++++++++++++--
24
tests/tcg/aarch64/test-826.c | 50 ++++++++++++++++++++++++++++++
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
31
index XXXXXXX..XXXXXXX 100644
32
--- a/target/arm/sve.decode
33
+++ b/target/arm/sve.decode
34
@@ -XXX,XX +XXX,XX @@ USDOT_zzzz 01000100 .. 0 ..... 011 110 ..... ..... @rda_rn_rm
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;
83
}
84
85
/* Indexed by [mte][be][xs][msz]. */
86
@@ -XXX,XX +XXX,XX @@ static bool trans_ST1_zpiz(DisasContext *s, arg_ST1_zpiz *a)
87
88
static bool trans_STNT1_zprz(DisasContext *s, arg_ST1_zprz *a)
89
{
90
+ gen_helper_gvec_mem_scatter *fn;
91
+ bool be = s->be_data == MO_BE;
92
+ bool mte = s->mte_active[0];
93
+
94
+ if (a->esz < a->msz) {
95
+ return false;
96
+ }
97
if (!dc_isar_feature(aa64_sve2, s)) {
98
return false;
99
}
100
- return trans_ST1_zprz(s, a);
101
+ if (!sve_access_check(s)) {
102
+ return true;
103
+ }
104
+
105
+ switch (a->esz) {
106
+ case MO_32:
107
+ fn = scatter_store_fn32[mte][be][0][a->msz];
108
+ break;
109
+ case MO_64:
110
+ fn = scatter_store_fn64[mte][be][2][a->msz];
111
+ break;
112
+ default:
113
+ g_assert_not_reached();
114
+ }
115
+
116
+ do_mem_zpz(s, a->rd, a->pg, a->rn, 0,
117
+ cpu_reg(s, a->rm), a->msz, true, fn);
118
+ return true;
119
}
120
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;
143
+}
144
+
145
+int main()
146
+{
147
+ struct sigaction sa = {
148
+ .sa_sigaction = sigsegv,
149
+ .sa_flags = SA_SIGINFO
150
+ };
151
+
152
+ void *page;
153
+ long ofs;
154
+
155
+ if (sigaction(SIGSEGV, &sa, NULL) < 0) {
156
+ perror("sigaction");
157
+ return EXIT_FAILURE;
158
+ }
159
+
160
+ page = mmap(0, getpagesize(), PROT_NONE, MAP_PRIVATE | MAP_ANON, -1, 0);
161
+ if (page == MAP_FAILED) {
162
+ perror("mmap");
163
+ return EXIT_FAILURE;
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
209
--
210
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
When arm_is_el2_enabled was introduced, we missed
4
updating pauth_check_trap.
5
6
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/788
7
Fixes: e6ef0169264b ("target/arm: use arm_is_el2_enabled() where applicable")
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Message-id: 20220315021205.342768-1-richard.henderson@linaro.org
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
target/arm/pauth_helper.c | 2 +-
14
1 file changed, 1 insertion(+), 1 deletion(-)
15
16
diff --git a/target/arm/pauth_helper.c b/target/arm/pauth_helper.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/pauth_helper.c
19
+++ b/target/arm/pauth_helper.c
20
@@ -XXX,XX +XXX,XX @@ static void QEMU_NORETURN pauth_trap(CPUARMState *env, int target_el,
21
22
static void pauth_check_trap(CPUARMState *env, int el, uintptr_t ra)
23
{
24
- if (el < 2 && arm_feature(env, ARM_FEATURE_EL2)) {
25
+ if (el < 2 && arm_is_el2_enabled(env)) {
26
uint64_t hcr = arm_hcr_el2_eff(env);
27
bool trap = !(hcr & HCR_API);
28
if (el == 0) {
29
--
30
2.25.1
31
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: Andrew Jones <drjones@redhat.com>
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
The removal of the selection of A15MPCORE from ARM_VIRT also
7
Found by running 'check-qtest-aarch64' with a clang
4
removed what A15MPCORE selects, ARM_GIC. We still need ARM_GIC.
8
address-sanitizer build, which complains:
5
9
6
Fixes: bec3c97e0cf9 ("hw/arm/virt: Remove dependency on Cortex-A15 MPCore peripherals")
10
==2542634==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x61000000ab00 at pc 0x559a20aebc29 bp 0x7fff97df74d0 sp 0x7fff97df74c8
7
Reported-by: Miroslav Rezanina <mrezanin@redhat.com>
11
WRITE of size 8 at 0x61000000ab00 thread T0
8
Signed-off-by: Andrew Jones <drjones@redhat.com>
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
9
Reviewed-by: Miroslav Rezanina <mrezanin@redhat.com>
13
#1 0x559a21bf297c in type_initialize /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/../../qom/object.c:365:9
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
14
#2 0x559a21bf3442 in object_class_foreach_tramp /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/../../qom/object.c:1070:5
11
Message-id: 20201111143440.112763-1-drjones@redhat.com
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")
12
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
13
---
38
---
14
hw/arm/Kconfig | 1 +
39
hw/dma/xlnx_csu_dma.c | 1 +
15
1 file changed, 1 insertion(+)
40
1 file changed, 1 insertion(+)
16
41
17
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
42
diff --git a/hw/dma/xlnx_csu_dma.c b/hw/dma/xlnx_csu_dma.c
18
index XXXXXXX..XXXXXXX 100644
43
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/Kconfig
44
--- a/hw/dma/xlnx_csu_dma.c
20
+++ b/hw/arm/Kconfig
45
+++ b/hw/dma/xlnx_csu_dma.c
21
@@ -XXX,XX +XXX,XX @@ config ARM_VIRT
46
@@ -XXX,XX +XXX,XX @@ static const TypeInfo xlnx_csu_dma_info = {
22
imply VFIO_PLATFORM
47
.parent = TYPE_SYS_BUS_DEVICE,
23
imply VFIO_XGMAC
48
.instance_size = sizeof(XlnxCSUDMA),
24
imply TPM_TIS_SYSBUS
49
.class_init = xlnx_csu_dma_class_init,
25
+ select ARM_GIC
50
+ .class_size = sizeof(XlnxCSUDMAClass),
26
select ACPI
51
.instance_init = xlnx_csu_dma_init,
27
select ARM_SMMUV3
52
.interfaces = (InterfaceInfo[]) {
28
select GPIO_KEY
53
{ TYPE_STREAM_SINK },
29
--
54
--
30
2.20.1
55
2.25.1
31
56
32
57
diff view generated by jsdifflib
New patch
1
In npcm7xx_clk_sel_init() we allocate a string with g_strdup_printf().
2
Use g_autofree so we free it rather than leaking it.
1
3
4
(Detected with the clang leak sanitizer.)
5
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 20220308170302.2582820-1-peter.maydell@linaro.org
10
---
11
hw/misc/npcm7xx_clk.c | 4 ++--
12
1 file changed, 2 insertions(+), 2 deletions(-)
13
14
diff --git a/hw/misc/npcm7xx_clk.c b/hw/misc/npcm7xx_clk.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/misc/npcm7xx_clk.c
17
+++ b/hw/misc/npcm7xx_clk.c
18
@@ -XXX,XX +XXX,XX @@ static void npcm7xx_clk_sel_init(Object *obj)
19
NPCM7xxClockSELState *sel = NPCM7XX_CLOCK_SEL(obj);
20
21
for (i = 0; i < NPCM7XX_CLK_SEL_MAX_INPUT; ++i) {
22
- sel->clock_in[i] = qdev_init_clock_in(DEVICE(sel),
23
- g_strdup_printf("clock-in[%d]", i),
24
+ g_autofree char *s = g_strdup_printf("clock-in[%d]", i);
25
+ sel->clock_in[i] = qdev_init_clock_in(DEVICE(sel), s,
26
npcm7xx_clk_update_sel_cb, sel, ClockUpdate);
27
}
28
sel->clock_out = qdev_init_clock_out(DEVICE(sel), "clock-out");
29
--
30
2.25.1
31
32
diff view generated by jsdifflib
New patch
1
We currently list the emulators in the Windows installer's dialog
2
in an essentially random order (it's whatever glob.glob() returns
3
them to, which is filesystem-implementation-dependent). Add a
4
call to sorted() so they appear in alphabetical order.
1
5
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.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
11
---
12
scripts/nsis.py | 4 ++--
13
1 file changed, 2 insertions(+), 2 deletions(-)
14
15
diff --git a/scripts/nsis.py b/scripts/nsis.py
16
index XXXXXXX..XXXXXXX 100644
17
--- a/scripts/nsis.py
18
+++ b/scripts/nsis.py
19
@@ -XXX,XX +XXX,XX @@ def main():
20
with open(
21
os.path.join(destdir + args.prefix, "system-emulations.nsh"), "w"
22
) as nsh:
23
- for exe in glob.glob(
24
+ for exe in sorted(glob.glob(
25
os.path.join(destdir + args.prefix, "qemu-system-*.exe")
26
- ):
27
+ )):
28
exe = os.path.basename(exe)
29
arch = exe[12:-4]
30
nsh.write(
31
--
32
2.25.1
33
34
diff view generated by jsdifflib
1
The TMP105 datasheet (https://www.ti.com/lit/gpn/tmp105) says that the
1
When we build our Windows installer, it emits the warning:
2
power-up reset values for the T_low and T_high registers are 80 degrees C
3
and 75 degrees C, which are 0x500 and 0x4B0 hex according to table 5. These
4
values are then shifted right by four bits to give the register reset
5
values, since both registers store the 12 bits of temperature data in bits
6
[15..4] of a 16 bit register.
7
2
8
We were resetting these registers to zero, which is problematic for Linux
3
warning 7998: ANSI targets are deprecated
9
guests which enable the alert interrupt and then immediately take an
4
10
unexpected overtemperature alert because the current temperature is above
5
Fix this by making our installer a Unicode installer instead. These
11
freezing...
6
won't work on Win95/98/ME, but we already do not support those.
7
8
See
9
https://nsis.sourceforge.io/Docs/Chapter4.html#aunicodetarget
10
for the documentation of the Unicode directive.
12
11
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Cédric Le Goater <clg@kaod.org>
13
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Message-id: 20201110150023.25533-2-peter.maydell@linaro.org
14
Reviewed-by: Stefan Weil <sw@weilnetz.de>
15
Message-id: 20220305105743.2384766-3-peter.maydell@linaro.org
16
---
16
---
17
hw/misc/tmp105.c | 3 +++
17
qemu.nsi | 3 +++
18
1 file changed, 3 insertions(+)
18
1 file changed, 3 insertions(+)
19
19
20
diff --git a/hw/misc/tmp105.c b/hw/misc/tmp105.c
20
diff --git a/qemu.nsi b/qemu.nsi
21
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/misc/tmp105.c
22
--- a/qemu.nsi
23
+++ b/hw/misc/tmp105.c
23
+++ b/qemu.nsi
24
@@ -XXX,XX +XXX,XX @@ static void tmp105_reset(I2CSlave *i2c)
24
@@ -XXX,XX +XXX,XX @@
25
s->faults = tmp105_faultq[(s->config >> 3) & 3];
25
!define OUTFILE "qemu-setup.exe"
26
s->alarm = 0;
26
!endif
27
27
28
+ s->limit[0] = 0x4b00; /* T_LOW, 75 degrees C */
28
+; Build a unicode installer
29
+ s->limit[1] = 0x5000; /* T_HIGH, 80 degrees C */
29
+Unicode true
30
+
30
+
31
tmp105_interrupt_update(s);
31
; Use maximum compression.
32
}
32
SetCompressor /SOLID lzma
33
33
34
--
34
--
35
2.20.1
35
2.25.1
36
36
37
37
diff view generated by jsdifflib
1
In commit 76346b6264a9b01979 we tried to add a configure check that
1
We use the nsis.py script to write out an installer script Section
2
the libgio pkg-config data was correct, which builds an executable
2
for each emulator executable, so the exact set of Sections depends on
3
linked against it. Unfortunately this doesn't catch the problem
3
which executables were built. However the part of qemu.nsi which
4
(missing static library dependency info), because a "do nothing" test
4
specifies mouse-over descriptions for each Section still has a
5
source file doesn't have any symbol references that cause the linker
5
hard-coded and very outdated list (with just i386 and alpha). This
6
to pull in .o files from libgio.a, and so we don't see the "missing
6
causes two problems. Firstly, if you build the installer for a
7
symbols from libmount" error that a full QEMU link triggers.
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.
8
14
9
(The ineffective test went unnoticed because of a typo that
15
Make nsis.py generate a second output file which has the necessary
10
effectively disabled libgio unconditionally, but after commit
16
MUI_DESCRIPTION_TEXT lines for each Section it creates, so we can
11
3569a5dfc11f2 fixed that, a static link of the system emulator on
17
include that at the right point in qemu.nsi to set the mouse-over
12
Ubuntu stopped working again.)
18
text.
13
14
Improve the gio test by having the test source fragment reference a
15
g_dbus function (which is what is indirectly causing us to end up
16
wanting functions from libmount).
17
19
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
21
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
20
Message-id: 20201116104617.18333-1-peter.maydell@linaro.org
22
Reviewed-by: John Snow <jsnow@redhat.com>
23
Message-id: 20220305105743.2384766-4-peter.maydell@linaro.org
21
---
24
---
22
configure | 11 +++++++++--
25
qemu.nsi | 5 +----
23
1 file changed, 9 insertions(+), 2 deletions(-)
26
scripts/nsis.py | 13 ++++++++++++-
27
2 files changed, 13 insertions(+), 5 deletions(-)
24
28
25
diff --git a/configure b/configure
29
diff --git a/qemu.nsi b/qemu.nsi
26
index XXXXXXX..XXXXXXX 100755
30
index XXXXXXX..XXXXXXX 100644
27
--- a/configure
31
--- a/qemu.nsi
28
+++ b/configure
32
+++ b/qemu.nsi
29
@@ -XXX,XX +XXX,XX @@ if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
33
@@ -XXX,XX +XXX,XX @@ SectionEnd
30
# Check that the libraries actually work -- Ubuntu 18.04 ships
34
; Descriptions (mouse-over).
31
# with pkg-config --static --libs data for gio-2.0 that is missing
35
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
32
# -lblkid and will give a link error.
36
!insertmacro MUI_DESCRIPTION_TEXT ${SectionSystem} "System emulation."
33
- write_c_skeleton
37
- !insertmacro MUI_DESCRIPTION_TEXT ${Section_alpha} "Alpha system emulation."
34
- if compile_prog "" "$gio_libs" ; then
38
- !insertmacro MUI_DESCRIPTION_TEXT ${Section_alphaw} "Alpha system emulation (GUI)."
35
+ cat > $TMPC <<EOF
39
- !insertmacro MUI_DESCRIPTION_TEXT ${Section_i386} "PC i386 system emulation."
36
+#include <gio/gio.h>
40
- !insertmacro MUI_DESCRIPTION_TEXT ${Section_i386w} "PC i386 system emulation (GUI)."
37
+int main(void)
41
+!include "${BINDIR}\system-mui-text.nsh"
38
+{
42
!insertmacro MUI_DESCRIPTION_TEXT ${SectionTools} "Tools."
39
+ g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
43
!ifdef DLLDIR
40
+ return 0;
44
!insertmacro MUI_DESCRIPTION_TEXT ${SectionDll} "Runtime Libraries (DLL)."
41
+}
45
diff --git a/scripts/nsis.py b/scripts/nsis.py
42
+EOF
46
index XXXXXXX..XXXXXXX 100644
43
+ if compile_prog "$gio_cflags" "$gio_libs" ; then
47
--- a/scripts/nsis.py
44
gio=yes
48
+++ b/scripts/nsis.py
45
else
49
@@ -XXX,XX +XXX,XX @@ def main():
46
gio=no
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)
47
--
76
--
48
2.20.1
77
2.25.1
49
78
50
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
New patch
1
From: Eric Auger <eric.auger@redhat.com>
1
2
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.
7
8
Signed-off-by: Eric Auger <eric.auger@redhat.com>
9
Reviewed-by: Andrew Jones <drjones@redhat.com>
10
Message-id: 20220308182452.223473-3-eric.auger@redhat.com
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/arm/virt.c | 7 ++++++-
15
1 file changed, 6 insertions(+), 1 deletion(-)
16
17
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/virt.c
20
+++ b/hw/arm/virt.c
21
@@ -XXX,XX +XXX,XX @@ static void finalize_gic_version(VirtMachineState *vms)
22
vms->gic_version = VIRT_GIC_VERSION_2;
23
break;
24
case VIRT_GIC_VERSION_MAX:
25
- vms->gic_version = VIRT_GIC_VERSION_3;
26
+ if (module_object_class_by_name("arm-gicv3")) {
27
+ /* CONFIG_ARM_GICV3_TCG was set */
28
+ vms->gic_version = VIRT_GIC_VERSION_3;
29
+ } else {
30
+ vms->gic_version = VIRT_GIC_VERSION_2;
31
+ }
32
break;
33
case VIRT_GIC_VERSION_HOST:
34
error_report("gic-version=host requires KVM");
35
--
36
2.25.1
diff view generated by jsdifflib
1
In the mtspr helper we attempt to check for "is the timer disabled"
1
Currently the CPU_LOG_INT logging misses some useful information
2
with "if (env->ttmr & TIMER_NONE)". This is wrong because TIMER_NONE
2
about loads from the vector table. Add logging where we load vector
3
is zero and the condition is always false (Coverity complains about
3
table entries. This is particularly helpful for cases where the user
4
the dead code.)
4
has accidentally not put a vector table in their image at all, which
5
can result in confusing guest crashes at startup.
5
6
6
The correct check would be to test whether the TTMR_M field in the
7
Here's an example of the new logging for a case where
7
register is equal to TIMER_NONE instead. However, the
8
the vector table contains garbage:
8
cpu_openrisc_timer_update() function checks whether the timer is
9
enabled (it looks at cpu->env.is_counting, which is set to 0 via
10
cpu_openrisc_count_stop() when the TTMR_M field is set to
11
TIMER_NONE), so there's no need to check for "timer disabled" in the
12
target/openrisc code. Instead, simply remove the dead code.
13
9
14
Fixes: Coverity CID 1005812
10
Loaded reset SP 0x0 PC 0x0 from vector table
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
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
26
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Acked-by: Stafford Horne <shorne@gmail.com>
27
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
17
Message-id: 20201103114654.18540-1-peter.maydell@linaro.org
28
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
29
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
30
Message-id: 20220315204306.2797684-2-peter.maydell@linaro.org
18
---
31
---
19
target/openrisc/sys_helper.c | 3 ---
32
target/arm/cpu.c | 5 +++++
20
1 file changed, 3 deletions(-)
33
target/arm/m_helper.c | 5 +++++
34
2 files changed, 10 insertions(+)
21
35
22
diff --git a/target/openrisc/sys_helper.c b/target/openrisc/sys_helper.c
36
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
23
index XXXXXXX..XXXXXXX 100644
37
index XXXXXXX..XXXXXXX 100644
24
--- a/target/openrisc/sys_helper.c
38
--- a/target/arm/cpu.c
25
+++ b/target/openrisc/sys_helper.c
39
+++ b/target/arm/cpu.c
26
@@ -XXX,XX +XXX,XX @@ void HELPER(mtspr)(CPUOpenRISCState *env, target_ulong spr, target_ulong rb)
40
@@ -XXX,XX +XXX,XX @@
27
41
#include "qemu/osdep.h"
28
case TO_SPR(10, 1): /* TTCR */
42
#include "qemu/qemu-print.h"
29
cpu_openrisc_count_set(cpu, rb);
43
#include "qemu/timer.h"
30
- if (env->ttmr & TIMER_NONE) {
44
+#include "qemu/log.h"
31
- return;
45
#include "qemu-common.h"
32
- }
46
#include "target/arm/idau.h"
33
cpu_openrisc_timer_update(cpu);
47
#include "qemu/module.h"
34
break;
48
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(DeviceState *dev)
35
#endif
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:
36
--
82
--
37
2.20.1
83
2.25.1
38
84
39
85
diff view generated by jsdifflib
1
In commit 5edab03d4040 we added tracepoints to the ps2 keyboard
1
For M-profile, the fault address is not always exposed to the guest
2
and mouse emulation. However we didn't remove all the debug-by-printf
2
in a fault register (for instance the BFAR bus fault address register
3
support. In fact there is only one printf() remaining, and it is
3
is only updated for bus faults on data accesses, not instruction
4
redundant with the trace_ps2_write_mouse() event next to it.
4
accesses). Currently we log the address only if we're putting it
5
Remove the printf() and the now-unused DEBUG* macros.
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.
6
7
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20201101133258.4240-1-peter.maydell@linaro.org
11
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
12
Message-id: 20220315204306.2797684-3-peter.maydell@linaro.org
11
---
13
---
12
hw/input/ps2.c | 9 ---------
14
target/arm/m_helper.c | 6 ++++++
13
1 file changed, 9 deletions(-)
15
1 file changed, 6 insertions(+)
14
16
15
diff --git a/hw/input/ps2.c b/hw/input/ps2.c
17
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
16
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/input/ps2.c
19
--- a/target/arm/m_helper.c
18
+++ b/hw/input/ps2.c
20
+++ b/target/arm/m_helper.c
19
@@ -XXX,XX +XXX,XX @@
21
@@ -XXX,XX +XXX,XX @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
20
22
* Note that for M profile we don't have a guest facing FSR, but
21
#include "trace.h"
23
* the env->exception.fsr will be populated by the code that
22
24
* raises the fault, in the A profile short-descriptor format.
23
-/* debug PC keyboard */
25
+ *
24
-//#define DEBUG_KBD
26
+ * Log the exception.vaddress now regardless of subtype, because
25
-
27
+ * logging below only logs it when it goes into a guest visible
26
-/* debug PC keyboard : only mouse */
28
+ * register.
27
-//#define DEBUG_MOUSE
29
*/
28
-
30
+ qemu_log_mask(CPU_LOG_INT, "...at fault address 0x%x\n",
29
/* Keyboard Commands */
31
+ (uint32_t)env->exception.vaddress);
30
#define KBD_CMD_SET_LEDS    0xED    /* Set keyboard leds */
32
switch (env->exception.fsr & 0xf) {
31
#define KBD_CMD_ECHO     0xEE
33
case M_FAKE_FSR_NSC_EXEC:
32
@@ -XXX,XX +XXX,XX @@ void ps2_write_mouse(void *opaque, int val)
34
/*
33
PS2MouseState *s = (PS2MouseState *)opaque;
34
35
trace_ps2_write_mouse(opaque, val);
36
-#ifdef DEBUG_MOUSE
37
- printf("kbd: write mouse 0x%02x\n", val);
38
-#endif
39
switch(s->common.write_cmd) {
40
default:
41
case -1:
42
--
35
--
43
2.20.1
36
2.25.1
44
37
45
38
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
2
2
3
Fix Coverity CID 1435957: Memory - illegal accesses (OVERRUN):
3
Add an unimplemented SERDES (Serializer/Deserializer) area.
4
4
5
>>> Overrunning array "suffixes" of 7 8-byte elements at element
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
index 7 (byte offset 63) using index "idx" (which evaluates to 7).
6
Reviewed-by: Francisco Iglesias <francisco.iglesias@xilinx.com>
7
7
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
8
Note, the biggest input value freq_to_str() can accept is UINT64_MAX,
8
Message-id: 20220316164645.2303510-2-edgar.iglesias@gmail.com
9
which is ~18.446 EHz, less than 1000 EHz.
10
11
Reported-by: Eduardo Habkost <ehabkost@redhat.com>
12
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
15
Reviewed-by: Luc Michel <luc@lmichel.fr>
16
Message-id: 20201101215755.2021421-1-f4bug@amsat.org
17
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
---
10
---
21
util/cutils.c | 3 ++-
11
include/hw/arm/xlnx-zynqmp.h | 2 +-
22
1 file changed, 2 insertions(+), 1 deletion(-)
12
hw/arm/xlnx-zynqmp.c | 5 +++++
13
2 files changed, 6 insertions(+), 1 deletion(-)
23
14
24
diff --git a/util/cutils.c b/util/cutils.c
15
diff --git a/include/hw/arm/xlnx-zynqmp.h b/include/hw/arm/xlnx-zynqmp.h
25
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
26
--- a/util/cutils.c
17
--- a/include/hw/arm/xlnx-zynqmp.h
27
+++ b/util/cutils.c
18
+++ b/include/hw/arm/xlnx-zynqmp.h
28
@@ -XXX,XX +XXX,XX @@ char *freq_to_str(uint64_t freq_hz)
19
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPState, XLNX_ZYNQMP)
29
double freq = freq_hz;
20
/*
30
size_t idx = 0;
21
* Unimplemented mmio regions needed to boot some images.
31
22
*/
32
- while (freq >= 1000.0 && idx < ARRAY_SIZE(suffixes)) {
23
-#define XLNX_ZYNQMP_NUM_UNIMP_AREAS 1
33
+ while (freq >= 1000.0) {
24
+#define XLNX_ZYNQMP_NUM_UNIMP_AREAS 2
34
freq /= 1000.0;
25
35
idx++;
26
struct XlnxZynqMPState {
36
}
27
/*< private >*/
37
+ assert(idx < ARRAY_SIZE(suffixes));
28
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
38
29
index XXXXXXX..XXXXXXX 100644
39
return g_strdup_printf("%0.3g %sHz", freq, suffixes[idx]);
30
--- a/hw/arm/xlnx-zynqmp.c
40
}
31
+++ b/hw/arm/xlnx-zynqmp.c
32
@@ -XXX,XX +XXX,XX @@
33
#define QSPI_DMA_ADDR 0xff0f0800
34
#define NUM_QSPI_IRQ_LINES 2
35
36
+/* Serializer/Deserializer. */
37
+#define SERDES_ADDR 0xfd400000
38
+#define SERDES_SIZE 0x20000
39
+
40
#define DP_ADDR 0xfd4a0000
41
#define DP_IRQ 113
42
43
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_create_unimp_mmio(XlnxZynqMPState *s)
44
hwaddr size;
45
} unimp_areas[ARRAY_SIZE(s->mr_unimp)] = {
46
{ .name = "apu", APU_ADDR, APU_SIZE },
47
+ { .name = "serdes", SERDES_ADDR, SERDES_SIZE },
48
};
49
unsigned int nr;
50
41
--
51
--
42
2.20.1
52
2.25.1
43
53
44
54
diff view generated by jsdifflib
New patch
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
2
3
Make the rvbar property settable after realize. This is done
4
in preparation to model the ZynqMP's runtime configurable rvbar.
5
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
7
Message-id: 20220316164645.2303510-3-edgar.iglesias@gmail.com
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/cpu.h | 3 ++-
12
target/arm/cpu.c | 12 +++++++-----
13
target/arm/helper.c | 10 +++++++---
14
3 files changed, 16 insertions(+), 9 deletions(-)
15
16
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/cpu.h
19
+++ b/target/arm/cpu.h
20
@@ -XXX,XX +XXX,XX @@ typedef struct CPUArchState {
21
uint64_t vbar_el[4];
22
};
23
uint32_t mvbar; /* (monitor) vector base address register */
24
+ uint64_t rvbar; /* rvbar sampled from rvbar property at reset */
25
struct { /* FCSE PID. */
26
uint32_t fcseidr_ns;
27
uint32_t fcseidr_s;
28
@@ -XXX,XX +XXX,XX @@ struct ArchCPU {
29
30
/* DCZ blocksize, in log_2(words), ie low 4 bits of DCZID_EL0 */
31
uint32_t dcz_blocksize;
32
- uint64_t rvbar;
33
+ uint64_t rvbar_prop; /* Property/input signals. */
34
35
/* Configurable aspects of GIC cpu interface (which is part of the CPU) */
36
int gic_num_lrs; /* number of list registers */
37
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
38
index XXXXXXX..XXXXXXX 100644
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
74
diff --git a/target/arm/helper.c b/target/arm/helper.c
75
index XXXXXXX..XXXXXXX 100644
76
--- a/target/arm/helper.c
77
+++ b/target/arm/helper.c
78
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
79
ARMCPRegInfo rvbar = {
80
.name = "RVBAR_EL1", .state = ARM_CP_STATE_AA64,
81
.opc0 = 3, .opc1 = 0, .crn = 12, .crm = 0, .opc2 = 1,
82
- .type = ARM_CP_CONST, .access = PL1_R, .resetvalue = cpu->rvbar
83
+ .access = PL1_R,
84
+ .fieldoffset = offsetof(CPUARMState, cp15.rvbar),
85
};
86
define_one_arm_cp_reg(cpu, &rvbar);
87
}
88
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
89
ARMCPRegInfo rvbar = {
90
.name = "RVBAR_EL2", .state = ARM_CP_STATE_AA64,
91
.opc0 = 3, .opc1 = 4, .crn = 12, .crm = 0, .opc2 = 1,
92
- .type = ARM_CP_CONST, .access = PL2_R, .resetvalue = cpu->rvbar
93
+ .access = PL2_R,
94
+ .fieldoffset = offsetof(CPUARMState, cp15.rvbar),
95
};
96
define_one_arm_cp_reg(cpu, &rvbar);
97
}
98
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
99
ARMCPRegInfo el3_regs[] = {
100
{ .name = "RVBAR_EL3", .state = ARM_CP_STATE_AA64,
101
.opc0 = 3, .opc1 = 6, .crn = 12, .crm = 0, .opc2 = 1,
102
- .type = ARM_CP_CONST, .access = PL3_R, .resetvalue = cpu->rvbar },
103
+ .access = PL3_R,
104
+ .fieldoffset = offsetof(CPUARMState, cp15.rvbar),
105
+ },
106
{ .name = "SCTLR_EL3", .state = ARM_CP_STATE_AA64,
107
.opc0 = 3, .opc1 = 6, .crn = 1, .crm = 0, .opc2 = 0,
108
.access = PL3_RW,
109
--
110
2.25.1
diff view generated by jsdifflib
1
The TMP105 datasheet says that in Interrupt Mode (when TM==1) the device
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
2
signals an alert when the temperature equals or exceeds the T_high value and
3
then remains high until a device register is read or the device responds to
4
the SMBUS Alert Response address, or the device is put into Shutdown Mode.
5
Thereafter the Alert pin will only be re-signalled when temperature falls
6
below T_low; alert can then be cleared in the same set of ways, and the
7
device returns to its initial "alert when temperature goes above T_high"
8
mode. (If this textual description is confusing, see figure 3 in the
9
TI datasheet at https://www.ti.com/lit/gpn/tmp105 .)
10
2
11
We were misimplementing this as a simple "always alert if temperature is
3
Add a model of the Xilinx ZynqMP CRF. At the moment this
12
above T_high or below T_low" condition, which gives a spurious alert on
4
is mostly a stub model.
13
startup if using the "T_high = 80 degrees C, T_low = 75 degrees C" reset
14
limit values.
15
5
16
Implement the correct (hysteresis) behaviour by tracking whether we
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
17
are currently looking for the temperature to rise over T_high or
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
18
for it to fall below T_low. Our implementation of the comparator
8
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
19
mode (TM==0) wasn't wrong, but rephrase it to match the way that
9
Message-id: 20220316164645.2303510-4-edgar.iglesias@gmail.com
20
interrupt mode is now handled for clarity.
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
include/hw/misc/xlnx-zynqmp-crf.h | 211 ++++++++++++++++++++++++
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
21
18
22
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
diff --git a/include/hw/misc/xlnx-zynqmp-crf.h b/include/hw/misc/xlnx-zynqmp-crf.h
23
Reviewed-by: Cédric Le Goater <clg@kaod.org>
20
new file mode 100644
24
Message-id: 20201110150023.25533-3-peter.maydell@linaro.org
21
index XXXXXXX..XXXXXXX
25
---
22
--- /dev/null
26
hw/misc/tmp105.h | 7 +++++
23
+++ b/include/hw/misc/xlnx-zynqmp-crf.h
27
hw/misc/tmp105.c | 70 +++++++++++++++++++++++++++++++++++++++++-------
24
@@ -XXX,XX +XXX,XX @@
28
2 files changed, 68 insertions(+), 9 deletions(-)
25
+/*
29
26
+ * QEMU model of the CRF - Clock Reset FPD.
30
diff --git a/hw/misc/tmp105.h b/hw/misc/tmp105.h
27
+ *
31
index XXXXXXX..XXXXXXX 100644
28
+ * Copyright (c) 2022 Xilinx Inc.
32
--- a/hw/misc/tmp105.h
29
+ * SPDX-License-Identifier: GPL-2.0-or-later
33
+++ b/hw/misc/tmp105.h
30
+ * Written by Edgar E. Iglesias <edgar.iglesias@xilinx.com>
34
@@ -XXX,XX +XXX,XX @@ struct TMP105State {
31
+ */
35
int16_t limit[2];
32
+#ifndef HW_MISC_XLNX_ZYNQMP_CRF_H
36
int faults;
33
+#define HW_MISC_XLNX_ZYNQMP_CRF_H
37
uint8_t alarm;
34
+
38
+ /*
35
+#include "hw/sysbus.h"
39
+ * The TMP105 initially looks for a temperature rising above T_high;
36
+#include "hw/register.h"
40
+ * once this is detected, the condition it looks for next is the
37
+
41
+ * temperature falling below T_low. This flag is false when initially
38
+#define TYPE_XLNX_ZYNQMP_CRF "xlnx.zynqmp_crf"
42
+ * looking for T_high, true when looking for T_low.
39
+OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPCRF, XLNX_ZYNQMP_CRF)
43
+ */
40
+
44
+ bool detect_falling;
41
+REG32(ERR_CTRL, 0x0)
45
};
42
+ FIELD(ERR_CTRL, SLVERR_ENABLE, 0, 1)
46
43
+REG32(IR_STATUS, 0x4)
47
#endif
44
+ FIELD(IR_STATUS, ADDR_DECODE_ERR, 0, 1)
48
diff --git a/hw/misc/tmp105.c b/hw/misc/tmp105.c
45
+REG32(IR_MASK, 0x8)
49
index XXXXXXX..XXXXXXX 100644
46
+ FIELD(IR_MASK, ADDR_DECODE_ERR, 0, 1)
50
--- a/hw/misc/tmp105.c
47
+REG32(IR_ENABLE, 0xc)
51
+++ b/hw/misc/tmp105.c
48
+ FIELD(IR_ENABLE, ADDR_DECODE_ERR, 0, 1)
52
@@ -XXX,XX +XXX,XX @@ static void tmp105_alarm_update(TMP105State *s)
49
+REG32(IR_DISABLE, 0x10)
53
return;
50
+ FIELD(IR_DISABLE, ADDR_DECODE_ERR, 0, 1)
54
}
51
+REG32(CRF_WPROT, 0x1c)
55
52
+ FIELD(CRF_WPROT, ACTIVE, 0, 1)
56
- if ((s->config >> 1) & 1) {                    /* TM */
53
+REG32(APLL_CTRL, 0x20)
57
- if (s->temperature >= s->limit[1])
54
+ FIELD(APLL_CTRL, POST_SRC, 24, 3)
58
- s->alarm = 1;
55
+ FIELD(APLL_CTRL, PRE_SRC, 20, 3)
59
- else if (s->temperature < s->limit[0])
56
+ FIELD(APLL_CTRL, CLKOUTDIV, 17, 1)
60
- s->alarm = 1;
57
+ FIELD(APLL_CTRL, DIV2, 16, 1)
61
+ if (s->config >> 1 & 1) {
58
+ FIELD(APLL_CTRL, FBDIV, 8, 7)
62
+ /*
59
+ FIELD(APLL_CTRL, BYPASS, 3, 1)
63
+ * TM == 1 : Interrupt mode. We signal Alert when the
60
+ FIELD(APLL_CTRL, RESET, 0, 1)
64
+ * temperature rises above T_high, and expect the guest to clear
61
+REG32(APLL_CFG, 0x24)
65
+ * it (eg by reading a device register).
62
+ FIELD(APLL_CFG, LOCK_DLY, 25, 7)
66
+ */
63
+ FIELD(APLL_CFG, LOCK_CNT, 13, 10)
67
+ if (s->detect_falling) {
64
+ FIELD(APLL_CFG, LFHF, 10, 2)
68
+ if (s->temperature < s->limit[0]) {
65
+ FIELD(APLL_CFG, CP, 5, 4)
69
+ s->alarm = 1;
66
+ FIELD(APLL_CFG, RES, 0, 4)
70
+ s->detect_falling = false;
67
+REG32(APLL_FRAC_CFG, 0x28)
71
+ }
68
+ FIELD(APLL_FRAC_CFG, ENABLED, 31, 1)
72
+ } else {
69
+ FIELD(APLL_FRAC_CFG, SEED, 22, 3)
73
+ if (s->temperature >= s->limit[1]) {
70
+ FIELD(APLL_FRAC_CFG, ALGRTHM, 19, 1)
74
+ s->alarm = 1;
71
+ FIELD(APLL_FRAC_CFG, ORDER, 18, 1)
75
+ s->detect_falling = true;
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);
76
+ }
313
+ }
77
+ }
314
+ }
78
} else {
315
+ }
79
- if (s->temperature >= s->limit[1])
316
+ return val64;
80
- s->alarm = 1;
317
+}
81
- else if (s->temperature < s->limit[0])
318
+
82
- s->alarm = 0;
319
+static const RegisterAccessInfo crf_regs_info[] = {
83
+ /*
320
+ { .name = "ERR_CTRL", .addr = A_ERR_CTRL,
84
+ * TM == 0 : Comparator mode. We signal Alert when the temperature
321
+ },{ .name = "IR_STATUS", .addr = A_IR_STATUS,
85
+ * rises above T_high, and stop signalling it when the temperature
322
+ .w1c = 0x1,
86
+ * falls below T_low.
323
+ .post_write = ir_status_postw,
87
+ */
324
+ },{ .name = "IR_MASK", .addr = A_IR_MASK,
88
+ if (s->detect_falling) {
325
+ .reset = 0x1,
89
+ if (s->temperature < s->limit[0]) {
326
+ .ro = 0x1,
90
+ s->alarm = 0;
327
+ },{ .name = "IR_ENABLE", .addr = A_IR_ENABLE,
91
+ s->detect_falling = false;
328
+ .pre_write = ir_enable_prew,
92
+ }
329
+ },{ .name = "IR_DISABLE", .addr = A_IR_DISABLE,
93
+ } else {
330
+ .pre_write = ir_disable_prew,
94
+ if (s->temperature >= s->limit[1]) {
331
+ },{ .name = "CRF_WPROT", .addr = A_CRF_WPROT,
95
+ s->alarm = 1;
332
+ },{ .name = "APLL_CTRL", .addr = A_APLL_CTRL,
96
+ s->detect_falling = true;
333
+ .reset = 0x12c09,
97
+ }
334
+ .rsvd = 0xf88c80f6,
98
+ }
335
+ },{ .name = "APLL_CFG", .addr = A_APLL_CFG,
99
}
336
+ .rsvd = 0x1801210,
100
337
+ },{ .name = "APLL_FRAC_CFG", .addr = A_APLL_FRAC_CFG,
101
tmp105_interrupt_update(s);
338
+ .rsvd = 0x7e330000,
102
@@ -XXX,XX +XXX,XX @@ static int tmp105_post_load(void *opaque, int version_id)
339
+ },{ .name = "DPLL_CTRL", .addr = A_DPLL_CTRL,
103
return 0;
340
+ .reset = 0x2c09,
104
}
341
+ .rsvd = 0xf88c80f6,
105
342
+ },{ .name = "DPLL_CFG", .addr = A_DPLL_CFG,
106
+static bool detect_falling_needed(void *opaque)
343
+ .rsvd = 0x1801210,
107
+{
344
+ },{ .name = "DPLL_FRAC_CFG", .addr = A_DPLL_FRAC_CFG,
108
+ TMP105State *s = opaque;
345
+ .rsvd = 0x7e330000,
109
+
346
+ },{ .name = "VPLL_CTRL", .addr = A_VPLL_CTRL,
110
+ /*
347
+ .reset = 0x12809,
111
+ * We only need to migrate the detect_falling bool if it's set;
348
+ .rsvd = 0xf88c80f6,
112
+ * for migration from older machines we assume that it is false
349
+ },{ .name = "VPLL_CFG", .addr = A_VPLL_CFG,
113
+ * (ie temperature is not out of range).
350
+ .rsvd = 0x1801210,
114
+ */
351
+ },{ .name = "VPLL_FRAC_CFG", .addr = A_VPLL_FRAC_CFG,
115
+ return s->detect_falling;
352
+ .rsvd = 0x7e330000,
116
+}
353
+ },{ .name = "PLL_STATUS", .addr = A_PLL_STATUS,
117
+
354
+ .reset = 0x3f,
118
+static const VMStateDescription vmstate_tmp105_detect_falling = {
355
+ .rsvd = 0xc0,
119
+ .name = "TMP105/detect-falling",
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,
120
+ .version_id = 1,
475
+ .version_id = 1,
121
+ .minimum_version_id = 1,
476
+ .minimum_version_id = 1,
122
+ .needed = detect_falling_needed,
123
+ .fields = (VMStateField[]) {
477
+ .fields = (VMStateField[]) {
124
+ VMSTATE_BOOL(detect_falling, TMP105State),
478
+ VMSTATE_UINT32_ARRAY(regs, XlnxZynqMPCRF, CRF_R_MAX),
125
+ VMSTATE_END_OF_LIST()
479
+ VMSTATE_END_OF_LIST(),
126
+ }
480
+ }
127
+};
481
+};
128
+
482
+
129
static const VMStateDescription vmstate_tmp105 = {
483
+static void crf_class_init(ObjectClass *klass, void *data)
130
.name = "TMP105",
484
+{
131
.version_id = 0,
485
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
132
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_tmp105 = {
486
+ DeviceClass *dc = DEVICE_CLASS(klass);
133
VMSTATE_UINT8(alarm, TMP105State),
487
+
134
VMSTATE_I2C_SLAVE(i2c, TMP105State),
488
+ dc->vmsd = &vmstate_crf;
135
VMSTATE_END_OF_LIST()
489
+ rc->phases.enter = crf_reset_enter;
136
+ },
490
+ rc->phases.hold = crf_reset_hold;
137
+ .subsections = (const VMStateDescription*[]) {
491
+}
138
+ &vmstate_tmp105_detect_falling,
492
+
139
+ NULL
493
+static const TypeInfo crf_info = {
140
}
494
+ .name = TYPE_XLNX_ZYNQMP_CRF,
141
};
495
+ .parent = TYPE_SYS_BUS_DEVICE,
142
496
+ .instance_size = sizeof(XlnxZynqMPCRF),
143
@@ -XXX,XX +XXX,XX @@ static void tmp105_reset(I2CSlave *i2c)
497
+ .class_init = crf_class_init,
144
s->config = 0;
498
+ .instance_init = crf_init,
145
s->faults = tmp105_faultq[(s->config >> 3) & 3];
499
+ .instance_finalize = crf_finalize,
146
s->alarm = 0;
500
+};
147
+ s->detect_falling = false;
501
+
148
502
+static void crf_register_types(void)
149
s->limit[0] = 0x4b00; /* T_LOW, 75 degrees C */
503
+{
150
s->limit[1] = 0x5000; /* T_HIGH, 80 degrees C */
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
509
index XXXXXXX..XXXXXXX 100644
510
--- a/hw/misc/meson.build
511
+++ b/hw/misc/meson.build
512
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_RASPI', if_true: files(
513
))
514
softmmu_ss.add(when: 'CONFIG_SLAVIO', if_true: files('slavio_misc.c'))
515
softmmu_ss.add(when: 'CONFIG_ZYNQ', if_true: files('zynq_slcr.c'))
516
+specific_ss.add(when: 'CONFIG_XLNX_ZYNQMP_ARM', if_true: files('xlnx-zynqmp-crf.c'))
517
softmmu_ss.add(when: 'CONFIG_XLNX_VERSAL', if_true: files(
518
'xlnx-versal-xramc.c',
519
'xlnx-versal-pmc-iou-slcr.c',
151
--
520
--
152
2.20.1
521
2.25.1
153
522
154
523
diff view generated by jsdifflib
1
From: Alex Chen <alex.chen@huawei.com>
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
2
2
3
We should use printf format specifier "%u" instead of "%d" for
3
Connect the ZynqMP CRF - Clock Reset FPD device.
4
argument of type "unsigned int".
5
4
6
Reported-by: Euler Robot <euler.robot@huawei.com>
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Signed-off-by: Alex Chen <alex.chen@huawei.com>
6
Reviewed-by: Francisco Iglesias <francisco.iglesias@xilinx.com>
8
Message-id: 20201111073651.72804-1-alex.chen@huawei.com
7
Reviewed-by: Luc Michel <luc@lmichel.fr>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
9
Message-id: 20220316164645.2303510-5-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
hw/timer/exynos4210_mct.c | 4 ++--
12
include/hw/arm/xlnx-zynqmp.h | 2 ++
13
hw/timer/exynos4210_pwm.c | 8 ++++----
13
hw/arm/xlnx-zynqmp.c | 16 ++++++++++++++++
14
2 files changed, 6 insertions(+), 6 deletions(-)
14
2 files changed, 18 insertions(+)
15
15
16
diff --git a/hw/timer/exynos4210_mct.c b/hw/timer/exynos4210_mct.c
16
diff --git a/include/hw/arm/xlnx-zynqmp.h b/include/hw/arm/xlnx-zynqmp.h
17
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/timer/exynos4210_mct.c
18
--- a/include/hw/arm/xlnx-zynqmp.h
19
+++ b/hw/timer/exynos4210_mct.c
19
+++ b/include/hw/arm/xlnx-zynqmp.h
20
@@ -XXX,XX +XXX,XX @@ static void exynos4210_gcomp_raise_irq(void *opaque, uint32_t id)
20
@@ -XXX,XX +XXX,XX @@
21
/* If CSTAT is pending and IRQ is enabled */
21
#include "hw/nvram/xlnx-bbram.h"
22
if ((s->reg.int_cstat & G_INT_CSTAT_COMP(id)) &&
22
#include "hw/nvram/xlnx-zynqmp-efuse.h"
23
(s->reg.int_enb & G_INT_ENABLE(id))) {
23
#include "hw/or-irq.h"
24
- DPRINTF("gcmp timer[%d] IRQ\n", id);
24
+#include "hw/misc/xlnx-zynqmp-crf.h"
25
+ DPRINTF("gcmp timer[%u] IRQ\n", id);
25
26
qemu_irq_raise(s->irq[id]);
26
#define TYPE_XLNX_ZYNQMP "xlnx-zynqmp"
27
}
27
OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPState, XLNX_ZYNQMP)
28
@@ -XXX,XX +XXX,XX @@ struct XlnxZynqMPState {
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
37
index XXXXXXX..XXXXXXX 100644
38
--- a/hw/arm/xlnx-zynqmp.c
39
+++ b/hw/arm/xlnx-zynqmp.c
40
@@ -XXX,XX +XXX,XX @@
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]);
28
}
52
}
29
@@ -XXX,XX +XXX,XX @@ static void exynos4210_mct_update_freq(Exynos4210MCTState *s)
53
30
MCT_CFG_GET_DIVIDER(s->reg_mct_cfg));
54
+static void xlnx_zynqmp_create_crf(XlnxZynqMPState *s, qemu_irq *gic)
31
55
+{
32
if (freq != s->freq) {
56
+ SysBusDevice *sbd;
33
- DPRINTF("freq=%dHz\n", s->freq);
57
+
34
+ DPRINTF("freq=%uHz\n", s->freq);
58
+ object_initialize_child(OBJECT(s), "crf", &s->crf, TYPE_XLNX_ZYNQMP_CRF);
35
59
+ sbd = SYS_BUS_DEVICE(&s->crf);
36
/* global timer */
60
+
37
tx_ptimer_set_freq(s->g_timer.ptimer_frc, s->freq);
61
+ sysbus_realize(sbd, &error_fatal);
38
diff --git a/hw/timer/exynos4210_pwm.c b/hw/timer/exynos4210_pwm.c
62
+ sysbus_mmio_map(sbd, 0, CRF_ADDR);
39
index XXXXXXX..XXXXXXX 100644
63
+ sysbus_connect_irq(sbd, 0, gic[CRF_IRQ]);
40
--- a/hw/timer/exynos4210_pwm.c
64
+}
41
+++ b/hw/timer/exynos4210_pwm.c
65
+
42
@@ -XXX,XX +XXX,XX @@ static void exynos4210_pwm_update_freq(Exynos4210PWMState *s, uint32_t id)
66
static void xlnx_zynqmp_create_unimp_mmio(XlnxZynqMPState *s)
43
67
{
44
if (freq != s->timer[id].freq) {
68
static const struct UnimpInfo {
45
ptimer_set_freq(s->timer[id].ptimer, s->timer[id].freq);
69
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
46
- DPRINTF("freq=%dHz\n", s->timer[id].freq);
70
47
+ DPRINTF("freq=%uHz\n", s->timer[id].freq);
71
xlnx_zynqmp_create_bbram(s, gic_spi);
48
}
72
xlnx_zynqmp_create_efuse(s, gic_spi);
49
}
73
+ xlnx_zynqmp_create_crf(s, gic_spi);
50
74
xlnx_zynqmp_create_unimp_mmio(s);
51
@@ -XXX,XX +XXX,XX @@ static void exynos4210_pwm_tick(void *opaque)
75
52
uint32_t id = s->id;
76
for (i = 0; i < XLNX_ZYNQMP_NUM_GDMA_CH; i++) {
53
bool cmp;
54
55
- DPRINTF("timer %d tick\n", id);
56
+ DPRINTF("timer %u tick\n", id);
57
58
/* set irq status */
59
p->reg_tint_cstat |= TINT_CSTAT_STATUS(id);
60
61
/* raise IRQ */
62
if (p->reg_tint_cstat & TINT_CSTAT_ENABLE(id)) {
63
- DPRINTF("timer %d IRQ\n", id);
64
+ DPRINTF("timer %u IRQ\n", id);
65
qemu_irq_raise(p->timer[id].irq);
66
}
67
68
@@ -XXX,XX +XXX,XX @@ static void exynos4210_pwm_tick(void *opaque)
69
}
70
71
if (cmp) {
72
- DPRINTF("auto reload timer %d count to %x\n", id,
73
+ DPRINTF("auto reload timer %u count to %x\n", id,
74
p->timer[id].reg_tcntb);
75
ptimer_set_count(p->timer[id].ptimer, p->timer[id].reg_tcntb);
76
ptimer_run(p->timer[id].ptimer, 1);
77
--
77
--
78
2.20.1
78
2.25.1
79
79
80
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: Alistair Francis <alistair.francis@wdc.com>
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
2
2
3
This patch fixes CID 1432800 by removing an unnecessary check.
3
Connect the ZynqMP APU Control device.
4
4
5
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
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
Reviewed-by: Luc Michel <luc@lmichel.fr>
8
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
9
Message-id: 20220316164645.2303510-7-edgar.iglesias@gmail.com
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
11
---
9
hw/core/register.c | 4 ----
12
include/hw/arm/xlnx-zynqmp.h | 4 +++-
10
1 file changed, 4 deletions(-)
13
hw/arm/xlnx-zynqmp.c | 25 +++++++++++++++++++++++--
14
2 files changed, 26 insertions(+), 3 deletions(-)
11
15
12
diff --git a/hw/core/register.c b/hw/core/register.c
16
diff --git a/include/hw/arm/xlnx-zynqmp.h b/include/hw/arm/xlnx-zynqmp.h
13
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/core/register.c
18
--- a/include/hw/arm/xlnx-zynqmp.h
15
+++ b/hw/core/register.c
19
+++ b/include/hw/arm/xlnx-zynqmp.h
16
@@ -XXX,XX +XXX,XX @@ static RegisterInfoArray *register_init_block(DeviceState *owner,
20
@@ -XXX,XX +XXX,XX @@
17
int index = rae[i].addr / data_size;
21
#include "hw/nvram/xlnx-bbram.h"
18
RegisterInfo *r = &ri[index];
22
#include "hw/nvram/xlnx-zynqmp-efuse.h"
19
23
#include "hw/or-irq.h"
20
- if (data + data_size * index == 0 || !&rae[i]) {
24
+#include "hw/misc/xlnx-zynqmp-apu-ctrl.h"
21
- continue;
25
#include "hw/misc/xlnx-zynqmp-crf.h"
22
- }
26
23
-
27
#define TYPE_XLNX_ZYNQMP "xlnx-zynqmp"
24
/* Init the register, this will zero it. */
28
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPState, XLNX_ZYNQMP)
25
object_initialize((void *)r, sizeof(*r), TYPE_REGISTER);
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]);
60
}
61
62
+static void xlnx_zynqmp_create_apu_ctrl(XlnxZynqMPState *s, qemu_irq *gic)
63
+{
64
+ SysBusDevice *sbd;
65
+ int i;
66
+
67
+ object_initialize_child(OBJECT(s), "apu-ctrl", &s->apu_ctrl,
68
+ TYPE_XLNX_ZYNQMP_APU_CTRL);
69
+ sbd = SYS_BUS_DEVICE(&s->apu_ctrl);
70
+
71
+ for (i = 0; i < XLNX_ZYNQMP_NUM_APU_CPUS; i++) {
72
+ g_autofree gchar *name = g_strdup_printf("cpu%d", i);
73
+
74
+ object_property_set_link(OBJECT(&s->apu_ctrl), name,
75
+ OBJECT(&s->apu_cpu[i]), &error_abort);
76
+ }
77
+
78
+ sysbus_realize(sbd, &error_fatal);
79
+ sysbus_mmio_map(sbd, 0, APU_ADDR);
80
+ sysbus_connect_irq(sbd, 0, gic[APU_IRQ]);
81
+}
82
+
83
static void xlnx_zynqmp_create_crf(XlnxZynqMPState *s, qemu_irq *gic)
84
{
85
SysBusDevice *sbd;
86
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_create_unimp_mmio(XlnxZynqMPState *s)
87
hwaddr base;
88
hwaddr size;
89
} unimp_areas[ARRAY_SIZE(s->mr_unimp)] = {
90
- { .name = "apu", APU_ADDR, APU_SIZE },
91
{ .name = "serdes", SERDES_ADDR, SERDES_SIZE },
92
};
93
unsigned int nr;
94
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
95
96
xlnx_zynqmp_create_bbram(s, gic_spi);
97
xlnx_zynqmp_create_efuse(s, gic_spi);
98
+ xlnx_zynqmp_create_apu_ctrl(s, gic_spi);
99
xlnx_zynqmp_create_crf(s, gic_spi);
100
xlnx_zynqmp_create_unimp_mmio(s);
26
101
27
--
102
--
28
2.20.1
103
2.25.1
29
104
30
105
diff view generated by jsdifflib
New patch
1
From: Andrew Deason <adeason@sinenomine.net>
1
2
3
On older Solaris releases (before Solaris 11), we didn't get a
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:
7
8
extern int madvise(void *, size_t, int);
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
22
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
24
---
25
meson.build | 23 +++++++++++++++++++++--
26
include/qemu/osdep.h | 8 ++++++++
27
util/osdep.c | 3 ---
28
3 files changed, 29 insertions(+), 5 deletions(-)
29
30
diff --git a/meson.build b/meson.build
31
index XXXXXXX..XXXXXXX 100644
32
--- a/meson.build
33
+++ b/meson.build
34
@@ -XXX,XX +XXX,XX @@ config_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
35
#error Not supported
36
#endif
37
}'''))
38
-config_host_data.set('CONFIG_MADVISE', cc.links(gnu_source_prefix + '''
39
+
40
+has_madvise = cc.links(gnu_source_prefix + '''
41
#include <sys/types.h>
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"
100
--
101
2.25.1
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