724a14a256
Update to rc4 of v2.9.0. Also includes a few other fixes, and a number of tweaks to the spec files. I'd be happy to answer any questions about all those spec file changes, I believe they were all in the direction of a more correct and maintainable spec file. Since this is still in rc phase, let's keep it in devel project. Final release should appear in time for Beta2 of SLE12SP3. Delta from previous: Added Alex's patch for keyboard empty event. OBS-URL: https://build.opensuse.org/request/show/487699 OBS-URL: https://build.opensuse.org/package/show/Virtualization/qemu?expand=0&rev=334
43 lines
1.6 KiB
Diff
43 lines
1.6 KiB
Diff
From 08ad46a51cbf155d68047b4dad660687aff9996b Mon Sep 17 00:00:00 2001
|
|
From: Alexander Graf <agraf@suse.de>
|
|
Date: Fri, 13 Jan 2012 17:05:41 +0100
|
|
Subject: [PATCH] linux-user: fix segfault deadlock
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
When entering the guest we take a lock to ensure that nobody else messes
|
|
with our TB chaining while we're doing it. If we get a segfault inside that
|
|
code, we manage to work on, but will not unlock the lock.
|
|
|
|
This patch forces unlocking of that lock in the segv handler. I'm not sure
|
|
this is the right approach though. Maybe we should rather make sure we don't
|
|
segfault in the code? I would greatly appreciate someone more intelligible
|
|
than me to look at this :).
|
|
|
|
Example code to trigger this is at: http://csgraf.de/tmp/conftest.c
|
|
|
|
Reported-by: Fabio Erculiani <lxnay@sabayon.org>
|
|
Signed-off-by: Alexander Graf <agraf@suse.de>
|
|
[AF: Drop spinlock_safe_unlock() and switch to tb_lock_reset() (bonzini)]
|
|
Signed-off-by: Andreas Färber <afaerber@suse.de>
|
|
---
|
|
user-exec.c | 4 ++++
|
|
1 file changed, 4 insertions(+)
|
|
|
|
diff --git a/user-exec.c b/user-exec.c
|
|
index a8f95fa1e1..c262653604 100644
|
|
--- a/user-exec.c
|
|
+++ b/user-exec.c
|
|
@@ -78,6 +78,10 @@ static inline int handle_cpu_signal(uintptr_t pc, unsigned long address,
|
|
printf("qemu: SIGSEGV pc=0x%08lx address=%08lx w=%d oldset=0x%08lx\n",
|
|
pc, address, is_write, *(unsigned long *)old_set);
|
|
#endif
|
|
+
|
|
+ /* Maybe we're still holding the TB fiddling lock? */
|
|
+ tb_lock_reset();
|
|
+
|
|
/* XXX: locking issue */
|
|
if (is_write && h2g_valid(address)) {
|
|
switch (page_unprotect(h2g(address), pc)) {
|