diff mbox series

[v2,09/41] linux-user/host/alpha: Populate host_signal.h

Message ID 20210918184527.408540-10-richard.henderson@linaro.org
State Superseded
Headers show
Series linux-user: Streamline handling of SIGSEGV | expand

Commit Message

Richard Henderson Sept. 18, 2021, 6:44 p.m. UTC
Split host_signal_pc and host_signal_write out of user-exec.c.

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

---
 linux-user/host/alpha/host-signal.h | 41 +++++++++++++++++++++++++++++
 accel/tcg/user-exec.c               | 31 +---------------------
 2 files changed, 42 insertions(+), 30 deletions(-)
 create mode 100644 linux-user/host/alpha/host-signal.h

-- 
2.25.1

Comments

Philippe Mathieu-Daudé Sept. 19, 2021, 6:03 p.m. UTC | #1
On 9/18/21 20:44, Richard Henderson wrote:
> Split host_signal_pc and host_signal_write out of user-exec.c.

> 

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

> ---

>  linux-user/host/alpha/host-signal.h | 41 +++++++++++++++++++++++++++++

>  accel/tcg/user-exec.c               | 31 +---------------------

>  2 files changed, 42 insertions(+), 30 deletions(-)

>  create mode 100644 linux-user/host/alpha/host-signal.h


Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Richard Henderson Sept. 19, 2021, 6:07 p.m. UTC | #2
On 9/19/21 11:03 AM, Philippe Mathieu-Daudé wrote:
> On 9/18/21 20:44, Richard Henderson wrote:

>> Split host_signal_pc and host_signal_write out of user-exec.c.

>>

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

>> ---

>>   linux-user/host/alpha/host-signal.h | 41 +++++++++++++++++++++++++++++

>>   accel/tcg/user-exec.c               | 31 +---------------------

>>   2 files changed, 42 insertions(+), 30 deletions(-)

>>   create mode 100644 linux-user/host/alpha/host-signal.h

> 

> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

> 


Amusingly, this is one bit that we might want to simply drop.  The remaining required 
entries in linux-user/host/arch/ are missing, so one can't actually build with alpha host 
at the moment.

Similarly, linux-user/host/ia64/ is also unusable, because we would have hit the #error in 
accel/tcg/user-exec.c, missing the host signal handling.


r~
Philippe Mathieu-Daudé Sept. 19, 2021, 6:11 p.m. UTC | #3
On 9/19/21 20:07, Richard Henderson wrote:
> On 9/19/21 11:03 AM, Philippe Mathieu-Daudé wrote:

>> On 9/18/21 20:44, Richard Henderson wrote:

>>> Split host_signal_pc and host_signal_write out of user-exec.c.

>>>

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

>>> ---

>>>   linux-user/host/alpha/host-signal.h | 41 +++++++++++++++++++++++++++++

>>>   accel/tcg/user-exec.c               | 31 +---------------------

>>>   2 files changed, 42 insertions(+), 30 deletions(-)

>>>   create mode 100644 linux-user/host/alpha/host-signal.h

>>

>> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

>>

> 

> Amusingly, this is one bit that we might want to simply drop.  The

> remaining required entries in linux-user/host/arch/ are missing, so one

> can't actually build with alpha host at the moment.

> 

> Similarly, linux-user/host/ia64/ is also unusable, because we would have

> hit the #error in accel/tcg/user-exec.c, missing the host signal handling.


Understandable. Since part of the work is done, I'd rather keep the
patches in this series and drop them after in another series (easier
to revert for someone interested in fixing these targets).
Philippe Mathieu-Daudé Sept. 19, 2021, 6:13 p.m. UTC | #4
On 9/18/21 20:44, Richard Henderson wrote:
> Split host_signal_pc and host_signal_write out of user-exec.c.

> 

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

> ---

>  linux-user/host/alpha/host-signal.h | 41 +++++++++++++++++++++++++++++

>  accel/tcg/user-exec.c               | 31 +---------------------

>  2 files changed, 42 insertions(+), 30 deletions(-)

>  create mode 100644 linux-user/host/alpha/host-signal.h


> +#ifndef ALPHA_HOST_SIGNAL_H

> +#define ALPHA_HOST_SIGNAL_H

> +

> +static inline uintptr_t host_signal_pc(ucontext_t *uc)

> +{

> +    return uc->uc_mcontext.sc_pc;

> +}

> +

> +static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)

> +{

> +    uint32_t *pc = uc->uc_mcontext.sc_pc;


BTW I'd use host_signal_pc() here for consistency with other targets.

> +    uint32_t insn = *pc;

> +

> +    /* XXX: need kernel patch to get write flag faster */

> +    switch (insn >> 26) {

> +    case 0x0d: /* stw */

> +    case 0x0e: /* stb */

> +    case 0x0f: /* stq_u */

> +    case 0x24: /* stf */

> +    case 0x25: /* stg */

[...]
diff mbox series

Patch

diff --git a/linux-user/host/alpha/host-signal.h b/linux-user/host/alpha/host-signal.h
new file mode 100644
index 0000000000..b0b488e004
--- /dev/null
+++ b/linux-user/host/alpha/host-signal.h
@@ -0,0 +1,41 @@ 
+/*
+ * host-signal.h: signal info dependent on the host architecture
+ *
+ * Copyright (C) 2021 Linaro Limited
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#ifndef ALPHA_HOST_SIGNAL_H
+#define ALPHA_HOST_SIGNAL_H
+
+static inline uintptr_t host_signal_pc(ucontext_t *uc)
+{
+    return uc->uc_mcontext.sc_pc;
+}
+
+static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
+{
+    uint32_t *pc = uc->uc_mcontext.sc_pc;
+    uint32_t insn = *pc;
+
+    /* XXX: need kernel patch to get write flag faster */
+    switch (insn >> 26) {
+    case 0x0d: /* stw */
+    case 0x0e: /* stb */
+    case 0x0f: /* stq_u */
+    case 0x24: /* stf */
+    case 0x25: /* stg */
+    case 0x26: /* sts */
+    case 0x27: /* stt */
+    case 0x2c: /* stl */
+    case 0x2d: /* stq */
+    case 0x2e: /* stl_c */
+    case 0x2f: /* stq_c */
+        return true;
+    }
+    return false;
+}
+
+#endif
diff --git a/accel/tcg/user-exec.c b/accel/tcg/user-exec.c
index e9e530e2e1..b895b5c8bd 100644
--- a/accel/tcg/user-exec.c
+++ b/accel/tcg/user-exec.c
@@ -255,36 +255,7 @@  void *probe_access(CPUArchState *env, target_ulong addr, int size,
     return size ? g2h(env_cpu(env), addr) : NULL;
 }
 
-#if defined(__alpha__)
-
-int cpu_signal_handler(int host_signum, void *pinfo,
-                           void *puc)
-{
-    siginfo_t *info = pinfo;
-    ucontext_t *uc = puc;
-    uint32_t *pc = uc->uc_mcontext.sc_pc;
-    uint32_t insn = *pc;
-    int is_write = 0;
-
-    /* XXX: need kernel patch to get write flag faster */
-    switch (insn >> 26) {
-    case 0x0d: /* stw */
-    case 0x0e: /* stb */
-    case 0x0f: /* stq_u */
-    case 0x24: /* stf */
-    case 0x25: /* stg */
-    case 0x26: /* sts */
-    case 0x27: /* stt */
-    case 0x2c: /* stl */
-    case 0x2d: /* stq */
-    case 0x2e: /* stl_c */
-    case 0x2f: /* stq_c */
-        is_write = 1;
-    }
-
-    return handle_cpu_signal(pc, info, is_write, &uc->uc_sigmask);
-}
-#elif defined(__sparc__)
+#if defined(__sparc__)
 
 int cpu_signal_handler(int host_signum, void *pinfo,
                        void *puc)