diff mbox series

[v5,07/67] linux-user/host/x86: Populate host_signal.h

Message ID 20211015041053.2769193-8-richard.henderson@linaro.org
State Superseded
Headers show
Series user-only: Cleanup SIGSEGV and SIGBUS handling | expand

Commit Message

Richard Henderson Oct. 15, 2021, 4:09 a.m. UTC
Split host_signal_pc and host_signal_write out of user-exec.c.
Drop the *BSD code, to be re-created under bsd-user/ later.

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

---
 linux-user/host/i386/host-signal.h   |  25 ++++-
 linux-user/host/x32/host-signal.h    |   2 +-
 linux-user/host/x86_64/host-signal.h |  25 ++++-
 accel/tcg/user-exec.c                | 136 +--------------------------
 4 files changed, 50 insertions(+), 138 deletions(-)

-- 
2.25.1

Comments

Warner Losh Oct. 15, 2021, 6:26 p.m. UTC | #1
On Thu, Oct 14, 2021 at 10:11 PM Richard Henderson <
richard.henderson@linaro.org> wrote:

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

> Drop the *BSD code, to be re-created under bsd-user/ later.

>

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

> ---

>  linux-user/host/i386/host-signal.h   |  25 ++++-

>  linux-user/host/x32/host-signal.h    |   2 +-

>  linux-user/host/x86_64/host-signal.h |  25 ++++-

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

>  4 files changed, 50 insertions(+), 138 deletions(-)

>


Reviewed-by: Warner Losh <imp@bsdimp.com>


Though I've not pulled this into bsd-user to see how it affects me,
so I may come to regret this :)

Warner


> diff --git a/linux-user/host/i386/host-signal.h

> b/linux-user/host/i386/host-signal.h

> index f4b4d65031..ccbbee5082 100644

> --- a/linux-user/host/i386/host-signal.h

> +++ b/linux-user/host/i386/host-signal.h

> @@ -1 +1,24 @@

> -#define HOST_SIGNAL_PLACEHOLDER

> +/*

> + * 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 I386_HOST_SIGNAL_H

> +#define I386_HOST_SIGNAL_H

> +

> +static inline uintptr_t host_signal_pc(ucontext_t *uc)

> +{

> +    return uc->uc_mcontext.gregs[REG_EIP];

> +}

> +

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

> +{

> +    return uc->uc_mcontext.gregs[REG_TRAPNO] == 0xe

> +        && (uc->uc_mcontext.gregs[REG_ERR] & 0x2);

> +}

> +

> +#endif

> diff --git a/linux-user/host/x32/host-signal.h

> b/linux-user/host/x32/host-signal.h

> index f4b4d65031..26800591d3 100644

> --- a/linux-user/host/x32/host-signal.h

> +++ b/linux-user/host/x32/host-signal.h

> @@ -1 +1 @@

> -#define HOST_SIGNAL_PLACEHOLDER

> +#include "../x86_64/host-signal.h"

> diff --git a/linux-user/host/x86_64/host-signal.h

> b/linux-user/host/x86_64/host-signal.h

> index f4b4d65031..883d2fcf65 100644

> --- a/linux-user/host/x86_64/host-signal.h

> +++ b/linux-user/host/x86_64/host-signal.h

> @@ -1 +1,24 @@

> -#define HOST_SIGNAL_PLACEHOLDER

> +/*

> + * 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 X86_64_HOST_SIGNAL_H

> +#define X86_64_HOST_SIGNAL_H

> +

> +static inline uintptr_t host_signal_pc(ucontext_t *uc)

> +{

> +    return uc->uc_mcontext.gregs[REG_RIP];

> +}

> +

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

> +{

> +    return uc->uc_mcontext.gregs[REG_TRAPNO] == 0xe

> +        && (uc->uc_mcontext.gregs[REG_ERR] & 0x2);

> +}

> +

> +#endif

> diff --git a/accel/tcg/user-exec.c b/accel/tcg/user-exec.c

> index 744af19397..474cb9cf82 100644

> --- a/accel/tcg/user-exec.c

> +++ b/accel/tcg/user-exec.c

> @@ -29,19 +29,6 @@

>  #include "trace/trace-root.h"

>  #include "internal.h"

>

> -#undef EAX

> -#undef ECX

> -#undef EDX

> -#undef EBX

> -#undef ESP

> -#undef EBP

> -#undef ESI

> -#undef EDI

> -#undef EIP

> -#ifdef __linux__

> -#include <sys/ucontext.h>

> -#endif

> -

>  __thread uintptr_t helper_retaddr;

>

>  //#define DEBUG_SIGNAL

> @@ -268,123 +255,7 @@ void *probe_access(CPUArchState *env, target_ulong

> addr, int size,

>      return size ? g2h(env_cpu(env), addr) : NULL;

>  }

>

> -#if defined(__i386__)

> -

> -#if defined(__NetBSD__)

> -#include <ucontext.h>

> -#include <machine/trap.h>

> -

> -#define EIP_sig(context)     ((context)->uc_mcontext.__gregs[_REG_EIP])

> -#define TRAP_sig(context)    ((context)->uc_mcontext.__gregs[_REG_TRAPNO])

> -#define ERROR_sig(context)   ((context)->uc_mcontext.__gregs[_REG_ERR])

> -#define MASK_sig(context)    ((context)->uc_sigmask)

> -#define PAGE_FAULT_TRAP      T_PAGEFLT

> -#elif defined(__FreeBSD__) || defined(__DragonFly__)

> -#include <ucontext.h>

> -#include <machine/trap.h>

> -

> -#define EIP_sig(context)  (*((unsigned long

> *)&(context)->uc_mcontext.mc_eip))

> -#define TRAP_sig(context)    ((context)->uc_mcontext.mc_trapno)

> -#define ERROR_sig(context)   ((context)->uc_mcontext.mc_err)

> -#define MASK_sig(context)    ((context)->uc_sigmask)

> -#define PAGE_FAULT_TRAP      T_PAGEFLT

> -#elif defined(__OpenBSD__)

> -#include <machine/trap.h>

> -#define EIP_sig(context)     ((context)->sc_eip)

> -#define TRAP_sig(context)    ((context)->sc_trapno)

> -#define ERROR_sig(context)   ((context)->sc_err)

> -#define MASK_sig(context)    ((context)->sc_mask)

> -#define PAGE_FAULT_TRAP      T_PAGEFLT

> -#else

> -#define EIP_sig(context)     ((context)->uc_mcontext.gregs[REG_EIP])

> -#define TRAP_sig(context)    ((context)->uc_mcontext.gregs[REG_TRAPNO])

> -#define ERROR_sig(context)   ((context)->uc_mcontext.gregs[REG_ERR])

> -#define MASK_sig(context)    ((context)->uc_sigmask)

> -#define PAGE_FAULT_TRAP      0xe

> -#endif

> -

> -int cpu_signal_handler(int host_signum, void *pinfo,

> -                       void *puc)

> -{

> -    siginfo_t *info = pinfo;

> -#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)

> -    ucontext_t *uc = puc;

> -#elif defined(__OpenBSD__)

> -    struct sigcontext *uc = puc;

> -#else

> -    ucontext_t *uc = puc;

> -#endif

> -    unsigned long pc;

> -    int trapno;

> -

> -#ifndef REG_EIP

> -/* for glibc 2.1 */

> -#define REG_EIP    EIP

> -#define REG_ERR    ERR

> -#define REG_TRAPNO TRAPNO

> -#endif

> -    pc = EIP_sig(uc);

> -    trapno = TRAP_sig(uc);

> -    return handle_cpu_signal(pc, info,

> -                             trapno == PAGE_FAULT_TRAP ?

> -                             (ERROR_sig(uc) >> 1) & 1 : 0,

> -                             &MASK_sig(uc));

> -}

> -

> -#elif defined(__x86_64__)

> -

> -#ifdef __NetBSD__

> -#include <machine/trap.h>

> -#define PC_sig(context)       _UC_MACHINE_PC(context)

> -#define TRAP_sig(context)

>  ((context)->uc_mcontext.__gregs[_REG_TRAPNO])

> -#define ERROR_sig(context)    ((context)->uc_mcontext.__gregs[_REG_ERR])

> -#define MASK_sig(context)     ((context)->uc_sigmask)

> -#define PAGE_FAULT_TRAP       T_PAGEFLT

> -#elif defined(__OpenBSD__)

> -#include <machine/trap.h>

> -#define PC_sig(context)       ((context)->sc_rip)

> -#define TRAP_sig(context)     ((context)->sc_trapno)

> -#define ERROR_sig(context)    ((context)->sc_err)

> -#define MASK_sig(context)     ((context)->sc_mask)

> -#define PAGE_FAULT_TRAP       T_PAGEFLT

> -#elif defined(__FreeBSD__) || defined(__DragonFly__)

> -#include <ucontext.h>

> -#include <machine/trap.h>

> -

> -#define PC_sig(context)  (*((unsigned long

> *)&(context)->uc_mcontext.mc_rip))

> -#define TRAP_sig(context)     ((context)->uc_mcontext.mc_trapno)

> -#define ERROR_sig(context)    ((context)->uc_mcontext.mc_err)

> -#define MASK_sig(context)     ((context)->uc_sigmask)

> -#define PAGE_FAULT_TRAP       T_PAGEFLT

> -#else

> -#define PC_sig(context)       ((context)->uc_mcontext.gregs[REG_RIP])

> -#define TRAP_sig(context)     ((context)->uc_mcontext.gregs[REG_TRAPNO])

> -#define ERROR_sig(context)    ((context)->uc_mcontext.gregs[REG_ERR])

> -#define MASK_sig(context)     ((context)->uc_sigmask)

> -#define PAGE_FAULT_TRAP       0xe

> -#endif

> -

> -int cpu_signal_handler(int host_signum, void *pinfo,

> -                       void *puc)

> -{

> -    siginfo_t *info = pinfo;

> -    unsigned long pc;

> -#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)

> -    ucontext_t *uc = puc;

> -#elif defined(__OpenBSD__)

> -    struct sigcontext *uc = puc;

> -#else

> -    ucontext_t *uc = puc;

> -#endif

> -

> -    pc = PC_sig(uc);

> -    return handle_cpu_signal(pc, info,

> -                             TRAP_sig(uc) == PAGE_FAULT_TRAP ?

> -                             (ERROR_sig(uc) >> 1) & 1 : 0,

> -                             &MASK_sig(uc));

> -}

> -

> -#elif defined(_ARCH_PPC)

> +#if defined(_ARCH_PPC)

>

>  /***********************************************************************

>   * signal context platform-specific definitions

> @@ -895,11 +766,6 @@ int cpu_signal_handler(int host_signum, void *pinfo,

>

>      return handle_cpu_signal(pc, info, is_write, &uc->uc_sigmask);

>  }

> -

> -#else

> -

> -#error host CPU specific signal handler needed

> -

>  #endif

>

>  /* The softmmu versions of these helpers are in cputlb.c.  */

> --

> 2.25.1

>

>
<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Oct 14, 2021 at 10:11 PM Richard Henderson &lt;<a href="mailto:richard.henderson@linaro.org">richard.henderson@linaro.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Split host_signal_pc and host_signal_write out of user-exec.c.<br>
Drop the *BSD code, to be re-created under bsd-user/ later.<br>
<br>
Signed-off-by: Richard Henderson &lt;<a href="mailto:richard.henderson@linaro.org" target="_blank">richard.henderson@linaro.org</a>&gt;<br>

---<br>
 linux-user/host/i386/host-signal.h   |  25 ++++-<br>
 linux-user/host/x32/host-signal.h    |   2 +-<br>
 linux-user/host/x86_64/host-signal.h |  25 ++++-<br>
 accel/tcg/user-exec.c                | 136 +--------------------------<br>
 4 files changed, 50 insertions(+), 138 deletions(-)<br></blockquote><div><br></div><div><div>Reviewed-by: Warner Losh &lt;<a href="mailto:imp@bsdimp.com">imp@bsdimp.com</a>&gt;</div></div><div><br></div><div>Though I&#39;ve not pulled this into bsd-user to see how it affects me,</div><div>so I may come to regret this :)</div><div><br></div><div>Warner</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
diff --git a/linux-user/host/i386/host-signal.h b/linux-user/host/i386/host-signal.h<br>
index f4b4d65031..ccbbee5082 100644<br>
--- a/linux-user/host/i386/host-signal.h<br>
+++ b/linux-user/host/i386/host-signal.h<br>
@@ -1 +1,24 @@<br>
-#define HOST_SIGNAL_PLACEHOLDER<br>
+/*<br>
+ * host-signal.h: signal info dependent on the host architecture<br>
+ *<br>
+ * Copyright (C) 2021 Linaro Limited<br>
+ *<br>
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.<br>
+ * See the COPYING file in the top-level directory.<br>
+ */<br>
+<br>
+#ifndef I386_HOST_SIGNAL_H<br>
+#define I386_HOST_SIGNAL_H<br>
+<br>
+static inline uintptr_t host_signal_pc(ucontext_t *uc)<br>
+{<br>
+    return uc-&gt;uc_mcontext.gregs[REG_EIP];<br>
+}<br>
+<br>
+static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)<br>
+{<br>
+    return uc-&gt;uc_mcontext.gregs[REG_TRAPNO] == 0xe<br>
+        &amp;&amp; (uc-&gt;uc_mcontext.gregs[REG_ERR] &amp; 0x2);<br>
+}<br>
+<br>
+#endif<br>
diff --git a/linux-user/host/x32/host-signal.h b/linux-user/host/x32/host-signal.h<br>
index f4b4d65031..26800591d3 100644<br>
--- a/linux-user/host/x32/host-signal.h<br>
+++ b/linux-user/host/x32/host-signal.h<br>
@@ -1 +1 @@<br>
-#define HOST_SIGNAL_PLACEHOLDER<br>
+#include &quot;../x86_64/host-signal.h&quot;<br>
diff --git a/linux-user/host/x86_64/host-signal.h b/linux-user/host/x86_64/host-signal.h<br>
index f4b4d65031..883d2fcf65 100644<br>
--- a/linux-user/host/x86_64/host-signal.h<br>
+++ b/linux-user/host/x86_64/host-signal.h<br>
@@ -1 +1,24 @@<br>
-#define HOST_SIGNAL_PLACEHOLDER<br>
+/*<br>
+ * host-signal.h: signal info dependent on the host architecture<br>
+ *<br>
+ * Copyright (C) 2021 Linaro Limited<br>
+ *<br>
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.<br>
+ * See the COPYING file in the top-level directory.<br>
+ */<br>
+<br>
+#ifndef X86_64_HOST_SIGNAL_H<br>
+#define X86_64_HOST_SIGNAL_H<br>
+<br>
+static inline uintptr_t host_signal_pc(ucontext_t *uc)<br>
+{<br>
+    return uc-&gt;uc_mcontext.gregs[REG_RIP];<br>
+}<br>
+<br>
+static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)<br>
+{<br>
+    return uc-&gt;uc_mcontext.gregs[REG_TRAPNO] == 0xe<br>
+        &amp;&amp; (uc-&gt;uc_mcontext.gregs[REG_ERR] &amp; 0x2);<br>
+}<br>
+<br>
+#endif<br>
diff --git a/accel/tcg/user-exec.c b/accel/tcg/user-exec.c<br>
index 744af19397..474cb9cf82 100644<br>
--- a/accel/tcg/user-exec.c<br>
+++ b/accel/tcg/user-exec.c<br>
@@ -29,19 +29,6 @@<br>
 #include &quot;trace/trace-root.h&quot;<br>
 #include &quot;internal.h&quot;<br>
<br>
-#undef EAX<br>
-#undef ECX<br>
-#undef EDX<br>
-#undef EBX<br>
-#undef ESP<br>
-#undef EBP<br>
-#undef ESI<br>
-#undef EDI<br>
-#undef EIP<br>
-#ifdef __linux__<br>
-#include &lt;sys/ucontext.h&gt;<br>
-#endif<br>
-<br>
 __thread uintptr_t helper_retaddr;<br>
<br>
 //#define DEBUG_SIGNAL<br>
@@ -268,123 +255,7 @@ void *probe_access(CPUArchState *env, target_ulong addr, int size,<br>
     return size ? g2h(env_cpu(env), addr) : NULL;<br>
 }<br>
<br>
-#if defined(__i386__)<br>
-<br>
-#if defined(__NetBSD__)<br>
-#include &lt;ucontext.h&gt;<br>
-#include &lt;machine/trap.h&gt;<br>
-<br>
-#define EIP_sig(context)     ((context)-&gt;uc_mcontext.__gregs[_REG_EIP])<br>
-#define TRAP_sig(context)    ((context)-&gt;uc_mcontext.__gregs[_REG_TRAPNO])<br>
-#define ERROR_sig(context)   ((context)-&gt;uc_mcontext.__gregs[_REG_ERR])<br>
-#define MASK_sig(context)    ((context)-&gt;uc_sigmask)<br>
-#define PAGE_FAULT_TRAP      T_PAGEFLT<br>
-#elif defined(__FreeBSD__) || defined(__DragonFly__)<br>
-#include &lt;ucontext.h&gt;<br>
-#include &lt;machine/trap.h&gt;<br>
-<br>
-#define EIP_sig(context)  (*((unsigned long *)&amp;(context)-&gt;uc_mcontext.mc_eip))<br>
-#define TRAP_sig(context)    ((context)-&gt;uc_mcontext.mc_trapno)<br>
-#define ERROR_sig(context)   ((context)-&gt;uc_mcontext.mc_err)<br>
-#define MASK_sig(context)    ((context)-&gt;uc_sigmask)<br>
-#define PAGE_FAULT_TRAP      T_PAGEFLT<br>
-#elif defined(__OpenBSD__)<br>
-#include &lt;machine/trap.h&gt;<br>
-#define EIP_sig(context)     ((context)-&gt;sc_eip)<br>
-#define TRAP_sig(context)    ((context)-&gt;sc_trapno)<br>
-#define ERROR_sig(context)   ((context)-&gt;sc_err)<br>
-#define MASK_sig(context)    ((context)-&gt;sc_mask)<br>
-#define PAGE_FAULT_TRAP      T_PAGEFLT<br>
-#else<br>
-#define EIP_sig(context)     ((context)-&gt;uc_mcontext.gregs[REG_EIP])<br>
-#define TRAP_sig(context)    ((context)-&gt;uc_mcontext.gregs[REG_TRAPNO])<br>
-#define ERROR_sig(context)   ((context)-&gt;uc_mcontext.gregs[REG_ERR])<br>
-#define MASK_sig(context)    ((context)-&gt;uc_sigmask)<br>
-#define PAGE_FAULT_TRAP      0xe<br>
-#endif<br>
-<br>
-int cpu_signal_handler(int host_signum, void *pinfo,<br>
-                       void *puc)<br>
-{<br>
-    siginfo_t *info = pinfo;<br>
-#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)<br>
-    ucontext_t *uc = puc;<br>
-#elif defined(__OpenBSD__)<br>
-    struct sigcontext *uc = puc;<br>
-#else<br>
-    ucontext_t *uc = puc;<br>
-#endif<br>
-    unsigned long pc;<br>
-    int trapno;<br>
-<br>
-#ifndef REG_EIP<br>
-/* for glibc 2.1 */<br>
-#define REG_EIP    EIP<br>
-#define REG_ERR    ERR<br>
-#define REG_TRAPNO TRAPNO<br>
-#endif<br>
-    pc = EIP_sig(uc);<br>
-    trapno = TRAP_sig(uc);<br>
-    return handle_cpu_signal(pc, info,<br>
-                             trapno == PAGE_FAULT_TRAP ?<br>
-                             (ERROR_sig(uc) &gt;&gt; 1) &amp; 1 : 0,<br>
-                             &amp;MASK_sig(uc));<br>
-}<br>
-<br>
-#elif defined(__x86_64__)<br>
-<br>
-#ifdef __NetBSD__<br>
-#include &lt;machine/trap.h&gt;<br>
-#define PC_sig(context)       _UC_MACHINE_PC(context)<br>
-#define TRAP_sig(context)     ((context)-&gt;uc_mcontext.__gregs[_REG_TRAPNO])<br>
-#define ERROR_sig(context)    ((context)-&gt;uc_mcontext.__gregs[_REG_ERR])<br>
-#define MASK_sig(context)     ((context)-&gt;uc_sigmask)<br>
-#define PAGE_FAULT_TRAP       T_PAGEFLT<br>
-#elif defined(__OpenBSD__)<br>
-#include &lt;machine/trap.h&gt;<br>
-#define PC_sig(context)       ((context)-&gt;sc_rip)<br>
-#define TRAP_sig(context)     ((context)-&gt;sc_trapno)<br>
-#define ERROR_sig(context)    ((context)-&gt;sc_err)<br>
-#define MASK_sig(context)     ((context)-&gt;sc_mask)<br>
-#define PAGE_FAULT_TRAP       T_PAGEFLT<br>
-#elif defined(__FreeBSD__) || defined(__DragonFly__)<br>
-#include &lt;ucontext.h&gt;<br>
-#include &lt;machine/trap.h&gt;<br>
-<br>
-#define PC_sig(context)  (*((unsigned long *)&amp;(context)-&gt;uc_mcontext.mc_rip))<br>
-#define TRAP_sig(context)     ((context)-&gt;uc_mcontext.mc_trapno)<br>
-#define ERROR_sig(context)    ((context)-&gt;uc_mcontext.mc_err)<br>
-#define MASK_sig(context)     ((context)-&gt;uc_sigmask)<br>
-#define PAGE_FAULT_TRAP       T_PAGEFLT<br>
-#else<br>
-#define PC_sig(context)       ((context)-&gt;uc_mcontext.gregs[REG_RIP])<br>
-#define TRAP_sig(context)     ((context)-&gt;uc_mcontext.gregs[REG_TRAPNO])<br>
-#define ERROR_sig(context)    ((context)-&gt;uc_mcontext.gregs[REG_ERR])<br>
-#define MASK_sig(context)     ((context)-&gt;uc_sigmask)<br>
-#define PAGE_FAULT_TRAP       0xe<br>
-#endif<br>
-<br>
-int cpu_signal_handler(int host_signum, void *pinfo,<br>
-                       void *puc)<br>
-{<br>
-    siginfo_t *info = pinfo;<br>
-    unsigned long pc;<br>
-#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)<br>
-    ucontext_t *uc = puc;<br>
-#elif defined(__OpenBSD__)<br>
-    struct sigcontext *uc = puc;<br>
-#else<br>
-    ucontext_t *uc = puc;<br>
-#endif<br>
-<br>
-    pc = PC_sig(uc);<br>
-    return handle_cpu_signal(pc, info,<br>
-                             TRAP_sig(uc) == PAGE_FAULT_TRAP ?<br>
-                             (ERROR_sig(uc) &gt;&gt; 1) &amp; 1 : 0,<br>
-                             &amp;MASK_sig(uc));<br>
-}<br>
-<br>
-#elif defined(_ARCH_PPC)<br>
+#if defined(_ARCH_PPC)<br>
<br>
 /***********************************************************************<br>
  * signal context platform-specific definitions<br>
@@ -895,11 +766,6 @@ int cpu_signal_handler(int host_signum, void *pinfo,<br>
<br>
     return handle_cpu_signal(pc, info, is_write, &amp;uc-&gt;uc_sigmask);<br>
 }<br>
-<br>
-#else<br>
-<br>
-#error host CPU specific signal handler needed<br>
-<br>
 #endif<br>
<br>
 /* The softmmu versions of these helpers are in cputlb.c.  */<br>
-- <br>
2.25.1<br>
<br>
</blockquote></div></div>
diff mbox series

Patch

diff --git a/linux-user/host/i386/host-signal.h b/linux-user/host/i386/host-signal.h
index f4b4d65031..ccbbee5082 100644
--- a/linux-user/host/i386/host-signal.h
+++ b/linux-user/host/i386/host-signal.h
@@ -1 +1,24 @@ 
-#define HOST_SIGNAL_PLACEHOLDER
+/*
+ * 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 I386_HOST_SIGNAL_H
+#define I386_HOST_SIGNAL_H
+
+static inline uintptr_t host_signal_pc(ucontext_t *uc)
+{
+    return uc->uc_mcontext.gregs[REG_EIP];
+}
+
+static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
+{
+    return uc->uc_mcontext.gregs[REG_TRAPNO] == 0xe
+        && (uc->uc_mcontext.gregs[REG_ERR] & 0x2);
+}
+
+#endif
diff --git a/linux-user/host/x32/host-signal.h b/linux-user/host/x32/host-signal.h
index f4b4d65031..26800591d3 100644
--- a/linux-user/host/x32/host-signal.h
+++ b/linux-user/host/x32/host-signal.h
@@ -1 +1 @@ 
-#define HOST_SIGNAL_PLACEHOLDER
+#include "../x86_64/host-signal.h"
diff --git a/linux-user/host/x86_64/host-signal.h b/linux-user/host/x86_64/host-signal.h
index f4b4d65031..883d2fcf65 100644
--- a/linux-user/host/x86_64/host-signal.h
+++ b/linux-user/host/x86_64/host-signal.h
@@ -1 +1,24 @@ 
-#define HOST_SIGNAL_PLACEHOLDER
+/*
+ * 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 X86_64_HOST_SIGNAL_H
+#define X86_64_HOST_SIGNAL_H
+
+static inline uintptr_t host_signal_pc(ucontext_t *uc)
+{
+    return uc->uc_mcontext.gregs[REG_RIP];
+}
+
+static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
+{
+    return uc->uc_mcontext.gregs[REG_TRAPNO] == 0xe
+        && (uc->uc_mcontext.gregs[REG_ERR] & 0x2);
+}
+
+#endif
diff --git a/accel/tcg/user-exec.c b/accel/tcg/user-exec.c
index 744af19397..474cb9cf82 100644
--- a/accel/tcg/user-exec.c
+++ b/accel/tcg/user-exec.c
@@ -29,19 +29,6 @@ 
 #include "trace/trace-root.h"
 #include "internal.h"
 
-#undef EAX
-#undef ECX
-#undef EDX
-#undef EBX
-#undef ESP
-#undef EBP
-#undef ESI
-#undef EDI
-#undef EIP
-#ifdef __linux__
-#include <sys/ucontext.h>
-#endif
-
 __thread uintptr_t helper_retaddr;
 
 //#define DEBUG_SIGNAL
@@ -268,123 +255,7 @@  void *probe_access(CPUArchState *env, target_ulong addr, int size,
     return size ? g2h(env_cpu(env), addr) : NULL;
 }
 
-#if defined(__i386__)
-
-#if defined(__NetBSD__)
-#include <ucontext.h>
-#include <machine/trap.h>
-
-#define EIP_sig(context)     ((context)->uc_mcontext.__gregs[_REG_EIP])
-#define TRAP_sig(context)    ((context)->uc_mcontext.__gregs[_REG_TRAPNO])
-#define ERROR_sig(context)   ((context)->uc_mcontext.__gregs[_REG_ERR])
-#define MASK_sig(context)    ((context)->uc_sigmask)
-#define PAGE_FAULT_TRAP      T_PAGEFLT
-#elif defined(__FreeBSD__) || defined(__DragonFly__)
-#include <ucontext.h>
-#include <machine/trap.h>
-
-#define EIP_sig(context)  (*((unsigned long *)&(context)->uc_mcontext.mc_eip))
-#define TRAP_sig(context)    ((context)->uc_mcontext.mc_trapno)
-#define ERROR_sig(context)   ((context)->uc_mcontext.mc_err)
-#define MASK_sig(context)    ((context)->uc_sigmask)
-#define PAGE_FAULT_TRAP      T_PAGEFLT
-#elif defined(__OpenBSD__)
-#include <machine/trap.h>
-#define EIP_sig(context)     ((context)->sc_eip)
-#define TRAP_sig(context)    ((context)->sc_trapno)
-#define ERROR_sig(context)   ((context)->sc_err)
-#define MASK_sig(context)    ((context)->sc_mask)
-#define PAGE_FAULT_TRAP      T_PAGEFLT
-#else
-#define EIP_sig(context)     ((context)->uc_mcontext.gregs[REG_EIP])
-#define TRAP_sig(context)    ((context)->uc_mcontext.gregs[REG_TRAPNO])
-#define ERROR_sig(context)   ((context)->uc_mcontext.gregs[REG_ERR])
-#define MASK_sig(context)    ((context)->uc_sigmask)
-#define PAGE_FAULT_TRAP      0xe
-#endif
-
-int cpu_signal_handler(int host_signum, void *pinfo,
-                       void *puc)
-{
-    siginfo_t *info = pinfo;
-#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)
-    ucontext_t *uc = puc;
-#elif defined(__OpenBSD__)
-    struct sigcontext *uc = puc;
-#else
-    ucontext_t *uc = puc;
-#endif
-    unsigned long pc;
-    int trapno;
-
-#ifndef REG_EIP
-/* for glibc 2.1 */
-#define REG_EIP    EIP
-#define REG_ERR    ERR
-#define REG_TRAPNO TRAPNO
-#endif
-    pc = EIP_sig(uc);
-    trapno = TRAP_sig(uc);
-    return handle_cpu_signal(pc, info,
-                             trapno == PAGE_FAULT_TRAP ?
-                             (ERROR_sig(uc) >> 1) & 1 : 0,
-                             &MASK_sig(uc));
-}
-
-#elif defined(__x86_64__)
-
-#ifdef __NetBSD__
-#include <machine/trap.h>
-#define PC_sig(context)       _UC_MACHINE_PC(context)
-#define TRAP_sig(context)     ((context)->uc_mcontext.__gregs[_REG_TRAPNO])
-#define ERROR_sig(context)    ((context)->uc_mcontext.__gregs[_REG_ERR])
-#define MASK_sig(context)     ((context)->uc_sigmask)
-#define PAGE_FAULT_TRAP       T_PAGEFLT
-#elif defined(__OpenBSD__)
-#include <machine/trap.h>
-#define PC_sig(context)       ((context)->sc_rip)
-#define TRAP_sig(context)     ((context)->sc_trapno)
-#define ERROR_sig(context)    ((context)->sc_err)
-#define MASK_sig(context)     ((context)->sc_mask)
-#define PAGE_FAULT_TRAP       T_PAGEFLT
-#elif defined(__FreeBSD__) || defined(__DragonFly__)
-#include <ucontext.h>
-#include <machine/trap.h>
-
-#define PC_sig(context)  (*((unsigned long *)&(context)->uc_mcontext.mc_rip))
-#define TRAP_sig(context)     ((context)->uc_mcontext.mc_trapno)
-#define ERROR_sig(context)    ((context)->uc_mcontext.mc_err)
-#define MASK_sig(context)     ((context)->uc_sigmask)
-#define PAGE_FAULT_TRAP       T_PAGEFLT
-#else
-#define PC_sig(context)       ((context)->uc_mcontext.gregs[REG_RIP])
-#define TRAP_sig(context)     ((context)->uc_mcontext.gregs[REG_TRAPNO])
-#define ERROR_sig(context)    ((context)->uc_mcontext.gregs[REG_ERR])
-#define MASK_sig(context)     ((context)->uc_sigmask)
-#define PAGE_FAULT_TRAP       0xe
-#endif
-
-int cpu_signal_handler(int host_signum, void *pinfo,
-                       void *puc)
-{
-    siginfo_t *info = pinfo;
-    unsigned long pc;
-#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)
-    ucontext_t *uc = puc;
-#elif defined(__OpenBSD__)
-    struct sigcontext *uc = puc;
-#else
-    ucontext_t *uc = puc;
-#endif
-
-    pc = PC_sig(uc);
-    return handle_cpu_signal(pc, info,
-                             TRAP_sig(uc) == PAGE_FAULT_TRAP ?
-                             (ERROR_sig(uc) >> 1) & 1 : 0,
-                             &MASK_sig(uc));
-}
-
-#elif defined(_ARCH_PPC)
+#if defined(_ARCH_PPC)
 
 /***********************************************************************
  * signal context platform-specific definitions
@@ -895,11 +766,6 @@  int cpu_signal_handler(int host_signum, void *pinfo,
 
     return handle_cpu_signal(pc, info, is_write, &uc->uc_sigmask);
 }
-
-#else
-
-#error host CPU specific signal handler needed
-
 #endif
 
 /* The softmmu versions of these helpers are in cputlb.c.  */