[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 18/43] target-ppc, tcg: fix usermode segfault with pt
From: |
David Gibson |
Subject: |
[Qemu-devel] [PULL 18/43] target-ppc, tcg: fix usermode segfault with pthread_create() |
Date: |
Wed, 22 Feb 2017 17:33:23 +1100 |
From: Sam Bobroff <address@hidden>
Programs run under qemu-ppc64 on an x86_64 host currently segfault
if they use pthread_create() due to the adjustment made to the NIP in
commit bd6fefe71cec5a0c7d2be4ac96307f25db56abf9.
This patch changes cpu_loop() to set the NIP back to the
pre-incremented value before calling do_syscall(), which causes the
correct address to be used for the new thread and corrects the fault.
Signed-off-by: Sam Bobroff <address@hidden>
Reviewed-by: Laurent Vivier <address@hidden>
Reviewed-by: Peter Maydell <address@hidden>
Signed-off-by: David Gibson <address@hidden>
---
linux-user/main.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/linux-user/main.c b/linux-user/main.c
index 4fd49ce..9645122 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -1712,10 +1712,12 @@ void cpu_loop(CPUPPCState *env)
* in syscalls.
*/
env->crf[0] &= ~0x1;
+ env->nip += 4;
ret = do_syscall(env, env->gpr[0], env->gpr[3], env->gpr[4],
env->gpr[5], env->gpr[6], env->gpr[7],
env->gpr[8], 0, 0);
if (ret == -TARGET_ERESTARTSYS) {
+ env->nip -= 4;
break;
}
if (ret == (target_ulong)(-TARGET_QEMU_ESIGRETURN)) {
@@ -1723,7 +1725,6 @@ void cpu_loop(CPUPPCState *env)
Avoid corrupting register state. */
break;
}
- env->nip += 4;
if (ret > (target_ulong)(-515)) {
env->crf[0] |= 0x1;
ret = -ret;
--
2.9.3
- [Qemu-devel] [PULL 00/43] ppc-for-2.9 queue 20170222, David Gibson, 2017/02/22
- [Qemu-devel] [PULL 01/43] spapr: cpu core: separate child threads destruction from machine state operations, David Gibson, 2017/02/22
- [Qemu-devel] [PULL 03/43] spapr: make cpu core unplug follow expected hotunplug call flow, David Gibson, 2017/02/22
- [Qemu-devel] [PULL 16/43] target-ppc: add slbsync implementation, David Gibson, 2017/02/22
- [Qemu-devel] [PULL 18/43] target-ppc, tcg: fix usermode segfault with pthread_create(),
David Gibson <=
- [Qemu-devel] [PULL 09/43] target-ppc: Add xsmaxcdp and xsmincdp instructions, David Gibson, 2017/02/22
- [Qemu-devel] [PULL 08/43] hw/ppc/pnv: Remove superfluous "qemu" prefix from error strings, David Gibson, 2017/02/22
- [Qemu-devel] [PULL 17/43] target-ppc: add wait instruction, David Gibson, 2017/02/22
- [Qemu-devel] [PULL 14/43] target-ppc: generate exception for copy/paste, David Gibson, 2017/02/22
- [Qemu-devel] [PULL 04/43] ppc: implement xsrqpi[x] instruction, David Gibson, 2017/02/22
- [Qemu-devel] [PULL 12/43] target-ppc: implement load atomic instruction, David Gibson, 2017/02/22
- [Qemu-devel] [PULL 05/43] ppc: implement xsrqpxp instruction, David Gibson, 2017/02/22
- [Qemu-devel] [PULL 02/43] spapr: move spapr_core_[foo]plug() callbacks close to machine code in spapr.c, David Gibson, 2017/02/22
- [Qemu-devel] [PULL 07/43] ppc: implement xssubqp instruction, David Gibson, 2017/02/22
- [Qemu-devel] [PULL 06/43] ppc: implement xssqrtqp instruction, David Gibson, 2017/02/22