diff mbox series

[v2,06/16] target/ppc: fix signal delivery for ppc64abi32

Message ID 20190919171015.12681-7-alex.bennee@linaro.org
State Superseded
Headers show
Series testing/next (docker/podman, tcg, build fixes) | expand

Commit Message

Alex Bennée Sept. 19, 2019, 5:10 p.m. UTC
We were incorrectly using the 64-bit AIX ABI instead of the 32-bit
SYSV ABI for setting NIP for the signal handler.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>


---
v2
  - change to wording
---
 linux-user/ppc/signal.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

-- 
2.20.1

Comments

Laurent Vivier Sept. 20, 2019, 7:27 p.m. UTC | #1
Le 19/09/2019 à 19:10, Alex Bennée a écrit :
> We were incorrectly using the 64-bit AIX ABI instead of the 32-bit

> SYSV ABI for setting NIP for the signal handler.

> 

> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

> 

> ---

> v2

>    - change to wording

> ---

>   linux-user/ppc/signal.c | 4 +++-

>   1 file changed, 3 insertions(+), 1 deletion(-)

> 

> diff --git a/linux-user/ppc/signal.c b/linux-user/ppc/signal.c

> index 619a56950df..5b82af6cb62 100644

> --- a/linux-user/ppc/signal.c

> +++ b/linux-user/ppc/signal.c

> @@ -501,7 +501,9 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,

>       int i, err = 0;

>   #if defined(TARGET_PPC64)

>       struct target_sigcontext *sc = 0;

> +#if !defined(TARGET_ABI32)

>       struct image_info *image = ((TaskState *)thread_cpu->opaque)->info;

> +#endif

>   #endif

>   

>       rt_sf_addr = get_sigframe(ka, env, sizeof(*rt_sf));

> @@ -557,7 +559,7 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,

>       env->gpr[5] = (target_ulong) h2g(&rt_sf->uc);

>       env->gpr[6] = (target_ulong) h2g(rt_sf);

>   

> -#if defined(TARGET_PPC64)

> +#if defined(TARGET_PPC64) && !defined(TARGET_ABI32)

>       if (get_ppc64_abi(image) < 2) {

>           /* ELFv1 PPC64 function pointers are pointers to OPD entries. */

>           struct target_func_ptr *handler =

> 


Reviewed-by: Laurent Vivier <laurent@vivier.eu>
diff mbox series

Patch

diff --git a/linux-user/ppc/signal.c b/linux-user/ppc/signal.c
index 619a56950df..5b82af6cb62 100644
--- a/linux-user/ppc/signal.c
+++ b/linux-user/ppc/signal.c
@@ -501,7 +501,9 @@  void setup_rt_frame(int sig, struct target_sigaction *ka,
     int i, err = 0;
 #if defined(TARGET_PPC64)
     struct target_sigcontext *sc = 0;
+#if !defined(TARGET_ABI32)
     struct image_info *image = ((TaskState *)thread_cpu->opaque)->info;
+#endif
 #endif
 
     rt_sf_addr = get_sigframe(ka, env, sizeof(*rt_sf));
@@ -557,7 +559,7 @@  void setup_rt_frame(int sig, struct target_sigaction *ka,
     env->gpr[5] = (target_ulong) h2g(&rt_sf->uc);
     env->gpr[6] = (target_ulong) h2g(rt_sf);
 
-#if defined(TARGET_PPC64)
+#if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
     if (get_ppc64_abi(image) < 2) {
         /* ELFv1 PPC64 function pointers are pointers to OPD entries. */
         struct target_func_ptr *handler =