summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2017-11-21 11:32:55 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2017-11-21 13:11:03 +0000
commit2713f71a2611c13e801c7077e2803096ee23237d (patch)
treeac3933b8c821fd57c6b804e5f1f09dd7625673f9
parent1889fb34554fc9fae9bc0a61109afb23ad09c3d3 (diff)
downloadpoky-2713f71a2611c13e801c7077e2803096ee23237d.tar.gz
qemu: Add patch to avoid qemuppc boot hangs
qemuppc boots are occasionally hanging on the autobuilder. This adds a patch which fixes the issue in local testing. Its being discussed with upstream qemu. (From OE-Core rev: 87719e35db08b21cd43ab3ebd72f4567ca0fdc65) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/recipes-devtools/qemu/qemu/ppc_locking.patch105
-rw-r--r--meta/recipes-devtools/qemu/qemu_2.10.1.bb1
2 files changed, 106 insertions, 0 deletions
diff --git a/meta/recipes-devtools/qemu/qemu/ppc_locking.patch b/meta/recipes-devtools/qemu/qemu/ppc_locking.patch
new file mode 100644
index 0000000000..6f722433d4
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu/ppc_locking.patch
@@ -0,0 +1,105 @@
1I've tracked down what I think is a problem causing qemu-system-ppc
2to hang whilst booting images.
3
4I believe the decrementer timer stops receiving interrupts so
5tasks in our images hang indefinitely as the timer stopped.
6
7It can be summed up with this line of debug:
8
9ppc_set_irq: 0x55b4e0d562f0 n_IRQ 8 level 1 => pending 00000100req 00000004
10
11It should normally read:
12
13ppc_set_irq: 0x55b4e0d562f0 n_IRQ 8 level 1 => pending 00000100req 00000002
14
15The question is why CPU_INTERRUPT_EXITTB ends up being set when the
16lines above this log message clearly sets CPU_INTERRUPT_HARD (via
17cpu_interrupt() ).
18
19I note in cpu.h:
20
21 /* updates protected by BQL */
22 uint32_t interrupt_request;
23
24(for struct CPUState)
25
26The ppc code does "cs->interrupt_request |= CPU_INTERRUPT_EXITTB" in 5
27places, 3 in excp_helper.c and 2 in helper_regs.h. In all cases,
28g_assert(qemu_mutex_iothread_locked()); fails. If I do something like:
29
30if (!qemu_mutex_iothread_locked()) {
31 qemu_mutex_lock_iothread();
32 cpu_interrupt(cs, CPU_INTERRUPT_EXITTB);
33 qemu_mutex_unlock_iothread();
34} else {
35 cpu_interrupt(cs, CPU_INTERRUPT_EXITTB);
36}
37
38in these call sites then I can no longer lock qemu up with my test
39case.
40
41I suspect the _HARD setting gets overwritten which stops the
42decrementer interrupts being delivered.
43
44Upstream-Status: Submitted [Issue discussed on qemu mailing list 2017/11/20]
45RP 2017/11/20
46
47Index: qemu-2.10.1/target/ppc/excp_helper.c
48===================================================================
49--- qemu-2.10.1.orig/target/ppc/excp_helper.c
50+++ qemu-2.10.1/target/ppc/excp_helper.c
51@@ -207,7 +207,9 @@ static inline void powerpc_excp(PowerPCC
52 "Entering checkstop state\n");
53 }
54 cs->halted = 1;
55- cs->interrupt_request |= CPU_INTERRUPT_EXITTB;
56+ qemu_mutex_lock_iothread();
57+ cpu_interrupt(cs, CPU_INTERRUPT_EXITTB);
58+ qemu_mutex_unlock_iothread();
59 }
60 if (env->msr_mask & MSR_HVB) {
61 /* ISA specifies HV, but can be delivered to guest with HV clear
62@@ -940,7 +942,9 @@ void helper_store_msr(CPUPPCState *env,
63
64 if (excp != 0) {
65 CPUState *cs = CPU(ppc_env_get_cpu(env));
66- cs->interrupt_request |= CPU_INTERRUPT_EXITTB;
67+ qemu_mutex_lock_iothread();
68+ cpu_interrupt(cs, CPU_INTERRUPT_EXITTB);
69+ qemu_mutex_unlock_iothread();
70 raise_exception(env, excp);
71 }
72 }
73@@ -995,7 +999,9 @@ static inline void do_rfi(CPUPPCState *e
74 /* No need to raise an exception here,
75 * as rfi is always the last insn of a TB
76 */
77- cs->interrupt_request |= CPU_INTERRUPT_EXITTB;
78+ qemu_mutex_lock_iothread();
79+ cpu_interrupt(cs, CPU_INTERRUPT_EXITTB);
80+ qemu_mutex_unlock_iothread();
81
82 /* Reset the reservation */
83 env->reserve_addr = -1;
84Index: qemu-2.10.1/target/ppc/helper_regs.h
85===================================================================
86--- qemu-2.10.1.orig/target/ppc/helper_regs.h
87+++ qemu-2.10.1/target/ppc/helper_regs.h
88@@ -114,11 +114,15 @@ static inline int hreg_store_msr(CPUPPCS
89 }
90 if (((value >> MSR_IR) & 1) != msr_ir ||
91 ((value >> MSR_DR) & 1) != msr_dr) {
92- cs->interrupt_request |= CPU_INTERRUPT_EXITTB;
93+ qemu_mutex_lock_iothread();
94+ cpu_interrupt(cs, CPU_INTERRUPT_EXITTB);
95+ qemu_mutex_unlock_iothread();
96 }
97 if ((env->mmu_model & POWERPC_MMU_BOOKE) &&
98 ((value >> MSR_GS) & 1) != msr_gs) {
99- cs->interrupt_request |= CPU_INTERRUPT_EXITTB;
100+ qemu_mutex_lock_iothread();
101+ cpu_interrupt(cs, CPU_INTERRUPT_EXITTB);
102+ qemu_mutex_unlock_iothread();
103 }
104 if (unlikely((env->flags & POWERPC_FLAG_TGPR) &&
105 ((value ^ env->msr) & (1 << MSR_TGPR)))) {
diff --git a/meta/recipes-devtools/qemu/qemu_2.10.1.bb b/meta/recipes-devtools/qemu/qemu_2.10.1.bb
index 6e9b68b0ff..8e3ca3c949 100644
--- a/meta/recipes-devtools/qemu/qemu_2.10.1.bb
+++ b/meta/recipes-devtools/qemu/qemu_2.10.1.bb
@@ -24,6 +24,7 @@ SRC_URI = "http://wiki.qemu-project.org/download/${BP}.tar.bz2 \
24 file://0003-Introduce-condition-in-TPM-backend-for-notification.patch \ 24 file://0003-Introduce-condition-in-TPM-backend-for-notification.patch \
25 file://0004-Add-support-for-VM-suspend-resume-for-TPM-TIS-v2.9.patch \ 25 file://0004-Add-support-for-VM-suspend-resume-for-TPM-TIS-v2.9.patch \
26 file://apic-fixup-fallthrough-to-PIC.patch \ 26 file://apic-fixup-fallthrough-to-PIC.patch \
27 file://ppc_locking.patch \
27 " 28 "
28UPSTREAM_CHECK_REGEX = "qemu-(?P<pver>\d+\..*)\.tar" 29UPSTREAM_CHECK_REGEX = "qemu-(?P<pver>\d+\..*)\.tar"
29 30