diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2016-08-03 22:38:51 +1000 |
---|---|---|
committer | David Gibson <david@gibson.dropbear.id.au> | 2016-09-23 10:29:40 +1000 |
commit | 95cda4c44ee2ae8616b2f9d8a2d68882cf437859 (patch) | |
tree | ec6ab3158b21ede4c1f43cbe398c17640d42e2c2 /linux-user/main.c | |
parent | ab04543602b7fa8fbc33401c66f071ae4570da04 (diff) | |
download | qemu-95cda4c44ee2ae8616b2f9d8a2d68882cf437859.zip qemu-95cda4c44ee2ae8616b2f9d8a2d68882cf437859.tar.gz qemu-95cda4c44ee2ae8616b2f9d8a2d68882cf437859.tar.bz2 |
ppc: Fix signal delivery in ppc-user and ppc64-user
There were a number of bugs in the implementation:
- The structure alignment was wrong for 64-bit.
- Also 64-bit only does RT signals.
- On 64-bit, we need to put a pointer to the (aligned) vector registers
in the frame and use it for restoring
- We had endian bugs when saving/restoring vector registers
- My recent fixes for exception NIP broke sigreturn in user mode
causing us to resume one instruction too far.
- Add VSR second halves
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Diffstat (limited to 'linux-user/main.c')
-rw-r--r-- | linux-user/main.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/linux-user/main.c b/linux-user/main.c index aba58c7..8daebe0 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -1992,12 +1992,12 @@ void cpu_loop(CPUPPCState *env) if (ret == -TARGET_ERESTARTSYS) { break; } - env->nip += 4; if (ret == (target_ulong)(-TARGET_QEMU_ESIGRETURN)) { /* Returning from a successful sigreturn syscall. Avoid corrupting register state. */ break; } + env->nip += 4; if (ret > (target_ulong)(-515)) { env->crf[0] |= 0x1; ret = -ret; |