1
Arm patch queue -- these are all bug fix patches but we might
1
First arm pullreq of the 2.13 cycle!
2
as well put them in to rc0...
3
2
4
thanks
5
-- PMM
3
-- PMM
6
4
7
The following changes since commit 2c8cfc0b52b5a4d123c26c0b5fdf941be24805be:
5
The following changes since commit 4743c23509a51bd4ee85cc272287a41917d1be35:
8
6
9
Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging (2018-03-19 11:44:26 +0000)
7
Update version for v2.12.0 release (2018-04-24 16:44:55 +0100)
10
8
11
are available in the Git repository at:
9
are available in the Git repository at:
12
10
13
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180319
11
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180426
14
12
15
for you to fetch changes up to ff72cb6b46b95bb530787add5277c211af3d31c6:
13
for you to fetch changes up to fbf32752663878947de455ff57cb5b9318f14bec:
16
14
17
hw/arm/raspi: Provide spin-loop code for AArch64 CPUs (2018-03-19 18:23:24 +0000)
15
xilinx_spips: Correct SNOOP_NONE state when flushing the txfifo (2018-04-26 11:04:40 +0100)
18
16
19
----------------------------------------------------------------
17
----------------------------------------------------------------
20
target-arm queue:
18
target-arm queue:
21
* fsl-imx6: Fix incorrect Ethernet interrupt defines
19
* xilinx_spips: Correct SNOOP_NONE state when flushing the txfifo
22
* dump: Update correct kdump phys_base field for AArch64
20
* timer/aspeed: fix vmstate version id
23
* char: i.MX: Add support for "TX complete" interrupt
21
* hw/arm/aspeed_soc: don't use vmstate_register_ram_global for SRAM
24
* bcm2836/raspi: Fix various bugs resulting in panics trying
22
* hw/arm/aspeed: don't make 'boot_rom' region 'nomigrate'
25
to boot a Debian Linux kernel on raspi3
23
* hw/arm/highbank: don't make sysram 'nomigrate'
24
* hw/arm/raspi: Don't bother setting default_cpu_type
25
* PMU emulation: some minor bugfixes and preparation for
26
support of other events than just the cycle counter
27
* target/arm: Use v7m_stack_read() for reading the frame signature
28
* target/arm: Remove stale TODO comment
29
* arm: always start from first_cpu when registering loader cpu reset callback
30
* device_tree: Increase FDT_MAX_SIZE to 1 MiB
26
31
27
----------------------------------------------------------------
32
----------------------------------------------------------------
28
Andrey Smirnov (2):
33
Aaron Lindsay (9):
29
char: i.MX: Simplify imx_update()
34
target/arm: Check PMCNTEN for whether PMCCNTR is enabled
30
char: i.MX: Add support for "TX complete" interrupt
35
target/arm: Treat PMCCNTR as alias of PMCCNTR_EL0
36
target/arm: Mask PMU register writes based on PMCR_EL0.N
37
target/arm: Fetch GICv3 state directly from CPUARMState
38
target/arm: Support multiple EL change hooks
39
target/arm: Add pre-EL change hooks
40
target/arm: Allow EL change hooks to do IO
41
target/arm: Fix bitmask for PMCCFILTR writes
42
target/arm: Make PMOVSCLR and PMUSERENR 64 bits wide
31
43
32
Guenter Roeck (1):
44
Cédric Le Goater (1):
33
fsl-imx6: Swap Ethernet interrupt defines
45
timer/aspeed: fix vmstate version id
34
46
35
Peter Maydell (9):
47
Geert Uytterhoeven (1):
36
hw/arm/raspi: Don't do board-setup or secure-boot for raspi3
48
device_tree: Increase FDT_MAX_SIZE to 1 MiB
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
49
46
Wei Huang (1):
50
Igor Mammedov (1):
47
dump: Update correct kdump phys_base field for AArch64
51
arm: always start from first_cpu when registering loader cpu reset callback
48
52
49
include/hw/arm/bcm2836.h | 31 +++++++++++++---
53
Peter Maydell (6):
50
include/hw/arm/fsl-imx6.h | 4 +-
54
target/arm: Remove stale TODO comment
51
include/hw/char/imx_serial.h | 3 ++
55
target/arm: Use v7m_stack_read() for reading the frame signature
52
dump.c | 14 +++++--
56
hw/arm/raspi: Don't bother setting default_cpu_type
53
hw/arm/bcm2836.c | 87 +++++++++++++++++++++++++++++++-------------
57
hw/arm/highbank: don't make sysram 'nomigrate'
54
hw/arm/boot.c | 12 ++++++
58
hw/arm/aspeed: don't make 'boot_rom' region 'nomigrate'
55
hw/arm/raspi.c | 77 +++++++++++++++++++++++++++++++--------
59
hw/arm/aspeed_soc: don't use vmstate_register_ram_global for SRAM
56
hw/char/imx_serial.c | 44 ++++++++++++++++------
57
hw/net/imx_fec.c | 28 +++++++++++++-
58
9 files changed, 237 insertions(+), 63 deletions(-)
59
60
61
Sai Pavan Boddu (1):
62
xilinx_spips: Correct SNOOP_NONE state when flushing the txfifo
63
64
target/arm/cpu.h | 48 +++++++++++++++++-------------
65
target/arm/internals.h | 14 +++++++--
66
device_tree.c | 2 +-
67
hw/arm/aspeed.c | 2 +-
68
hw/arm/aspeed_soc.c | 3 +-
69
hw/arm/boot.c | 2 +-
70
hw/arm/highbank.c | 2 +-
71
hw/arm/raspi.c | 2 --
72
hw/intc/arm_gicv3_cpuif.c | 10 ++-----
73
hw/ssi/xilinx_spips.c | 3 +-
74
hw/timer/aspeed_timer.c | 2 +-
75
target/arm/cpu.c | 37 +++++++++++++++++++----
76
target/arm/helper.c | 73 ++++++++++++++++++++++++++--------------------
77
target/arm/op_helper.c | 8 +++++
78
target/arm/translate-a64.c | 6 ++++
79
target/arm/translate.c | 12 ++++++++
80
16 files changed, 148 insertions(+), 78 deletions(-)
81
diff view generated by jsdifflib
New patch
1
From: Geert Uytterhoeven <geert+renesas@glider.be>
1
2
3
It is not uncommon for a contemporary FDT to be larger than 64 KiB,
4
leading to failures loading the device tree from sysfs:
5
6
qemu-system-aarch64: qemu_fdt_setprop: Couldn't set ...: FDT_ERR_NOSPACE
7
8
Hence increase the limit to 1 MiB, like on PPC.
9
10
For reference, the largest arm64 DTB created from the Linux sources is
11
ca. 75 KiB large (100 KiB when built with symbols/fixup support).
12
13
Cc: qemu-stable@nongnu.org
14
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
15
Message-id: 1523541337-23919-1-git-send-email-geert+renesas@glider.be
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
---
19
device_tree.c | 2 +-
20
1 file changed, 1 insertion(+), 1 deletion(-)
21
22
diff --git a/device_tree.c b/device_tree.c
23
index XXXXXXX..XXXXXXX 100644
24
--- a/device_tree.c
25
+++ b/device_tree.c
26
@@ -XXX,XX +XXX,XX @@
27
28
#include <libfdt.h>
29
30
-#define FDT_MAX_SIZE 0x10000
31
+#define FDT_MAX_SIZE 0x100000
32
33
void *create_device_tree(int *sizep)
34
{
35
--
36
2.17.0
37
38
diff view generated by jsdifflib
1
If we're directly booting a Linux kernel and the CPU supports both
1
From: Igor Mammedov <imammedo@redhat.com>
2
EL3 and EL2, we start the kernel in EL2, as it expects. We must also
3
set the SCR_EL3.HCE bit in this situation, so that the HVC
4
instruction is enabled rather than UNDEFing. Otherwise at least some
5
kernels will panic when trying to initialize KVM in the guest.
6
2
3
if arm_load_kernel() were passed non first_cpu, QEMU would end up
4
with partially set do_cpu_reset() callback leaving some CPUs without it.
5
6
Make sure that do_cpu_reset() is registered for all CPUs by enumerating
7
CPUs from first_cpu.
8
9
(In practice every board that we have was passing us the first CPU
10
as the boot CPU, either directly or indirectly, so this wasn't
11
causing incorrect behaviour.)
12
13
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
14
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
[PMM: added a note that this isn't a behaviour change]
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20180313153458.26822-4-peter.maydell@linaro.org
9
---
17
---
10
hw/arm/boot.c | 5 +++++
18
hw/arm/boot.c | 2 +-
11
1 file changed, 5 insertions(+)
19
1 file changed, 1 insertion(+), 1 deletion(-)
12
20
13
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
21
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
14
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/boot.c
23
--- a/hw/arm/boot.c
16
+++ b/hw/arm/boot.c
24
+++ b/hw/arm/boot.c
17
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
25
@@ -XXX,XX +XXX,XX @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
18
assert(!info->secure_board_setup);
26
* actually loading a kernel, the handler is also responsible for
19
}
27
* arranging that we start it correctly.
20
28
*/
21
+ if (arm_feature(env, ARM_FEATURE_EL2)) {
29
- for (cs = CPU(cpu); cs; cs = CPU_NEXT(cs)) {
22
+ /* If we have EL2 then Linux expects the HVC insn to work */
30
+ for (cs = first_cpu; cs; cs = CPU_NEXT(cs)) {
23
+ env->cp15.scr_el3 |= SCR_HCE;
31
qemu_register_reset(do_cpu_reset, ARM_CPU(cs));
24
+ }
32
}
25
+
33
}
26
/* Set to non-secure if not a secure boot */
27
if (!info->secure_boot &&
28
(cs != first_cpu || !info->secure_board_setup)) {
29
--
34
--
30
2.16.2
35
2.17.0
31
36
32
37
diff view generated by jsdifflib
New patch
1
Remove a stale TODO comment -- we have now made the arm_ldl_ptw()
2
and arm_ldq_ptw() functions propagate physical memory read errors
3
out to their callers.
1
4
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20180419142151.9862-1-peter.maydell@linaro.org
8
---
9
target/arm/helper.c | 8 +-------
10
1 file changed, 1 insertion(+), 7 deletions(-)
11
12
diff --git a/target/arm/helper.c b/target/arm/helper.c
13
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/helper.c
15
+++ b/target/arm/helper.c
16
@@ -XXX,XX +XXX,XX @@ static hwaddr S1_ptw_translate(CPUARMState *env, ARMMMUIdx mmu_idx,
17
return addr;
18
}
19
20
-/* All loads done in the course of a page table walk go through here.
21
- * TODO: rather than ignoring errors from physical memory reads (which
22
- * are external aborts in ARM terminology) we should propagate this
23
- * error out so that we can turn it into a Data Abort if this walk
24
- * was being done for a CPU load/store or an address translation instruction
25
- * (but not if it was for a debug access).
26
- */
27
+/* All loads done in the course of a page table walk go through here. */
28
static uint32_t arm_ldl_ptw(CPUState *cs, hwaddr addr, bool is_secure,
29
ARMMMUIdx mmu_idx, ARMMMUFaultInfo *fi)
30
{
31
--
32
2.17.0
33
34
diff view generated by jsdifflib
1
Add some assertions that if we're about to boot an AArch64 kernel,
1
In commit 95695effe8caa552b8f2 we changed the v7M/v8M stack
2
the board code has not mistakenly set either secure_boot or
2
pop code to use a new v7m_stack_read() function that checks
3
secure_board_setup. It doesn't make sense to set secure_boot,
3
whether the read should fail due to an MPU or bus abort.
4
because all AArch64 kernels must be booted in non-secure mode.
4
We missed one call though, the one which reads the signature
5
word for the callee-saved register part of the frame.
5
6
6
It might in theory make sense to set secure_board_setup, but
7
Correct the omission.
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
8
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Message-id: 20180313153458.26822-3-peter.maydell@linaro.org
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Message-id: 20180419142106.9694-1-peter.maydell@linaro.org
16
---
13
---
17
hw/arm/boot.c | 7 +++++++
14
target/arm/helper.c | 9 +++++----
18
1 file changed, 7 insertions(+)
15
1 file changed, 5 insertions(+), 4 deletions(-)
19
16
20
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
17
diff --git a/target/arm/helper.c b/target/arm/helper.c
21
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/boot.c
19
--- a/target/arm/helper.c
23
+++ b/hw/arm/boot.c
20
+++ b/target/arm/helper.c
24
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
21
@@ -XXX,XX +XXX,XX @@ static bool v7m_push_stack(ARMCPU *cpu)
25
} else {
22
static void do_v7m_exception_exit(ARMCPU *cpu)
26
env->pstate = PSTATE_MODE_EL1h;
23
{
27
}
24
CPUARMState *env = &cpu->env;
28
+ /* AArch64 kernels never boot in secure mode */
25
- CPUState *cs = CPU(cpu);
29
+ assert(!info->secure_boot);
26
uint32_t excret;
30
+ /* This hook is only supported for AArch32 currently:
27
uint32_t xpsr;
31
+ * bootloader_aarch64[] will not call the hook, and
28
bool ufault = false;
32
+ * the code above has already dropped us into EL2 or EL1.
29
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
33
+ */
30
((excret & R_V7M_EXCRET_ES_MASK) == 0 ||
34
+ assert(!info->secure_board_setup);
31
(excret & R_V7M_EXCRET_DCRS_MASK) == 0)) {
35
}
32
uint32_t expected_sig = 0xfefa125b;
36
33
- uint32_t actual_sig = ldl_phys(cs->as, frameptr);
37
/* Set to non-secure if not a secure boot */
34
+ uint32_t actual_sig;
35
36
- if (expected_sig != actual_sig) {
37
+ pop_ok = v7m_stack_read(cpu, &actual_sig, frameptr, mmu_idx);
38
+
39
+ if (pop_ok && expected_sig != actual_sig) {
40
/* Take a SecureFault on the current stack */
41
env->v7m.sfsr |= R_V7M_SFSR_INVIS_MASK;
42
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_SECURE, false);
43
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
44
return;
45
}
46
47
- pop_ok =
48
+ pop_ok = pop_ok &&
49
v7m_stack_read(cpu, &env->regs[4], frameptr + 0x8, mmu_idx) &&
50
v7m_stack_read(cpu, &env->regs[4], frameptr + 0x8, mmu_idx) &&
51
v7m_stack_read(cpu, &env->regs[5], frameptr + 0xc, mmu_idx) &&
38
--
52
--
39
2.16.2
53
2.17.0
40
54
41
55
diff view generated by jsdifflib
New patch
1
From: Aaron Lindsay <alindsay@codeaurora.org>
1
2
3
Signed-off-by: Aaron Lindsay <alindsay@codeaurora.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 1523997485-1905-2-git-send-email-alindsay@codeaurora.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/helper.c | 2 +-
9
1 file changed, 1 insertion(+), 1 deletion(-)
10
11
diff --git a/target/arm/helper.c b/target/arm/helper.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/helper.c
14
+++ b/target/arm/helper.c
15
@@ -XXX,XX +XXX,XX @@ static inline bool arm_ccnt_enabled(CPUARMState *env)
16
{
17
/* This does not support checking PMCCFILTR_EL0 register */
18
19
- if (!(env->cp15.c9_pmcr & PMCRE)) {
20
+ if (!(env->cp15.c9_pmcr & PMCRE) || !(env->cp15.c9_pmcnten & (1 << 31))) {
21
return false;
22
}
23
24
--
25
2.17.0
26
27
diff view generated by jsdifflib
New patch
1
From: Aaron Lindsay <alindsay@codeaurora.org>
1
2
3
They share the same underlying state
4
5
Signed-off-by: Aaron Lindsay <alindsay@codeaurora.org>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Message-id: 1523997485-1905-3-git-send-email-alindsay@codeaurora.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/helper.c | 2 +-
11
1 file changed, 1 insertion(+), 1 deletion(-)
12
13
diff --git a/target/arm/helper.c b/target/arm/helper.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/helper.c
16
+++ b/target/arm/helper.c
17
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
18
.fieldoffset = offsetof(CPUARMState, cp15.c9_pmselr),
19
.writefn = pmselr_write, .raw_writefn = raw_write, },
20
{ .name = "PMCCNTR", .cp = 15, .crn = 9, .crm = 13, .opc1 = 0, .opc2 = 0,
21
- .access = PL0_RW, .resetvalue = 0, .type = ARM_CP_IO,
22
+ .access = PL0_RW, .resetvalue = 0, .type = ARM_CP_ALIAS | ARM_CP_IO,
23
.readfn = pmccntr_read, .writefn = pmccntr_write32,
24
.accessfn = pmreg_access_ccntr },
25
{ .name = "PMCCNTR_EL0", .state = ARM_CP_STATE_AA64,
26
--
27
2.17.0
28
29
diff view generated by jsdifflib
1
The bcm2837 is pretty similar to the bcm2836, but it does have
1
From: Aaron Lindsay <alindsay@codeaurora.org>
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
This is in preparation for enabling counters other than PMCCNTR
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
4
5
Signed-off-by: Aaron Lindsay <alindsay@codeaurora.org>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Message-id: 1523997485-1905-5-git-send-email-alindsay@codeaurora.org
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>
15
Message-id: 20180313153458.26822-7-peter.maydell@linaro.org
16
---
9
---
17
include/hw/arm/bcm2836.h | 19 +++++++++++++++++++
10
target/arm/helper.c | 31 ++++++++++++++++++++++---------
18
hw/arm/bcm2836.c | 37 ++++++++++++++++++++++++++++++++-----
11
1 file changed, 22 insertions(+), 9 deletions(-)
19
hw/arm/raspi.c | 3 ++-
20
3 files changed, 53 insertions(+), 6 deletions(-)
21
12
22
diff --git a/include/hw/arm/bcm2836.h b/include/hw/arm/bcm2836.h
13
diff --git a/target/arm/helper.c b/target/arm/helper.c
23
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
24
--- a/include/hw/arm/bcm2836.h
15
--- a/target/arm/helper.c
25
+++ b/include/hw/arm/bcm2836.h
16
+++ b/target/arm/helper.c
26
@@ -XXX,XX +XXX,XX @@
17
@@ -XXX,XX +XXX,XX @@ typedef struct V8M_SAttributes {
27
18
static void v8m_security_lookup(CPUARMState *env, uint32_t address,
28
#define BCM283X_NCPUS 4
19
MMUAccessType access_type, ARMMMUIdx mmu_idx,
29
20
V8M_SAttributes *sattrs);
30
+/* These type names are for specific SoCs; other than instantiating
21
-
31
+ * them, code using these devices should always handle them via the
22
-/* Definitions for the PMCCNTR and PMCR registers */
32
+ * BCM283x base class, so they have no BCM2836(obj) etc macros.
23
-#define PMCRD 0x8
33
+ */
24
-#define PMCRC 0x4
34
+#define TYPE_BCM2836 "bcm2836"
25
-#define PMCRE 0x1
35
+#define TYPE_BCM2837 "bcm2837"
26
#endif
27
28
static int vfp_gdb_get_reg(CPUARMState *env, uint8_t *buf, int reg)
29
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v6_cp_reginfo[] = {
30
REGINFO_SENTINEL
31
};
32
33
+/* Definitions for the PMU registers */
34
+#define PMCRN_MASK 0xf800
35
+#define PMCRN_SHIFT 11
36
+#define PMCRD 0x8
37
+#define PMCRC 0x4
38
+#define PMCRE 0x1
36
+
39
+
37
typedef struct BCM283XState {
40
+static inline uint32_t pmu_num_counters(CPUARMState *env)
38
/*< private >*/
41
+{
39
DeviceState parent_obj;
42
+ return (env->cp15.c9_pmcr & PMCRN_MASK) >> PMCRN_SHIFT;
40
@@ -XXX,XX +XXX,XX @@ typedef struct BCM283XState {
43
+}
41
BCM2835PeripheralState peripherals;
42
} BCM283XState;
43
44
+typedef struct BCM283XInfo BCM283XInfo;
45
+
44
+
46
+typedef struct BCM283XClass {
45
+/* Bits allowed to be set/cleared for PMCNTEN* and PMINTEN* */
47
+ DeviceClass parent_class;
46
+static inline uint64_t pmu_counter_mask(CPUARMState *env)
48
+ const BCM283XInfo *info;
47
+{
49
+} BCM283XClass;
48
+ return (1 << 31) | ((1 << pmu_num_counters(env)) - 1);
49
+}
50
+
50
+
51
+#define BCM283X_CLASS(klass) \
51
static CPAccessResult pmreg_access(CPUARMState *env, const ARMCPRegInfo *ri,
52
+ OBJECT_CLASS_CHECK(BCM283XClass, (klass), TYPE_BCM283X)
52
bool isread)
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
{
53
{
80
BCM283XState *s = BCM283X(obj);
54
@@ -XXX,XX +XXX,XX @@ static void pmccfiltr_write(CPUARMState *env, const ARMCPRegInfo *ri,
81
@@ -XXX,XX +XXX,XX @@ static Property bcm2836_props[] = {
55
static void pmcntenset_write(CPUARMState *env, const ARMCPRegInfo *ri,
82
DEFINE_PROP_END_OF_LIST()
56
uint64_t value)
83
};
84
85
-static void bcm2836_class_init(ObjectClass *oc, void *data)
86
+static void bcm283x_class_init(ObjectClass *oc, void *data)
87
{
57
{
88
DeviceClass *dc = DEVICE_CLASS(oc);
58
- value &= (1 << 31);
89
+ BCM283XClass *bc = BCM283X_CLASS(oc);
59
+ value &= pmu_counter_mask(env);
90
60
env->cp15.c9_pmcnten |= value;
91
- dc->props = bcm2836_props;
92
+ bc->info = data;
93
dc->realize = bcm2836_realize;
94
+ dc->props = bcm2836_props;
95
}
61
}
96
62
97
-static const TypeInfo bcm2836_type_info = {
63
static void pmcntenclr_write(CPUARMState *env, const ARMCPRegInfo *ri,
98
+static const TypeInfo bcm283x_type_info = {
64
uint64_t value)
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
{
65
{
110
- type_register_static(&bcm2836_type_info);
66
- value &= (1 << 31);
111
+ int i;
67
+ value &= pmu_counter_mask(env);
112
+
68
env->cp15.c9_pmcnten &= ~value;
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
}
69
}
124
70
125
type_init(bcm2836_register_types)
71
@@ -XXX,XX +XXX,XX @@ static void pmintenset_write(CPUARMState *env, const ARMCPRegInfo *ri,
126
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
72
uint64_t value)
127
index XXXXXXX..XXXXXXX 100644
73
{
128
--- a/hw/arm/raspi.c
74
/* We have no event counters so only the C bit can be changed */
129
+++ b/hw/arm/raspi.c
75
- value &= (1 << 31);
130
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
76
+ value &= pmu_counter_mask(env);
131
BusState *bus;
77
env->cp15.c9_pminten |= value;
132
DeviceState *carddev;
78
}
133
79
134
- object_initialize(&s->soc, sizeof(s->soc), TYPE_BCM283X);
80
static void pmintenclr_write(CPUARMState *env, const ARMCPRegInfo *ri,
135
+ object_initialize(&s->soc, sizeof(s->soc),
81
uint64_t value)
136
+ version == 3 ? TYPE_BCM2837 : TYPE_BCM2836);
82
{
137
object_property_add_child(OBJECT(machine), "soc", OBJECT(&s->soc),
83
- value &= (1 << 31);
138
&error_abort);
84
+ value &= pmu_counter_mask(env);
85
env->cp15.c9_pminten &= ~value;
86
}
139
87
140
--
88
--
141
2.16.2
89
2.17.0
142
90
143
91
diff view generated by jsdifflib
New patch
1
From: Aaron Lindsay <alindsay@codeaurora.org>
1
2
3
This eliminates the need for fetching it from el_change_hook_opaque, and
4
allows for supporting multiple el_change_hooks without having to hack
5
something together to find the registered opaque belonging to GICv3.
6
7
Signed-off-by: Aaron Lindsay <alindsay@codeaurora.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 1523997485-1905-6-git-send-email-alindsay@codeaurora.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/cpu.h | 10 ----------
13
hw/intc/arm_gicv3_cpuif.c | 10 ++--------
14
2 files changed, 2 insertions(+), 18 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 @@ static inline AddressSpace *arm_addressspace(CPUState *cs, MemTxAttrs attrs)
21
void arm_register_el_change_hook(ARMCPU *cpu, ARMELChangeHook *hook,
22
void *opaque);
23
24
-/**
25
- * arm_get_el_change_hook_opaque:
26
- * Return the opaque data that will be used by the el_change_hook
27
- * for this CPU.
28
- */
29
-static inline void *arm_get_el_change_hook_opaque(ARMCPU *cpu)
30
-{
31
- return cpu->el_change_hook_opaque;
32
-}
33
-
34
/**
35
* aa32_vfp_dreg:
36
* Return a pointer to the Dn register within env in 32-bit mode.
37
diff --git a/hw/intc/arm_gicv3_cpuif.c b/hw/intc/arm_gicv3_cpuif.c
38
index XXXXXXX..XXXXXXX 100644
39
--- a/hw/intc/arm_gicv3_cpuif.c
40
+++ b/hw/intc/arm_gicv3_cpuif.c
41
@@ -XXX,XX +XXX,XX @@ void gicv3_set_gicv3state(CPUState *cpu, GICv3CPUState *s)
42
43
static GICv3CPUState *icc_cs_from_env(CPUARMState *env)
44
{
45
- /* Given the CPU, find the right GICv3CPUState struct.
46
- * Since we registered the CPU interface with the EL change hook as
47
- * the opaque pointer, we can just directly get from the CPU to it.
48
- */
49
- return arm_get_el_change_hook_opaque(arm_env_get_cpu(env));
50
+ return env->gicv3state;
51
}
52
53
static bool gicv3_use_ns_bank(CPUARMState *env)
54
@@ -XXX,XX +XXX,XX @@ void gicv3_init_cpuif(GICv3State *s)
55
* it might be with code translated by CPU 0 but run by CPU 1, in
56
* which case we'd get the wrong value.
57
* So instead we define the regs with no ri->opaque info, and
58
- * get back to the GICv3CPUState from the ARMCPU by reading back
59
- * the opaque pointer from the el_change_hook, which we're going
60
- * to need to register anyway.
61
+ * get back to the GICv3CPUState from the CPUARMState.
62
*/
63
define_arm_cp_regs(cpu, gicv3_cpuif_reginfo);
64
if (arm_feature(&cpu->env, ARM_FEATURE_EL2)
65
--
66
2.17.0
67
68
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
From: Aaron Lindsay <alindsay@codeaurora.org>
2
2
3
Code of imx_update() is slightly confusing since the "flags" variable
3
Signed-off-by: Aaron Lindsay <alindsay@codeaurora.org>
4
doesn't really corespond to anything in real hardware and server as a
4
Message-id: 1523997485-1905-7-git-send-email-alindsay@codeaurora.org
5
kitchensink accumulating events normally reported via USR1 and USR2
6
registers.
7
8
Change the code to explicitly evaluate state of interrupts reported
9
via USR1 and USR2 against corresponding masking bits and use the to
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>
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
31
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
32
---
7
---
33
hw/char/imx_serial.c | 24 ++++++++++++++++--------
8
target/arm/cpu.h | 20 ++++++++++----------
34
1 file changed, 16 insertions(+), 8 deletions(-)
9
target/arm/internals.h | 7 ++++---
10
target/arm/cpu.c | 21 ++++++++++++++++-----
11
3 files changed, 30 insertions(+), 18 deletions(-)
35
12
36
diff --git a/hw/char/imx_serial.c b/hw/char/imx_serial.c
13
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
37
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
38
--- a/hw/char/imx_serial.c
15
--- a/target/arm/cpu.h
39
+++ b/hw/char/imx_serial.c
16
+++ b/target/arm/cpu.h
40
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_imx_serial = {
17
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
41
18
} CPUARMState;
42
static void imx_update(IMXSerialState *s)
19
20
/**
21
- * ARMELChangeHook:
22
+ * ARMELChangeHookFn:
23
* type of a function which can be registered via arm_register_el_change_hook()
24
* to get callbacks when the CPU changes its exception level or mode.
25
*/
26
-typedef void ARMELChangeHook(ARMCPU *cpu, void *opaque);
27
-
28
+typedef void ARMELChangeHookFn(ARMCPU *cpu, void *opaque);
29
+typedef struct ARMELChangeHook ARMELChangeHook;
30
+struct ARMELChangeHook {
31
+ ARMELChangeHookFn *hook;
32
+ void *opaque;
33
+ QLIST_ENTRY(ARMELChangeHook) node;
34
+};
35
36
/* These values map onto the return values for
37
* QEMU_PSCI_0_2_FN_AFFINITY_INFO */
38
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
39
*/
40
bool cfgend;
41
42
- ARMELChangeHook *el_change_hook;
43
- void *el_change_hook_opaque;
44
+ QLIST_HEAD(, ARMELChangeHook) el_change_hooks;
45
46
int32_t node_id; /* NUMA node this CPU belongs to */
47
48
@@ -XXX,XX +XXX,XX @@ static inline AddressSpace *arm_addressspace(CPUState *cs, MemTxAttrs attrs)
49
* CPU changes exception level or mode. The hook function will be
50
* passed a pointer to the ARMCPU and the opaque data pointer passed
51
* to this function when the hook was registered.
52
- *
53
- * Note that we currently only support registering a single hook function,
54
- * and will assert if this function is called twice.
55
- * This facility is intended for the use of the GICv3 emulation.
56
*/
57
-void arm_register_el_change_hook(ARMCPU *cpu, ARMELChangeHook *hook,
58
+void arm_register_el_change_hook(ARMCPU *cpu, ARMELChangeHookFn *hook,
59
void *opaque);
60
61
/**
62
diff --git a/target/arm/internals.h b/target/arm/internals.h
63
index XXXXXXX..XXXXXXX 100644
64
--- a/target/arm/internals.h
65
+++ b/target/arm/internals.h
66
@@ -XXX,XX +XXX,XX @@ void arm_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
67
int mmu_idx, MemTxAttrs attrs,
68
MemTxResult response, uintptr_t retaddr);
69
70
-/* Call the EL change hook if one has been registered */
71
+/* Call any registered EL change hooks */
72
static inline void arm_call_el_change_hook(ARMCPU *cpu)
43
{
73
{
44
- uint32_t flags;
74
- if (cpu->el_change_hook) {
45
+ uint32_t usr1;
75
- cpu->el_change_hook(cpu, cpu->el_change_hook_opaque);
46
+ uint32_t usr2;
76
+ ARMELChangeHook *hook, *next;
47
+ uint32_t mask;
77
+ QLIST_FOREACH_SAFE(hook, &cpu->el_change_hooks, node, next) {
48
78
+ hook->hook(cpu, hook->opaque);
49
- flags = (s->usr1 & s->ucr1) & (USR1_TRDY|USR1_RRDY);
79
}
50
- if (s->ucr1 & UCR1_TXMPTYEN) {
51
- flags |= (s->uts1 & UTS1_TXEMPTY);
52
- } else {
53
- flags &= ~USR1_TRDY;
54
- }
55
+ /*
56
+ * Lucky for us TRDY and RRDY has the same offset in both USR1 and
57
+ * UCR1, so we can get away with something as simple as the
58
+ * following:
59
+ */
60
+ usr1 = s->usr1 & s->ucr1 & (USR1_TRDY | USR1_RRDY);
61
+ /*
62
+ * Bits that we want in USR2 are not as conveniently laid out,
63
+ * unfortunately.
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
}
80
}
71
81
72
static void imx_serial_reset(IMXSerialState *s)
82
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
83
index XXXXXXX..XXXXXXX 100644
84
--- a/target/arm/cpu.c
85
+++ b/target/arm/cpu.c
86
@@ -XXX,XX +XXX,XX @@ static bool arm_cpu_has_work(CPUState *cs)
87
| CPU_INTERRUPT_EXITTB);
88
}
89
90
-void arm_register_el_change_hook(ARMCPU *cpu, ARMELChangeHook *hook,
91
+void arm_register_el_change_hook(ARMCPU *cpu, ARMELChangeHookFn *hook,
92
void *opaque)
93
{
94
- /* We currently only support registering a single hook function */
95
- assert(!cpu->el_change_hook);
96
- cpu->el_change_hook = hook;
97
- cpu->el_change_hook_opaque = opaque;
98
+ ARMELChangeHook *entry = g_new0(ARMELChangeHook, 1);
99
+
100
+ entry->hook = hook;
101
+ entry->opaque = opaque;
102
+
103
+ QLIST_INSERT_HEAD(&cpu->el_change_hooks, entry, node);
104
}
105
106
static void cp_reg_reset(gpointer key, gpointer value, gpointer opaque)
107
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_initfn(Object *obj)
108
cpu->cp_regs = g_hash_table_new_full(g_int_hash, g_int_equal,
109
g_free, g_free);
110
111
+ QLIST_INIT(&cpu->el_change_hooks);
112
+
113
#ifndef CONFIG_USER_ONLY
114
/* Our inbound IRQ and FIQ lines */
115
if (kvm_enabled()) {
116
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_post_init(Object *obj)
117
static void arm_cpu_finalizefn(Object *obj)
118
{
119
ARMCPU *cpu = ARM_CPU(obj);
120
+ ARMELChangeHook *hook, *next;
121
+
122
g_hash_table_destroy(cpu->cp_regs);
123
+
124
+ QLIST_FOREACH_SAFE(hook, &cpu->el_change_hooks, node, next) {
125
+ QLIST_REMOVE(hook, node);
126
+ g_free(hook);
127
+ }
128
}
129
130
static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
73
--
131
--
74
2.16.2
132
2.17.0
75
133
76
134
diff view generated by jsdifflib
1
The raspi3 has AArch64 CPUs, which means that our smpboot
1
From: Aaron Lindsay <alindsay@codeaurora.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
Because the design of the PMU requires that the counter values be
4
converted between their delta and guest-visible forms for mode
5
filtering, an additional hook which occurs before the EL is changed is
6
necessary.
7
8
Signed-off-by: Aaron Lindsay <alindsay@codeaurora.org>
9
Message-id: 1523997485-1905-8-git-send-email-alindsay@codeaurora.org
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
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
---
12
---
11
hw/arm/raspi.c | 41 ++++++++++++++++++++++++++++++++++++++++-
13
target/arm/cpu.h | 22 +++++++++++++++++++---
12
1 file changed, 40 insertions(+), 1 deletion(-)
14
target/arm/internals.h | 7 +++++++
15
target/arm/cpu.c | 16 ++++++++++++++++
16
target/arm/helper.c | 14 ++++++++------
17
target/arm/op_helper.c | 8 ++++++++
18
5 files changed, 58 insertions(+), 9 deletions(-)
13
19
14
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
20
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
15
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/raspi.c
22
--- a/target/arm/cpu.h
17
+++ b/hw/arm/raspi.c
23
+++ b/target/arm/cpu.h
18
@@ -XXX,XX +XXX,XX @@
24
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
19
#define BOARDSETUP_ADDR (MVBAR_ADDR + 0x20) /* board setup code */
25
*/
20
#define FIRMWARE_ADDR_2 0x8000 /* Pi 2 loads kernel.img here by default */
26
bool cfgend;
21
#define FIRMWARE_ADDR_3 0x80000 /* Pi 3 loads kernel.img here by default */
27
22
+#define SPINTABLE_ADDR 0xd8 /* Pi 3 bootloader spintable */
28
+ QLIST_HEAD(, ARMELChangeHook) pre_el_change_hooks;
23
29
QLIST_HEAD(, ARMELChangeHook) el_change_hooks;
24
/* Table of Linux board IDs for different Pi versions */
30
25
static const int raspi_boardid[] = {[1] = 0xc42, [2] = 0xc43, [3] = 0xc44};
31
int32_t node_id; /* NUMA node this CPU belongs to */
26
@@ -XXX,XX +XXX,XX @@ static void write_smpboot(ARMCPU *cpu, const struct arm_boot_info *info)
32
@@ -XXX,XX +XXX,XX @@ static inline AddressSpace *arm_addressspace(CPUState *cs, MemTxAttrs attrs)
27
info->smp_loader_start);
33
#endif
34
35
/**
36
- * arm_register_el_change_hook:
37
- * Register a hook function which will be called back whenever this
38
+ * arm_register_pre_el_change_hook:
39
+ * Register a hook function which will be called immediately before this
40
* CPU changes exception level or mode. The hook function will be
41
* passed a pointer to the ARMCPU and the opaque data pointer passed
42
* to this function when the hook was registered.
43
+ *
44
+ * Note that if a pre-change hook is called, any registered post-change hooks
45
+ * are guaranteed to subsequently be called.
46
*/
47
-void arm_register_el_change_hook(ARMCPU *cpu, ARMELChangeHookFn *hook,
48
+void arm_register_pre_el_change_hook(ARMCPU *cpu, ARMELChangeHookFn *hook,
49
void *opaque);
50
+/**
51
+ * arm_register_el_change_hook:
52
+ * Register a hook function which will be called immediately after this
53
+ * CPU changes exception level or mode. The hook function will be
54
+ * passed a pointer to the ARMCPU and the opaque data pointer passed
55
+ * to this function when the hook was registered.
56
+ *
57
+ * Note that any registered hooks registered here are guaranteed to be called
58
+ * if pre-change hooks have been.
59
+ */
60
+void arm_register_el_change_hook(ARMCPU *cpu, ARMELChangeHookFn *hook, void
61
+ *opaque);
62
63
/**
64
* aa32_vfp_dreg:
65
diff --git a/target/arm/internals.h b/target/arm/internals.h
66
index XXXXXXX..XXXXXXX 100644
67
--- a/target/arm/internals.h
68
+++ b/target/arm/internals.h
69
@@ -XXX,XX +XXX,XX @@ void arm_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
70
MemTxResult response, uintptr_t retaddr);
71
72
/* Call any registered EL change hooks */
73
+static inline void arm_call_pre_el_change_hook(ARMCPU *cpu)
74
+{
75
+ ARMELChangeHook *hook, *next;
76
+ QLIST_FOREACH_SAFE(hook, &cpu->pre_el_change_hooks, node, next) {
77
+ hook->hook(cpu, hook->opaque);
78
+ }
79
+}
80
static inline void arm_call_el_change_hook(ARMCPU *cpu)
81
{
82
ARMELChangeHook *hook, *next;
83
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
84
index XXXXXXX..XXXXXXX 100644
85
--- a/target/arm/cpu.c
86
+++ b/target/arm/cpu.c
87
@@ -XXX,XX +XXX,XX @@ static bool arm_cpu_has_work(CPUState *cs)
88
| CPU_INTERRUPT_EXITTB);
28
}
89
}
29
90
30
+static void write_smpboot64(ARMCPU *cpu, const struct arm_boot_info *info)
91
+void arm_register_pre_el_change_hook(ARMCPU *cpu, ARMELChangeHookFn *hook,
92
+ void *opaque)
31
+{
93
+{
32
+ /* Unlike the AArch32 version we don't need to call the board setup hook.
94
+ ARMELChangeHook *entry = g_new0(ARMELChangeHook, 1);
33
+ * The mechanism for doing the spin-table is also entirely different.
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
+
95
+
54
+ static const uint64_t spintables[] = {
96
+ entry->hook = hook;
55
+ 0, 0, 0, 0
97
+ entry->opaque = opaque;
56
+ };
57
+
98
+
58
+ rom_add_blob_fixed("raspi_smpboot", smpboot, sizeof(smpboot),
99
+ QLIST_INSERT_HEAD(&cpu->pre_el_change_hooks, entry, node);
59
+ info->smp_loader_start);
60
+ rom_add_blob_fixed("raspi_spintables", spintables, sizeof(spintables),
61
+ SPINTABLE_ADDR);
62
+}
100
+}
63
+
101
+
64
static void write_board_setup(ARMCPU *cpu, const struct arm_boot_info *info)
102
void arm_register_el_change_hook(ARMCPU *cpu, ARMELChangeHookFn *hook,
103
void *opaque)
65
{
104
{
66
arm_write_secure_board_setup_dummy_smc(cpu, info, MVBAR_ADDR);
105
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_initfn(Object *obj)
67
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
106
cpu->cp_regs = g_hash_table_new_full(g_int_hash, g_int_equal,
68
/* Pi2 and Pi3 requires SMP setup */
107
g_free, g_free);
69
if (version >= 2) {
108
70
binfo.smp_loader_start = SMPBOOT_ADDR;
109
+ QLIST_INIT(&cpu->pre_el_change_hooks);
71
- binfo.write_secondary_boot = write_smpboot;
110
QLIST_INIT(&cpu->el_change_hooks);
72
+ if (version == 2) {
111
73
+ binfo.write_secondary_boot = write_smpboot;
112
#ifndef CONFIG_USER_ONLY
74
+ } else {
113
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_finalizefn(Object *obj)
75
+ binfo.write_secondary_boot = write_smpboot64;
114
76
+ }
115
g_hash_table_destroy(cpu->cp_regs);
77
binfo.secondary_cpu_reset_hook = reset_secondary;
116
117
+ QLIST_FOREACH_SAFE(hook, &cpu->pre_el_change_hooks, node, next) {
118
+ QLIST_REMOVE(hook, node);
119
+ g_free(hook);
120
+ }
121
QLIST_FOREACH_SAFE(hook, &cpu->el_change_hooks, node, next) {
122
QLIST_REMOVE(hook, node);
123
g_free(hook);
124
diff --git a/target/arm/helper.c b/target/arm/helper.c
125
index XXXXXXX..XXXXXXX 100644
126
--- a/target/arm/helper.c
127
+++ b/target/arm/helper.c
128
@@ -XXX,XX +XXX,XX @@ void arm_cpu_do_interrupt(CPUState *cs)
129
return;
78
}
130
}
79
131
132
+ /* Hooks may change global state so BQL should be held, also the
133
+ * BQL needs to be held for any modification of
134
+ * cs->interrupt_request.
135
+ */
136
+ g_assert(qemu_mutex_iothread_locked());
137
+
138
+ arm_call_pre_el_change_hook(cpu);
139
+
140
assert(!excp_is_internal(cs->exception_index));
141
if (arm_el_is_aa64(env, new_el)) {
142
arm_cpu_do_interrupt_aarch64(cs);
143
@@ -XXX,XX +XXX,XX @@ void arm_cpu_do_interrupt(CPUState *cs)
144
arm_cpu_do_interrupt_aarch32(cs);
145
}
146
147
- /* Hooks may change global state so BQL should be held, also the
148
- * BQL needs to be held for any modification of
149
- * cs->interrupt_request.
150
- */
151
- g_assert(qemu_mutex_iothread_locked());
152
-
153
arm_call_el_change_hook(cpu);
154
155
if (!kvm_enabled()) {
156
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
157
index XXXXXXX..XXXXXXX 100644
158
--- a/target/arm/op_helper.c
159
+++ b/target/arm/op_helper.c
160
@@ -XXX,XX +XXX,XX @@ void HELPER(cpsr_write)(CPUARMState *env, uint32_t val, uint32_t mask)
161
/* Write the CPSR for a 32-bit exception return */
162
void HELPER(cpsr_write_eret)(CPUARMState *env, uint32_t val)
163
{
164
+ qemu_mutex_lock_iothread();
165
+ arm_call_pre_el_change_hook(arm_env_get_cpu(env));
166
+ qemu_mutex_unlock_iothread();
167
+
168
cpsr_write(env, val, CPSR_ERET_MASK, CPSRWriteExceptionReturn);
169
170
/* Generated code has already stored the new PC value, but
171
@@ -XXX,XX +XXX,XX @@ void HELPER(exception_return)(CPUARMState *env)
172
goto illegal_return;
173
}
174
175
+ qemu_mutex_lock_iothread();
176
+ arm_call_pre_el_change_hook(arm_env_get_cpu(env));
177
+ qemu_mutex_unlock_iothread();
178
+
179
if (!return_to_aa64) {
180
env->aarch64 = 0;
181
/* We do a raw CPSR write because aarch64_sync_64_to_32()
80
--
182
--
81
2.16.2
183
2.17.0
82
184
83
185
diff view generated by jsdifflib
New patch
1
From: Aaron Lindsay <alindsay@codeaurora.org>
1
2
3
During code generation, surround CPSR writes and exception returns which
4
call the EL change hooks with gen_io_start/end. The immediate need is
5
for the PMU to access the clock and icount during EL change to support
6
mode filtering.
7
8
Signed-off-by: Aaron Lindsay <alindsay@codeaurora.org>
9
Message-id: 1523997485-1905-9-git-send-email-alindsay@codeaurora.org
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
target/arm/translate-a64.c | 6 ++++++
14
target/arm/translate.c | 12 ++++++++++++
15
2 files changed, 18 insertions(+)
16
17
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/translate-a64.c
20
+++ b/target/arm/translate-a64.c
21
@@ -XXX,XX +XXX,XX @@ static void disas_uncond_b_reg(DisasContext *s, uint32_t insn)
22
unallocated_encoding(s);
23
return;
24
}
25
+ if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
26
+ gen_io_start();
27
+ }
28
gen_helper_exception_return(cpu_env);
29
+ if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
30
+ gen_io_end();
31
+ }
32
/* Must exit loop to check un-masked IRQs */
33
s->base.is_jmp = DISAS_EXIT;
34
return;
35
diff --git a/target/arm/translate.c b/target/arm/translate.c
36
index XXXXXXX..XXXXXXX 100644
37
--- a/target/arm/translate.c
38
+++ b/target/arm/translate.c
39
@@ -XXX,XX +XXX,XX @@ static void gen_rfe(DisasContext *s, TCGv_i32 pc, TCGv_i32 cpsr)
40
* appropriately depending on the new Thumb bit, so it must
41
* be called after storing the new PC.
42
*/
43
+ if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
44
+ gen_io_start();
45
+ }
46
gen_helper_cpsr_write_eret(cpu_env, cpsr);
47
+ if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
48
+ gen_io_end();
49
+ }
50
tcg_temp_free_i32(cpsr);
51
/* Must exit loop to check un-masked IRQs */
52
s->base.is_jmp = DISAS_EXIT;
53
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
54
if (exc_return) {
55
/* Restore CPSR from SPSR. */
56
tmp = load_cpu_field(spsr);
57
+ if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
58
+ gen_io_start();
59
+ }
60
gen_helper_cpsr_write_eret(cpu_env, tmp);
61
+ if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
62
+ gen_io_end();
63
+ }
64
tcg_temp_free_i32(tmp);
65
/* Must exit loop to check un-masked IRQs */
66
s->base.is_jmp = DISAS_EXIT;
67
--
68
2.17.0
69
70
diff view generated by jsdifflib
1
Now we have separate types for BCM2386 and BCM2387, we might as well
1
From: Aaron Lindsay <alindsay@codeaurora.org>
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
It was shifted to the left one bit too few.
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
4
11
This does require us to only build the bcm2837 object on
5
Signed-off-by: Aaron Lindsay <alindsay@codeaurora.org>
12
TARGET_AARCH64 configs, since otherwise it won't instantiate
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
due to the missing cortex-a53 device and "make check" will fail.
7
Message-id: 1523997485-1905-10-git-send-email-alindsay@codeaurora.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/helper.c | 2 +-
11
1 file changed, 1 insertion(+), 1 deletion(-)
14
12
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
diff --git a/target/arm/helper.c b/target/arm/helper.c
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
---
20
hw/arm/bcm2836.c | 24 +++++++++++++++---------
21
hw/arm/raspi.c | 2 --
22
2 files changed, 15 insertions(+), 11 deletions(-)
23
24
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
25
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/arm/bcm2836.c
15
--- a/target/arm/helper.c
27
+++ b/hw/arm/bcm2836.c
16
+++ b/target/arm/helper.c
28
@@ -XXX,XX +XXX,XX @@
17
@@ -XXX,XX +XXX,XX @@ static void pmccfiltr_write(CPUARMState *env, const ARMCPRegInfo *ri,
29
18
uint64_t value)
30
struct BCM283XInfo {
31
const char *name;
32
+ const char *cpu_type;
33
int clusterid;
34
};
35
36
static const BCM283XInfo bcm283x_socs[] = {
37
{
38
.name = TYPE_BCM2836,
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
{
19
{
53
BCM283XState *s = BCM283X(obj);
20
pmccntr_sync(env);
54
+ BCM283XClass *bc = BCM283X_GET_CLASS(obj);
21
- env->cp15.pmccfiltr_el0 = value & 0x7E000000;
55
+ const BCM283XInfo *info = bc->info;
22
+ env->cp15.pmccfiltr_el0 = value & 0xfc000000;
56
+ int n;
23
pmccntr_sync(env);
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
}
24
}
84
25
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
--
26
--
104
2.16.2
27
2.17.0
105
28
106
29
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
From: Aaron Lindsay <alindsay@codeaurora.org>
2
2
3
Add support for "TX complete"/TXDC interrupt generate by real HW since
3
This is a bug fix to ensure 64-bit reads of these registers don't read
4
it is needed to support guests other than Linux.
4
adjacent data.
5
5
6
Based on the patch by Bill Paul as found here:
6
Signed-off-by: Aaron Lindsay <alindsay@codeaurora.org>
7
https://bugs.launchpad.net/qemu/+bug/1753314
7
Message-id: 1523997485-1905-13-git-send-email-alindsay@codeaurora.org
8
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>
8
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
target/arm/cpu.h | 4 ++--
20
hw/char/imx_serial.c | 20 +++++++++++++++++---
12
target/arm/helper.c | 5 +++--
21
2 files changed, 20 insertions(+), 3 deletions(-)
13
2 files changed, 5 insertions(+), 4 deletions(-)
22
14
23
diff --git a/include/hw/char/imx_serial.h b/include/hw/char/imx_serial.h
15
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
24
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
25
--- a/include/hw/char/imx_serial.h
17
--- a/target/arm/cpu.h
26
+++ b/include/hw/char/imx_serial.h
18
+++ b/target/arm/cpu.h
27
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
28
#define UCR2_RXEN (1<<1) /* Receiver enable */
20
uint32_t c9_data;
29
#define UCR2_SRST (1<<0) /* Reset complete */
21
uint64_t c9_pmcr; /* performance monitor control register */
30
22
uint64_t c9_pmcnten; /* perf monitor counter enables */
31
+#define UCR4_TCEN BIT(3) /* TX complete interrupt enable */
23
- uint32_t c9_pmovsr; /* perf monitor overflow status */
32
+
24
- uint32_t c9_pmuserenr; /* perf monitor user enable */
33
#define UTS1_TXEMPTY (1<<6)
25
+ uint64_t c9_pmovsr; /* perf monitor overflow status */
34
#define UTS1_RXEMPTY (1<<5)
26
+ uint64_t c9_pmuserenr; /* perf monitor user enable */
35
#define UTS1_TXFULL (1<<4)
27
uint64_t c9_pmselr; /* perf monitor counter selection register */
36
@@ -XXX,XX +XXX,XX @@ typedef struct IMXSerialState {
28
uint64_t c9_pminten; /* perf monitor interrupt enables */
37
uint32_t ubmr;
29
union { /* Memory attribute redirection */
38
uint32_t ubrc;
30
diff --git a/target/arm/helper.c b/target/arm/helper.c
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
31
index XXXXXXX..XXXXXXX 100644
46
--- a/hw/char/imx_serial.c
32
--- a/target/arm/helper.c
47
+++ b/hw/char/imx_serial.c
33
+++ b/target/arm/helper.c
48
@@ -XXX,XX +XXX,XX @@
34
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
49
35
.fieldoffset = offsetof(CPUARMState, cp15.c9_pmcnten),
50
static const VMStateDescription vmstate_imx_serial = {
36
.writefn = pmcntenclr_write },
51
.name = TYPE_IMX_SERIAL,
37
{ .name = "PMOVSR", .cp = 15, .crn = 9, .crm = 12, .opc1 = 0, .opc2 = 3,
52
- .version_id = 1,
38
- .access = PL0_RW, .fieldoffset = offsetof(CPUARMState, cp15.c9_pmovsr),
53
- .minimum_version_id = 1,
39
+ .access = PL0_RW,
54
+ .version_id = 2,
40
+ .fieldoffset = offsetoflow32(CPUARMState, cp15.c9_pmovsr),
55
+ .minimum_version_id = 2,
41
.accessfn = pmreg_access,
56
.fields = (VMStateField[]) {
42
.writefn = pmovsr_write,
57
VMSTATE_INT32(readbuff, IMXSerialState),
43
.raw_writefn = raw_write },
58
VMSTATE_UINT32(usr1, IMXSerialState),
44
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
59
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_imx_serial = {
45
.accessfn = pmreg_access_xevcntr },
60
VMSTATE_UINT32(ubmr, IMXSerialState),
46
{ .name = "PMUSERENR", .cp = 15, .crn = 9, .crm = 14, .opc1 = 0, .opc2 = 0,
61
VMSTATE_UINT32(ubrc, IMXSerialState),
47
.access = PL0_R | PL1_RW, .accessfn = access_tpm,
62
VMSTATE_UINT32(ucr3, IMXSerialState),
48
- .fieldoffset = offsetof(CPUARMState, cp15.c9_pmuserenr),
63
+ VMSTATE_UINT32(ucr4, IMXSerialState),
49
+ .fieldoffset = offsetoflow32(CPUARMState, cp15.c9_pmuserenr),
64
VMSTATE_END_OF_LIST()
50
.resetvalue = 0,
65
},
51
.writefn = pmuserenr_write, .raw_writefn = raw_write },
66
};
52
{ .name = "PMUSERENR_EL0", .state = ARM_CP_STATE_AA64,
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
--
53
--
114
2.16.2
54
2.17.0
115
55
116
56
diff view generated by jsdifflib
1
Our BCM2836 type is really a generic one that can be any of
1
In commit 210f47840dd62, we changed the bcm2836 SoC object to
2
the bcm283x family. Rename it accordingly. We change only
2
always create a CPU of the correct type for that SoC model. This
3
the names which are visible via the header file to the
3
makes the default_cpu_type settings in the MachineClass structs
4
rest of the QEMU code, leaving private function names
4
for the raspi2 and raspi3 boards redundant. We didn't change
5
in bcm2836.c as they are.
5
those at the time because it would have meant a temporary
6
6
regression in a corner case of error handling if the user
7
This is a preliminary to making bcm283x be an abstract
7
requested a non-existing CPU type. The -cpu parse handling
8
parent class to specific types for the bcm2836 and bcm2837.
8
changes in 2278b93941d42c3 mean that it no longer implicitly
9
depends on default_cpu_type for this to work, so we can now
10
delete the redundant default_cpu_type fields.
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
Message-id: 20180420155547.9497-1-peter.maydell@linaro.org
14
---
15
---
15
include/hw/arm/bcm2836.h | 12 ++++++------
16
hw/arm/raspi.c | 2 --
16
hw/arm/bcm2836.c | 17 +++++++++--------
17
1 file changed, 2 deletions(-)
17
hw/arm/raspi.c | 16 ++++++++--------
18
3 files changed, 23 insertions(+), 22 deletions(-)
19
18
20
diff --git a/include/hw/arm/bcm2836.h b/include/hw/arm/bcm2836.h
21
index XXXXXXX..XXXXXXX 100644
22
--- a/include/hw/arm/bcm2836.h
23
+++ b/include/hw/arm/bcm2836.h
24
@@ -XXX,XX +XXX,XX @@
25
#include "hw/arm/bcm2835_peripherals.h"
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
}
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
19
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
118
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
119
--- a/hw/arm/raspi.c
21
--- a/hw/arm/raspi.c
120
+++ b/hw/arm/raspi.c
22
+++ 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)
23
@@ -XXX,XX +XXX,XX @@ static void raspi2_machine_init(MachineClass *mc)
24
mc->no_parallel = 1;
140
mc->no_floppy = 1;
25
mc->no_floppy = 1;
141
mc->no_cdrom = 1;
26
mc->no_cdrom = 1;
142
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a15");
27
- mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a7");
143
- mc->max_cpus = BCM2836_NCPUS;
28
mc->max_cpus = BCM283X_NCPUS;
144
- mc->min_cpus = BCM2836_NCPUS;
29
mc->min_cpus = BCM283X_NCPUS;
145
- mc->default_cpus = BCM2836_NCPUS;
30
mc->default_cpus = BCM283X_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)
31
@@ -XXX,XX +XXX,XX @@ static void raspi3_machine_init(MachineClass *mc)
32
mc->no_parallel = 1;
153
mc->no_floppy = 1;
33
mc->no_floppy = 1;
154
mc->no_cdrom = 1;
34
mc->no_cdrom = 1;
155
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a53");
35
- mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a53");
156
- mc->max_cpus = BCM2836_NCPUS;
36
mc->max_cpus = BCM283X_NCPUS;
157
- mc->min_cpus = BCM2836_NCPUS;
37
mc->min_cpus = BCM283X_NCPUS;
158
- mc->default_cpus = BCM2836_NCPUS;
38
mc->default_cpus = BCM283X_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
--
39
--
166
2.16.2
40
2.17.0
167
41
168
42
diff view generated by jsdifflib
1
The BCM2837 sets the Aff1 field of the MPIDR affinity values for the
1
Currently we use memory_region_init_ram_nomigrate() to create
2
CPUs to 0, whereas the BCM2836 uses 0xf. Set this correctly, as it
2
the "highbank.sysram" memory region, and we don't manually
3
is required for Linux to boot.
3
register it with vmstate_register_ram(). This currently
4
means that its contents are migrated but as a ram block
5
whose name is the empty string; in future it may mean they
6
are not migrated at all. Use memory_region_init_ram() instead.
7
8
Note that this is a cross-version migration compatibility
9
break for the "highbank" and "midway" machines.
4
10
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
12
Message-id: 20180420124835.7268-2-peter.maydell@linaro.org
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20180313153458.26822-8-peter.maydell@linaro.org
9
---
13
---
10
hw/arm/bcm2836.c | 11 +++++++----
14
hw/arm/highbank.c | 2 +-
11
1 file changed, 7 insertions(+), 4 deletions(-)
15
1 file changed, 1 insertion(+), 1 deletion(-)
12
16
13
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
17
diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
14
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/bcm2836.c
19
--- a/hw/arm/highbank.c
16
+++ b/hw/arm/bcm2836.c
20
+++ b/hw/arm/highbank.c
17
@@ -XXX,XX +XXX,XX @@
21
@@ -XXX,XX +XXX,XX @@ static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
18
22
memory_region_add_subregion(sysmem, 0, dram);
19
struct BCM283XInfo {
23
20
const char *name;
24
sysram = g_new(MemoryRegion, 1);
21
+ int clusterid;
25
- memory_region_init_ram_nomigrate(sysram, NULL, "highbank.sysram", 0x8000,
22
};
26
+ memory_region_init_ram(sysram, NULL, "highbank.sysram", 0x8000,
23
27
&error_fatal);
24
static const BCM283XInfo bcm283x_socs[] = {
28
memory_region_add_subregion(sysmem, 0xfff88000, sysram);
25
{
29
if (bios_name != NULL) {
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
--
30
--
58
2.16.2
31
2.17.0
59
32
60
33
diff view generated by jsdifflib
1
The TypeInfo and state struct for bcm2386 disagree about what the
1
Currently we use memory_region_init_ram_nomigrate() to create
2
parent class is -- the TypeInfo says it's TYPE_SYS_BUS_DEVICE,
2
the "aspeed.boot_rom" memory region, and we don't manually
3
but the BCM2386State struct only defines the parent_obj field
3
register it with vmstate_register_ram(). This currently
4
as DeviceState. This would have caused problems if anything
4
means that its contents are migrated but as a ram block
5
actually tried to treat the object as a TYPE_SYS_BUS_DEVICE.
5
whose name is the empty string; in future it may mean they
6
Fix the TypeInfo to use TYPE_DEVICE as the parent, since we don't
6
are not migrated at all. Use memory_region_init_ram() instead.
7
need any of the additional functionality TYPE_SYS_BUS_DEVICE
7
8
provides.
8
Note that would be a cross-version migration compatibility break
9
for the "palmetto-bmc", "ast2500-evb" and "romulus-bmc" machines,
10
but migration is currently broken for them.
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>
13
Reviewed-by: Cédric Le Goater <clg@kaod.org>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Tested-by: Cédric Le Goater <clg@kaod.org>
13
Message-id: 20180313153458.26822-5-peter.maydell@linaro.org
15
Message-id: 20180420124835.7268-3-peter.maydell@linaro.org
14
---
16
---
15
hw/arm/bcm2836.c | 2 +-
17
hw/arm/aspeed.c | 2 +-
16
1 file changed, 1 insertion(+), 1 deletion(-)
18
1 file changed, 1 insertion(+), 1 deletion(-)
17
19
18
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
20
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
19
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/arm/bcm2836.c
22
--- a/hw/arm/aspeed.c
21
+++ b/hw/arm/bcm2836.c
23
+++ b/hw/arm/aspeed.c
22
@@ -XXX,XX +XXX,XX @@ static void bcm2836_class_init(ObjectClass *oc, void *data)
24
@@ -XXX,XX +XXX,XX @@ static void aspeed_board_init(MachineState *machine,
23
25
* SoC and 128MB for the AST2500 SoC, which is twice as big as
24
static const TypeInfo bcm2836_type_info = {
26
* needed by the flash modules of the Aspeed machines.
25
.name = TYPE_BCM2836,
27
*/
26
- .parent = TYPE_SYS_BUS_DEVICE,
28
- memory_region_init_rom_nomigrate(boot_rom, OBJECT(bmc), "aspeed.boot_rom",
27
+ .parent = TYPE_DEVICE,
29
+ memory_region_init_rom(boot_rom, OBJECT(bmc), "aspeed.boot_rom",
28
.instance_size = sizeof(BCM2836State),
30
fl->size, &error_abort);
29
.instance_init = bcm2836_init,
31
memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
30
.class_init = bcm2836_class_init,
32
boot_rom);
31
--
33
--
32
2.16.2
34
2.17.0
33
35
34
36
diff view generated by jsdifflib
1
For the rpi1 and 2 we want to boot the Linux kernel via some
1
Currently we use vmstate_register_ram_global() for the SRAM;
2
custom setup code that makes sure that the SMC instruction
2
this is not a good idea for devices, because it means that
3
acts as a no-op, because it's used for cache maintenance.
3
you can only ever create one instance of the device, as
4
The rpi3 boots AArch64 kernels, which don't need SMC for
4
the second instance would get a RAM block name clash.
5
cache maintenance and always expect to be booted non-secure.
5
Instead, use memory_region_init_ram(), which automatically
6
Don't fill in the aarch32-specific parts of the binfo struct.
6
registers the RAM block with a local-to-the-device name.
7
8
Note that this would be a cross-version migration compatibility break
9
for the "palmetto-bmc", "ast2500-evb" and "romulus-bmc" machines,
10
but migration is currently broken for them.
7
11
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
13
Reviewed-by: Cédric Le Goater <clg@kaod.org>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Tested-by: Cédric Le Goater <clg@kaod.org>
11
Message-id: 20180313153458.26822-2-peter.maydell@linaro.org
15
Message-id: 20180420124835.7268-4-peter.maydell@linaro.org
12
---
16
---
13
hw/arm/raspi.c | 17 +++++++++++++----
17
hw/arm/aspeed_soc.c | 3 +--
14
1 file changed, 13 insertions(+), 4 deletions(-)
18
1 file changed, 1 insertion(+), 2 deletions(-)
15
19
16
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
20
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
17
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/arm/raspi.c
22
--- a/hw/arm/aspeed_soc.c
19
+++ b/hw/arm/raspi.c
23
+++ b/hw/arm/aspeed_soc.c
20
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
24
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
21
binfo.board_id = raspi_boardid[version];
25
}
22
binfo.ram_size = ram_size;
26
23
binfo.nb_cpus = smp_cpus;
27
/* SRAM */
24
- binfo.board_setup_addr = BOARDSETUP_ADDR;
28
- memory_region_init_ram_nomigrate(&s->sram, OBJECT(dev), "aspeed.sram",
25
- binfo.write_board_setup = write_board_setup;
29
+ memory_region_init_ram(&s->sram, OBJECT(dev), "aspeed.sram",
26
- binfo.secure_board_setup = true;
30
sc->info->sram_size, &err);
27
- binfo.secure_boot = true;
31
if (err) {
28
+
32
error_propagate(errp, err);
29
+ if (version <= 2) {
33
return;
30
+ /* The rpi1 and 2 require some custom setup code to run in Secure
34
}
31
+ * mode before booting a kernel (to set up the SMC vectors so
35
- vmstate_register_ram_global(&s->sram);
32
+ * that we get a no-op SMC; this is used by Linux to call the
36
memory_region_add_subregion(get_system_memory(), ASPEED_SOC_SRAM_BASE,
33
+ * firmware for some cache maintenance operations.
37
&s->sram);
34
+ * The rpi3 doesn't need this.
38
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
--
39
--
45
2.16.2
40
2.17.0
46
41
47
42
diff view generated by jsdifflib
1
From: Guenter Roeck <linux@roeck-us.net>
1
From: Cédric Le Goater <clg@kaod.org>
2
2
3
The sabrelite machine model used by qemu-system-arm is based on the
3
commit 1d3e65aa7ac5 ("hw/timer: Add value matching support to
4
Freescale/NXP i.MX6Q processor. This SoC has an on-board ethernet
4
aspeed_timer") increased the vmstate version of aspeed.timer because
5
controller which is supported in QEMU using the imx_fec.c module
5
the state had changed, but it also bumped the version of the
6
(actually called imx.enet for this model.)
6
VMSTATE_STRUCT_ARRAY under the aspeed.timerctrl which did not need to.
7
7
8
The include/hw/arm/fsm-imx6.h file defines the interrupt vectors for the
8
Change back this version to fix migration.
9
imx.enet device like this:
10
9
11
#define FSL_IMX6_ENET_MAC_1588_IRQ 118
10
Signed-off-by: Cédric Le Goater <clg@kaod.org>
12
#define FSL_IMX6_ENET_MAC_IRQ 119
11
Message-id: 20180423101433.17759-1-clg@kaod.org
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>
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
42
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
43
---
14
---
44
include/hw/arm/fsl-imx6.h | 4 ++--
15
hw/timer/aspeed_timer.c | 2 +-
45
hw/net/imx_fec.c | 28 +++++++++++++++++++++++++++-
16
1 file changed, 1 insertion(+), 1 deletion(-)
46
2 files changed, 29 insertions(+), 3 deletions(-)
47
17
48
diff --git a/include/hw/arm/fsl-imx6.h b/include/hw/arm/fsl-imx6.h
18
diff --git a/hw/timer/aspeed_timer.c b/hw/timer/aspeed_timer.c
49
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
50
--- a/include/hw/arm/fsl-imx6.h
20
--- a/hw/timer/aspeed_timer.c
51
+++ b/include/hw/arm/fsl-imx6.h
21
+++ b/hw/timer/aspeed_timer.c
52
@@ -XXX,XX +XXX,XX @@ typedef struct FslIMX6State {
22
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_aspeed_timer_state = {
53
#define FSL_IMX6_HDMI_MASTER_IRQ 115
23
VMSTATE_UINT32(ctrl, AspeedTimerCtrlState),
54
#define FSL_IMX6_HDMI_CEC_IRQ 116
24
VMSTATE_UINT32(ctrl2, AspeedTimerCtrlState),
55
#define FSL_IMX6_MLB150_LOW_IRQ 117
25
VMSTATE_STRUCT_ARRAY(timers, AspeedTimerCtrlState,
56
-#define FSL_IMX6_ENET_MAC_1588_IRQ 118
26
- ASPEED_TIMER_NR_TIMERS, 2, vmstate_aspeed_timer,
57
-#define FSL_IMX6_ENET_MAC_IRQ 119
27
+ ASPEED_TIMER_NR_TIMERS, 1, vmstate_aspeed_timer,
58
+#define FSL_IMX6_ENET_MAC_IRQ 118
28
AspeedTimer),
59
+#define FSL_IMX6_ENET_MAC_1588_IRQ 119
29
VMSTATE_END_OF_LIST()
60
#define FSL_IMX6_PCIE1_IRQ 120
30
}
61
#define FSL_IMX6_PCIE2_IRQ 121
62
#define FSL_IMX6_PCIE3_IRQ 122
63
diff --git a/hw/net/imx_fec.c b/hw/net/imx_fec.c
64
index XXXXXXX..XXXXXXX 100644
65
--- a/hw/net/imx_fec.c
66
+++ b/hw/net/imx_fec.c
67
@@ -XXX,XX +XXX,XX @@ static void imx_enet_write_bd(IMXENETBufDesc *bd, dma_addr_t addr)
68
69
static void imx_eth_update(IMXFECState *s)
70
{
71
- if (s->regs[ENET_EIR] & s->regs[ENET_EIMR] & ENET_INT_TS_TIMER) {
72
+ /*
73
+ * Previous versions of qemu had the ENET_INT_MAC and ENET_INT_TS_TIMER
74
+ * interrupts swapped. This worked with older versions of Linux (4.14
75
+ * and older) since Linux associated both interrupt lines with Ethernet
76
+ * MAC interrupts. Specifically,
77
+ * - Linux 4.15 and later have separate interrupt handlers for the MAC and
78
+ * timer interrupts. Those versions of Linux fail with versions of QEMU
79
+ * with swapped interrupt assignments.
80
+ * - In linux 4.14, both interrupt lines were registered with the Ethernet
81
+ * MAC interrupt handler. As a result, all versions of qemu happen to
82
+ * work, though that is accidental.
83
+ * - In Linux 4.9 and older, the timer interrupt was registered directly
84
+ * with the Ethernet MAC interrupt handler. The MAC interrupt was
85
+ * redirected to a GPIO interrupt to work around erratum ERR006687.
86
+ * This was implemented using the SOC's IOMUX block. In qemu, this GPIO
87
+ * interrupt never fired since IOMUX is currently not supported in qemu.
88
+ * Linux instead received MAC interrupts on the timer interrupt.
89
+ * As a result, qemu versions with the swapped interrupt assignment work,
90
+ * albeit accidentally, but qemu versions with the correct interrupt
91
+ * assignment fail.
92
+ *
93
+ * To ensure that all versions of Linux work, generate ENET_INT_MAC
94
+ * interrrupts on both interrupt lines. This should be changed if and when
95
+ * qemu supports IOMUX.
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
--
31
--
103
2.16.2
32
2.17.0
104
33
105
34
diff view generated by jsdifflib
1
From: Wei Huang <wei@redhat.com>
1
From: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
2
2
3
For guest kernel that supports KASLR, the load address can change every
3
SNOOP_NONE state handle is moved above in the if ladder, as it's same
4
time when guest VM runs. To find the physical base address correctly,
4
as SNOOP_STRIPPING during data cycles.
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
5
10
Signed-off-by: Wei Huang <wei@redhat.com>
6
Signed-off-by: Sai Pavan Boddu <saipava@xilinx.com>
11
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
7
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
12
Message-id: 1520615003-20869-1-git-send-email-wei@redhat.com
8
Message-id: 1524119244-1240-1-git-send-email-saipava@xilinx.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
10
---
15
dump.c | 14 +++++++++++---
11
hw/ssi/xilinx_spips.c | 3 ++-
16
1 file changed, 11 insertions(+), 3 deletions(-)
12
1 file changed, 2 insertions(+), 1 deletion(-)
17
13
18
diff --git a/dump.c b/dump.c
14
diff --git a/hw/ssi/xilinx_spips.c b/hw/ssi/xilinx_spips.c
19
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
20
--- a/dump.c
16
--- a/hw/ssi/xilinx_spips.c
21
+++ b/dump.c
17
+++ b/hw/ssi/xilinx_spips.c
22
@@ -XXX,XX +XXX,XX @@ static void vmcoreinfo_update_phys_base(DumpState *s)
18
@@ -XXX,XX +XXX,XX @@ static void xilinx_spips_flush_txfifo(XilinxSPIPS *s)
23
19
if (fifo8_is_empty(&s->tx_fifo)) {
24
lines = g_strsplit((char *)vmci, "\n", -1);
20
xilinx_spips_update_ixr(s);
25
for (i = 0; lines[i]; i++) {
21
return;
26
- if (g_str_has_prefix(lines[i], "NUMBER(phys_base)=")) {
22
- } else if (s->snoop_state == SNOOP_STRIPING) {
27
- if (qemu_strtou64(lines[i] + 18, NULL, 16,
23
+ } else if (s->snoop_state == SNOOP_STRIPING ||
28
+ const char *prefix = NULL;
24
+ s->snoop_state == SNOOP_NONE) {
29
+
25
for (i = 0; i < num_effective_busses(s); ++i) {
30
+ if (s->dump_info.d_machine == EM_X86_64) {
26
tx_rx[i] = fifo8_pop(&s->tx_fifo);
31
+ prefix = "NUMBER(phys_base)=";
32
+ } else if (s->dump_info.d_machine == EM_AARCH64) {
33
+ prefix = "NUMBER(PHYS_OFFSET)=";
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
}
27
}
44
--
28
--
45
2.16.2
29
2.17.0
46
30
47
31
diff view generated by jsdifflib