diff mbox series

[11/30] bsd-user/host/arm/host-signal.h: Implement host_signal_*

Message ID 20220109161923.85683-12-imp@bsdimp.com (mailing list archive)
State New, archived
Headers show
Series bsd-user: upstream our signal implementation | expand

Commit Message

Warner Losh Jan. 9, 2022, 4:19 p.m. UTC
Implement host_signal_pc, host_signal_set_pc and host_signal_write for
arm.

Signed-off-by: Kyle Evans <kevans@freebsd.org>
Signed-off-by: Warner Losh <imp@bsdimp.com>
---
 bsd-user/host/arm/host-signal.h | 39 +++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)
 create mode 100644 bsd-user/host/arm/host-signal.h

Comments

Peter Maydell Jan. 13, 2022, 7:32 p.m. UTC | #1
On Sun, 9 Jan 2022 at 16:33, Warner Losh <imp@bsdimp.com> wrote:
>
> Implement host_signal_pc, host_signal_set_pc and host_signal_write for
> arm.
>
> Signed-off-by: Kyle Evans <kevans@freebsd.org>
> Signed-off-by: Warner Losh <imp@bsdimp.com>

> +static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
> +{
> +    /*
> +     * In the FSR, bit 11 is WnR. FreeBSD returns this as part of the
> +     * si_info.si_trapno which we don't have access to here.  We assume that uc
> +     * is part of a trapframe and reach around to get to the si_info that's in
> +     * the sigframe just before it, though this may be unwise.
> +     */

Yeah, that's pretty nasty. But this function is passed a
siginfo_t pointer -- isn't that the one you need ?

> +    siginfo_t *si;
> +    si = &((siginfo_t *)uc)[-1];
> +    uint32_t fsr = si->si_trapno;
> +
> +    return extract32(fsr, 11, 1);
> +}

thanks
-- PMM
Warner Losh Jan. 17, 2022, 3:53 a.m. UTC | #2
On Thu, Jan 13, 2022 at 12:32 PM Peter Maydell <peter.maydell@linaro.org>
wrote:

> On Sun, 9 Jan 2022 at 16:33, Warner Losh <imp@bsdimp.com> wrote:
> >
> > Implement host_signal_pc, host_signal_set_pc and host_signal_write for
> > arm.
> >
> > Signed-off-by: Kyle Evans <kevans@freebsd.org>
> > Signed-off-by: Warner Losh <imp@bsdimp.com>
>
> > +static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
> > +{
> > +    /*
> > +     * In the FSR, bit 11 is WnR. FreeBSD returns this as part of the
> > +     * si_info.si_trapno which we don't have access to here.  We assume
> that uc
> > +     * is part of a trapframe and reach around to get to the si_info
> that's in
> > +     * the sigframe just before it, though this may be unwise.
> > +     */
>
> Yeah, that's pretty nasty. But this function is passed a
> siginfo_t pointer -- isn't that the one you need ?
>

Doh! I feel stupid now... You're right. This is a lot easier than I
thought. I'll fix that.

Warner


> > +    siginfo_t *si;
> > +    si = &((siginfo_t *)uc)[-1];
> > +    uint32_t fsr = si->si_trapno;
> > +
> > +    return extract32(fsr, 11, 1);
> > +}
>
> thanks
> -- PMM
>
diff mbox series

Patch

diff --git a/bsd-user/host/arm/host-signal.h b/bsd-user/host/arm/host-signal.h
new file mode 100644
index 00000000000..e403c26caed
--- /dev/null
+++ b/bsd-user/host/arm/host-signal.h
@@ -0,0 +1,39 @@ 
+/*
+ * host-signal.h: signal info dependent on the host architecture
+ *
+ * Copyright (c) 2021 Warner Losh
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef ARM_HOST_SIGNAL_H
+#define ARM_HOST_SIGNAL_H
+
+#include <sys/ucontext.h>
+
+static inline uintptr_t host_signal_pc(ucontext_t *uc)
+{
+    return uc->uc_mcontext.__gregs[_REG_PC];
+}
+
+static inline void host_signal_set_pc(ucontext_t *uc, uintptr_t pc)
+{
+    uc->uc_mcontext.__gregs[_REG_PC] = pc;
+}
+
+static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
+{
+    /*
+     * In the FSR, bit 11 is WnR. FreeBSD returns this as part of the
+     * si_info.si_trapno which we don't have access to here.  We assume that uc
+     * is part of a trapframe and reach around to get to the si_info that's in
+     * the sigframe just before it, though this may be unwise.
+     */
+    siginfo_t *si;
+    si = &((siginfo_t *)uc)[-1];
+    uint32_t fsr = si->si_trapno;
+
+    return extract32(fsr, 11, 1);
+}
+
+#endif