1
Arm patch queue -- these are all bug fix patches but we might
1
Mostly straightforward bugfixes. The new Xilinx devices are
2
as well put them in to rc0...
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.
3
7
4
thanks
8
thanks
5
-- PMM
9
-- PMM
6
10
7
The following changes since commit 2c8cfc0b52b5a4d123c26c0b5fdf941be24805be:
11
The following changes since commit 1d60bb4b14601e38ed17384277aa4c30c57925d3:
8
12
9
Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging (2018-03-19 11:44:26 +0000)
13
Merge tag 'pull-request-2022-03-15v2' of https://gitlab.com/thuth/qemu into staging (2022-03-16 10:43:58 +0000)
10
14
11
are available in the Git repository at:
15
are available in the Git repository at:
12
16
13
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180319
17
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20220318
14
18
15
for you to fetch changes up to ff72cb6b46b95bb530787add5277c211af3d31c6:
19
for you to fetch changes up to 79d54c9eac04c554e3c081589542f801ace71797:
16
20
17
hw/arm/raspi: Provide spin-loop code for AArch64 CPUs (2018-03-19 18:23:24 +0000)
21
util/osdep: Remove some early cruft (2022-03-18 11:32:13 +0000)
18
22
19
----------------------------------------------------------------
23
----------------------------------------------------------------
20
target-arm queue:
24
target-arm queue:
21
* fsl-imx6: Fix incorrect Ethernet interrupt defines
25
* Fix sve2 ldnt1 and stnt1
22
* dump: Update correct kdump phys_base field for AArch64
26
* Fix pauth_check_trap vs SEL2
23
* char: i.MX: Add support for "TX complete" interrupt
27
* Fix handling of LPAE block descriptors
24
* bcm2836/raspi: Fix various bugs resulting in panics trying
28
* hw/dma/xlnx_csu_dma: Set TYPE_XLNX_CSU_DMA class_size
25
to boot a Debian Linux kernel on raspi3
29
* hw/misc/npcm7xx_clk: Don't leak string in npcm7xx_clk_sel_init()
30
* nsis installer: List emulators in alphabetical order
31
* nsis installer: Suppress "ANSI targets are deprecated" warning
32
* nsis installer: Fix mouse-over descriptions for emulators
33
* hw/arm/virt: Fix gic-version=max when CONFIG_ARM_GICV3_TCG is unset
34
* Improve M-profile vector table access logging
35
* Xilinx ZynqMP: model CRF and APU control
36
* Fix compile issues on modern Solaris
26
37
27
----------------------------------------------------------------
38
----------------------------------------------------------------
28
Andrey Smirnov (2):
39
Andrew Deason (3):
29
char: i.MX: Simplify imx_update()
40
util/osdep: Avoid madvise proto on modern Solaris
30
char: i.MX: Add support for "TX complete" interrupt
41
hw/i386/acpi-build: Avoid 'sun' identifier
42
util/osdep: Remove some early cruft
31
43
32
Guenter Roeck (1):
44
Edgar E. Iglesias (6):
33
fsl-imx6: Swap Ethernet interrupt defines
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
34
51
35
Peter Maydell (9):
52
Eric Auger (2):
36
hw/arm/raspi: Don't do board-setup or secure-boot for raspi3
53
hw/intc: Rename CONFIG_ARM_GIC_TCG into CONFIG_ARM_GICV3_TCG
37
hw/arm/boot: assert that secure_boot and secure_board_setup are false for AArch64
54
hw/arm/virt: Fix gic-version=max when CONFIG_ARM_GICV3_TCG is unset
38
hw/arm/boot: If booting a kernel in EL2, set SCR_EL3.HCE
39
hw/arm/bcm2386: Fix parent type of bcm2386
40
hw/arm/bcm2836: Rename bcm2836 type/struct to bcm283x
41
hw/arm/bcm2836: Create proper bcm2837 device
42
hw/arm/bcm2836: Use correct affinity values for BCM2837
43
hw/arm/bcm2836: Hardcode correct CPU type
44
hw/arm/raspi: Provide spin-loop code for AArch64 CPUs
45
55
46
Wei Huang (1):
56
Peter Maydell (8):
47
dump: Update correct kdump phys_base field for AArch64
57
target/arm: Fix handling of LPAE block descriptors
58
hw/dma/xlnx_csu_dma: Set TYPE_XLNX_CSU_DMA class_size
59
hw/misc/npcm7xx_clk: Don't leak string in npcm7xx_clk_sel_init()
60
nsis installer: List emulators in alphabetical order
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
48
65
49
include/hw/arm/bcm2836.h | 31 +++++++++++++---
66
Richard Henderson (2):
50
include/hw/arm/fsl-imx6.h | 4 +-
67
target/arm: Fix sve2 ldnt1 and stnt1
51
include/hw/char/imx_serial.h | 3 ++
68
target/arm: Fix pauth_check_trap vs SEL2
52
dump.c | 14 +++++--
53
hw/arm/bcm2836.c | 87 +++++++++++++++++++++++++++++++-------------
54
hw/arm/boot.c | 12 ++++++
55
hw/arm/raspi.c | 77 +++++++++++++++++++++++++++++++--------
56
hw/char/imx_serial.c | 44 ++++++++++++++++------
57
hw/net/imx_fec.c | 28 +++++++++++++-
58
9 files changed, 237 insertions(+), 63 deletions(-)
59
69
70
meson.build | 23 ++-
71
include/hw/arm/xlnx-zynqmp.h | 4 +
72
include/hw/misc/xlnx-zynqmp-apu-ctrl.h | 93 ++++++++++++
73
include/hw/misc/xlnx-zynqmp-crf.h | 211 ++++++++++++++++++++++++++
74
include/qemu/osdep.h | 8 +
75
target/arm/cpu.h | 3 +-
76
target/arm/sve.decode | 5 +-
77
hw/arm/virt.c | 7 +-
78
hw/arm/xlnx-zynqmp.c | 46 +++++-
79
hw/dma/xlnx_csu_dma.c | 1 +
80
hw/i386/acpi-build.c | 4 +-
81
hw/misc/npcm7xx_clk.c | 4 +-
82
hw/misc/xlnx-zynqmp-apu-ctrl.c | 253 +++++++++++++++++++++++++++++++
83
hw/misc/xlnx-zynqmp-crf.c | 266 +++++++++++++++++++++++++++++++++
84
target/arm/cpu.c | 17 ++-
85
target/arm/helper.c | 20 ++-
86
target/arm/m_helper.c | 11 ++
87
target/arm/pauth_helper.c | 2 +-
88
target/arm/translate-sve.c | 51 ++++++-
89
tests/tcg/aarch64/test-826.c | 50 +++++++
90
util/osdep.c | 10 --
91
hw/intc/Kconfig | 2 +-
92
hw/intc/meson.build | 4 +-
93
hw/misc/meson.build | 2 +
94
qemu.nsi | 8 +-
95
scripts/nsis.py | 17 ++-
96
tests/tcg/aarch64/Makefile.target | 4 +
97
tests/tcg/configure.sh | 4 +
98
28 files changed, 1084 insertions(+), 46 deletions(-)
99
create mode 100644 include/hw/misc/xlnx-zynqmp-apu-ctrl.h
100
create mode 100644 include/hw/misc/xlnx-zynqmp-crf.h
101
create mode 100644 hw/misc/xlnx-zynqmp-apu-ctrl.c
102
create mode 100644 hw/misc/xlnx-zynqmp-crf.c
103
create mode 100644 tests/tcg/aarch64/test-826.c
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Code of imx_update() is slightly confusing since the "flags" variable
3
For both ldnt1 and stnt1, the meaning of the Rn and Rm are different
4
doesn't really corespond to anything in real hardware and server as a
4
from ld1 and st1: the vector and integer registers are reversed, and
5
kitchensink accumulating events normally reported via USR1 and USR2
5
the integer register 31 refers to XZR instead of SP.
6
registers.
6
7
7
Secondly, the 64-bit version of ldnt1 was being interpreted as
8
Change the code to explicitly evaluate state of interrupts reported
8
32-bit unpacked unscaled offset instead of 64-bit unscaled offset,
9
via USR1 and USR2 against corresponding masking bits and use the to
9
which discarded the upper 32 bits of the address coming from
10
detemine if IRQ line should be asserted or not.
10
the vector argument.
11
11
12
NOTE: Check for UTS1_TXEMPTY being set has been dropped for two
12
Thirdly, validate that the memory element size is in range for the
13
reasons:
13
vector element size for ldnt1. For ld1, we do this via independent
14
14
decode patterns, but for ldnt1 we need to do it manually.
15
1. Emulation code implements a single character FIFO, so this flag
15
16
will always be set since characters are trasmitted as a part of
16
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/826
17
the code emulating "push" into the FIFO
17
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
18
19
2. imx_update() is really just a function doing ORing and maksing
20
of reported events, so checking for UTS1_TXEMPTY should happen,
21
if it's ever really needed should probably happen outside of
22
it.
23
24
Cc: qemu-devel@nongnu.org
25
Cc: qemu-arm@nongnu.org
26
Cc: Bill Paul <wpaul@windriver.com>
27
Cc: Peter Maydell <peter.maydell@linaro.org>
28
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
29
Message-id: 20180315191141.6789-1-andrew.smirnov@gmail.com
30
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
19
Message-id: 20220308031655.240710-1-richard.henderson@linaro.org
31
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
32
---
21
---
33
hw/char/imx_serial.c | 24 ++++++++++++++++--------
22
target/arm/sve.decode | 5 ++-
34
1 file changed, 16 insertions(+), 8 deletions(-)
23
target/arm/translate-sve.c | 51 +++++++++++++++++++++++++++++--
35
24
tests/tcg/aarch64/test-826.c | 50 ++++++++++++++++++++++++++++++
36
diff --git a/hw/char/imx_serial.c b/hw/char/imx_serial.c
25
tests/tcg/aarch64/Makefile.target | 4 +++
26
tests/tcg/configure.sh | 4 +++
27
5 files changed, 109 insertions(+), 5 deletions(-)
28
create mode 100644 tests/tcg/aarch64/test-826.c
29
30
diff --git a/target/arm/sve.decode b/target/arm/sve.decode
37
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
38
--- a/hw/char/imx_serial.c
32
--- a/target/arm/sve.decode
39
+++ b/hw/char/imx_serial.c
33
+++ b/target/arm/sve.decode
40
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_imx_serial = {
34
@@ -XXX,XX +XXX,XX @@ USDOT_zzzz 01000100 .. 0 ..... 011 110 ..... ..... @rda_rn_rm
41
35
42
static void imx_update(IMXSerialState *s)
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)
43
{
54
{
44
- uint32_t flags;
55
+ gen_helper_gvec_mem_scatter *fn = NULL;
45
+ uint32_t usr1;
56
+ bool be = s->be_data == MO_BE;
46
+ uint32_t usr2;
57
+ bool mte = s->mte_active[0];
47
+ uint32_t mask;
58
+
48
59
+ if (a->esz < a->msz + !a->u) {
49
- flags = (s->usr1 & s->ucr1) & (USR1_TRDY|USR1_RRDY);
60
+ return false;
50
- if (s->ucr1 & UCR1_TXMPTYEN) {
61
+ }
51
- flags |= (s->uts1 & UTS1_TXEMPTY);
62
if (!dc_isar_feature(aa64_sve2, s)) {
52
- } else {
63
return false;
53
- flags &= ~USR1_TRDY;
64
}
54
- }
65
- return trans_LD1_zprz(s, a);
55
+ /*
66
+ if (!sve_access_check(s)) {
56
+ * Lucky for us TRDY and RRDY has the same offset in both USR1 and
67
+ return true;
57
+ * UCR1, so we can get away with something as simple as the
68
+ }
58
+ * following:
69
+
59
+ */
70
+ switch (a->esz) {
60
+ usr1 = s->usr1 & s->ucr1 & (USR1_TRDY | USR1_RRDY);
71
+ case MO_32:
61
+ /*
72
+ fn = gather_load_fn32[mte][be][0][0][a->u][a->msz];
62
+ * Bits that we want in USR2 are not as conveniently laid out,
73
+ break;
63
+ * unfortunately.
74
+ case MO_64:
64
+ */
75
+ fn = gather_load_fn64[mte][be][0][2][a->u][a->msz];
65
+ mask = (s->ucr1 & UCR1_TXMPTYEN) ? USR2_TXFE : 0;
76
+ break;
66
+ usr2 = s->usr2 & mask;
77
+ }
67
78
+ assert(fn != NULL);
68
- qemu_set_irq(s->irq, !!flags);
79
+
69
+ qemu_set_irq(s->irq, usr1 || usr2);
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;
70
}
83
}
71
84
72
static void imx_serial_reset(IMXSerialState *s)
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
73
--
209
--
74
2.16.2
210
2.25.1
75
76
diff view generated by jsdifflib
1
The TypeInfo and state struct for bcm2386 disagree about what the
1
From: Richard Henderson <richard.henderson@linaro.org>
2
parent class is -- the TypeInfo says it's TYPE_SYS_BUS_DEVICE,
3
but the BCM2386State struct only defines the parent_obj field
4
as DeviceState. This would have caused problems if anything
5
actually tried to treat the object as a TYPE_SYS_BUS_DEVICE.
6
Fix the TypeInfo to use TYPE_DEVICE as the parent, since we don't
7
need any of the additional functionality TYPE_SYS_BUS_DEVICE
8
provides.
9
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
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Message-id: 20180313153458.26822-5-peter.maydell@linaro.org
14
---
12
---
15
hw/arm/bcm2836.c | 2 +-
13
target/arm/pauth_helper.c | 2 +-
16
1 file changed, 1 insertion(+), 1 deletion(-)
14
1 file changed, 1 insertion(+), 1 deletion(-)
17
15
18
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
16
diff --git a/target/arm/pauth_helper.c b/target/arm/pauth_helper.c
19
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/arm/bcm2836.c
18
--- a/target/arm/pauth_helper.c
21
+++ b/hw/arm/bcm2836.c
19
+++ b/target/arm/pauth_helper.c
22
@@ -XXX,XX +XXX,XX @@ static void bcm2836_class_init(ObjectClass *oc, void *data)
20
@@ -XXX,XX +XXX,XX @@ static void QEMU_NORETURN pauth_trap(CPUARMState *env, int target_el,
23
21
24
static const TypeInfo bcm2836_type_info = {
22
static void pauth_check_trap(CPUARMState *env, int el, uintptr_t ra)
25
.name = TYPE_BCM2836,
23
{
26
- .parent = TYPE_SYS_BUS_DEVICE,
24
- if (el < 2 && arm_feature(env, ARM_FEATURE_EL2)) {
27
+ .parent = TYPE_DEVICE,
25
+ if (el < 2 && arm_is_el2_enabled(env)) {
28
.instance_size = sizeof(BCM2836State),
26
uint64_t hcr = arm_hcr_el2_eff(env);
29
.instance_init = bcm2836_init,
27
bool trap = !(hcr & HCR_API);
30
.class_init = bcm2836_class_init,
28
if (el == 0) {
31
--
29
--
32
2.16.2
30
2.25.1
33
31
34
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
New patch
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.
1
6
7
Found by running 'check-qtest-aarch64' with a clang
8
address-sanitizer build, which complains:
9
10
==2542634==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x61000000ab00 at pc 0x559a20aebc29 bp 0x7fff97df74d0 sp 0x7fff97df74c8
11
WRITE of size 8 at 0x61000000ab00 thread T0
12
#0 0x559a20aebc28 in xlnx_csu_dma_class_init /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/../../hw/dma/xlnx_csu_dma.c:722:16
13
#1 0x559a21bf297c in type_initialize /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/../../qom/object.c:365:9
14
#2 0x559a21bf3442 in object_class_foreach_tramp /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/../../qom/object.c:1070:5
15
#3 0x7f09bcb641b7 in g_hash_table_foreach (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x401b7)
16
#4 0x559a21bf3c27 in object_class_foreach /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/../../qom/object.c:1092:5
17
#5 0x559a21bf3c27 in object_class_get_list /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/../../qom/object.c:1149:5
18
#6 0x559a2081a2fd in select_machine /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/../../softmmu/vl.c:1661:24
19
#7 0x559a2081a2fd in qemu_create_machine /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/../../softmmu/vl.c:2146:35
20
#8 0x559a2081a2fd in qemu_init /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/../../softmmu/vl.c:3706:5
21
#9 0x559a20720ed5 in main /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/../../softmmu/main.c:49:5
22
#10 0x7f09baec00b2 in __libc_start_main /build/glibc-sMfBJT/glibc-2.31/csu/../csu/libc-start.c:308:16
23
#11 0x559a2067673d in _start (/mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/qemu-system-aarch64+0xf4b73d)
24
25
0x61000000ab00 is located 0 bytes to the right of 192-byte region [0x61000000aa40,0x61000000ab00)
26
allocated by thread T0 here:
27
#0 0x559a206eeff2 in calloc (/mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/qemu-system-aarch64+0xfc3ff2)
28
#1 0x7f09bcb7bef0 in g_malloc0 (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x57ef0)
29
#2 0x559a21bf3442 in object_class_foreach_tramp /mnt/nvmedisk/linaro/qemu-from-laptop/qemu/build/san/../../qom/object.c:1070:5
30
31
Fixes: 00f05c02f9e7342f ("hw/dma/xlnx_csu_dma: Support starting a read transfer through a class method")
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
38
---
39
hw/dma/xlnx_csu_dma.c | 1 +
40
1 file changed, 1 insertion(+)
41
42
diff --git a/hw/dma/xlnx_csu_dma.c b/hw/dma/xlnx_csu_dma.c
43
index XXXXXXX..XXXXXXX 100644
44
--- a/hw/dma/xlnx_csu_dma.c
45
+++ b/hw/dma/xlnx_csu_dma.c
46
@@ -XXX,XX +XXX,XX @@ static const TypeInfo xlnx_csu_dma_info = {
47
.parent = TYPE_SYS_BUS_DEVICE,
48
.instance_size = sizeof(XlnxCSUDMA),
49
.class_init = xlnx_csu_dma_class_init,
50
+ .class_size = sizeof(XlnxCSUDMAClass),
51
.instance_init = xlnx_csu_dma_init,
52
.interfaces = (InterfaceInfo[]) {
53
{ TYPE_STREAM_SINK },
54
--
55
2.25.1
56
57
diff view generated by jsdifflib
1
Now we have separate types for BCM2386 and BCM2387, we might as well
1
In npcm7xx_clk_sel_init() we allocate a string with g_strdup_printf().
2
just hard-code the CPU type they use rather than having it passed
2
Use g_autofree so we free it rather than leaking it.
3
through as an object property. This then lets us put the initialization
4
of the CPU object in init rather than realize.
5
3
6
Note that this change means that it's no longer possible on
4
(Detected with the clang leak sanitizer.)
7
the command line to use -cpu to ask for a different kind of
8
CPU than the SoC supports. This was never a supported thing to
9
do anyway; we were just not sanity-checking the command line.
10
11
This does require us to only build the bcm2837 object on
12
TARGET_AARCH64 configs, since otherwise it won't instantiate
13
due to the missing cortex-a53 device and "make check" will fail.
14
5
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
17
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
18
Message-id: 20180313153458.26822-9-peter.maydell@linaro.org
9
Message-id: 20220308170302.2582820-1-peter.maydell@linaro.org
19
---
10
---
20
hw/arm/bcm2836.c | 24 +++++++++++++++---------
11
hw/misc/npcm7xx_clk.c | 4 ++--
21
hw/arm/raspi.c | 2 --
12
1 file changed, 2 insertions(+), 2 deletions(-)
22
2 files changed, 15 insertions(+), 11 deletions(-)
23
13
24
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
14
diff --git a/hw/misc/npcm7xx_clk.c b/hw/misc/npcm7xx_clk.c
25
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/arm/bcm2836.c
16
--- a/hw/misc/npcm7xx_clk.c
27
+++ b/hw/arm/bcm2836.c
17
+++ b/hw/misc/npcm7xx_clk.c
28
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ static void npcm7xx_clk_sel_init(Object *obj)
29
19
NPCM7xxClockSELState *sel = NPCM7XX_CLOCK_SEL(obj);
30
struct BCM283XInfo {
20
31
const char *name;
21
for (i = 0; i < NPCM7XX_CLK_SEL_MAX_INPUT; ++i) {
32
+ const char *cpu_type;
22
- sel->clock_in[i] = qdev_init_clock_in(DEVICE(sel),
33
int clusterid;
23
- g_strdup_printf("clock-in[%d]", i),
34
};
24
+ g_autofree char *s = g_strdup_printf("clock-in[%d]", i);
35
25
+ sel->clock_in[i] = qdev_init_clock_in(DEVICE(sel), s,
36
static const BCM283XInfo bcm283x_socs[] = {
26
npcm7xx_clk_update_sel_cb, sel, ClockUpdate);
37
{
27
}
38
.name = TYPE_BCM2836,
28
sel->clock_out = qdev_init_clock_out(DEVICE(sel), "clock-out");
39
+ .cpu_type = ARM_CPU_TYPE_NAME("cortex-a15"),
40
.clusterid = 0xf,
41
},
42
+#ifdef TARGET_AARCH64
43
{
44
.name = TYPE_BCM2837,
45
+ .cpu_type = ARM_CPU_TYPE_NAME("cortex-a53"),
46
.clusterid = 0x0,
47
},
48
+#endif
49
};
50
51
static void bcm2836_init(Object *obj)
52
{
53
BCM283XState *s = BCM283X(obj);
54
+ BCM283XClass *bc = BCM283X_GET_CLASS(obj);
55
+ const BCM283XInfo *info = bc->info;
56
+ int n;
57
+
58
+ for (n = 0; n < BCM283X_NCPUS; n++) {
59
+ object_initialize(&s->cpus[n], sizeof(s->cpus[n]),
60
+ info->cpu_type);
61
+ object_property_add_child(obj, "cpu[*]", OBJECT(&s->cpus[n]),
62
+ &error_abort);
63
+ }
64
65
object_initialize(&s->control, sizeof(s->control), TYPE_BCM2836_CONTROL);
66
object_property_add_child(obj, "control", OBJECT(&s->control), NULL);
67
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
68
69
/* common peripherals from bcm2835 */
70
71
- obj = OBJECT(dev);
72
- for (n = 0; n < BCM283X_NCPUS; n++) {
73
- object_initialize(&s->cpus[n], sizeof(s->cpus[n]),
74
- s->cpu_type);
75
- object_property_add_child(obj, "cpu[*]", OBJECT(&s->cpus[n]),
76
- &error_abort);
77
- }
78
-
79
obj = object_property_get_link(OBJECT(dev), "ram", &err);
80
if (obj == NULL) {
81
error_setg(errp, "%s: required ram link not found: %s",
82
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
83
}
84
85
static Property bcm2836_props[] = {
86
- DEFINE_PROP_STRING("cpu-type", BCM283XState, cpu_type),
87
DEFINE_PROP_UINT32("enabled-cpus", BCM283XState, enabled_cpus,
88
BCM283X_NCPUS),
89
DEFINE_PROP_END_OF_LIST()
90
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
91
index XXXXXXX..XXXXXXX 100644
92
--- a/hw/arm/raspi.c
93
+++ b/hw/arm/raspi.c
94
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
95
/* Setup the SOC */
96
object_property_add_const_link(OBJECT(&s->soc), "ram", OBJECT(&s->ram),
97
&error_abort);
98
- object_property_set_str(OBJECT(&s->soc), machine->cpu_type, "cpu-type",
99
- &error_abort);
100
object_property_set_int(OBJECT(&s->soc), smp_cpus, "enabled-cpus",
101
&error_abort);
102
int board_rev = version == 3 ? 0xa02082 : 0xa21041;
103
--
29
--
104
2.16.2
30
2.25.1
105
31
106
32
diff view generated by jsdifflib
1
The BCM2837 sets the Aff1 field of the MPIDR affinity values for the
1
We currently list the emulators in the Windows installer's dialog
2
CPUs to 0, whereas the BCM2836 uses 0xf. Set this correctly, as it
2
in an essentially random order (it's whatever glob.glob() returns
3
is required for Linux to boot.
3
them to, which is filesystem-implementation-dependent). Add a
4
call to sorted() so they appear in alphabetical order.
4
5
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20180313153458.26822-8-peter.maydell@linaro.org
8
Reviewed-by: Stefan Weil <sw@weilnetz.de>
9
Reviewed-by: John Snow <jsnow@redhat.com>
10
Message-id: 20220305105743.2384766-2-peter.maydell@linaro.org
9
---
11
---
10
hw/arm/bcm2836.c | 11 +++++++----
12
scripts/nsis.py | 4 ++--
11
1 file changed, 7 insertions(+), 4 deletions(-)
13
1 file changed, 2 insertions(+), 2 deletions(-)
12
14
13
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
15
diff --git a/scripts/nsis.py b/scripts/nsis.py
14
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/bcm2836.c
17
--- a/scripts/nsis.py
16
+++ b/hw/arm/bcm2836.c
18
+++ b/scripts/nsis.py
17
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ def main():
18
20
with open(
19
struct BCM283XInfo {
21
os.path.join(destdir + args.prefix, "system-emulations.nsh"), "w"
20
const char *name;
22
) as nsh:
21
+ int clusterid;
23
- for exe in glob.glob(
22
};
24
+ for exe in sorted(glob.glob(
23
25
os.path.join(destdir + args.prefix, "qemu-system-*.exe")
24
static const BCM283XInfo bcm283x_socs[] = {
26
- ):
25
{
27
+ )):
26
.name = TYPE_BCM2836,
28
exe = os.path.basename(exe)
27
+ .clusterid = 0xf,
29
arch = exe[12:-4]
28
},
30
nsh.write(
29
{
30
.name = TYPE_BCM2837,
31
+ .clusterid = 0x0,
32
},
33
};
34
35
@@ -XXX,XX +XXX,XX @@ static void bcm2836_init(Object *obj)
36
static void bcm2836_realize(DeviceState *dev, Error **errp)
37
{
38
BCM283XState *s = BCM283X(dev);
39
+ BCM283XClass *bc = BCM283X_GET_CLASS(dev);
40
+ const BCM283XInfo *info = bc->info;
41
Object *obj;
42
Error *err = NULL;
43
int n;
44
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
45
qdev_get_gpio_in_named(DEVICE(&s->control), "gpu-fiq", 0));
46
47
for (n = 0; n < BCM283X_NCPUS; n++) {
48
- /* Mirror bcm2836, which has clusterid set to 0xf
49
- * TODO: this should be converted to a property of ARM_CPU
50
- */
51
- s->cpus[n].mp_affinity = 0xF00 | n;
52
+ /* TODO: this should be converted to a property of ARM_CPU */
53
+ s->cpus[n].mp_affinity = (info->clusterid << 8) | n;
54
55
/* set periphbase/CBAR value for CPU-local registers */
56
object_property_set_int(OBJECT(&s->cpus[n]),
57
--
31
--
58
2.16.2
32
2.25.1
59
33
60
34
diff view generated by jsdifflib
1
Our BCM2836 type is really a generic one that can be any of
1
When we build our Windows installer, it emits the warning:
2
the bcm283x family. Rename it accordingly. We change only
3
the names which are visible via the header file to the
4
rest of the QEMU code, leaving private function names
5
in bcm2836.c as they are.
6
2
7
This is a preliminary to making bcm283x be an abstract
3
warning 7998: ANSI targets are deprecated
8
parent class to specific types for the bcm2836 and bcm2837.
4
5
Fix this by making our installer a Unicode installer instead. These
6
won't work on Win95/98/ME, but we already do not support those.
7
8
See
9
https://nsis.sourceforge.io/Docs/Chapter4.html#aunicodetarget
10
for the documentation of the Unicode directive.
9
11
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Message-id: 20180313153458.26822-6-peter.maydell@linaro.org
14
Reviewed-by: Stefan Weil <sw@weilnetz.de>
15
Message-id: 20220305105743.2384766-3-peter.maydell@linaro.org
14
---
16
---
15
include/hw/arm/bcm2836.h | 12 ++++++------
17
qemu.nsi | 3 +++
16
hw/arm/bcm2836.c | 17 +++++++++--------
18
1 file changed, 3 insertions(+)
17
hw/arm/raspi.c | 16 ++++++++--------
18
3 files changed, 23 insertions(+), 22 deletions(-)
19
19
20
diff --git a/include/hw/arm/bcm2836.h b/include/hw/arm/bcm2836.h
20
diff --git a/qemu.nsi b/qemu.nsi
21
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
22
--- a/include/hw/arm/bcm2836.h
22
--- a/qemu.nsi
23
+++ b/include/hw/arm/bcm2836.h
23
+++ b/qemu.nsi
24
@@ -XXX,XX +XXX,XX @@
24
@@ -XXX,XX +XXX,XX @@
25
#include "hw/arm/bcm2835_peripherals.h"
25
!define OUTFILE "qemu-setup.exe"
26
#include "hw/intc/bcm2836_control.h"
26
!endif
27
27
28
-#define TYPE_BCM2836 "bcm2836"
28
+; Build a unicode installer
29
-#define BCM2836(obj) OBJECT_CHECK(BCM2836State, (obj), TYPE_BCM2836)
29
+Unicode true
30
+#define TYPE_BCM283X "bcm283x"
30
+
31
+#define BCM283X(obj) OBJECT_CHECK(BCM283XState, (obj), TYPE_BCM283X)
31
; Use maximum compression.
32
32
SetCompressor /SOLID lzma
33
-#define BCM2836_NCPUS 4
33
34
+#define BCM283X_NCPUS 4
35
36
-typedef struct BCM2836State {
37
+typedef struct BCM283XState {
38
/*< private >*/
39
DeviceState parent_obj;
40
/*< public >*/
41
@@ -XXX,XX +XXX,XX @@ typedef struct BCM2836State {
42
char *cpu_type;
43
uint32_t enabled_cpus;
44
45
- ARMCPU cpus[BCM2836_NCPUS];
46
+ ARMCPU cpus[BCM283X_NCPUS];
47
BCM2836ControlState control;
48
BCM2835PeripheralState peripherals;
49
-} BCM2836State;
50
+} BCM283XState;
51
52
#endif /* BCM2836_H */
53
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
54
index XXXXXXX..XXXXXXX 100644
55
--- a/hw/arm/bcm2836.c
56
+++ b/hw/arm/bcm2836.c
57
@@ -XXX,XX +XXX,XX @@
58
59
static void bcm2836_init(Object *obj)
60
{
61
- BCM2836State *s = BCM2836(obj);
62
+ BCM283XState *s = BCM283X(obj);
63
64
object_initialize(&s->control, sizeof(s->control), TYPE_BCM2836_CONTROL);
65
object_property_add_child(obj, "control", OBJECT(&s->control), NULL);
66
@@ -XXX,XX +XXX,XX @@ static void bcm2836_init(Object *obj)
67
68
static void bcm2836_realize(DeviceState *dev, Error **errp)
69
{
70
- BCM2836State *s = BCM2836(dev);
71
+ BCM283XState *s = BCM283X(dev);
72
Object *obj;
73
Error *err = NULL;
74
int n;
75
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
76
/* common peripherals from bcm2835 */
77
78
obj = OBJECT(dev);
79
- for (n = 0; n < BCM2836_NCPUS; n++) {
80
+ for (n = 0; n < BCM283X_NCPUS; n++) {
81
object_initialize(&s->cpus[n], sizeof(s->cpus[n]),
82
s->cpu_type);
83
object_property_add_child(obj, "cpu[*]", OBJECT(&s->cpus[n]),
84
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
85
sysbus_connect_irq(SYS_BUS_DEVICE(&s->peripherals), 1,
86
qdev_get_gpio_in_named(DEVICE(&s->control), "gpu-fiq", 0));
87
88
- for (n = 0; n < BCM2836_NCPUS; n++) {
89
+ for (n = 0; n < BCM283X_NCPUS; n++) {
90
/* Mirror bcm2836, which has clusterid set to 0xf
91
* TODO: this should be converted to a property of ARM_CPU
92
*/
93
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
94
}
95
96
static Property bcm2836_props[] = {
97
- DEFINE_PROP_STRING("cpu-type", BCM2836State, cpu_type),
98
- DEFINE_PROP_UINT32("enabled-cpus", BCM2836State, enabled_cpus, BCM2836_NCPUS),
99
+ DEFINE_PROP_STRING("cpu-type", BCM283XState, cpu_type),
100
+ DEFINE_PROP_UINT32("enabled-cpus", BCM283XState, enabled_cpus,
101
+ BCM283X_NCPUS),
102
DEFINE_PROP_END_OF_LIST()
103
};
104
105
@@ -XXX,XX +XXX,XX @@ static void bcm2836_class_init(ObjectClass *oc, void *data)
106
}
107
108
static const TypeInfo bcm2836_type_info = {
109
- .name = TYPE_BCM2836,
110
+ .name = TYPE_BCM283X,
111
.parent = TYPE_DEVICE,
112
- .instance_size = sizeof(BCM2836State),
113
+ .instance_size = sizeof(BCM283XState),
114
.instance_init = bcm2836_init,
115
.class_init = bcm2836_class_init,
116
};
117
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
118
index XXXXXXX..XXXXXXX 100644
119
--- a/hw/arm/raspi.c
120
+++ b/hw/arm/raspi.c
121
@@ -XXX,XX +XXX,XX @@
122
static const int raspi_boardid[] = {[1] = 0xc42, [2] = 0xc43, [3] = 0xc44};
123
124
typedef struct RasPiState {
125
- BCM2836State soc;
126
+ BCM283XState soc;
127
MemoryRegion ram;
128
} RasPiState;
129
130
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
131
BusState *bus;
132
DeviceState *carddev;
133
134
- object_initialize(&s->soc, sizeof(s->soc), TYPE_BCM2836);
135
+ object_initialize(&s->soc, sizeof(s->soc), TYPE_BCM283X);
136
object_property_add_child(OBJECT(machine), "soc", OBJECT(&s->soc),
137
&error_abort);
138
139
@@ -XXX,XX +XXX,XX @@ static void raspi2_machine_init(MachineClass *mc)
140
mc->no_floppy = 1;
141
mc->no_cdrom = 1;
142
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a15");
143
- mc->max_cpus = BCM2836_NCPUS;
144
- mc->min_cpus = BCM2836_NCPUS;
145
- mc->default_cpus = BCM2836_NCPUS;
146
+ mc->max_cpus = BCM283X_NCPUS;
147
+ mc->min_cpus = BCM283X_NCPUS;
148
+ mc->default_cpus = BCM283X_NCPUS;
149
mc->default_ram_size = 1024 * 1024 * 1024;
150
mc->ignore_memory_transaction_failures = true;
151
};
152
@@ -XXX,XX +XXX,XX @@ static void raspi3_machine_init(MachineClass *mc)
153
mc->no_floppy = 1;
154
mc->no_cdrom = 1;
155
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a53");
156
- mc->max_cpus = BCM2836_NCPUS;
157
- mc->min_cpus = BCM2836_NCPUS;
158
- mc->default_cpus = BCM2836_NCPUS;
159
+ mc->max_cpus = BCM283X_NCPUS;
160
+ mc->min_cpus = BCM283X_NCPUS;
161
+ mc->default_cpus = BCM283X_NCPUS;
162
mc->default_ram_size = 1024 * 1024 * 1024;
163
}
164
DEFINE_MACHINE("raspi3", raspi3_machine_init)
165
--
34
--
166
2.16.2
35
2.25.1
167
36
168
37
diff view generated by jsdifflib
1
If we're directly booting a Linux kernel and the CPU supports both
1
We use the nsis.py script to write out an installer script Section
2
EL3 and EL2, we start the kernel in EL2, as it expects. We must also
2
for each emulator executable, so the exact set of Sections depends on
3
set the SCR_EL3.HCE bit in this situation, so that the HVC
3
which executables were built. However the part of qemu.nsi which
4
instruction is enabled rather than UNDEFing. Otherwise at least some
4
specifies mouse-over descriptions for each Section still has a
5
kernels will panic when trying to initialize KVM in the guest.
5
hard-coded and very outdated list (with just i386 and alpha). This
6
causes two problems. Firstly, if you build the installer for a
7
configuration where you didn't build the i386 binaries you get
8
warnings like this:
9
warning 6000: unknown variable/constant "{Section_i386}" detected, ignoring (macro:_==:1)
10
warning 6000: unknown variable/constant "{Section_i386w}" detected, ignoring (macro:_==:1)
11
(this happens in our gitlab CI jobs, for instance).
12
Secondly, most of the emulators in the generated installer don't have
13
any mouseover text.
14
15
Make nsis.py generate a second output file which has the necessary
16
MUI_DESCRIPTION_TEXT lines for each Section it creates, so we can
17
include that at the right point in qemu.nsi to set the mouse-over
18
text.
6
19
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20180313153458.26822-4-peter.maydell@linaro.org
21
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
22
Reviewed-by: John Snow <jsnow@redhat.com>
23
Message-id: 20220305105743.2384766-4-peter.maydell@linaro.org
9
---
24
---
10
hw/arm/boot.c | 5 +++++
25
qemu.nsi | 5 +----
11
1 file changed, 5 insertions(+)
26
scripts/nsis.py | 13 ++++++++++++-
27
2 files changed, 13 insertions(+), 5 deletions(-)
12
28
13
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
29
diff --git a/qemu.nsi b/qemu.nsi
14
index XXXXXXX..XXXXXXX 100644
30
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/boot.c
31
--- a/qemu.nsi
16
+++ b/hw/arm/boot.c
32
+++ b/qemu.nsi
17
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
33
@@ -XXX,XX +XXX,XX @@ SectionEnd
18
assert(!info->secure_board_setup);
34
; Descriptions (mouse-over).
19
}
35
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
20
36
!insertmacro MUI_DESCRIPTION_TEXT ${SectionSystem} "System emulation."
21
+ if (arm_feature(env, ARM_FEATURE_EL2)) {
37
- !insertmacro MUI_DESCRIPTION_TEXT ${Section_alpha} "Alpha system emulation."
22
+ /* If we have EL2 then Linux expects the HVC insn to work */
38
- !insertmacro MUI_DESCRIPTION_TEXT ${Section_alphaw} "Alpha system emulation (GUI)."
23
+ env->cp15.scr_el3 |= SCR_HCE;
39
- !insertmacro MUI_DESCRIPTION_TEXT ${Section_i386} "PC i386 system emulation."
24
+ }
40
- !insertmacro MUI_DESCRIPTION_TEXT ${Section_i386w} "PC i386 system emulation (GUI)."
41
+!include "${BINDIR}\system-mui-text.nsh"
42
!insertmacro MUI_DESCRIPTION_TEXT ${SectionTools} "Tools."
43
!ifdef DLLDIR
44
!insertmacro MUI_DESCRIPTION_TEXT ${SectionDll} "Runtime Libraries (DLL)."
45
diff --git a/scripts/nsis.py b/scripts/nsis.py
46
index XXXXXXX..XXXXXXX 100644
47
--- a/scripts/nsis.py
48
+++ b/scripts/nsis.py
49
@@ -XXX,XX +XXX,XX @@ def main():
50
subprocess.run(["make", "install", "DESTDIR=" + destdir + os.path.sep])
51
with open(
52
os.path.join(destdir + args.prefix, "system-emulations.nsh"), "w"
53
- ) as nsh:
54
+ ) as nsh, open(
55
+ os.path.join(destdir + args.prefix, "system-mui-text.nsh"), "w"
56
+ ) as muinsh:
57
for exe in sorted(glob.glob(
58
os.path.join(destdir + args.prefix, "qemu-system-*.exe")
59
)):
60
@@ -XXX,XX +XXX,XX @@ def main():
61
arch, exe
62
)
63
)
64
+ if arch.endswith('w'):
65
+ desc = arch[:-1] + " emulation (GUI)."
66
+ else:
67
+ desc = arch + " emulation."
25
+
68
+
26
/* Set to non-secure if not a secure boot */
69
+ muinsh.write(
27
if (!info->secure_boot &&
70
+ """
28
(cs != first_cpu || !info->secure_board_setup)) {
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)
29
--
76
--
30
2.16.2
77
2.25.1
31
78
32
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
For the rpi1 and 2 we want to boot the Linux kernel via some
1
Currently the CPU_LOG_INT logging misses some useful information
2
custom setup code that makes sure that the SMC instruction
2
about loads from the vector table. Add logging where we load vector
3
acts as a no-op, because it's used for cache maintenance.
3
table entries. This is particularly helpful for cases where the user
4
The rpi3 boots AArch64 kernels, which don't need SMC for
4
has accidentally not put a vector table in their image at all, which
5
cache maintenance and always expect to be booted non-secure.
5
can result in confusing guest crashes at startup.
6
Don't fill in the aarch32-specific parts of the binfo struct.
6
7
Here's an example of the new logging for a case where
8
the vector table contains garbage:
9
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 :-))
7
25
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
26
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
27
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Message-id: 20180313153458.26822-2-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
12
---
31
---
13
hw/arm/raspi.c | 17 +++++++++++++----
32
target/arm/cpu.c | 5 +++++
14
1 file changed, 13 insertions(+), 4 deletions(-)
33
target/arm/m_helper.c | 5 +++++
34
2 files changed, 10 insertions(+)
15
35
16
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
36
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
17
index XXXXXXX..XXXXXXX 100644
37
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/arm/raspi.c
38
--- a/target/arm/cpu.c
19
+++ b/hw/arm/raspi.c
39
+++ b/target/arm/cpu.c
20
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
40
@@ -XXX,XX +XXX,XX @@
21
binfo.board_id = raspi_boardid[version];
41
#include "qemu/osdep.h"
22
binfo.ram_size = ram_size;
42
#include "qemu/qemu-print.h"
23
binfo.nb_cpus = smp_cpus;
43
#include "qemu/timer.h"
24
- binfo.board_setup_addr = BOARDSETUP_ADDR;
44
+#include "qemu/log.h"
25
- binfo.write_board_setup = write_board_setup;
45
#include "qemu-common.h"
26
- binfo.secure_board_setup = true;
46
#include "target/arm/idau.h"
27
- binfo.secure_boot = true;
47
#include "qemu/module.h"
48
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(DeviceState *dev)
49
initial_pc = ldl_phys(s->as, vecbase + 4);
50
}
51
52
+ qemu_log_mask(CPU_LOG_INT,
53
+ "Loaded reset SP 0x%x PC 0x%x from vector table\n",
54
+ initial_msp, initial_pc);
28
+
55
+
29
+ if (version <= 2) {
56
env->regs[13] = initial_msp & 0xFFFFFFFC;
30
+ /* The rpi1 and 2 require some custom setup code to run in Secure
57
env->regs[15] = initial_pc & ~1;
31
+ * mode before booting a kernel (to set up the SMC vectors so
58
env->thumb = initial_pc & 1;
32
+ * that we get a no-op SMC; this is used by Linux to call the
59
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
33
+ * firmware for some cache maintenance operations.
60
index XXXXXXX..XXXXXXX 100644
34
+ * The rpi3 doesn't need this.
61
--- a/target/arm/m_helper.c
35
+ */
62
+++ b/target/arm/m_helper.c
36
+ binfo.board_setup_addr = BOARDSETUP_ADDR;
63
@@ -XXX,XX +XXX,XX @@ static bool arm_v7m_load_vector(ARMCPU *cpu, int exc, bool targets_secure,
37
+ binfo.write_board_setup = write_board_setup;
64
ARMMMUIdx mmu_idx;
38
+ binfo.secure_board_setup = true;
65
bool exc_secure;
39
+ binfo.secure_boot = true;
66
40
+ }
67
+ qemu_log_mask(CPU_LOG_INT,
41
68
+ "...loading from element %d of %s vector table at 0x%x\n",
42
/* Pi2 and Pi3 requires SMP setup */
69
+ exc, targets_secure ? "secure" : "non-secure", addr);
43
if (version >= 2) {
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:
44
--
82
--
45
2.16.2
83
2.25.1
46
84
47
85
diff view generated by jsdifflib
1
Add some assertions that if we're about to boot an AArch64 kernel,
1
For M-profile, the fault address is not always exposed to the guest
2
the board code has not mistakenly set either secure_boot or
2
in a fault register (for instance the BFAR bus fault address register
3
secure_board_setup. It doesn't make sense to set secure_boot,
3
is only updated for bus faults on data accesses, not instruction
4
because all AArch64 kernels must be booted in non-secure mode.
4
accesses). Currently we log the address only if we're putting it
5
5
into a particular guest-visible register. Since we always have it,
6
It might in theory make sense to set secure_board_setup, but
6
log it generically, to make logs of i-side faults a bit clearer.
7
we don't currently support that, because only the AArch32
8
bootloader[] code calls this hook; bootloader_aarch64[] does not.
9
Since we don't have a current need for this functionality, just
10
assert that we don't try to use it. If it's needed we'll add
11
it later.
12
7
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Message-id: 20180313153458.26822-3-peter.maydell@linaro.org
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
12
Message-id: 20220315204306.2797684-3-peter.maydell@linaro.org
16
---
13
---
17
hw/arm/boot.c | 7 +++++++
14
target/arm/m_helper.c | 6 ++++++
18
1 file changed, 7 insertions(+)
15
1 file changed, 6 insertions(+)
19
16
20
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
17
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
21
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/boot.c
19
--- a/target/arm/m_helper.c
23
+++ b/hw/arm/boot.c
20
+++ b/target/arm/m_helper.c
24
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
21
@@ -XXX,XX +XXX,XX @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
25
} else {
22
* Note that for M profile we don't have a guest facing FSR, but
26
env->pstate = PSTATE_MODE_EL1h;
23
* the env->exception.fsr will be populated by the code that
27
}
24
* raises the fault, in the A profile short-descriptor format.
28
+ /* AArch64 kernels never boot in secure mode */
25
+ *
29
+ assert(!info->secure_boot);
26
+ * Log the exception.vaddress now regardless of subtype, because
30
+ /* This hook is only supported for AArch32 currently:
27
+ * logging below only logs it when it goes into a guest visible
31
+ * bootloader_aarch64[] will not call the hook, and
28
+ * register.
32
+ * the code above has already dropped us into EL2 or EL1.
29
*/
33
+ */
30
+ qemu_log_mask(CPU_LOG_INT, "...at fault address 0x%x\n",
34
+ assert(!info->secure_board_setup);
31
+ (uint32_t)env->exception.vaddress);
35
}
32
switch (env->exception.fsr & 0xf) {
36
33
case M_FAKE_FSR_NSC_EXEC:
37
/* Set to non-secure if not a secure boot */
34
/*
38
--
35
--
39
2.16.2
36
2.25.1
40
37
41
38
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
2
2
3
Add support for "TX complete"/TXDC interrupt generate by real HW since
3
Add an unimplemented SERDES (Serializer/Deserializer) area.
4
it is needed to support guests other than Linux.
5
4
6
Based on the patch by Bill Paul as found here:
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
https://bugs.launchpad.net/qemu/+bug/1753314
6
Reviewed-by: Francisco Iglesias <francisco.iglesias@xilinx.com>
8
7
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
9
Cc: qemu-devel@nongnu.org
8
Message-id: 20220316164645.2303510-2-edgar.iglesias@gmail.com
10
Cc: qemu-arm@nongnu.org
11
Cc: Bill Paul <wpaul@windriver.com>
12
Cc: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Bill Paul <wpaul@windriver.com>
14
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
15
Message-id: 20180315191141.6789-2-andrew.smirnov@gmail.com
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
---
10
---
19
include/hw/char/imx_serial.h | 3 +++
11
include/hw/arm/xlnx-zynqmp.h | 2 +-
20
hw/char/imx_serial.c | 20 +++++++++++++++++---
12
hw/arm/xlnx-zynqmp.c | 5 +++++
21
2 files changed, 20 insertions(+), 3 deletions(-)
13
2 files changed, 6 insertions(+), 1 deletion(-)
22
14
23
diff --git a/include/hw/char/imx_serial.h b/include/hw/char/imx_serial.h
15
diff --git a/include/hw/arm/xlnx-zynqmp.h b/include/hw/arm/xlnx-zynqmp.h
24
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
25
--- a/include/hw/char/imx_serial.h
17
--- a/include/hw/arm/xlnx-zynqmp.h
26
+++ b/include/hw/char/imx_serial.h
18
+++ b/include/hw/arm/xlnx-zynqmp.h
19
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPState, XLNX_ZYNQMP)
20
/*
21
* Unimplemented mmio regions needed to boot some images.
22
*/
23
-#define XLNX_ZYNQMP_NUM_UNIMP_AREAS 1
24
+#define XLNX_ZYNQMP_NUM_UNIMP_AREAS 2
25
26
struct XlnxZynqMPState {
27
/*< private >*/
28
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/arm/xlnx-zynqmp.c
31
+++ b/hw/arm/xlnx-zynqmp.c
27
@@ -XXX,XX +XXX,XX @@
32
@@ -XXX,XX +XXX,XX @@
28
#define UCR2_RXEN (1<<1) /* Receiver enable */
33
#define QSPI_DMA_ADDR 0xff0f0800
29
#define UCR2_SRST (1<<0) /* Reset complete */
34
#define NUM_QSPI_IRQ_LINES 2
30
35
31
+#define UCR4_TCEN BIT(3) /* TX complete interrupt enable */
36
+/* Serializer/Deserializer. */
37
+#define SERDES_ADDR 0xfd400000
38
+#define SERDES_SIZE 0x20000
32
+
39
+
33
#define UTS1_TXEMPTY (1<<6)
40
#define DP_ADDR 0xfd4a0000
34
#define UTS1_RXEMPTY (1<<5)
41
#define DP_IRQ 113
35
#define UTS1_TXFULL (1<<4)
42
36
@@ -XXX,XX +XXX,XX @@ typedef struct IMXSerialState {
43
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_create_unimp_mmio(XlnxZynqMPState *s)
37
uint32_t ubmr;
44
hwaddr size;
38
uint32_t ubrc;
45
} unimp_areas[ARRAY_SIZE(s->mr_unimp)] = {
39
uint32_t ucr3;
46
{ .name = "apu", APU_ADDR, APU_SIZE },
40
+ uint32_t ucr4;
47
+ { .name = "serdes", SERDES_ADDR, SERDES_SIZE },
41
48
};
42
qemu_irq irq;
49
unsigned int nr;
43
CharBackend chr;
50
44
diff --git a/hw/char/imx_serial.c b/hw/char/imx_serial.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/hw/char/imx_serial.c
47
+++ b/hw/char/imx_serial.c
48
@@ -XXX,XX +XXX,XX @@
49
50
static const VMStateDescription vmstate_imx_serial = {
51
.name = TYPE_IMX_SERIAL,
52
- .version_id = 1,
53
- .minimum_version_id = 1,
54
+ .version_id = 2,
55
+ .minimum_version_id = 2,
56
.fields = (VMStateField[]) {
57
VMSTATE_INT32(readbuff, IMXSerialState),
58
VMSTATE_UINT32(usr1, IMXSerialState),
59
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_imx_serial = {
60
VMSTATE_UINT32(ubmr, IMXSerialState),
61
VMSTATE_UINT32(ubrc, IMXSerialState),
62
VMSTATE_UINT32(ucr3, IMXSerialState),
63
+ VMSTATE_UINT32(ucr4, IMXSerialState),
64
VMSTATE_END_OF_LIST()
65
},
66
};
67
@@ -XXX,XX +XXX,XX @@ static void imx_update(IMXSerialState *s)
68
* unfortunately.
69
*/
70
mask = (s->ucr1 & UCR1_TXMPTYEN) ? USR2_TXFE : 0;
71
+ /*
72
+ * TCEN and TXDC are both bit 3
73
+ */
74
+ mask |= s->ucr4 & UCR4_TCEN;
75
+
76
usr2 = s->usr2 & mask;
77
78
qemu_set_irq(s->irq, usr1 || usr2);
79
@@ -XXX,XX +XXX,XX @@ static uint64_t imx_serial_read(void *opaque, hwaddr offset,
80
return s->ucr3;
81
82
case 0x23: /* UCR4 */
83
+ return s->ucr4;
84
+
85
case 0x29: /* BRM Incremental */
86
return 0x0; /* TODO */
87
88
@@ -XXX,XX +XXX,XX @@ static void imx_serial_write(void *opaque, hwaddr offset,
89
* qemu_chr_fe_write and background I/O callbacks */
90
qemu_chr_fe_write_all(&s->chr, &ch, 1);
91
s->usr1 &= ~USR1_TRDY;
92
+ s->usr2 &= ~USR2_TXDC;
93
imx_update(s);
94
s->usr1 |= USR1_TRDY;
95
+ s->usr2 |= USR2_TXDC;
96
imx_update(s);
97
}
98
break;
99
@@ -XXX,XX +XXX,XX @@ static void imx_serial_write(void *opaque, hwaddr offset,
100
s->ucr3 = value & 0xffff;
101
break;
102
103
- case 0x2d: /* UTS1 */
104
case 0x23: /* UCR4 */
105
+ s->ucr4 = value & 0xffff;
106
+ imx_update(s);
107
+ break;
108
+
109
+ case 0x2d: /* UTS1 */
110
qemu_log_mask(LOG_UNIMP, "[%s]%s: Unimplemented reg 0x%"
111
HWADDR_PRIx "\n", TYPE_IMX_SERIAL, __func__, offset);
112
/* TODO */
113
--
51
--
114
2.16.2
52
2.25.1
115
53
116
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 bcm2837 is pretty similar to the bcm2836, but it does have
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
2
some differences. Notably, the MPIDR affinity aff1 values it
3
sets for the CPUs are 0x0, rather than the 0xf that the bcm2836
4
uses, and if this is wrong Linux will not boot.
5
2
6
Rather than trying to have one device with properties that
3
Add a model of the Xilinx ZynqMP CRF. At the moment this
7
configure it differently for the two cases, create two
4
is mostly a stub model.
8
separate QOM devices for the two SoCs. We use the same approach
9
as hw/arm/aspeed_soc.c and share code and have a data table
10
that might differ per-SoC. For the moment the two types don't
11
actually have different behaviour.
12
5
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
9
Message-id: 20220316164645.2303510-4-edgar.iglesias@gmail.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Message-id: 20180313153458.26822-7-peter.maydell@linaro.org
16
---
11
---
17
include/hw/arm/bcm2836.h | 19 +++++++++++++++++++
12
include/hw/misc/xlnx-zynqmp-crf.h | 211 ++++++++++++++++++++++++
18
hw/arm/bcm2836.c | 37 ++++++++++++++++++++++++++++++++-----
13
hw/misc/xlnx-zynqmp-crf.c | 266 ++++++++++++++++++++++++++++++
19
hw/arm/raspi.c | 3 ++-
14
hw/misc/meson.build | 1 +
20
3 files changed, 53 insertions(+), 6 deletions(-)
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
diff --git a/include/hw/arm/bcm2836.h b/include/hw/arm/bcm2836.h
19
diff --git a/include/hw/misc/xlnx-zynqmp-crf.h b/include/hw/misc/xlnx-zynqmp-crf.h
23
index XXXXXXX..XXXXXXX 100644
20
new file mode 100644
24
--- a/include/hw/arm/bcm2836.h
21
index XXXXXXX..XXXXXXX
25
+++ b/include/hw/arm/bcm2836.h
22
--- /dev/null
23
+++ b/include/hw/misc/xlnx-zynqmp-crf.h
26
@@ -XXX,XX +XXX,XX @@
24
@@ -XXX,XX +XXX,XX @@
27
25
+/*
28
#define BCM283X_NCPUS 4
26
+ * QEMU model of the CRF - Clock Reset FPD.
29
27
+ *
30
+/* These type names are for specific SoCs; other than instantiating
28
+ * Copyright (c) 2022 Xilinx Inc.
31
+ * them, code using these devices should always handle them via the
29
+ * SPDX-License-Identifier: GPL-2.0-or-later
32
+ * BCM283x base class, so they have no BCM2836(obj) etc macros.
30
+ * Written by Edgar E. Iglesias <edgar.iglesias@xilinx.com>
33
+ */
31
+ */
34
+#define TYPE_BCM2836 "bcm2836"
32
+#ifndef HW_MISC_XLNX_ZYNQMP_CRF_H
35
+#define TYPE_BCM2837 "bcm2837"
33
+#define HW_MISC_XLNX_ZYNQMP_CRF_H
36
+
34
+
37
typedef struct BCM283XState {
35
+#include "hw/sysbus.h"
38
/*< private >*/
36
+#include "hw/register.h"
39
DeviceState parent_obj;
37
+
40
@@ -XXX,XX +XXX,XX @@ typedef struct BCM283XState {
38
+#define TYPE_XLNX_ZYNQMP_CRF "xlnx.zynqmp_crf"
41
BCM2835PeripheralState peripherals;
39
+OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPCRF, XLNX_ZYNQMP_CRF)
42
} BCM283XState;
40
+
43
41
+REG32(ERR_CTRL, 0x0)
44
+typedef struct BCM283XInfo BCM283XInfo;
42
+ FIELD(ERR_CTRL, SLVERR_ENABLE, 0, 1)
45
+
43
+REG32(IR_STATUS, 0x4)
46
+typedef struct BCM283XClass {
44
+ FIELD(IR_STATUS, ADDR_DECODE_ERR, 0, 1)
47
+ DeviceClass parent_class;
45
+REG32(IR_MASK, 0x8)
48
+ const BCM283XInfo *info;
46
+ FIELD(IR_MASK, ADDR_DECODE_ERR, 0, 1)
49
+} BCM283XClass;
47
+REG32(IR_ENABLE, 0xc)
50
+
48
+ FIELD(IR_ENABLE, ADDR_DECODE_ERR, 0, 1)
51
+#define BCM283X_CLASS(klass) \
49
+REG32(IR_DISABLE, 0x10)
52
+ OBJECT_CLASS_CHECK(BCM283XClass, (klass), TYPE_BCM283X)
50
+ FIELD(IR_DISABLE, ADDR_DECODE_ERR, 0, 1)
53
+#define BCM283X_GET_CLASS(obj) \
51
+REG32(CRF_WPROT, 0x1c)
54
+ OBJECT_GET_CLASS(BCM283XClass, (obj), TYPE_BCM283X)
52
+ FIELD(CRF_WPROT, ACTIVE, 0, 1)
55
+
53
+REG32(APLL_CTRL, 0x20)
56
#endif /* BCM2836_H */
54
+ FIELD(APLL_CTRL, POST_SRC, 24, 3)
57
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
55
+ FIELD(APLL_CTRL, PRE_SRC, 20, 3)
58
index XXXXXXX..XXXXXXX 100644
56
+ FIELD(APLL_CTRL, CLKOUTDIV, 17, 1)
59
--- a/hw/arm/bcm2836.c
57
+ FIELD(APLL_CTRL, DIV2, 16, 1)
60
+++ b/hw/arm/bcm2836.c
58
+ FIELD(APLL_CTRL, FBDIV, 8, 7)
59
+ FIELD(APLL_CTRL, BYPASS, 3, 1)
60
+ FIELD(APLL_CTRL, RESET, 0, 1)
61
+REG32(APLL_CFG, 0x24)
62
+ FIELD(APLL_CFG, LOCK_DLY, 25, 7)
63
+ FIELD(APLL_CFG, LOCK_CNT, 13, 10)
64
+ FIELD(APLL_CFG, LFHF, 10, 2)
65
+ FIELD(APLL_CFG, CP, 5, 4)
66
+ FIELD(APLL_CFG, RES, 0, 4)
67
+REG32(APLL_FRAC_CFG, 0x28)
68
+ FIELD(APLL_FRAC_CFG, ENABLED, 31, 1)
69
+ FIELD(APLL_FRAC_CFG, SEED, 22, 3)
70
+ FIELD(APLL_FRAC_CFG, ALGRTHM, 19, 1)
71
+ FIELD(APLL_FRAC_CFG, ORDER, 18, 1)
72
+ FIELD(APLL_FRAC_CFG, DATA, 0, 16)
73
+REG32(DPLL_CTRL, 0x2c)
74
+ FIELD(DPLL_CTRL, POST_SRC, 24, 3)
75
+ FIELD(DPLL_CTRL, PRE_SRC, 20, 3)
76
+ FIELD(DPLL_CTRL, CLKOUTDIV, 17, 1)
77
+ FIELD(DPLL_CTRL, DIV2, 16, 1)
78
+ FIELD(DPLL_CTRL, FBDIV, 8, 7)
79
+ FIELD(DPLL_CTRL, BYPASS, 3, 1)
80
+ FIELD(DPLL_CTRL, RESET, 0, 1)
81
+REG32(DPLL_CFG, 0x30)
82
+ FIELD(DPLL_CFG, LOCK_DLY, 25, 7)
83
+ FIELD(DPLL_CFG, LOCK_CNT, 13, 10)
84
+ FIELD(DPLL_CFG, LFHF, 10, 2)
85
+ FIELD(DPLL_CFG, CP, 5, 4)
86
+ FIELD(DPLL_CFG, RES, 0, 4)
87
+REG32(DPLL_FRAC_CFG, 0x34)
88
+ FIELD(DPLL_FRAC_CFG, ENABLED, 31, 1)
89
+ FIELD(DPLL_FRAC_CFG, SEED, 22, 3)
90
+ FIELD(DPLL_FRAC_CFG, ALGRTHM, 19, 1)
91
+ FIELD(DPLL_FRAC_CFG, ORDER, 18, 1)
92
+ FIELD(DPLL_FRAC_CFG, DATA, 0, 16)
93
+REG32(VPLL_CTRL, 0x38)
94
+ FIELD(VPLL_CTRL, POST_SRC, 24, 3)
95
+ FIELD(VPLL_CTRL, PRE_SRC, 20, 3)
96
+ FIELD(VPLL_CTRL, CLKOUTDIV, 17, 1)
97
+ FIELD(VPLL_CTRL, DIV2, 16, 1)
98
+ FIELD(VPLL_CTRL, FBDIV, 8, 7)
99
+ FIELD(VPLL_CTRL, BYPASS, 3, 1)
100
+ FIELD(VPLL_CTRL, RESET, 0, 1)
101
+REG32(VPLL_CFG, 0x3c)
102
+ FIELD(VPLL_CFG, LOCK_DLY, 25, 7)
103
+ FIELD(VPLL_CFG, LOCK_CNT, 13, 10)
104
+ FIELD(VPLL_CFG, LFHF, 10, 2)
105
+ FIELD(VPLL_CFG, CP, 5, 4)
106
+ FIELD(VPLL_CFG, RES, 0, 4)
107
+REG32(VPLL_FRAC_CFG, 0x40)
108
+ FIELD(VPLL_FRAC_CFG, ENABLED, 31, 1)
109
+ FIELD(VPLL_FRAC_CFG, SEED, 22, 3)
110
+ FIELD(VPLL_FRAC_CFG, ALGRTHM, 19, 1)
111
+ FIELD(VPLL_FRAC_CFG, ORDER, 18, 1)
112
+ FIELD(VPLL_FRAC_CFG, DATA, 0, 16)
113
+REG32(PLL_STATUS, 0x44)
114
+ FIELD(PLL_STATUS, VPLL_STABLE, 5, 1)
115
+ FIELD(PLL_STATUS, DPLL_STABLE, 4, 1)
116
+ FIELD(PLL_STATUS, APLL_STABLE, 3, 1)
117
+ FIELD(PLL_STATUS, VPLL_LOCK, 2, 1)
118
+ FIELD(PLL_STATUS, DPLL_LOCK, 1, 1)
119
+ FIELD(PLL_STATUS, APLL_LOCK, 0, 1)
120
+REG32(APLL_TO_LPD_CTRL, 0x48)
121
+ FIELD(APLL_TO_LPD_CTRL, DIVISOR0, 8, 6)
122
+REG32(DPLL_TO_LPD_CTRL, 0x4c)
123
+ FIELD(DPLL_TO_LPD_CTRL, DIVISOR0, 8, 6)
124
+REG32(VPLL_TO_LPD_CTRL, 0x50)
125
+ FIELD(VPLL_TO_LPD_CTRL, DIVISOR0, 8, 6)
126
+REG32(ACPU_CTRL, 0x60)
127
+ FIELD(ACPU_CTRL, CLKACT_HALF, 25, 1)
128
+ FIELD(ACPU_CTRL, CLKACT_FULL, 24, 1)
129
+ FIELD(ACPU_CTRL, DIVISOR0, 8, 6)
130
+ FIELD(ACPU_CTRL, SRCSEL, 0, 3)
131
+REG32(DBG_TRACE_CTRL, 0x64)
132
+ FIELD(DBG_TRACE_CTRL, CLKACT, 24, 1)
133
+ FIELD(DBG_TRACE_CTRL, DIVISOR0, 8, 6)
134
+ FIELD(DBG_TRACE_CTRL, SRCSEL, 0, 3)
135
+REG32(DBG_FPD_CTRL, 0x68)
136
+ FIELD(DBG_FPD_CTRL, CLKACT, 24, 1)
137
+ FIELD(DBG_FPD_CTRL, DIVISOR0, 8, 6)
138
+ FIELD(DBG_FPD_CTRL, SRCSEL, 0, 3)
139
+REG32(DP_VIDEO_REF_CTRL, 0x70)
140
+ FIELD(DP_VIDEO_REF_CTRL, CLKACT, 24, 1)
141
+ FIELD(DP_VIDEO_REF_CTRL, DIVISOR1, 16, 6)
142
+ FIELD(DP_VIDEO_REF_CTRL, DIVISOR0, 8, 6)
143
+ FIELD(DP_VIDEO_REF_CTRL, SRCSEL, 0, 3)
144
+REG32(DP_AUDIO_REF_CTRL, 0x74)
145
+ FIELD(DP_AUDIO_REF_CTRL, CLKACT, 24, 1)
146
+ FIELD(DP_AUDIO_REF_CTRL, DIVISOR1, 16, 6)
147
+ FIELD(DP_AUDIO_REF_CTRL, DIVISOR0, 8, 6)
148
+ FIELD(DP_AUDIO_REF_CTRL, SRCSEL, 0, 3)
149
+REG32(DP_STC_REF_CTRL, 0x7c)
150
+ FIELD(DP_STC_REF_CTRL, CLKACT, 24, 1)
151
+ FIELD(DP_STC_REF_CTRL, DIVISOR1, 16, 6)
152
+ FIELD(DP_STC_REF_CTRL, DIVISOR0, 8, 6)
153
+ FIELD(DP_STC_REF_CTRL, SRCSEL, 0, 3)
154
+REG32(DDR_CTRL, 0x80)
155
+ FIELD(DDR_CTRL, CLKACT, 24, 1)
156
+ FIELD(DDR_CTRL, DIVISOR0, 8, 6)
157
+ FIELD(DDR_CTRL, SRCSEL, 0, 3)
158
+REG32(GPU_REF_CTRL, 0x84)
159
+ FIELD(GPU_REF_CTRL, PP1_CLKACT, 26, 1)
160
+ FIELD(GPU_REF_CTRL, PP0_CLKACT, 25, 1)
161
+ FIELD(GPU_REF_CTRL, CLKACT, 24, 1)
162
+ FIELD(GPU_REF_CTRL, DIVISOR0, 8, 6)
163
+ FIELD(GPU_REF_CTRL, SRCSEL, 0, 3)
164
+REG32(SATA_REF_CTRL, 0xa0)
165
+ FIELD(SATA_REF_CTRL, CLKACT, 24, 1)
166
+ FIELD(SATA_REF_CTRL, DIVISOR0, 8, 6)
167
+ FIELD(SATA_REF_CTRL, SRCSEL, 0, 3)
168
+REG32(PCIE_REF_CTRL, 0xb4)
169
+ FIELD(PCIE_REF_CTRL, CLKACT, 24, 1)
170
+ FIELD(PCIE_REF_CTRL, DIVISOR0, 8, 6)
171
+ FIELD(PCIE_REF_CTRL, SRCSEL, 0, 3)
172
+REG32(GDMA_REF_CTRL, 0xb8)
173
+ FIELD(GDMA_REF_CTRL, CLKACT, 24, 1)
174
+ FIELD(GDMA_REF_CTRL, DIVISOR0, 8, 6)
175
+ FIELD(GDMA_REF_CTRL, SRCSEL, 0, 3)
176
+REG32(DPDMA_REF_CTRL, 0xbc)
177
+ FIELD(DPDMA_REF_CTRL, CLKACT, 24, 1)
178
+ FIELD(DPDMA_REF_CTRL, DIVISOR0, 8, 6)
179
+ FIELD(DPDMA_REF_CTRL, SRCSEL, 0, 3)
180
+REG32(TOPSW_MAIN_CTRL, 0xc0)
181
+ FIELD(TOPSW_MAIN_CTRL, CLKACT, 24, 1)
182
+ FIELD(TOPSW_MAIN_CTRL, DIVISOR0, 8, 6)
183
+ FIELD(TOPSW_MAIN_CTRL, SRCSEL, 0, 3)
184
+REG32(TOPSW_LSBUS_CTRL, 0xc4)
185
+ FIELD(TOPSW_LSBUS_CTRL, CLKACT, 24, 1)
186
+ FIELD(TOPSW_LSBUS_CTRL, DIVISOR0, 8, 6)
187
+ FIELD(TOPSW_LSBUS_CTRL, SRCSEL, 0, 3)
188
+REG32(DBG_TSTMP_CTRL, 0xf8)
189
+ FIELD(DBG_TSTMP_CTRL, DIVISOR0, 8, 6)
190
+ FIELD(DBG_TSTMP_CTRL, SRCSEL, 0, 3)
191
+REG32(RST_FPD_TOP, 0x100)
192
+ FIELD(RST_FPD_TOP, PCIE_CFG_RESET, 19, 1)
193
+ FIELD(RST_FPD_TOP, PCIE_BRIDGE_RESET, 18, 1)
194
+ FIELD(RST_FPD_TOP, PCIE_CTRL_RESET, 17, 1)
195
+ FIELD(RST_FPD_TOP, DP_RESET, 16, 1)
196
+ FIELD(RST_FPD_TOP, SWDT_RESET, 15, 1)
197
+ FIELD(RST_FPD_TOP, AFI_FM5_RESET, 12, 1)
198
+ FIELD(RST_FPD_TOP, AFI_FM4_RESET, 11, 1)
199
+ FIELD(RST_FPD_TOP, AFI_FM3_RESET, 10, 1)
200
+ FIELD(RST_FPD_TOP, AFI_FM2_RESET, 9, 1)
201
+ FIELD(RST_FPD_TOP, AFI_FM1_RESET, 8, 1)
202
+ FIELD(RST_FPD_TOP, AFI_FM0_RESET, 7, 1)
203
+ FIELD(RST_FPD_TOP, GDMA_RESET, 6, 1)
204
+ FIELD(RST_FPD_TOP, GPU_PP1_RESET, 5, 1)
205
+ FIELD(RST_FPD_TOP, GPU_PP0_RESET, 4, 1)
206
+ FIELD(RST_FPD_TOP, GPU_RESET, 3, 1)
207
+ FIELD(RST_FPD_TOP, GT_RESET, 2, 1)
208
+ FIELD(RST_FPD_TOP, SATA_RESET, 1, 1)
209
+REG32(RST_FPD_APU, 0x104)
210
+ FIELD(RST_FPD_APU, ACPU3_PWRON_RESET, 13, 1)
211
+ FIELD(RST_FPD_APU, ACPU2_PWRON_RESET, 12, 1)
212
+ FIELD(RST_FPD_APU, ACPU1_PWRON_RESET, 11, 1)
213
+ FIELD(RST_FPD_APU, ACPU0_PWRON_RESET, 10, 1)
214
+ FIELD(RST_FPD_APU, APU_L2_RESET, 8, 1)
215
+ FIELD(RST_FPD_APU, ACPU3_RESET, 3, 1)
216
+ FIELD(RST_FPD_APU, ACPU2_RESET, 2, 1)
217
+ FIELD(RST_FPD_APU, ACPU1_RESET, 1, 1)
218
+ FIELD(RST_FPD_APU, ACPU0_RESET, 0, 1)
219
+REG32(RST_DDR_SS, 0x108)
220
+ FIELD(RST_DDR_SS, DDR_RESET, 3, 1)
221
+ FIELD(RST_DDR_SS, APM_RESET, 2, 1)
222
+
223
+#define CRF_R_MAX (R_RST_DDR_SS + 1)
224
+
225
+struct XlnxZynqMPCRF {
226
+ SysBusDevice parent_obj;
227
+ MemoryRegion iomem;
228
+ qemu_irq irq_ir;
229
+
230
+ RegisterInfoArray *reg_array;
231
+ uint32_t regs[CRF_R_MAX];
232
+ RegisterInfo regs_info[CRF_R_MAX];
233
+};
234
+
235
+#endif
236
diff --git a/hw/misc/xlnx-zynqmp-crf.c b/hw/misc/xlnx-zynqmp-crf.c
237
new file mode 100644
238
index XXXXXXX..XXXXXXX
239
--- /dev/null
240
+++ b/hw/misc/xlnx-zynqmp-crf.c
61
@@ -XXX,XX +XXX,XX @@
241
@@ -XXX,XX +XXX,XX @@
62
/* "QA7" (Pi2) interrupt controller and mailboxes etc. */
242
+/*
63
#define BCM2836_CONTROL_BASE 0x40000000
243
+ * QEMU model of the CRF - Clock Reset FPD.
64
244
+ *
65
+struct BCM283XInfo {
245
+ * Copyright (c) 2022 Xilinx Inc.
66
+ const char *name;
246
+ * SPDX-License-Identifier: GPL-2.0-or-later
247
+ * Written by Edgar E. Iglesias <edgar.iglesias@xilinx.com>
248
+ */
249
+
250
+#include "qemu/osdep.h"
251
+#include "hw/sysbus.h"
252
+#include "hw/register.h"
253
+#include "qemu/bitops.h"
254
+#include "qemu/log.h"
255
+#include "migration/vmstate.h"
256
+#include "hw/irq.h"
257
+#include "hw/misc/xlnx-zynqmp-crf.h"
258
+#include "target/arm/arm-powerctl.h"
259
+
260
+#ifndef XLNX_ZYNQMP_CRF_ERR_DEBUG
261
+#define XLNX_ZYNQMP_CRF_ERR_DEBUG 0
262
+#endif
263
+
264
+#define CRF_MAX_CPU 4
265
+
266
+static void ir_update_irq(XlnxZynqMPCRF *s)
267
+{
268
+ bool pending = s->regs[R_IR_STATUS] & ~s->regs[R_IR_MASK];
269
+ qemu_set_irq(s->irq_ir, pending);
270
+}
271
+
272
+static void ir_status_postw(RegisterInfo *reg, uint64_t val64)
273
+{
274
+ XlnxZynqMPCRF *s = XLNX_ZYNQMP_CRF(reg->opaque);
275
+ ir_update_irq(s);
276
+}
277
+
278
+static uint64_t ir_enable_prew(RegisterInfo *reg, uint64_t val64)
279
+{
280
+ XlnxZynqMPCRF *s = XLNX_ZYNQMP_CRF(reg->opaque);
281
+ uint32_t val = val64;
282
+
283
+ s->regs[R_IR_MASK] &= ~val;
284
+ ir_update_irq(s);
285
+ return 0;
286
+}
287
+
288
+static uint64_t ir_disable_prew(RegisterInfo *reg, uint64_t val64)
289
+{
290
+ XlnxZynqMPCRF *s = XLNX_ZYNQMP_CRF(reg->opaque);
291
+ uint32_t val = val64;
292
+
293
+ s->regs[R_IR_MASK] |= val;
294
+ ir_update_irq(s);
295
+ return 0;
296
+}
297
+
298
+static uint64_t rst_fpd_apu_prew(RegisterInfo *reg, uint64_t val64)
299
+{
300
+ XlnxZynqMPCRF *s = XLNX_ZYNQMP_CRF(reg->opaque);
301
+ uint32_t val = val64;
302
+ uint32_t val_old = s->regs[R_RST_FPD_APU];
303
+ unsigned int i;
304
+
305
+ for (i = 0; i < CRF_MAX_CPU; i++) {
306
+ uint32_t mask = (1 << (R_RST_FPD_APU_ACPU0_RESET_SHIFT + i));
307
+
308
+ if ((val ^ val_old) & mask) {
309
+ if (val & mask) {
310
+ arm_set_cpu_off(i);
311
+ } else {
312
+ arm_set_cpu_on_and_reset(i);
313
+ }
314
+ }
315
+ }
316
+ return val64;
317
+}
318
+
319
+static const RegisterAccessInfo crf_regs_info[] = {
320
+ { .name = "ERR_CTRL", .addr = A_ERR_CTRL,
321
+ },{ .name = "IR_STATUS", .addr = A_IR_STATUS,
322
+ .w1c = 0x1,
323
+ .post_write = ir_status_postw,
324
+ },{ .name = "IR_MASK", .addr = A_IR_MASK,
325
+ .reset = 0x1,
326
+ .ro = 0x1,
327
+ },{ .name = "IR_ENABLE", .addr = A_IR_ENABLE,
328
+ .pre_write = ir_enable_prew,
329
+ },{ .name = "IR_DISABLE", .addr = A_IR_DISABLE,
330
+ .pre_write = ir_disable_prew,
331
+ },{ .name = "CRF_WPROT", .addr = A_CRF_WPROT,
332
+ },{ .name = "APLL_CTRL", .addr = A_APLL_CTRL,
333
+ .reset = 0x12c09,
334
+ .rsvd = 0xf88c80f6,
335
+ },{ .name = "APLL_CFG", .addr = A_APLL_CFG,
336
+ .rsvd = 0x1801210,
337
+ },{ .name = "APLL_FRAC_CFG", .addr = A_APLL_FRAC_CFG,
338
+ .rsvd = 0x7e330000,
339
+ },{ .name = "DPLL_CTRL", .addr = A_DPLL_CTRL,
340
+ .reset = 0x2c09,
341
+ .rsvd = 0xf88c80f6,
342
+ },{ .name = "DPLL_CFG", .addr = A_DPLL_CFG,
343
+ .rsvd = 0x1801210,
344
+ },{ .name = "DPLL_FRAC_CFG", .addr = A_DPLL_FRAC_CFG,
345
+ .rsvd = 0x7e330000,
346
+ },{ .name = "VPLL_CTRL", .addr = A_VPLL_CTRL,
347
+ .reset = 0x12809,
348
+ .rsvd = 0xf88c80f6,
349
+ },{ .name = "VPLL_CFG", .addr = A_VPLL_CFG,
350
+ .rsvd = 0x1801210,
351
+ },{ .name = "VPLL_FRAC_CFG", .addr = A_VPLL_FRAC_CFG,
352
+ .rsvd = 0x7e330000,
353
+ },{ .name = "PLL_STATUS", .addr = A_PLL_STATUS,
354
+ .reset = 0x3f,
355
+ .rsvd = 0xc0,
356
+ .ro = 0x3f,
357
+ },{ .name = "APLL_TO_LPD_CTRL", .addr = A_APLL_TO_LPD_CTRL,
358
+ .reset = 0x400,
359
+ .rsvd = 0xc0ff,
360
+ },{ .name = "DPLL_TO_LPD_CTRL", .addr = A_DPLL_TO_LPD_CTRL,
361
+ .reset = 0x400,
362
+ .rsvd = 0xc0ff,
363
+ },{ .name = "VPLL_TO_LPD_CTRL", .addr = A_VPLL_TO_LPD_CTRL,
364
+ .reset = 0x400,
365
+ .rsvd = 0xc0ff,
366
+ },{ .name = "ACPU_CTRL", .addr = A_ACPU_CTRL,
367
+ .reset = 0x3000400,
368
+ .rsvd = 0xfcffc0f8,
369
+ },{ .name = "DBG_TRACE_CTRL", .addr = A_DBG_TRACE_CTRL,
370
+ .reset = 0x2500,
371
+ .rsvd = 0xfeffc0f8,
372
+ },{ .name = "DBG_FPD_CTRL", .addr = A_DBG_FPD_CTRL,
373
+ .reset = 0x1002500,
374
+ .rsvd = 0xfeffc0f8,
375
+ },{ .name = "DP_VIDEO_REF_CTRL", .addr = A_DP_VIDEO_REF_CTRL,
376
+ .reset = 0x1002300,
377
+ .rsvd = 0xfec0c0f8,
378
+ },{ .name = "DP_AUDIO_REF_CTRL", .addr = A_DP_AUDIO_REF_CTRL,
379
+ .reset = 0x1032300,
380
+ .rsvd = 0xfec0c0f8,
381
+ },{ .name = "DP_STC_REF_CTRL", .addr = A_DP_STC_REF_CTRL,
382
+ .reset = 0x1203200,
383
+ .rsvd = 0xfec0c0f8,
384
+ },{ .name = "DDR_CTRL", .addr = A_DDR_CTRL,
385
+ .reset = 0x1000500,
386
+ .rsvd = 0xfeffc0f8,
387
+ },{ .name = "GPU_REF_CTRL", .addr = A_GPU_REF_CTRL,
388
+ .reset = 0x1500,
389
+ .rsvd = 0xf8ffc0f8,
390
+ },{ .name = "SATA_REF_CTRL", .addr = A_SATA_REF_CTRL,
391
+ .reset = 0x1001600,
392
+ .rsvd = 0xfeffc0f8,
393
+ },{ .name = "PCIE_REF_CTRL", .addr = A_PCIE_REF_CTRL,
394
+ .reset = 0x1500,
395
+ .rsvd = 0xfeffc0f8,
396
+ },{ .name = "GDMA_REF_CTRL", .addr = A_GDMA_REF_CTRL,
397
+ .reset = 0x1000500,
398
+ .rsvd = 0xfeffc0f8,
399
+ },{ .name = "DPDMA_REF_CTRL", .addr = A_DPDMA_REF_CTRL,
400
+ .reset = 0x1000500,
401
+ .rsvd = 0xfeffc0f8,
402
+ },{ .name = "TOPSW_MAIN_CTRL", .addr = A_TOPSW_MAIN_CTRL,
403
+ .reset = 0x1000400,
404
+ .rsvd = 0xfeffc0f8,
405
+ },{ .name = "TOPSW_LSBUS_CTRL", .addr = A_TOPSW_LSBUS_CTRL,
406
+ .reset = 0x1000800,
407
+ .rsvd = 0xfeffc0f8,
408
+ },{ .name = "DBG_TSTMP_CTRL", .addr = A_DBG_TSTMP_CTRL,
409
+ .reset = 0xa00,
410
+ .rsvd = 0xffffc0f8,
411
+ },
412
+ { .name = "RST_FPD_TOP", .addr = A_RST_FPD_TOP,
413
+ .reset = 0xf9ffe,
414
+ .rsvd = 0xf06001,
415
+ },{ .name = "RST_FPD_APU", .addr = A_RST_FPD_APU,
416
+ .reset = 0x3d0f,
417
+ .rsvd = 0xc2f0,
418
+ .pre_write = rst_fpd_apu_prew,
419
+ },{ .name = "RST_DDR_SS", .addr = A_RST_DDR_SS,
420
+ .reset = 0xf,
421
+ .rsvd = 0xf3,
422
+ }
67
+};
423
+};
68
+
424
+
69
+static const BCM283XInfo bcm283x_socs[] = {
425
+static void crf_reset_enter(Object *obj, ResetType type)
70
+ {
426
+{
71
+ .name = TYPE_BCM2836,
427
+ XlnxZynqMPCRF *s = XLNX_ZYNQMP_CRF(obj);
72
+ },
428
+ unsigned int i;
73
+ {
429
+
74
+ .name = TYPE_BCM2837,
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,
75
+ },
448
+ },
76
+};
449
+};
77
+
450
+
78
static void bcm2836_init(Object *obj)
451
+static void crf_init(Object *obj)
79
{
452
+{
80
BCM283XState *s = BCM283X(obj);
453
+ XlnxZynqMPCRF *s = XLNX_ZYNQMP_CRF(obj);
81
@@ -XXX,XX +XXX,XX @@ static Property bcm2836_props[] = {
454
+ SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
82
DEFINE_PROP_END_OF_LIST()
455
+
83
};
456
+ s->reg_array =
84
457
+ register_init_block32(DEVICE(obj), crf_regs_info,
85
-static void bcm2836_class_init(ObjectClass *oc, void *data)
458
+ ARRAY_SIZE(crf_regs_info),
86
+static void bcm283x_class_init(ObjectClass *oc, void *data)
459
+ s->regs_info, s->regs,
87
{
460
+ &crf_ops,
88
DeviceClass *dc = DEVICE_CLASS(oc);
461
+ XLNX_ZYNQMP_CRF_ERR_DEBUG,
89
+ BCM283XClass *bc = BCM283X_CLASS(oc);
462
+ CRF_R_MAX * 4);
90
463
+ sysbus_init_mmio(sbd, &s->reg_array->mem);
91
- dc->props = bcm2836_props;
464
+ sysbus_init_irq(sbd, &s->irq_ir);
92
+ bc->info = data;
465
+}
93
dc->realize = bcm2836_realize;
466
+
94
+ dc->props = bcm2836_props;
467
+static void crf_finalize(Object *obj)
95
}
468
+{
96
469
+ XlnxZynqMPCRF *s = XLNX_ZYNQMP_CRF(obj);
97
-static const TypeInfo bcm2836_type_info = {
470
+ register_finalize_block(s->reg_array);
98
+static const TypeInfo bcm283x_type_info = {
471
+}
99
.name = TYPE_BCM283X,
472
+
100
.parent = TYPE_DEVICE,
473
+static const VMStateDescription vmstate_crf = {
101
.instance_size = sizeof(BCM283XState),
474
+ .name = TYPE_XLNX_ZYNQMP_CRF,
102
.instance_init = bcm2836_init,
475
+ .version_id = 1,
103
- .class_init = bcm2836_class_init,
476
+ .minimum_version_id = 1,
104
+ .class_size = sizeof(BCM283XClass),
477
+ .fields = (VMStateField[]) {
105
+ .abstract = true,
478
+ VMSTATE_UINT32_ARRAY(regs, XlnxZynqMPCRF, CRF_R_MAX),
106
};
479
+ VMSTATE_END_OF_LIST(),
107
108
static void bcm2836_register_types(void)
109
{
110
- type_register_static(&bcm2836_type_info);
111
+ int i;
112
+
113
+ type_register_static(&bcm283x_type_info);
114
+ for (i = 0; i < ARRAY_SIZE(bcm283x_socs); i++) {
115
+ TypeInfo ti = {
116
+ .name = bcm283x_socs[i].name,
117
+ .parent = TYPE_BCM283X,
118
+ .class_init = bcm283x_class_init,
119
+ .class_data = (void *) &bcm283x_socs[i],
120
+ };
121
+ type_register(&ti);
122
+ }
480
+ }
123
}
481
+};
124
482
+
125
type_init(bcm2836_register_types)
483
+static void crf_class_init(ObjectClass *klass, void *data)
126
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
484
+{
485
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
486
+ DeviceClass *dc = DEVICE_CLASS(klass);
487
+
488
+ dc->vmsd = &vmstate_crf;
489
+ rc->phases.enter = crf_reset_enter;
490
+ rc->phases.hold = crf_reset_hold;
491
+}
492
+
493
+static const TypeInfo crf_info = {
494
+ .name = TYPE_XLNX_ZYNQMP_CRF,
495
+ .parent = TYPE_SYS_BUS_DEVICE,
496
+ .instance_size = sizeof(XlnxZynqMPCRF),
497
+ .class_init = crf_class_init,
498
+ .instance_init = crf_init,
499
+ .instance_finalize = crf_finalize,
500
+};
501
+
502
+static void crf_register_types(void)
503
+{
504
+ type_register_static(&crf_info);
505
+}
506
+
507
+type_init(crf_register_types)
508
diff --git a/hw/misc/meson.build b/hw/misc/meson.build
127
index XXXXXXX..XXXXXXX 100644
509
index XXXXXXX..XXXXXXX 100644
128
--- a/hw/arm/raspi.c
510
--- a/hw/misc/meson.build
129
+++ b/hw/arm/raspi.c
511
+++ b/hw/misc/meson.build
130
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
512
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_RASPI', if_true: files(
131
BusState *bus;
513
))
132
DeviceState *carddev;
514
softmmu_ss.add(when: 'CONFIG_SLAVIO', if_true: files('slavio_misc.c'))
133
515
softmmu_ss.add(when: 'CONFIG_ZYNQ', if_true: files('zynq_slcr.c'))
134
- object_initialize(&s->soc, sizeof(s->soc), TYPE_BCM283X);
516
+specific_ss.add(when: 'CONFIG_XLNX_ZYNQMP_ARM', if_true: files('xlnx-zynqmp-crf.c'))
135
+ object_initialize(&s->soc, sizeof(s->soc),
517
softmmu_ss.add(when: 'CONFIG_XLNX_VERSAL', if_true: files(
136
+ version == 3 ? TYPE_BCM2837 : TYPE_BCM2836);
518
'xlnx-versal-xramc.c',
137
object_property_add_child(OBJECT(machine), "soc", OBJECT(&s->soc),
519
'xlnx-versal-pmc-iou-slcr.c',
138
&error_abort);
139
140
--
520
--
141
2.16.2
521
2.25.1
142
522
143
523
diff view generated by jsdifflib
1
From: Wei Huang <wei@redhat.com>
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
2
2
3
For guest kernel that supports KASLR, the load address can change every
3
Connect the ZynqMP CRF - Clock Reset FPD device.
4
time when guest VM runs. To find the physical base address correctly,
5
current QEMU dump searches VMCOREINFO for the string "NUMBER(phys_base)=".
6
However this string pattern is only available on x86_64. AArch64 uses a
7
different field, called "NUMBER(PHYS_OFFSET)=". This patch makes sure
8
QEMU dump uses the correct string on AArch64.
9
4
10
Signed-off-by: Wei Huang <wei@redhat.com>
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
6
Reviewed-by: Francisco Iglesias <francisco.iglesias@xilinx.com>
12
Message-id: 1520615003-20869-1-git-send-email-wei@redhat.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-5-edgar.iglesias@gmail.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
11
---
15
dump.c | 14 +++++++++++---
12
include/hw/arm/xlnx-zynqmp.h | 2 ++
16
1 file changed, 11 insertions(+), 3 deletions(-)
13
hw/arm/xlnx-zynqmp.c | 16 ++++++++++++++++
14
2 files changed, 18 insertions(+)
17
15
18
diff --git a/dump.c b/dump.c
16
diff --git a/include/hw/arm/xlnx-zynqmp.h b/include/hw/arm/xlnx-zynqmp.h
19
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
20
--- a/dump.c
18
--- a/include/hw/arm/xlnx-zynqmp.h
21
+++ b/dump.c
19
+++ b/include/hw/arm/xlnx-zynqmp.h
22
@@ -XXX,XX +XXX,XX @@ static void vmcoreinfo_update_phys_base(DumpState *s)
20
@@ -XXX,XX +XXX,XX @@
23
21
#include "hw/nvram/xlnx-bbram.h"
24
lines = g_strsplit((char *)vmci, "\n", -1);
22
#include "hw/nvram/xlnx-zynqmp-efuse.h"
25
for (i = 0; lines[i]; i++) {
23
#include "hw/or-irq.h"
26
- if (g_str_has_prefix(lines[i], "NUMBER(phys_base)=")) {
24
+#include "hw/misc/xlnx-zynqmp-crf.h"
27
- if (qemu_strtou64(lines[i] + 18, NULL, 16,
25
28
+ const char *prefix = NULL;
26
#define TYPE_XLNX_ZYNQMP "xlnx-zynqmp"
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
29
+
46
+
30
+ if (s->dump_info.d_machine == EM_X86_64) {
47
/* Serializer/Deserializer. */
31
+ prefix = "NUMBER(phys_base)=";
48
#define SERDES_ADDR 0xfd400000
32
+ } else if (s->dump_info.d_machine == EM_AARCH64) {
49
#define SERDES_SIZE 0x20000
33
+ prefix = "NUMBER(PHYS_OFFSET)=";
50
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_create_efuse(XlnxZynqMPState *s, qemu_irq *gic)
34
+ }
51
sysbus_connect_irq(sbd, 0, gic[EFUSE_IRQ]);
52
}
53
54
+static void xlnx_zynqmp_create_crf(XlnxZynqMPState *s, qemu_irq *gic)
55
+{
56
+ SysBusDevice *sbd;
35
+
57
+
36
+ if (prefix && g_str_has_prefix(lines[i], prefix)) {
58
+ object_initialize_child(OBJECT(s), "crf", &s->crf, TYPE_XLNX_ZYNQMP_CRF);
37
+ if (qemu_strtou64(lines[i] + strlen(prefix), NULL, 16,
59
+ sbd = SYS_BUS_DEVICE(&s->crf);
38
&phys_base) < 0) {
60
+
39
- warn_report("Failed to read NUMBER(phys_base)=");
61
+ sysbus_realize(sbd, &error_fatal);
40
+ warn_report("Failed to read %s", prefix);
62
+ sysbus_mmio_map(sbd, 0, CRF_ADDR);
41
} else {
63
+ sysbus_connect_irq(sbd, 0, gic[CRF_IRQ]);
42
s->dump_info.phys_base = phys_base;
64
+}
43
}
65
+
66
static void xlnx_zynqmp_create_unimp_mmio(XlnxZynqMPState *s)
67
{
68
static const struct UnimpInfo {
69
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
70
71
xlnx_zynqmp_create_bbram(s, gic_spi);
72
xlnx_zynqmp_create_efuse(s, gic_spi);
73
+ xlnx_zynqmp_create_crf(s, gic_spi);
74
xlnx_zynqmp_create_unimp_mmio(s);
75
76
for (i = 0; i < XLNX_ZYNQMP_NUM_GDMA_CH; i++) {
44
--
77
--
45
2.16.2
78
2.25.1
46
79
47
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
The raspi3 has AArch64 CPUs, which means that our smpboot
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
2
code for keeping the secondary CPUs in a pen needs to have
3
a version for A64 as well as A32. Without this, the
4
secondary CPUs go into an infinite loop of taking undefined
5
instruction exceptions.
6
2
3
Connect the ZynqMP APU Control device.
4
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.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
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 20180313153458.26822-10-peter.maydell@linaro.org
10
---
11
---
11
hw/arm/raspi.c | 41 ++++++++++++++++++++++++++++++++++++++++-
12
include/hw/arm/xlnx-zynqmp.h | 4 +++-
12
1 file changed, 40 insertions(+), 1 deletion(-)
13
hw/arm/xlnx-zynqmp.c | 25 +++++++++++++++++++++++--
14
2 files changed, 26 insertions(+), 3 deletions(-)
13
15
14
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
16
diff --git a/include/hw/arm/xlnx-zynqmp.h b/include/hw/arm/xlnx-zynqmp.h
15
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/raspi.c
18
--- a/include/hw/arm/xlnx-zynqmp.h
17
+++ b/hw/arm/raspi.c
19
+++ b/include/hw/arm/xlnx-zynqmp.h
18
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@
19
#define BOARDSETUP_ADDR (MVBAR_ADDR + 0x20) /* board setup code */
21
#include "hw/nvram/xlnx-bbram.h"
20
#define FIRMWARE_ADDR_2 0x8000 /* Pi 2 loads kernel.img here by default */
22
#include "hw/nvram/xlnx-zynqmp-efuse.h"
21
#define FIRMWARE_ADDR_3 0x80000 /* Pi 3 loads kernel.img here by default */
23
#include "hw/or-irq.h"
22
+#define SPINTABLE_ADDR 0xd8 /* Pi 3 bootloader spintable */
24
+#include "hw/misc/xlnx-zynqmp-apu-ctrl.h"
23
25
#include "hw/misc/xlnx-zynqmp-crf.h"
24
/* Table of Linux board IDs for different Pi versions */
26
25
static const int raspi_boardid[] = {[1] = 0xc42, [2] = 0xc43, [3] = 0xc44};
27
#define TYPE_XLNX_ZYNQMP "xlnx-zynqmp"
26
@@ -XXX,XX +XXX,XX @@ static void write_smpboot(ARMCPU *cpu, const struct arm_boot_info *info)
28
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPState, XLNX_ZYNQMP)
27
info->smp_loader_start);
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]);
28
}
60
}
29
61
30
+static void write_smpboot64(ARMCPU *cpu, const struct arm_boot_info *info)
62
+static void xlnx_zynqmp_create_apu_ctrl(XlnxZynqMPState *s, qemu_irq *gic)
31
+{
63
+{
32
+ /* Unlike the AArch32 version we don't need to call the board setup hook.
64
+ SysBusDevice *sbd;
33
+ * The mechanism for doing the spin-table is also entirely different.
65
+ int i;
34
+ * We must have four 64-bit fields at absolute addresses
35
+ * 0xd8, 0xe0, 0xe8, 0xf0 in RAM, which are the flag variables for
36
+ * our CPUs, and which we must ensure are zero initialized before
37
+ * the primary CPU goes into the kernel. We put these variables inside
38
+ * a rom blob, so that the reset for ROM contents zeroes them for us.
39
+ */
40
+ static const uint32_t smpboot[] = {
41
+ 0xd2801b05, /* mov x5, 0xd8 */
42
+ 0xd53800a6, /* mrs x6, mpidr_el1 */
43
+ 0x924004c6, /* and x6, x6, #0x3 */
44
+ 0xd503205f, /* spin: wfe */
45
+ 0xf86678a4, /* ldr x4, [x5,x6,lsl #3] */
46
+ 0xb4ffffc4, /* cbz x4, spin */
47
+ 0xd2800000, /* mov x0, #0x0 */
48
+ 0xd2800001, /* mov x1, #0x0 */
49
+ 0xd2800002, /* mov x2, #0x0 */
50
+ 0xd2800003, /* mov x3, #0x0 */
51
+ 0xd61f0080, /* br x4 */
52
+ };
53
+
66
+
54
+ static const uint64_t spintables[] = {
67
+ object_initialize_child(OBJECT(s), "apu-ctrl", &s->apu_ctrl,
55
+ 0, 0, 0, 0
68
+ TYPE_XLNX_ZYNQMP_APU_CTRL);
56
+ };
69
+ sbd = SYS_BUS_DEVICE(&s->apu_ctrl);
57
+
70
+
58
+ rom_add_blob_fixed("raspi_smpboot", smpboot, sizeof(smpboot),
71
+ for (i = 0; i < XLNX_ZYNQMP_NUM_APU_CPUS; i++) {
59
+ info->smp_loader_start);
72
+ g_autofree gchar *name = g_strdup_printf("cpu%d", i);
60
+ rom_add_blob_fixed("raspi_spintables", spintables, sizeof(spintables),
73
+
61
+ SPINTABLE_ADDR);
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]);
62
+}
81
+}
63
+
82
+
64
static void write_board_setup(ARMCPU *cpu, const struct arm_boot_info *info)
83
static void xlnx_zynqmp_create_crf(XlnxZynqMPState *s, qemu_irq *gic)
65
{
84
{
66
arm_write_secure_board_setup_dummy_smc(cpu, info, MVBAR_ADDR);
85
SysBusDevice *sbd;
67
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
86
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_create_unimp_mmio(XlnxZynqMPState *s)
68
/* Pi2 and Pi3 requires SMP setup */
87
hwaddr base;
69
if (version >= 2) {
88
hwaddr size;
70
binfo.smp_loader_start = SMPBOOT_ADDR;
89
} unimp_areas[ARRAY_SIZE(s->mr_unimp)] = {
71
- binfo.write_secondary_boot = write_smpboot;
90
- { .name = "apu", APU_ADDR, APU_SIZE },
72
+ if (version == 2) {
91
{ .name = "serdes", SERDES_ADDR, SERDES_SIZE },
73
+ binfo.write_secondary_boot = write_smpboot;
92
};
74
+ } else {
93
unsigned int nr;
75
+ binfo.write_secondary_boot = write_smpboot64;
94
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
76
+ }
95
77
binfo.secondary_cpu_reset_hook = reset_secondary;
96
xlnx_zynqmp_create_bbram(s, gic_spi);
78
}
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);
79
101
80
--
102
--
81
2.16.2
103
2.25.1
82
104
83
105
diff view generated by jsdifflib
1
From: Guenter Roeck <linux@roeck-us.net>
1
From: Andrew Deason <adeason@sinenomine.net>
2
2
3
The sabrelite machine model used by qemu-system-arm is based on the
3
On older Solaris releases (before Solaris 11), we didn't get a
4
Freescale/NXP i.MX6Q processor. This SoC has an on-board ethernet
4
prototype for madvise, and so util/osdep.c provides its own prototype.
5
controller which is supported in QEMU using the imx_fec.c module
5
Some time between the public Solaris 11.4 release and Solaris 11.4.42
6
(actually called imx.enet for this model.)
6
CBE, we started getting an madvise prototype that looks like this:
7
7
8
The include/hw/arm/fsm-imx6.h file defines the interrupt vectors for the
8
extern int madvise(void *, size_t, int);
9
imx.enet device like this:
10
9
11
#define FSL_IMX6_ENET_MAC_1588_IRQ 118
10
which conflicts with the prototype in util/osdeps.c. Instead of always
12
#define FSL_IMX6_ENET_MAC_IRQ 119
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.
13
15
14
According to https://www.nxp.com/docs/en/reference-manual/IMX6DQRM.pdf,
16
The 'missing_madvise_proto' meson check contains an obviously wrong
15
page 225, in Table 3-1. ARM Cortex A9 domain interrupt summary,
17
prototype for madvise. So if that code compiles and links, we must be
16
interrupts are as follows.
18
missing the actual prototype for madvise.
17
19
18
150 ENET MAC 0 IRQ
20
Signed-off-by: Andrew Deason <adeason@sinenomine.net>
19
151 ENET MAC 0 1588 Timer interrupt
21
Message-id: 20220316035227.3702-2-adeason@sinenomine.net
20
21
where
22
23
150 - 32 == 118
24
151 - 32 == 119
25
26
In other words, the vector definitions in the fsl-imx6.h file are reversed.
27
28
Fixing the interrupts alone causes problems with older Linux kernels:
29
The Ethernet interface will fail to probe with Linux v4.9 and earlier.
30
Linux v4.1 and earlier will crash due to a bug in Ethernet driver probe
31
error handling. This is a Linux kernel problem, not a qemu problem:
32
the Linux kernel only worked by accident since it requested both interrupts.
33
34
For backward compatibility, generate the Ethernet interrupt on both interrupt
35
lines. This was shown to work from all Linux kernel releases starting with
36
v3.16.
37
38
Link: https://bugs.launchpad.net/qemu/+bug/1753309
39
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
40
Message-id: 1520723090-22130-1-git-send-email-linux@roeck-us.net
41
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
22
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
42
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
43
---
24
---
44
include/hw/arm/fsl-imx6.h | 4 ++--
25
meson.build | 23 +++++++++++++++++++++--
45
hw/net/imx_fec.c | 28 +++++++++++++++++++++++++++-
26
include/qemu/osdep.h | 8 ++++++++
46
2 files changed, 29 insertions(+), 3 deletions(-)
27
util/osdep.c | 3 ---
28
3 files changed, 29 insertions(+), 5 deletions(-)
47
29
48
diff --git a/include/hw/arm/fsl-imx6.h b/include/hw/arm/fsl-imx6.h
30
diff --git a/meson.build b/meson.build
49
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
50
--- a/include/hw/arm/fsl-imx6.h
32
--- a/meson.build
51
+++ b/include/hw/arm/fsl-imx6.h
33
+++ b/meson.build
52
@@ -XXX,XX +XXX,XX @@ typedef struct FslIMX6State {
34
@@ -XXX,XX +XXX,XX @@ config_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
53
#define FSL_IMX6_HDMI_MASTER_IRQ 115
35
#error Not supported
54
#define FSL_IMX6_HDMI_CEC_IRQ 116
36
#endif
55
#define FSL_IMX6_MLB150_LOW_IRQ 117
37
}'''))
56
-#define FSL_IMX6_ENET_MAC_1588_IRQ 118
38
-config_host_data.set('CONFIG_MADVISE', cc.links(gnu_source_prefix + '''
57
-#define FSL_IMX6_ENET_MAC_IRQ 119
39
+
58
+#define FSL_IMX6_ENET_MAC_IRQ 118
40
+has_madvise = cc.links(gnu_source_prefix + '''
59
+#define FSL_IMX6_ENET_MAC_1588_IRQ 119
41
#include <sys/types.h>
60
#define FSL_IMX6_PCIE1_IRQ 120
42
#include <sys/mman.h>
61
#define FSL_IMX6_PCIE2_IRQ 121
43
#include <stddef.h>
62
#define FSL_IMX6_PCIE3_IRQ 122
44
- int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }'''))
63
diff --git a/hw/net/imx_fec.c b/hw/net/imx_fec.c
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
64
index XXXXXXX..XXXXXXX 100644
68
index XXXXXXX..XXXXXXX 100644
65
--- a/hw/net/imx_fec.c
69
--- a/include/qemu/osdep.h
66
+++ b/hw/net/imx_fec.c
70
+++ b/include/qemu/osdep.h
67
@@ -XXX,XX +XXX,XX @@ static void imx_enet_write_bd(IMXENETBufDesc *bd, dma_addr_t addr)
71
@@ -XXX,XX +XXX,XX @@ void qemu_anon_ram_free(void *ptr, size_t size);
68
72
#define SIGIO SIGPOLL
69
static void imx_eth_update(IMXFECState *s)
73
#endif
70
{
74
71
- if (s->regs[ENET_EIR] & s->regs[ENET_EIMR] & ENET_INT_TS_TIMER) {
75
+#ifdef HAVE_MADVISE_WITHOUT_PROTOTYPE
72
+ /*
76
+/*
73
+ * Previous versions of qemu had the ENET_INT_MAC and ENET_INT_TS_TIMER
77
+ * See MySQL bug #7156 (http://bugs.mysql.com/bug.php?id=7156) for discussion
74
+ * interrupts swapped. This worked with older versions of Linux (4.14
78
+ * about Solaris missing the madvise() prototype.
75
+ * and older) since Linux associated both interrupt lines with Ethernet
79
+ */
76
+ * MAC interrupts. Specifically,
80
+extern int madvise(char *, size_t, int);
77
+ * - Linux 4.15 and later have separate interrupt handlers for the MAC and
81
+#endif
78
+ * timer interrupts. Those versions of Linux fail with versions of QEMU
82
+
79
+ * with swapped interrupt assignments.
83
#if defined(CONFIG_LINUX)
80
+ * - In linux 4.14, both interrupt lines were registered with the Ethernet
84
#ifndef BUS_MCEERR_AR
81
+ * MAC interrupt handler. As a result, all versions of qemu happen to
85
#define BUS_MCEERR_AR 4
82
+ * work, though that is accidental.
86
diff --git a/util/osdep.c b/util/osdep.c
83
+ * - In Linux 4.9 and older, the timer interrupt was registered directly
87
index XXXXXXX..XXXXXXX 100644
84
+ * with the Ethernet MAC interrupt handler. The MAC interrupt was
88
--- a/util/osdep.c
85
+ * redirected to a GPIO interrupt to work around erratum ERR006687.
89
+++ b/util/osdep.c
86
+ * This was implemented using the SOC's IOMUX block. In qemu, this GPIO
90
@@ -XXX,XX +XXX,XX @@
87
+ * interrupt never fired since IOMUX is currently not supported in qemu.
91
88
+ * Linux instead received MAC interrupts on the timer interrupt.
92
#ifdef CONFIG_SOLARIS
89
+ * As a result, qemu versions with the swapped interrupt assignment work,
93
#include <sys/statvfs.h>
90
+ * albeit accidentally, but qemu versions with the correct interrupt
94
-/* See MySQL bug #7156 (http://bugs.mysql.com/bug.php?id=7156) for
91
+ * assignment fail.
95
- discussion about Solaris header problems */
92
+ *
96
-extern int madvise(char *, size_t, int);
93
+ * To ensure that all versions of Linux work, generate ENET_INT_MAC
97
#endif
94
+ * interrrupts on both interrupt lines. This should be changed if and when
98
95
+ * qemu supports IOMUX.
99
#include "qemu-common.h"
96
+ */
97
+ if (s->regs[ENET_EIR] & s->regs[ENET_EIMR] &
98
+ (ENET_INT_MAC | ENET_INT_TS_TIMER)) {
99
qemu_set_irq(s->irq[1], 1);
100
} else {
101
qemu_set_irq(s->irq[1], 0);
102
--
100
--
103
2.16.2
101
2.25.1
104
105
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