1
Arm patch queue -- these are all bug fix patches but we might
1
target-arm queue: nothing major here, but no point
2
as well put them in to rc0...
2
sitting on them waiting for more stuff to come along.
3
3
4
thanks
4
thanks
5
-- PMM
5
-- PMM
6
6
7
The following changes since commit 2c8cfc0b52b5a4d123c26c0b5fdf941be24805be:
7
The following changes since commit 1329132d28bf14b9508f7a1f04a2c63422bc3f99:
8
8
9
Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging (2018-03-19 11:44:26 +0000)
9
Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging (2019-09-26 16:14:03 +0100)
10
10
11
are available in the Git repository at:
11
are available in the Git repository at:
12
12
13
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180319
13
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20190927
14
14
15
for you to fetch changes up to ff72cb6b46b95bb530787add5277c211af3d31c6:
15
for you to fetch changes up to e4e34855e658b78ecac50a651cc847662ff02cfd:
16
16
17
hw/arm/raspi: Provide spin-loop code for AArch64 CPUs (2018-03-19 18:23:24 +0000)
17
hw/arm/boot: Use the IEC binary prefix definitions (2019-09-27 11:44:39 +0100)
18
18
19
----------------------------------------------------------------
19
----------------------------------------------------------------
20
target-arm queue:
20
target-arm queue:
21
* fsl-imx6: Fix incorrect Ethernet interrupt defines
21
* Fix the CBAR register implementation for Cortex-A53,
22
* dump: Update correct kdump phys_base field for AArch64
22
Cortex-A57, Cortex-A72
23
* char: i.MX: Add support for "TX complete" interrupt
23
* Fix direct booting of Linux kernels on emulated CPUs
24
* bcm2836/raspi: Fix various bugs resulting in panics trying
24
which have an AArch32 EL3 (incorrect NSACR settings
25
to boot a Debian Linux kernel on raspi3
25
meant they could not access the FPU)
26
* semihosting cleanup: do more work at translate time
27
and less work at runtime
26
28
27
----------------------------------------------------------------
29
----------------------------------------------------------------
28
Andrey Smirnov (2):
30
Alex Bennée (6):
29
char: i.MX: Simplify imx_update()
31
tests/tcg: clean-up some comments after the de-tangling
30
char: i.MX: Add support for "TX complete" interrupt
32
target/arm: handle M-profile semihosting at translate time
33
target/arm: handle A-profile semihosting at translate time
34
target/arm: remove run time semihosting checks
35
target/arm: remove run-time semihosting checks for linux-user
36
tests/tcg: add linux-user semihosting smoke test for ARM
31
37
32
Guenter Roeck (1):
38
Luc Michel (1):
33
fsl-imx6: Swap Ethernet interrupt defines
39
target/arm: fix CBAR register for AArch64 CPUs
34
40
35
Peter Maydell (9):
41
Peter Maydell (1):
36
hw/arm/raspi: Don't do board-setup or secure-boot for raspi3
42
hw/arm/boot.c: Set NSACR.{CP11,CP10} for NS kernel boots
37
hw/arm/boot: assert that secure_boot and secure_board_setup are false for AArch64
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
43
46
Wei Huang (1):
44
Philippe Mathieu-Daudé (1):
47
dump: Update correct kdump phys_base field for AArch64
45
hw/arm/boot: Use the IEC binary prefix definitions
48
46
49
include/hw/arm/bcm2836.h | 31 +++++++++++++---
47
tests/tcg/Makefile.target | 7 ++-
50
include/hw/arm/fsl-imx6.h | 4 +-
48
tests/tcg/aarch64/Makefile.target | 8 ++-
51
include/hw/char/imx_serial.h | 3 ++
49
tests/tcg/arm/Makefile.target | 20 ++++---
52
dump.c | 14 +++++--
50
linux-user/arm/target_syscall.h | 3 -
53
hw/arm/bcm2836.c | 87 +++++++++++++++++++++++++++++++-------------
51
hw/arm/boot.c | 12 ++--
54
hw/arm/boot.c | 12 ++++++
52
linux-user/arm/cpu_loop.c | 3 -
55
hw/arm/raspi.c | 77 +++++++++++++++++++++++++++++++--------
53
target/arm/helper.c | 115 +++++++++++++-------------------------
56
hw/char/imx_serial.c | 44 ++++++++++++++++------
54
target/arm/m_helper.c | 18 ++----
57
hw/net/imx_fec.c | 28 +++++++++++++-
55
target/arm/translate.c | 30 ++++++++--
58
9 files changed, 237 insertions(+), 63 deletions(-)
56
tests/tcg/arm/semihosting.c | 45 +++++++++++++++
57
10 files changed, 146 insertions(+), 115 deletions(-)
58
create mode 100644 tests/tcg/arm/semihosting.c
59
59
diff view generated by jsdifflib
1
Now we have separate types for BCM2386 and BCM2387, we might as well
1
From: Luc Michel <luc.michel@greensocs.com>
2
just hard-code the CPU type they use rather than having it passed
3
through as an object property. This then lets us put the initialization
4
of the CPU object in init rather than realize.
5
2
6
Note that this change means that it's no longer possible on
3
For AArch64 CPUs with a CBAR register, we have two views for it:
7
the command line to use -cpu to ask for a different kind of
4
- in AArch64 state, the CBAR_EL1 register (S3_1_C15_C3_0), returns the
8
CPU than the SoC supports. This was never a supported thing to
5
full 64 bits CBAR value
9
do anyway; we were just not sanity-checking the command line.
6
- in AArch32 state, the CBAR register (cp15, opc1=1, CRn=15, CRm=3, opc2=0)
7
returns a 32 bits view such that:
8
CBAR = CBAR_EL1[31:18] 0..0 CBAR_EL1[43:32]
10
9
11
This does require us to only build the bcm2837 object on
10
This commit fixes the current implementation where:
12
TARGET_AARCH64 configs, since otherwise it won't instantiate
11
- CBAR_EL1 was returning the 32 bits view instead of the full 64 bits
13
due to the missing cortex-a53 device and "make check" will fail.
12
value,
13
- CBAR was returning a truncated 32 bits version of the full 64 bits
14
one, instead of the 32 bits view
15
- CBAR was declared as cp15, opc1=4, CRn=15, CRm=0, opc2=0, which is
16
the CBAR register found in the ARMv7 Cortex-Ax CPUs, but not in
17
ARMv8 CPUs.
14
18
19
Signed-off-by: Luc Michel <luc.michel@greensocs.com>
20
Message-id: 20190912110103.1417887-1-luc.michel@greensocs.com
21
[PMM: Added a comment about the two different kinds of CBAR]
22
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
17
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
18
Message-id: 20180313153458.26822-9-peter.maydell@linaro.org
19
---
24
---
20
hw/arm/bcm2836.c | 24 +++++++++++++++---------
25
target/arm/helper.c | 19 ++++++++++++++++---
21
hw/arm/raspi.c | 2 --
26
1 file changed, 16 insertions(+), 3 deletions(-)
22
2 files changed, 15 insertions(+), 11 deletions(-)
23
27
24
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
28
diff --git a/target/arm/helper.c b/target/arm/helper.c
25
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/arm/bcm2836.c
30
--- a/target/arm/helper.c
27
+++ b/hw/arm/bcm2836.c
31
+++ b/target/arm/helper.c
28
@@ -XXX,XX +XXX,XX @@
32
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
29
33
}
30
struct BCM283XInfo {
34
31
const char *name;
35
if (arm_feature(env, ARM_FEATURE_CBAR)) {
32
+ const char *cpu_type;
36
+ /*
33
int clusterid;
37
+ * CBAR is IMPDEF, but common on Arm Cortex-A implementations.
34
};
38
+ * There are two flavours:
35
39
+ * (1) older 32-bit only cores have a simple 32-bit CBAR
36
static const BCM283XInfo bcm283x_socs[] = {
40
+ * (2) 64-bit cores have a 64-bit CBAR visible to AArch64, plus a
37
{
41
+ * 32-bit register visible to AArch32 at a different encoding
38
.name = TYPE_BCM2836,
42
+ * to the "flavour 1" register and with the bits rearranged to
39
+ .cpu_type = ARM_CPU_TYPE_NAME("cortex-a15"),
43
+ * be able to squash a 64-bit address into the 32-bit view.
40
.clusterid = 0xf,
44
+ * We distinguish the two via the ARM_FEATURE_AARCH64 flag, but
41
},
45
+ * in future if we support AArch32-only configs of some of the
42
+#ifdef TARGET_AARCH64
46
+ * AArch64 cores we might need to add a specific feature flag
43
{
47
+ * to indicate cores with "flavour 2" CBAR.
44
.name = TYPE_BCM2837,
48
+ */
45
+ .cpu_type = ARM_CPU_TYPE_NAME("cortex-a53"),
49
if (arm_feature(env, ARM_FEATURE_AARCH64)) {
46
.clusterid = 0x0,
50
/* 32 bit view is [31:18] 0...0 [43:32]. */
47
},
51
uint32_t cbar32 = (extract64(cpu->reset_cbar, 18, 14) << 18)
48
+#endif
52
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
49
};
53
ARMCPRegInfo cbar_reginfo[] = {
50
54
{ .name = "CBAR",
51
static void bcm2836_init(Object *obj)
55
.type = ARM_CP_CONST,
52
{
56
- .cp = 15, .crn = 15, .crm = 0, .opc1 = 4, .opc2 = 0,
53
BCM283XState *s = BCM283X(obj);
57
- .access = PL1_R, .resetvalue = cpu->reset_cbar },
54
+ BCM283XClass *bc = BCM283X_GET_CLASS(obj);
58
+ .cp = 15, .crn = 15, .crm = 3, .opc1 = 1, .opc2 = 0,
55
+ const BCM283XInfo *info = bc->info;
59
+ .access = PL1_R, .resetvalue = cbar32 },
56
+ int n;
60
{ .name = "CBAR_EL1", .state = ARM_CP_STATE_AA64,
57
+
61
.type = ARM_CP_CONST,
58
+ for (n = 0; n < BCM283X_NCPUS; n++) {
62
.opc0 = 3, .opc1 = 1, .crn = 15, .crm = 3, .opc2 = 0,
59
+ object_initialize(&s->cpus[n], sizeof(s->cpus[n]),
63
- .access = PL1_R, .resetvalue = cbar32 },
60
+ info->cpu_type);
64
+ .access = PL1_R, .resetvalue = cpu->reset_cbar },
61
+ object_property_add_child(obj, "cpu[*]", OBJECT(&s->cpus[n]),
65
REGINFO_SENTINEL
62
+ &error_abort);
66
};
63
+ }
67
/* We don't implement a r/w 64 bit CBAR currently */
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
--
68
--
104
2.16.2
69
2.20.1
105
70
106
71
diff view generated by jsdifflib
1
From: Wei Huang <wei@redhat.com>
1
From: Alex Bennée <alex.bennee@linaro.org>
2
2
3
For guest kernel that supports KASLR, the load address can change every
3
These were missed in the recent de-tangling so have been updated to be
4
time when guest VM runs. To find the physical base address correctly,
4
more actuate. I've also built up ARM_TESTS in a manner similar to
5
current QEMU dump searches VMCOREINFO for the string "NUMBER(phys_base)=".
5
AARCH64_TESTS for better consistency.
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
6
10
Signed-off-by: Wei Huang <wei@redhat.com>
7
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
11
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Message-id: 1520615003-20869-1-git-send-email-wei@redhat.com
9
Message-id: 20190913151845.12582-2-alex.bennee@linaro.org
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
11
---
15
dump.c | 14 +++++++++++---
12
tests/tcg/Makefile.target | 7 +++++--
16
1 file changed, 11 insertions(+), 3 deletions(-)
13
tests/tcg/aarch64/Makefile.target | 3 ++-
14
tests/tcg/arm/Makefile.target | 15 ++++++++-------
15
3 files changed, 15 insertions(+), 10 deletions(-)
17
16
18
diff --git a/dump.c b/dump.c
17
diff --git a/tests/tcg/Makefile.target b/tests/tcg/Makefile.target
19
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
20
--- a/dump.c
19
--- a/tests/tcg/Makefile.target
21
+++ b/dump.c
20
+++ b/tests/tcg/Makefile.target
22
@@ -XXX,XX +XXX,XX @@ static void vmcoreinfo_update_phys_base(DumpState *s)
21
@@ -XXX,XX +XXX,XX @@ TIMEOUT=15
23
22
endif
24
lines = g_strsplit((char *)vmci, "\n", -1);
23
25
for (i = 0; lines[i]; i++) {
24
ifdef CONFIG_USER_ONLY
26
- if (g_str_has_prefix(lines[i], "NUMBER(phys_base)=")) {
25
-# The order we include is important. We include multiarch, base arch
27
- if (qemu_strtou64(lines[i] + 18, NULL, 16,
26
-# and finally arch if it's not the same as base arch.
28
+ const char *prefix = NULL;
27
+# The order we include is important. We include multiarch first and
28
+# then the target. If there are common tests shared between
29
+# sub-targets (e.g. ARM & AArch64) then it is up to
30
+# $(TARGET_NAME)/Makefile.target to include the common parent
31
+# architecture in its VPATH.
32
-include $(SRC_PATH)/tests/tcg/multiarch/Makefile.target
33
-include $(SRC_PATH)/tests/tcg/$(TARGET_NAME)/Makefile.target
34
35
diff --git a/tests/tcg/aarch64/Makefile.target b/tests/tcg/aarch64/Makefile.target
36
index XXXXXXX..XXXXXXX 100644
37
--- a/tests/tcg/aarch64/Makefile.target
38
+++ b/tests/tcg/aarch64/Makefile.target
39
@@ -XXX,XX +XXX,XX @@ VPATH         += $(ARM_SRC)
40
AARCH64_SRC=$(SRC_PATH)/tests/tcg/aarch64
41
VPATH         += $(AARCH64_SRC)
42
43
-# we don't build any other ARM test
44
+# Float-convert Tests
45
AARCH64_TESTS=fcvt
46
47
fcvt: LDFLAGS+=-lm
48
@@ -XXX,XX +XXX,XX @@ run-fcvt: fcvt
49
    $(call run-test,$<,$(QEMU) $<, "$< on $(TARGET_NAME)")
50
    $(call diff-out,$<,$(AARCH64_SRC)/fcvt.ref)
51
52
+# Pauth Tests
53
AARCH64_TESTS += pauth-1 pauth-2
54
run-pauth-%: QEMU_OPTS += -cpu max
55
56
diff --git a/tests/tcg/arm/Makefile.target b/tests/tcg/arm/Makefile.target
57
index XXXXXXX..XXXXXXX 100644
58
--- a/tests/tcg/arm/Makefile.target
59
+++ b/tests/tcg/arm/Makefile.target
60
@@ -XXX,XX +XXX,XX @@ ARM_SRC=$(SRC_PATH)/tests/tcg/arm
61
# Set search path for all sources
62
VPATH         += $(ARM_SRC)
63
64
-ARM_TESTS=hello-arm test-arm-iwmmxt
65
-
66
-TESTS += $(ARM_TESTS) fcvt
67
-
68
+# Basic Hello World
69
+ARM_TESTS = hello-arm
70
hello-arm: CFLAGS+=-marm -ffreestanding
71
hello-arm: LDFLAGS+=-nostdlib
72
73
+# IWMXT floating point extensions
74
+ARM_TESTS += test-arm-iwmmxt
75
test-arm-iwmmxt: CFLAGS+=-marm -march=iwmmxt -mabi=aapcs -mfpu=fpv4-sp-d16
76
test-arm-iwmmxt: test-arm-iwmmxt.S
77
    $(CC) $(CFLAGS) $< -o $@ $(LDFLAGS)
78
79
-ifeq ($(TARGET_NAME), arm)
80
+# Float-convert Tests
81
+ARM_TESTS += fcvt
82
fcvt: LDFLAGS+=-lm
83
# fcvt: CFLAGS+=-march=armv8.2-a+fp16 -mfpu=neon-fp-armv8
84
-
85
run-fcvt: fcvt
86
    $(call run-test,fcvt,$(QEMU) $<,"$< on $(TARGET_NAME)")
87
    $(call diff-out,fcvt,$(ARM_SRC)/fcvt.ref)
88
-endif
29
+
89
+
30
+ if (s->dump_info.d_machine == EM_X86_64) {
90
+TESTS += $(ARM_TESTS)
31
+ prefix = "NUMBER(phys_base)=";
91
32
+ } else if (s->dump_info.d_machine == EM_AARCH64) {
92
# On ARM Linux only supports 4k pages
33
+ prefix = "NUMBER(PHYS_OFFSET)=";
93
EXTRA_RUNS+=run-test-mmap-4096
34
+ }
35
+
36
+ if (prefix && g_str_has_prefix(lines[i], prefix)) {
37
+ if (qemu_strtou64(lines[i] + strlen(prefix), NULL, 16,
38
&phys_base) < 0) {
39
- warn_report("Failed to read NUMBER(phys_base)=");
40
+ warn_report("Failed to read %s", prefix);
41
} else {
42
s->dump_info.phys_base = phys_base;
43
}
44
--
94
--
45
2.16.2
95
2.20.1
46
96
47
97
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
From: Alex Bennée <alex.bennee@linaro.org>
2
2
3
Add support for "TX complete"/TXDC interrupt generate by real HW since
3
We do this for other semihosting calls so we might as well do it for
4
it is needed to support guests other than Linux.
4
M-profile as well.
5
5
6
Based on the patch by Bill Paul as found here:
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
7
https://bugs.launchpad.net/qemu/+bug/1753314
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
8
Message-id: 20190913151845.12582-3-alex.bennee@linaro.org
9
Cc: qemu-devel@nongnu.org
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>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
---
11
---
19
include/hw/char/imx_serial.h | 3 +++
12
target/arm/m_helper.c | 18 ++++++------------
20
hw/char/imx_serial.c | 20 +++++++++++++++++---
13
target/arm/translate.c | 11 ++++++++++-
21
2 files changed, 20 insertions(+), 3 deletions(-)
14
2 files changed, 16 insertions(+), 13 deletions(-)
22
15
23
diff --git a/include/hw/char/imx_serial.h b/include/hw/char/imx_serial.h
16
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
24
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
25
--- a/include/hw/char/imx_serial.h
18
--- a/target/arm/m_helper.c
26
+++ b/include/hw/char/imx_serial.h
19
+++ b/target/arm/m_helper.c
27
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
28
#define UCR2_RXEN (1<<1) /* Receiver enable */
21
break;
29
#define UCR2_SRST (1<<0) /* Reset complete */
30
31
+#define UCR4_TCEN BIT(3) /* TX complete interrupt enable */
32
+
33
#define UTS1_TXEMPTY (1<<6)
34
#define UTS1_RXEMPTY (1<<5)
35
#define UTS1_TXFULL (1<<4)
36
@@ -XXX,XX +XXX,XX @@ typedef struct IMXSerialState {
37
uint32_t ubmr;
38
uint32_t ubrc;
39
uint32_t ucr3;
40
+ uint32_t ucr4;
41
42
qemu_irq irq;
43
CharBackend chr;
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
}
22
}
98
break;
23
break;
99
@@ -XXX,XX +XXX,XX @@ static void imx_serial_write(void *opaque, hwaddr offset,
24
+ case EXCP_SEMIHOST:
100
s->ucr3 = value & 0xffff;
25
+ qemu_log_mask(CPU_LOG_INT,
26
+ "...handling as semihosting call 0x%x\n",
27
+ env->regs[0]);
28
+ env->regs[0] = do_arm_semihosting(env);
29
+ return;
30
case EXCP_BKPT:
31
- if (semihosting_enabled()) {
32
- int nr;
33
- nr = arm_lduw_code(env, env->regs[15], arm_sctlr_b(env)) & 0xff;
34
- if (nr == 0xab) {
35
- env->regs[15] += 2;
36
- qemu_log_mask(CPU_LOG_INT,
37
- "...handling as semihosting call 0x%x\n",
38
- env->regs[0]);
39
- env->regs[0] = do_arm_semihosting(env);
40
- return;
41
- }
42
- }
43
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_DEBUG, false);
101
break;
44
break;
102
45
case EXCP_IRQ:
103
- case 0x2d: /* UTS1 */
46
diff --git a/target/arm/translate.c b/target/arm/translate.c
104
case 0x23: /* UCR4 */
47
index XXXXXXX..XXXXXXX 100644
105
+ s->ucr4 = value & 0xffff;
48
--- a/target/arm/translate.c
106
+ imx_update(s);
49
+++ b/target/arm/translate.c
107
+ break;
50
@@ -XXX,XX +XXX,XX @@ static bool trans_BKPT(DisasContext *s, arg_BKPT *a)
108
+
51
if (!ENABLE_ARCH_5) {
109
+ case 0x2d: /* UTS1 */
52
return false;
110
qemu_log_mask(LOG_UNIMP, "[%s]%s: Unimplemented reg 0x%"
53
}
111
HWADDR_PRIx "\n", TYPE_IMX_SERIAL, __func__, offset);
54
- gen_exception_bkpt_insn(s, syn_aa32_bkpt(a->imm, false));
112
/* TODO */
55
+ if (arm_dc_feature(s, ARM_FEATURE_M) &&
56
+ semihosting_enabled() &&
57
+#ifndef CONFIG_USER_ONLY
58
+ !IS_USER(s) &&
59
+#endif
60
+ (a->imm == 0xab)) {
61
+ gen_exception_internal_insn(s, s->base.pc_next, EXCP_SEMIHOST);
62
+ } else {
63
+ gen_exception_bkpt_insn(s, syn_aa32_bkpt(a->imm, false));
64
+ }
65
return true;
66
}
67
113
--
68
--
114
2.16.2
69
2.20.1
115
70
116
71
diff view generated by jsdifflib
1
The raspi3 has AArch64 CPUs, which means that our smpboot
1
From: Alex Bennée <alex.bennee@linaro.org>
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
As for the other semihosting calls we can resolve this at translate
4
time.
5
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20190913151845.12582-4-alex.bennee@linaro.org
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
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
---
10
---
11
hw/arm/raspi.c | 41 ++++++++++++++++++++++++++++++++++++++++-
11
target/arm/translate.c | 19 +++++++++++++++----
12
1 file changed, 40 insertions(+), 1 deletion(-)
12
1 file changed, 15 insertions(+), 4 deletions(-)
13
13
14
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
14
diff --git a/target/arm/translate.c b/target/arm/translate.c
15
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/raspi.c
16
--- a/target/arm/translate.c
17
+++ b/hw/arm/raspi.c
17
+++ b/target/arm/translate.c
18
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ static bool trans_CBZ(DisasContext *s, arg_CBZ *a)
19
#define BOARDSETUP_ADDR (MVBAR_ADDR + 0x20) /* board setup code */
20
#define FIRMWARE_ADDR_2 0x8000 /* Pi 2 loads kernel.img here by default */
21
#define FIRMWARE_ADDR_3 0x80000 /* Pi 3 loads kernel.img here by default */
22
+#define SPINTABLE_ADDR 0xd8 /* Pi 3 bootloader spintable */
23
24
/* Table of Linux board IDs for different Pi versions */
25
static const int raspi_boardid[] = {[1] = 0xc42, [2] = 0xc43, [3] = 0xc44};
26
@@ -XXX,XX +XXX,XX @@ static void write_smpboot(ARMCPU *cpu, const struct arm_boot_info *info)
27
info->smp_loader_start);
28
}
19
}
29
20
30
+static void write_smpboot64(ARMCPU *cpu, const struct arm_boot_info *info)
21
/*
31
+{
22
- * Supervisor call
32
+ /* Unlike the AArch32 version we don't need to call the board setup hook.
23
+ * Supervisor call - both T32 & A32 come here so we need to check
33
+ * The mechanism for doing the spin-table is also entirely different.
24
+ * which mode we are in when checking for semihosting.
34
+ * We must have four 64-bit fields at absolute addresses
25
*/
35
+ * 0xd8, 0xe0, 0xe8, 0xf0 in RAM, which are the flag variables for
26
36
+ * our CPUs, and which we must ensure are zero initialized before
27
static bool trans_SVC(DisasContext *s, arg_SVC *a)
37
+ * the primary CPU goes into the kernel. We put these variables inside
28
{
38
+ * a rom blob, so that the reset for ROM contents zeroes them for us.
29
- gen_set_pc_im(s, s->base.pc_next);
39
+ */
30
- s->svc_imm = a->imm;
40
+ static const uint32_t smpboot[] = {
31
- s->base.is_jmp = DISAS_SWI;
41
+ 0xd2801b05, /* mov x5, 0xd8 */
32
+ const uint32_t semihost_imm = s->thumb ? 0xab : 0x123456;
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
+
33
+
54
+ static const uint64_t spintables[] = {
34
+ if (!arm_dc_feature(s, ARM_FEATURE_M) && semihosting_enabled() &&
55
+ 0, 0, 0, 0
35
+#ifndef CONFIG_USER_ONLY
56
+ };
36
+ !IS_USER(s) &&
57
+
37
+#endif
58
+ rom_add_blob_fixed("raspi_smpboot", smpboot, sizeof(smpboot),
38
+ (a->imm == semihost_imm)) {
59
+ info->smp_loader_start);
39
+ gen_exception_internal_insn(s, s->base.pc_next, EXCP_SEMIHOST);
60
+ rom_add_blob_fixed("raspi_spintables", spintables, sizeof(spintables),
40
+ } else {
61
+ SPINTABLE_ADDR);
41
+ gen_set_pc_im(s, s->base.pc_next);
62
+}
42
+ s->svc_imm = a->imm;
63
+
43
+ s->base.is_jmp = DISAS_SWI;
64
static void write_board_setup(ARMCPU *cpu, const struct arm_boot_info *info)
44
+ }
65
{
45
return true;
66
arm_write_secure_board_setup_dummy_smc(cpu, info, MVBAR_ADDR);
46
}
67
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
68
/* Pi2 and Pi3 requires SMP setup */
69
if (version >= 2) {
70
binfo.smp_loader_start = SMPBOOT_ADDR;
71
- binfo.write_secondary_boot = write_smpboot;
72
+ if (version == 2) {
73
+ binfo.write_secondary_boot = write_smpboot;
74
+ } else {
75
+ binfo.write_secondary_boot = write_smpboot64;
76
+ }
77
binfo.secondary_cpu_reset_hook = reset_secondary;
78
}
79
47
80
--
48
--
81
2.16.2
49
2.20.1
82
50
83
51
diff view generated by jsdifflib
1
Our BCM2836 type is really a generic one that can be any of
1
From: Alex Bennée <alex.bennee@linaro.org>
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
Now we do all our checking and use a common EXCP_SEMIHOST for
8
parent class to specific types for the bcm2836 and bcm2837.
4
semihosting operations we can make helper code a lot simpler.
9
5
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20190913151845.12582-5-alex.bennee@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
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-6-peter.maydell@linaro.org
14
---
10
---
15
include/hw/arm/bcm2836.h | 12 ++++++------
11
target/arm/helper.c | 96 +++++++++++----------------------------------
16
hw/arm/bcm2836.c | 17 +++++++++--------
12
1 file changed, 22 insertions(+), 74 deletions(-)
17
hw/arm/raspi.c | 16 ++++++++--------
18
3 files changed, 23 insertions(+), 22 deletions(-)
19
13
20
diff --git a/include/hw/arm/bcm2836.h b/include/hw/arm/bcm2836.h
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
21
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
22
--- a/include/hw/arm/bcm2836.h
16
--- a/target/arm/helper.c
23
+++ b/include/hw/arm/bcm2836.h
17
+++ b/target/arm/helper.c
24
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_do_interrupt_aarch64(CPUState *cs)
25
#include "hw/arm/bcm2835_peripherals.h"
19
new_el, env->pc, pstate_read(env));
26
#include "hw/intc/bcm2836_control.h"
27
28
-#define TYPE_BCM2836 "bcm2836"
29
-#define BCM2836(obj) OBJECT_CHECK(BCM2836State, (obj), TYPE_BCM2836)
30
+#define TYPE_BCM283X "bcm283x"
31
+#define BCM283X(obj) OBJECT_CHECK(BCM283XState, (obj), TYPE_BCM283X)
32
33
-#define BCM2836_NCPUS 4
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
}
20
}
95
21
96
static Property bcm2836_props[] = {
22
-static inline bool check_for_semihosting(CPUState *cs)
97
- DEFINE_PROP_STRING("cpu-type", BCM2836State, cpu_type),
23
-{
98
- DEFINE_PROP_UINT32("enabled-cpus", BCM2836State, enabled_cpus, BCM2836_NCPUS),
24
+/*
99
+ DEFINE_PROP_STRING("cpu-type", BCM283XState, cpu_type),
25
+ * Do semihosting call and set the appropriate return value. All the
100
+ DEFINE_PROP_UINT32("enabled-cpus", BCM283XState, enabled_cpus,
26
+ * permission and validity checks have been done at translate time.
101
+ BCM283X_NCPUS),
27
+ *
102
DEFINE_PROP_END_OF_LIST()
28
+ * We only see semihosting exceptions in TCG only as they are not
103
};
29
+ * trapped to the hypervisor in KVM.
104
30
+ */
105
@@ -XXX,XX +XXX,XX @@ static void bcm2836_class_init(ObjectClass *oc, void *data)
31
#ifdef CONFIG_TCG
32
- /* Check whether this exception is a semihosting call; if so
33
- * then handle it and return true; otherwise return false.
34
- */
35
+static void handle_semihosting(CPUState *cs)
36
+{
37
ARMCPU *cpu = ARM_CPU(cs);
38
CPUARMState *env = &cpu->env;
39
40
if (is_a64(env)) {
41
- if (cs->exception_index == EXCP_SEMIHOST) {
42
- /* This is always the 64-bit semihosting exception.
43
- * The "is this usermode" and "is semihosting enabled"
44
- * checks have been done at translate time.
45
- */
46
- qemu_log_mask(CPU_LOG_INT,
47
- "...handling as semihosting call 0x%" PRIx64 "\n",
48
- env->xregs[0]);
49
- env->xregs[0] = do_arm_semihosting(env);
50
- return true;
51
- }
52
- return false;
53
+ qemu_log_mask(CPU_LOG_INT,
54
+ "...handling as semihosting call 0x%" PRIx64 "\n",
55
+ env->xregs[0]);
56
+ env->xregs[0] = do_arm_semihosting(env);
57
} else {
58
- uint32_t imm;
59
-
60
- /* Only intercept calls from privileged modes, to provide some
61
- * semblance of security.
62
- */
63
- if (cs->exception_index != EXCP_SEMIHOST &&
64
- (!semihosting_enabled() ||
65
- ((env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_USR))) {
66
- return false;
67
- }
68
-
69
- switch (cs->exception_index) {
70
- case EXCP_SEMIHOST:
71
- /* This is always a semihosting call; the "is this usermode"
72
- * and "is semihosting enabled" checks have been done at
73
- * translate time.
74
- */
75
- break;
76
- case EXCP_SWI:
77
- /* Check for semihosting interrupt. */
78
- if (env->thumb) {
79
- imm = arm_lduw_code(env, env->regs[15] - 2, arm_sctlr_b(env))
80
- & 0xff;
81
- if (imm == 0xab) {
82
- break;
83
- }
84
- } else {
85
- imm = arm_ldl_code(env, env->regs[15] - 4, arm_sctlr_b(env))
86
- & 0xffffff;
87
- if (imm == 0x123456) {
88
- break;
89
- }
90
- }
91
- return false;
92
- case EXCP_BKPT:
93
- /* See if this is a semihosting syscall. */
94
- if (env->thumb) {
95
- imm = arm_lduw_code(env, env->regs[15], arm_sctlr_b(env))
96
- & 0xff;
97
- if (imm == 0xab) {
98
- env->regs[15] += 2;
99
- break;
100
- }
101
- }
102
- return false;
103
- default:
104
- return false;
105
- }
106
-
107
qemu_log_mask(CPU_LOG_INT,
108
"...handling as semihosting call 0x%x\n",
109
env->regs[0]);
110
env->regs[0] = do_arm_semihosting(env);
111
- return true;
112
}
113
-#else
114
- return false;
115
-#endif
106
}
116
}
107
117
+#endif
108
static const TypeInfo bcm2836_type_info = {
118
109
- .name = TYPE_BCM2836,
119
/* Handle a CPU exception for A and R profile CPUs.
110
+ .name = TYPE_BCM283X,
120
* Do any appropriate logging, handle PSCI calls, and then hand off
111
.parent = TYPE_DEVICE,
121
@@ -XXX,XX +XXX,XX @@ void arm_cpu_do_interrupt(CPUState *cs)
112
- .instance_size = sizeof(BCM2836State),
122
return;
113
+ .instance_size = sizeof(BCM283XState),
123
}
114
.instance_init = bcm2836_init,
124
115
.class_init = bcm2836_class_init,
125
- /* Semihosting semantics depend on the register width of the
116
};
126
- * code that caused the exception, not the target exception level,
117
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
127
- * so must be handled here.
118
index XXXXXXX..XXXXXXX 100644
128
+ /*
119
--- a/hw/arm/raspi.c
129
+ * Semihosting semantics depend on the register width of the code
120
+++ b/hw/arm/raspi.c
130
+ * that caused the exception, not the target exception level, so
121
@@ -XXX,XX +XXX,XX @@
131
+ * must be handled here.
122
static const int raspi_boardid[] = {[1] = 0xc42, [2] = 0xc43, [3] = 0xc44};
132
*/
123
133
- if (check_for_semihosting(cs)) {
124
typedef struct RasPiState {
134
+#ifdef CONFIG_TCG
125
- BCM2836State soc;
135
+ if (cs->exception_index == EXCP_SEMIHOST) {
126
+ BCM283XState soc;
136
+ handle_semihosting(cs);
127
MemoryRegion ram;
137
return;
128
} RasPiState;
138
}
129
139
+#endif
130
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
140
131
BusState *bus;
141
/* Hooks may change global state so BQL should be held, also the
132
DeviceState *carddev;
142
* BQL needs to be held for any modification of
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
--
143
--
166
2.16.2
144
2.20.1
167
145
168
146
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
From: Alex Bennée <alex.bennee@linaro.org>
2
2
3
Code of imx_update() is slightly confusing since the "flags" variable
3
Now we do all our checking at translate time we can make cpu_loop a
4
doesn't really corespond to anything in real hardware and server as a
4
little bit simpler. We also introduce a simple linux-user semihosting
5
kitchensink accumulating events normally reported via USR1 and USR2
5
test case to defend the functionality. The out-of-tree softmmu based
6
registers.
6
semihosting tests are still more comprehensive.
7
7
8
Change the code to explicitly evaluate state of interrupts reported
8
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
9
via USR1 and USR2 against corresponding masking bits and use the to
9
Message-id: 20190913151845.12582-6-alex.bennee@linaro.org
10
detemine if IRQ line should be asserted or not.
11
12
NOTE: Check for UTS1_TXEMPTY being set has been dropped for two
13
reasons:
14
15
1. Emulation code implements a single character FIFO, so this flag
16
will always be set since characters are trasmitted as a part of
17
the code emulating "push" into the FIFO
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>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
31
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
32
---
12
---
33
hw/char/imx_serial.c | 24 ++++++++++++++++--------
13
linux-user/arm/target_syscall.h | 3 ---
34
1 file changed, 16 insertions(+), 8 deletions(-)
14
linux-user/arm/cpu_loop.c | 3 ---
15
2 files changed, 6 deletions(-)
35
16
36
diff --git a/hw/char/imx_serial.c b/hw/char/imx_serial.c
17
diff --git a/linux-user/arm/target_syscall.h b/linux-user/arm/target_syscall.h
37
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
38
--- a/hw/char/imx_serial.c
19
--- a/linux-user/arm/target_syscall.h
39
+++ b/hw/char/imx_serial.c
20
+++ b/linux-user/arm/target_syscall.h
40
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_imx_serial = {
21
@@ -XXX,XX +XXX,XX @@ struct target_pt_regs {
41
22
#define ARM_NR_set_tls     (ARM_NR_BASE + 5)
42
static void imx_update(IMXSerialState *s)
23
#define ARM_NR_get_tls (ARM_NR_BASE + 6)
43
{
24
44
- uint32_t flags;
25
-#define ARM_NR_semihosting     0x123456
45
+ uint32_t usr1;
26
-#define ARM_NR_thumb_semihosting 0xAB
46
+ uint32_t usr2;
27
-
47
+ uint32_t mask;
28
#if defined(TARGET_WORDS_BIGENDIAN)
48
29
#define UNAME_MACHINE "armv5teb"
49
- flags = (s->usr1 & s->ucr1) & (USR1_TRDY|USR1_RRDY);
30
#else
50
- if (s->ucr1 & UCR1_TXMPTYEN) {
31
diff --git a/linux-user/arm/cpu_loop.c b/linux-user/arm/cpu_loop.c
51
- flags |= (s->uts1 & UTS1_TXEMPTY);
32
index XXXXXXX..XXXXXXX 100644
52
- } else {
33
--- a/linux-user/arm/cpu_loop.c
53
- flags &= ~USR1_TRDY;
34
+++ b/linux-user/arm/cpu_loop.c
54
- }
35
@@ -XXX,XX +XXX,XX @@ void cpu_loop(CPUARMState *env)
55
+ /*
36
56
+ * Lucky for us TRDY and RRDY has the same offset in both USR1 and
37
if (n == ARM_NR_cacheflush) {
57
+ * UCR1, so we can get away with something as simple as the
38
/* nop */
58
+ * following:
39
- } else if (n == ARM_NR_semihosting
59
+ */
40
- || n == ARM_NR_thumb_semihosting) {
60
+ usr1 = s->usr1 & s->ucr1 & (USR1_TRDY | USR1_RRDY);
41
- env->regs[0] = do_arm_semihosting (env);
61
+ /*
42
} else if (n == 0 || n >= ARM_SYSCALL_BASE || env->thumb) {
62
+ * Bits that we want in USR2 are not as conveniently laid out,
43
/* linux syscall */
63
+ * unfortunately.
44
if (env->thumb || n == 0) {
64
+ */
65
+ mask = (s->ucr1 & UCR1_TXMPTYEN) ? USR2_TXFE : 0;
66
+ usr2 = s->usr2 & mask;
67
68
- qemu_set_irq(s->irq, !!flags);
69
+ qemu_set_irq(s->irq, usr1 || usr2);
70
}
71
72
static void imx_serial_reset(IMXSerialState *s)
73
--
45
--
74
2.16.2
46
2.20.1
75
47
76
48
diff view generated by jsdifflib
1
From: Guenter Roeck <linux@roeck-us.net>
1
From: Alex Bennée <alex.bennee@linaro.org>
2
2
3
The sabrelite machine model used by qemu-system-arm is based on the
3
We already use semihosting for the system stuff so this is a simple
4
Freescale/NXP i.MX6Q processor. This SoC has an on-board ethernet
4
smoke test to ensure we are working OK on linux-user.
5
controller which is supported in QEMU using the imx_fec.c module
6
(actually called imx.enet for this model.)
7
5
8
The include/hw/arm/fsm-imx6.h file defines the interrupt vectors for the
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
9
imx.enet device like this:
7
Message-id: 20190913151845.12582-7-alex.bennee@linaro.org
10
11
#define FSL_IMX6_ENET_MAC_1588_IRQ 118
12
#define FSL_IMX6_ENET_MAC_IRQ 119
13
14
According to https://www.nxp.com/docs/en/reference-manual/IMX6DQRM.pdf,
15
page 225, in Table 3-1. ARM Cortex A9 domain interrupt summary,
16
interrupts are as follows.
17
18
150 ENET MAC 0 IRQ
19
151 ENET MAC 0 1588 Timer interrupt
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>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
42
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
43
---
10
---
44
include/hw/arm/fsl-imx6.h | 4 ++--
11
tests/tcg/aarch64/Makefile.target | 5 ++++
45
hw/net/imx_fec.c | 28 +++++++++++++++++++++++++++-
12
tests/tcg/arm/Makefile.target | 5 ++++
46
2 files changed, 29 insertions(+), 3 deletions(-)
13
tests/tcg/arm/semihosting.c | 45 +++++++++++++++++++++++++++++++
14
3 files changed, 55 insertions(+)
15
create mode 100644 tests/tcg/arm/semihosting.c
47
16
48
diff --git a/include/hw/arm/fsl-imx6.h b/include/hw/arm/fsl-imx6.h
17
diff --git a/tests/tcg/aarch64/Makefile.target b/tests/tcg/aarch64/Makefile.target
49
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
50
--- a/include/hw/arm/fsl-imx6.h
19
--- a/tests/tcg/aarch64/Makefile.target
51
+++ b/include/hw/arm/fsl-imx6.h
20
+++ b/tests/tcg/aarch64/Makefile.target
52
@@ -XXX,XX +XXX,XX @@ typedef struct FslIMX6State {
21
@@ -XXX,XX +XXX,XX @@ run-fcvt: fcvt
53
#define FSL_IMX6_HDMI_MASTER_IRQ 115
22
AARCH64_TESTS += pauth-1 pauth-2
54
#define FSL_IMX6_HDMI_CEC_IRQ 116
23
run-pauth-%: QEMU_OPTS += -cpu max
55
#define FSL_IMX6_MLB150_LOW_IRQ 117
24
56
-#define FSL_IMX6_ENET_MAC_1588_IRQ 118
25
+# Semihosting smoke test for linux-user
57
-#define FSL_IMX6_ENET_MAC_IRQ 119
26
+AARCH64_TESTS += semihosting
58
+#define FSL_IMX6_ENET_MAC_IRQ 118
27
+run-semihosting: semihosting
59
+#define FSL_IMX6_ENET_MAC_1588_IRQ 119
28
+    $(call run-test,$<,$(QEMU) $< 2> $<.err, "$< on $(TARGET_NAME)")
60
#define FSL_IMX6_PCIE1_IRQ 120
29
+
61
#define FSL_IMX6_PCIE2_IRQ 121
30
TESTS += $(AARCH64_TESTS)
62
#define FSL_IMX6_PCIE3_IRQ 122
31
diff --git a/tests/tcg/arm/Makefile.target b/tests/tcg/arm/Makefile.target
63
diff --git a/hw/net/imx_fec.c b/hw/net/imx_fec.c
64
index XXXXXXX..XXXXXXX 100644
32
index XXXXXXX..XXXXXXX 100644
65
--- a/hw/net/imx_fec.c
33
--- a/tests/tcg/arm/Makefile.target
66
+++ b/hw/net/imx_fec.c
34
+++ b/tests/tcg/arm/Makefile.target
67
@@ -XXX,XX +XXX,XX @@ static void imx_enet_write_bd(IMXENETBufDesc *bd, dma_addr_t addr)
35
@@ -XXX,XX +XXX,XX @@ run-fcvt: fcvt
68
36
    $(call run-test,fcvt,$(QEMU) $<,"$< on $(TARGET_NAME)")
69
static void imx_eth_update(IMXFECState *s)
37
    $(call diff-out,fcvt,$(ARM_SRC)/fcvt.ref)
70
{
38
71
- if (s->regs[ENET_EIR] & s->regs[ENET_EIMR] & ENET_INT_TS_TIMER) {
39
+# Semihosting smoke test for linux-user
72
+ /*
40
+ARM_TESTS += semihosting
73
+ * Previous versions of qemu had the ENET_INT_MAC and ENET_INT_TS_TIMER
41
+run-semihosting: semihosting
74
+ * interrupts swapped. This worked with older versions of Linux (4.14
42
+    $(call run-test,$<,$(QEMU) $< 2> $<.err, "$< on $(TARGET_NAME)")
75
+ * and older) since Linux associated both interrupt lines with Ethernet
43
+
76
+ * MAC interrupts. Specifically,
44
TESTS += $(ARM_TESTS)
77
+ * - Linux 4.15 and later have separate interrupt handlers for the MAC and
45
78
+ * timer interrupts. Those versions of Linux fail with versions of QEMU
46
# On ARM Linux only supports 4k pages
79
+ * with swapped interrupt assignments.
47
diff --git a/tests/tcg/arm/semihosting.c b/tests/tcg/arm/semihosting.c
80
+ * - In linux 4.14, both interrupt lines were registered with the Ethernet
48
new file mode 100644
81
+ * MAC interrupt handler. As a result, all versions of qemu happen to
49
index XXXXXXX..XXXXXXX
82
+ * work, though that is accidental.
50
--- /dev/null
83
+ * - In Linux 4.9 and older, the timer interrupt was registered directly
51
+++ b/tests/tcg/arm/semihosting.c
84
+ * with the Ethernet MAC interrupt handler. The MAC interrupt was
52
@@ -XXX,XX +XXX,XX @@
85
+ * redirected to a GPIO interrupt to work around erratum ERR006687.
53
+/*
86
+ * This was implemented using the SOC's IOMUX block. In qemu, this GPIO
54
+ * linux-user semihosting checks
87
+ * interrupt never fired since IOMUX is currently not supported in qemu.
55
+ *
88
+ * Linux instead received MAC interrupts on the timer interrupt.
56
+ * Copyright (c) 2019
89
+ * As a result, qemu versions with the swapped interrupt assignment work,
57
+ * Written by Alex Bennée <alex.bennee@linaro.org>
90
+ * albeit accidentally, but qemu versions with the correct interrupt
58
+ *
91
+ * assignment fail.
59
+ * SPDX-License-Identifier: GPL-3.0-or-later
92
+ *
60
+ */
93
+ * To ensure that all versions of Linux work, generate ENET_INT_MAC
61
+
94
+ * interrrupts on both interrupt lines. This should be changed if and when
62
+#include <stdint.h>
95
+ * qemu supports IOMUX.
63
+
96
+ */
64
+#define SYS_WRITE0 0x04
97
+ if (s->regs[ENET_EIR] & s->regs[ENET_EIMR] &
65
+#define SYS_REPORTEXC 0x18
98
+ (ENET_INT_MAC | ENET_INT_TS_TIMER)) {
66
+
99
qemu_set_irq(s->irq[1], 1);
67
+void __semi_call(uintptr_t type, uintptr_t arg0)
100
} else {
68
+{
101
qemu_set_irq(s->irq[1], 0);
69
+#if defined(__arm__)
70
+ register uintptr_t t asm("r0") = type;
71
+ register uintptr_t a0 asm("r1") = arg0;
72
+ asm("svc 0xab"
73
+ : /* no return */
74
+ : "r" (t), "r" (a0));
75
+#else
76
+ register uintptr_t t asm("x0") = type;
77
+ register uintptr_t a0 asm("x1") = arg0;
78
+ asm("hlt 0xf000"
79
+ : /* no return */
80
+ : "r" (t), "r" (a0));
81
+#endif
82
+}
83
+
84
+int main(int argc, char *argv[argc])
85
+{
86
+#if defined(__arm__)
87
+ uintptr_t exit_code = 0x20026;
88
+#else
89
+ uintptr_t exit_block[2] = {0x20026, 0};
90
+ uintptr_t exit_code = (uintptr_t) &exit_block;
91
+#endif
92
+
93
+ __semi_call(SYS_WRITE0, (uintptr_t) "Hello World");
94
+ __semi_call(SYS_REPORTEXC, exit_code);
95
+ /* if we get here we failed */
96
+ return -1;
97
+}
102
--
98
--
103
2.16.2
99
2.20.1
104
100
105
101
diff view generated by jsdifflib
Deleted patch
1
For the rpi1 and 2 we want to boot the Linux kernel via some
2
custom setup code that makes sure that the SMC instruction
3
acts as a no-op, because it's used for cache maintenance.
4
The rpi3 boots AArch64 kernels, which don't need SMC for
5
cache maintenance and always expect to be booted non-secure.
6
Don't fill in the aarch32-specific parts of the binfo struct.
7
1
8
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>
11
Message-id: 20180313153458.26822-2-peter.maydell@linaro.org
12
---
13
hw/arm/raspi.c | 17 +++++++++++++----
14
1 file changed, 13 insertions(+), 4 deletions(-)
15
16
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/arm/raspi.c
19
+++ b/hw/arm/raspi.c
20
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
21
binfo.board_id = raspi_boardid[version];
22
binfo.ram_size = ram_size;
23
binfo.nb_cpus = smp_cpus;
24
- binfo.board_setup_addr = BOARDSETUP_ADDR;
25
- binfo.write_board_setup = write_board_setup;
26
- binfo.secure_board_setup = true;
27
- binfo.secure_boot = true;
28
+
29
+ if (version <= 2) {
30
+ /* The rpi1 and 2 require some custom setup code to run in Secure
31
+ * mode before booting a kernel (to set up the SMC vectors so
32
+ * that we get a no-op SMC; this is used by Linux to call the
33
+ * firmware for some cache maintenance operations.
34
+ * The rpi3 doesn't need this.
35
+ */
36
+ binfo.board_setup_addr = BOARDSETUP_ADDR;
37
+ binfo.write_board_setup = write_board_setup;
38
+ binfo.secure_board_setup = true;
39
+ binfo.secure_boot = true;
40
+ }
41
42
/* Pi2 and Pi3 requires SMP setup */
43
if (version >= 2) {
44
--
45
2.16.2
46
47
diff view generated by jsdifflib
1
If we're directly booting a Linux kernel and the CPU supports both
1
If we're booting a Linux kernel directly into Non-Secure
2
EL3 and EL2, we start the kernel in EL2, as it expects. We must also
2
state on a CPU which has Secure state, then make sure we
3
set the SCR_EL3.HCE bit in this situation, so that the HVC
3
set the NSACR CP11 and CP10 bits, so that Non-Secure is allowed
4
instruction is enabled rather than UNDEFing. Otherwise at least some
4
to access the FPU. Otherwise an AArch32 kernel will UNDEF as
5
kernels will panic when trying to initialize KVM in the guest.
5
soon as it tries to use the FPU.
6
6
7
It used to not matter that we didn't do this until commit
8
fc1120a7f5f2d4b6, where we implemented actually honouring
9
these NSACR bits.
10
11
The problem only exists for CPUs where EL3 is AArch32; the
12
equivalent AArch64 trap bits are in CPTR_EL3 and are "0 to
13
not trap, 1 to trap", so the reset value of the register
14
permits NS access, unlike NSACR.
15
16
Fixes: fc1120a7f5
17
Fixes: https://bugs.launchpad.net/qemu/+bug/1844597
18
Cc: qemu-stable@nongnu.org
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20180313153458.26822-4-peter.maydell@linaro.org
20
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
21
Message-id: 20190920174039.3916-1-peter.maydell@linaro.org
9
---
22
---
10
hw/arm/boot.c | 5 +++++
23
hw/arm/boot.c | 2 ++
11
1 file changed, 5 insertions(+)
24
1 file changed, 2 insertions(+)
12
25
13
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
26
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
14
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/boot.c
28
--- a/hw/arm/boot.c
16
+++ b/hw/arm/boot.c
29
+++ b/hw/arm/boot.c
17
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
30
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
18
assert(!info->secure_board_setup);
31
(cs != first_cpu || !info->secure_board_setup)) {
32
/* Linux expects non-secure state */
33
env->cp15.scr_el3 |= SCR_NS;
34
+ /* Set NSACR.{CP11,CP10} so NS can access the FPU */
35
+ env->cp15.nsacr |= 3 << 10;
19
}
36
}
20
37
}
21
+ if (arm_feature(env, ARM_FEATURE_EL2)) {
38
22
+ /* If we have EL2 then Linux expects the HVC insn to work */
23
+ env->cp15.scr_el3 |= SCR_HCE;
24
+ }
25
+
26
/* Set to non-secure if not a secure boot */
27
if (!info->secure_boot &&
28
(cs != first_cpu || !info->secure_board_setup)) {
29
--
39
--
30
2.16.2
40
2.20.1
31
41
32
42
diff view generated by jsdifflib
1
Add some assertions that if we're about to boot an AArch64 kernel,
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
the board code has not mistakenly set either secure_boot or
3
secure_board_setup. It doesn't make sense to set secure_boot,
4
because all AArch64 kernels must be booted in non-secure mode.
5
2
6
It might in theory make sense to set secure_board_setup, but
3
IEC binary prefixes ease code review: the unit is explicit.
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
4
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
7
Reviewed-by: Thomas Huth <thuth@redhat.com>
8
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20190923131108.21459-1-philmd@redhat.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-3-peter.maydell@linaro.org
16
---
11
---
17
hw/arm/boot.c | 7 +++++++
12
hw/arm/boot.c | 10 +++++-----
18
1 file changed, 7 insertions(+)
13
1 file changed, 5 insertions(+), 5 deletions(-)
19
14
20
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
15
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
21
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/boot.c
17
--- a/hw/arm/boot.c
23
+++ b/hw/arm/boot.c
18
+++ b/hw/arm/boot.c
24
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
19
@@ -XXX,XX +XXX,XX @@ int arm_load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
25
} else {
20
goto fail;
26
env->pstate = PSTATE_MODE_EL1h;
21
}
27
}
22
28
+ /* AArch64 kernels never boot in secure mode */
23
- if (scells < 2 && binfo->ram_size >= (1ULL << 32)) {
29
+ assert(!info->secure_boot);
24
+ if (scells < 2 && binfo->ram_size >= 4 * GiB) {
30
+ /* This hook is only supported for AArch32 currently:
25
/* This is user error so deserves a friendlier error message
31
+ * bootloader_aarch64[] will not call the hook, and
26
* than the failure of setprop_sized_cells would provide
32
+ * the code above has already dropped us into EL2 or EL1.
27
*/
33
+ */
28
@@ -XXX,XX +XXX,XX @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
34
+ assert(!info->secure_board_setup);
29
* we might still make a bad choice here.
35
}
30
*/
36
31
info->initrd_start = info->loader_start +
37
/* Set to non-secure if not a secure boot */
32
- MIN(info->ram_size / 2, 128 * 1024 * 1024);
33
+ MIN(info->ram_size / 2, 128 * MiB);
34
if (image_high_addr) {
35
info->initrd_start = MAX(info->initrd_start, image_high_addr);
36
}
37
@@ -XXX,XX +XXX,XX @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
38
*
39
* Let's play safe and prealign it to 2MB to give us some space.
40
*/
41
- align = 2 * 1024 * 1024;
42
+ align = 2 * MiB;
43
} else {
44
/*
45
* Some 32bit kernels will trash anything in the 4K page the
46
* initrd ends in, so make sure the DTB isn't caught up in that.
47
*/
48
- align = 4096;
49
+ align = 4 * KiB;
50
}
51
52
/* Place the DTB after the initrd in memory with alignment. */
53
@@ -XXX,XX +XXX,XX @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
54
info->loader_start + KERNEL_ARGS_ADDR;
55
fixupcontext[FIXUP_ARGPTR_HI] =
56
(info->loader_start + KERNEL_ARGS_ADDR) >> 32;
57
- if (info->ram_size >= (1ULL << 32)) {
58
+ if (info->ram_size >= 4 * GiB) {
59
error_report("RAM size must be less than 4GB to boot"
60
" Linux kernel using ATAGS (try passing a device tree"
61
" using -dtb)");
38
--
62
--
39
2.16.2
63
2.20.1
40
64
41
65
diff view generated by jsdifflib
Deleted patch
1
The TypeInfo and state struct for bcm2386 disagree about what the
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
1
10
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
---
15
hw/arm/bcm2836.c | 2 +-
16
1 file changed, 1 insertion(+), 1 deletion(-)
17
18
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/arm/bcm2836.c
21
+++ b/hw/arm/bcm2836.c
22
@@ -XXX,XX +XXX,XX @@ static void bcm2836_class_init(ObjectClass *oc, void *data)
23
24
static const TypeInfo bcm2836_type_info = {
25
.name = TYPE_BCM2836,
26
- .parent = TYPE_SYS_BUS_DEVICE,
27
+ .parent = TYPE_DEVICE,
28
.instance_size = sizeof(BCM2836State),
29
.instance_init = bcm2836_init,
30
.class_init = bcm2836_class_init,
31
--
32
2.16.2
33
34
diff view generated by jsdifflib
Deleted patch
1
The bcm2837 is pretty similar to the bcm2836, but it does have
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
1
6
Rather than trying to have one device with properties that
7
configure it differently for the two cases, create two
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
13
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
---
17
include/hw/arm/bcm2836.h | 19 +++++++++++++++++++
18
hw/arm/bcm2836.c | 37 ++++++++++++++++++++++++++++++++-----
19
hw/arm/raspi.c | 3 ++-
20
3 files changed, 53 insertions(+), 6 deletions(-)
21
22
diff --git a/include/hw/arm/bcm2836.h b/include/hw/arm/bcm2836.h
23
index XXXXXXX..XXXXXXX 100644
24
--- a/include/hw/arm/bcm2836.h
25
+++ b/include/hw/arm/bcm2836.h
26
@@ -XXX,XX +XXX,XX @@
27
28
#define BCM283X_NCPUS 4
29
30
+/* These type names are for specific SoCs; other than instantiating
31
+ * them, code using these devices should always handle them via the
32
+ * BCM283x base class, so they have no BCM2836(obj) etc macros.
33
+ */
34
+#define TYPE_BCM2836 "bcm2836"
35
+#define TYPE_BCM2837 "bcm2837"
36
+
37
typedef struct BCM283XState {
38
/*< private >*/
39
DeviceState parent_obj;
40
@@ -XXX,XX +XXX,XX @@ typedef struct BCM283XState {
41
BCM2835PeripheralState peripherals;
42
} BCM283XState;
43
44
+typedef struct BCM283XInfo BCM283XInfo;
45
+
46
+typedef struct BCM283XClass {
47
+ DeviceClass parent_class;
48
+ const BCM283XInfo *info;
49
+} BCM283XClass;
50
+
51
+#define BCM283X_CLASS(klass) \
52
+ OBJECT_CLASS_CHECK(BCM283XClass, (klass), TYPE_BCM283X)
53
+#define BCM283X_GET_CLASS(obj) \
54
+ OBJECT_GET_CLASS(BCM283XClass, (obj), TYPE_BCM283X)
55
+
56
#endif /* BCM2836_H */
57
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
58
index XXXXXXX..XXXXXXX 100644
59
--- a/hw/arm/bcm2836.c
60
+++ b/hw/arm/bcm2836.c
61
@@ -XXX,XX +XXX,XX @@
62
/* "QA7" (Pi2) interrupt controller and mailboxes etc. */
63
#define BCM2836_CONTROL_BASE 0x40000000
64
65
+struct BCM283XInfo {
66
+ const char *name;
67
+};
68
+
69
+static const BCM283XInfo bcm283x_socs[] = {
70
+ {
71
+ .name = TYPE_BCM2836,
72
+ },
73
+ {
74
+ .name = TYPE_BCM2837,
75
+ },
76
+};
77
+
78
static void bcm2836_init(Object *obj)
79
{
80
BCM283XState *s = BCM283X(obj);
81
@@ -XXX,XX +XXX,XX @@ static Property bcm2836_props[] = {
82
DEFINE_PROP_END_OF_LIST()
83
};
84
85
-static void bcm2836_class_init(ObjectClass *oc, void *data)
86
+static void bcm283x_class_init(ObjectClass *oc, void *data)
87
{
88
DeviceClass *dc = DEVICE_CLASS(oc);
89
+ BCM283XClass *bc = BCM283X_CLASS(oc);
90
91
- dc->props = bcm2836_props;
92
+ bc->info = data;
93
dc->realize = bcm2836_realize;
94
+ dc->props = bcm2836_props;
95
}
96
97
-static const TypeInfo bcm2836_type_info = {
98
+static const TypeInfo bcm283x_type_info = {
99
.name = TYPE_BCM283X,
100
.parent = TYPE_DEVICE,
101
.instance_size = sizeof(BCM283XState),
102
.instance_init = bcm2836_init,
103
- .class_init = bcm2836_class_init,
104
+ .class_size = sizeof(BCM283XClass),
105
+ .abstract = true,
106
};
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
+ }
123
}
124
125
type_init(bcm2836_register_types)
126
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
127
index XXXXXXX..XXXXXXX 100644
128
--- a/hw/arm/raspi.c
129
+++ b/hw/arm/raspi.c
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_BCM283X);
135
+ object_initialize(&s->soc, sizeof(s->soc),
136
+ version == 3 ? TYPE_BCM2837 : TYPE_BCM2836);
137
object_property_add_child(OBJECT(machine), "soc", OBJECT(&s->soc),
138
&error_abort);
139
140
--
141
2.16.2
142
143
diff view generated by jsdifflib
Deleted patch
1
The BCM2837 sets the Aff1 field of the MPIDR affinity values for the
2
CPUs to 0, whereas the BCM2836 uses 0xf. Set this correctly, as it
3
is required for Linux to boot.
4
1
5
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>
8
Message-id: 20180313153458.26822-8-peter.maydell@linaro.org
9
---
10
hw/arm/bcm2836.c | 11 +++++++----
11
1 file changed, 7 insertions(+), 4 deletions(-)
12
13
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/bcm2836.c
16
+++ b/hw/arm/bcm2836.c
17
@@ -XXX,XX +XXX,XX @@
18
19
struct BCM283XInfo {
20
const char *name;
21
+ int clusterid;
22
};
23
24
static const BCM283XInfo bcm283x_socs[] = {
25
{
26
.name = TYPE_BCM2836,
27
+ .clusterid = 0xf,
28
},
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
--
58
2.16.2
59
60
diff view generated by jsdifflib