Thomas Huth <th...@redhat.com> writes: > Since the introduction of MTTCG, using the msgsnd instruction > abort()s if being called without holding the BQL. So let's protect > that part of the code now with qemu_mutex_lock_iothread(). > > Buglink: https://bugs.launchpad.net/qemu/+bug/1694998 > Signed-off-by: Thomas Huth <th...@redhat.com>
Reviewed-by: Alex Bennée <alex.ben...@linaro.org> p.s. I was checking the ppc code for other CPU_FOREACH patterns and I noticed the tlb_flush calls could probably use the tlb_flush_all_cpus API instead of manually looping themselves. You should also double check the semantics to make sure none of them need to use the _synced variant and a cpu_exit if the flush needs to complete w.r.t the originating CPU. > --- > target/ppc/excp_helper.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c > index 9cb2123..3a9f086 100644 > --- a/target/ppc/excp_helper.c > +++ b/target/ppc/excp_helper.c > @@ -17,6 +17,7 @@ > * License along with this library; if not, see > <http://www.gnu.org/licenses/>. > */ > #include "qemu/osdep.h" > +#include "qemu/main-loop.h" > #include "cpu.h" > #include "exec/helper-proto.h" > #include "exec/exec-all.h" > @@ -1132,6 +1133,7 @@ void helper_msgsnd(target_ulong rb) > return; > } > > + qemu_mutex_lock_iothread(); > CPU_FOREACH(cs) { > PowerPCCPU *cpu = POWERPC_CPU(cs); > CPUPPCState *cenv = &cpu->env; > @@ -1141,5 +1143,6 @@ void helper_msgsnd(target_ulong rb) > cpu_interrupt(cs, CPU_INTERRUPT_HARD); > } > } > + qemu_mutex_unlock_iothread(); > } > #endif -- Alex Bennée