diff mbox series

[14/21] linux-user/openrisc: Implement setup_sigtramp

Message ID 20210616011209.1446045-15-richard.henderson@linaro.org
State Superseded
Headers show
Series linux-user: Move signal trampolines to new page | expand

Commit Message

Richard Henderson June 16, 2021, 1:12 a.m. UTC
Create and record the rt signal trampoline.

Cc: Stafford Horne <shorne@gmail.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

---
 linux-user/openrisc/target_signal.h |  2 ++
 linux-user/openrisc/signal.c        | 24 ++++++++++++++++--------
 2 files changed, 18 insertions(+), 8 deletions(-)

-- 
2.25.1

Comments

Philippe Mathieu-Daudé June 16, 2021, 4:49 p.m. UTC | #1
On 6/16/21 3:12 AM, Richard Henderson wrote:
> Create and record the rt signal trampoline.

> 

> Cc: Stafford Horne <shorne@gmail.com>

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

> ---

>  linux-user/openrisc/target_signal.h |  2 ++

>  linux-user/openrisc/signal.c        | 24 ++++++++++++++++--------

>  2 files changed, 18 insertions(+), 8 deletions(-)


Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Stafford Horne June 17, 2021, 12:24 a.m. UTC | #2
On Tue, Jun 15, 2021 at 06:12:02PM -0700, Richard Henderson wrote:
> Create and record the rt signal trampoline.

> 

> Cc: Stafford Horne <shorne@gmail.com>

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


Reviewed-by: Stafford Horne <shorne@gmail.com>


> ---

>  linux-user/openrisc/target_signal.h |  2 ++

>  linux-user/openrisc/signal.c        | 24 ++++++++++++++++--------

>  2 files changed, 18 insertions(+), 8 deletions(-)

> 

> diff --git a/linux-user/openrisc/target_signal.h b/linux-user/openrisc/target_signal.h

> index 8283eaf544..077ec3d5e8 100644

> --- a/linux-user/openrisc/target_signal.h

> +++ b/linux-user/openrisc/target_signal.h

> @@ -26,4 +26,6 @@ typedef struct target_sigaltstack {

>  

>  #include "../generic/signal.h"

>  

> +#define TARGET_ARCH_HAS_SIGTRAMP_PAGE 1

> +

>  #endif /* OPENRISC_TARGET_SIGNAL_H */

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

> index 5c5640a284..b411b01864 100644

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

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

> @@ -37,7 +37,6 @@ typedef struct target_ucontext {

>  typedef struct target_rt_sigframe {

>      struct target_siginfo info;

>      target_ucontext uc;

> -    uint32_t retcode[4];  /* trampoline code */

>  } target_rt_sigframe;

>  

>  static void restore_sigcontext(CPUOpenRISCState *env, target_sigcontext *sc)

> @@ -115,14 +114,8 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,

>          __put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]);

>      }

>  

> -    /* This is l.ori r11,r0,__NR_sigreturn; l.sys 1; l.nop; l.nop */

> -    __put_user(0xa9600000 | TARGET_NR_rt_sigreturn, frame->retcode + 0);

> -    __put_user(0x20000001, frame->retcode + 1);

> -    __put_user(0x15000000, frame->retcode + 2);

> -    __put_user(0x15000000, frame->retcode + 3);

> -

>      /* Set up registers for signal handler */

> -    cpu_set_gpr(env, 9, frame_addr + offsetof(target_rt_sigframe, retcode));

> +    cpu_set_gpr(env, 9, default_rt_sigreturn);

>      cpu_set_gpr(env, 3, sig);

>      cpu_set_gpr(env, 4, frame_addr + offsetof(target_rt_sigframe, info));

>      cpu_set_gpr(env, 5, frame_addr + offsetof(target_rt_sigframe, uc));

> @@ -168,3 +161,18 @@ long do_rt_sigreturn(CPUOpenRISCState *env)

>      force_sig(TARGET_SIGSEGV);

>      return 0;

>  }

> +

> +void setup_sigtramp(abi_ulong sigtramp_page)

> +{

> +    uint32_t *tramp = lock_user(VERIFY_WRITE, sigtramp_page, 4 * 4, 0);

> +    assert(tramp != NULL);

> +

> +    /* This is l.ori r11,r0,__NR_sigreturn; l.sys 1; l.nop; l.nop */

> +    __put_user(0xa9600000 | TARGET_NR_rt_sigreturn, tramp + 0);

> +    __put_user(0x20000001, tramp + 1);

> +    __put_user(0x15000000, tramp + 2);

> +    __put_user(0x15000000, tramp + 3);

> +

> +    default_rt_sigreturn = sigtramp_page;

> +    unlock_user(tramp, sigtramp_page, 4 * 4);

> +}

> -- 

> 2.25.1

>
diff mbox series

Patch

diff --git a/linux-user/openrisc/target_signal.h b/linux-user/openrisc/target_signal.h
index 8283eaf544..077ec3d5e8 100644
--- a/linux-user/openrisc/target_signal.h
+++ b/linux-user/openrisc/target_signal.h
@@ -26,4 +26,6 @@  typedef struct target_sigaltstack {
 
 #include "../generic/signal.h"
 
+#define TARGET_ARCH_HAS_SIGTRAMP_PAGE 1
+
 #endif /* OPENRISC_TARGET_SIGNAL_H */
diff --git a/linux-user/openrisc/signal.c b/linux-user/openrisc/signal.c
index 5c5640a284..b411b01864 100644
--- a/linux-user/openrisc/signal.c
+++ b/linux-user/openrisc/signal.c
@@ -37,7 +37,6 @@  typedef struct target_ucontext {
 typedef struct target_rt_sigframe {
     struct target_siginfo info;
     target_ucontext uc;
-    uint32_t retcode[4];  /* trampoline code */
 } target_rt_sigframe;
 
 static void restore_sigcontext(CPUOpenRISCState *env, target_sigcontext *sc)
@@ -115,14 +114,8 @@  void setup_rt_frame(int sig, struct target_sigaction *ka,
         __put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]);
     }
 
-    /* This is l.ori r11,r0,__NR_sigreturn; l.sys 1; l.nop; l.nop */
-    __put_user(0xa9600000 | TARGET_NR_rt_sigreturn, frame->retcode + 0);
-    __put_user(0x20000001, frame->retcode + 1);
-    __put_user(0x15000000, frame->retcode + 2);
-    __put_user(0x15000000, frame->retcode + 3);
-
     /* Set up registers for signal handler */
-    cpu_set_gpr(env, 9, frame_addr + offsetof(target_rt_sigframe, retcode));
+    cpu_set_gpr(env, 9, default_rt_sigreturn);
     cpu_set_gpr(env, 3, sig);
     cpu_set_gpr(env, 4, frame_addr + offsetof(target_rt_sigframe, info));
     cpu_set_gpr(env, 5, frame_addr + offsetof(target_rt_sigframe, uc));
@@ -168,3 +161,18 @@  long do_rt_sigreturn(CPUOpenRISCState *env)
     force_sig(TARGET_SIGSEGV);
     return 0;
 }
+
+void setup_sigtramp(abi_ulong sigtramp_page)
+{
+    uint32_t *tramp = lock_user(VERIFY_WRITE, sigtramp_page, 4 * 4, 0);
+    assert(tramp != NULL);
+
+    /* This is l.ori r11,r0,__NR_sigreturn; l.sys 1; l.nop; l.nop */
+    __put_user(0xa9600000 | TARGET_NR_rt_sigreturn, tramp + 0);
+    __put_user(0x20000001, tramp + 1);
+    __put_user(0x15000000, tramp + 2);
+    __put_user(0x15000000, tramp + 3);
+
+    default_rt_sigreturn = sigtramp_page;
+    unlock_user(tramp, sigtramp_page, 4 * 4);
+}