diff mbox series

[15/18] bsd-user: Implement RISC-V signal trampoline setup functions

Message ID 20240802083423.142365-16-itachis@FreeBSD.org
State New
Headers show
Series bsd-user: Comprehensive RISCV support | expand

Commit Message

Ajeet Singh Aug. 2, 2024, 8:34 a.m. UTC
From: Mark Corbin <mark.corbin@embecsom.com>

Added functions for setting up the RISC-V signal trampoline and signal
frame:

'set_sigtramp_args()': Configures the RISC-V CPU state with arguments
for the signal handler. It sets up the registers with the signal
number,pointers to the signal info and user context, the signal handler
address, and the signal frame pointer.

'setup_sigframe_arch()': Initializes the signal frame with the current
machine context.This function copies the context from the CPU state to
the signal frame, preparing it for the signal handler.

Signed-off-by: Mark Corbin <mark.corbin@embecsom.com>
Signed-off-by: Ajeet Singh <itachis@FreeBSD.org>
Signed-off-by: Warner Losh <imp@bsdimp.com>
Co-authored-by: Warner Losh <imp@bsdimp.com>
---
 bsd-user/riscv/signal.c | 63 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 63 insertions(+)
 create mode 100644 bsd-user/riscv/signal.c

Comments

Richard Henderson Aug. 2, 2024, 1:46 p.m. UTC | #1
On 8/2/24 18:34, Ajeet Singh wrote:
> From: Mark Corbin <mark.corbin@embecsom.com>
> 
> Added functions for setting up the RISC-V signal trampoline and signal
> frame:
> 
> 'set_sigtramp_args()': Configures the RISC-V CPU state with arguments
> for the signal handler. It sets up the registers with the signal
> number,pointers to the signal info and user context, the signal handler
> address, and the signal frame pointer.
> 
> 'setup_sigframe_arch()': Initializes the signal frame with the current
> machine context.This function copies the context from the CPU state to
> the signal frame, preparing it for the signal handler.
> 
> Signed-off-by: Mark Corbin <mark.corbin@embecsom.com>
> Signed-off-by: Ajeet Singh <itachis@FreeBSD.org>
> Signed-off-by: Warner Losh <imp@bsdimp.com>
> Co-authored-by: Warner Losh <imp@bsdimp.com>
> ---
>   bsd-user/riscv/signal.c | 63 +++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 63 insertions(+)
>   create mode 100644 bsd-user/riscv/signal.c
> 
> diff --git a/bsd-user/riscv/signal.c b/bsd-user/riscv/signal.c
> new file mode 100644
> index 0000000000..005eb53cab
> --- /dev/null
> +++ b/bsd-user/riscv/signal.c
> @@ -0,0 +1,63 @@
> +/*
> + *  RISC-V signal definitions
> + *
> + *  Copyright (c) 2019 Mark Corbin
> + *
> + *  This program is free software; you can redistribute it and/or modify
> + *  it under the terms of the GNU General Public License as published by
> + *  the Free Software Foundation; either version 2 of the License, or
> + *  (at your option) any later version.
> + *
> + *  This program is distributed in the hope that it will be useful,
> + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *  GNU General Public License for more details.
> + *
> + *  You should have received a copy of the GNU General Public License
> + *  along with this program; if not, see <http://www.gnu.org/licenses/>.
> + */
> +#include "qemu/osdep.h"
> +
> +#include "qemu.h"
> +
> +/*
> + * Compare with sendsig() in riscv/riscv/exec_machdep.c
> + * Assumes that target stack frame memory is locked.
> + */
> +abi_long
> +set_sigtramp_args(CPURISCVState *regs, int sig, struct target_sigframe *frame,
> +    abi_ulong frame_addr, struct target_sigaction *ka)
> +{
> +    /*
> +     * Arguments to signal handler:
> +     *  a0 (10) = signal number
> +     *  a1 (11) = siginfo pointer
> +     *  a2 (12) = ucontext pointer
> +     *  pc      = signal pointer handler
> +     *  sp (2)  = sigframe pointer
> +     *  ra (1)  = sigtramp at base of user stack
> +     */
> +
> +     regs->gpr[10] = sig;
> +     regs->gpr[11] = frame_addr +
> +         offsetof(struct target_sigframe, sf_si);
> +     regs->gpr[12] = frame_addr +
> +         offsetof(struct target_sigframe, sf_uc);

xA0 .. xA2

> +     regs->pc = ka->_sa_handler;
> +     regs->gpr[2] = frame_addr;
> +     regs->gpr[1] = TARGET_PS_STRINGS - TARGET_SZSIGCODE;

xRA, xSP.

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

r~
Warner Losh Aug. 3, 2024, 12:04 a.m. UTC | #2
On Fri, Aug 2, 2024 at 7:46 AM Richard Henderson <
richard.henderson@linaro.org> wrote:

> On 8/2/24 18:34, Ajeet Singh wrote:
> > From: Mark Corbin <mark.corbin@embecsom.com>
> >
> > Added functions for setting up the RISC-V signal trampoline and signal
> > frame:
> >
> > 'set_sigtramp_args()': Configures the RISC-V CPU state with arguments
> > for the signal handler. It sets up the registers with the signal
> > number,pointers to the signal info and user context, the signal handler
> > address, and the signal frame pointer.
> >
> > 'setup_sigframe_arch()': Initializes the signal frame with the current
> > machine context.This function copies the context from the CPU state to
> > the signal frame, preparing it for the signal handler.
> >
> > Signed-off-by: Mark Corbin <mark.corbin@embecsom.com>
> > Signed-off-by: Ajeet Singh <itachis@FreeBSD.org>
> > Signed-off-by: Warner Losh <imp@bsdimp.com>
> > Co-authored-by: Warner Losh <imp@bsdimp.com>
> > ---
> >   bsd-user/riscv/signal.c | 63 +++++++++++++++++++++++++++++++++++++++++
> >   1 file changed, 63 insertions(+)
> >   create mode 100644 bsd-user/riscv/signal.c
> >
> > diff --git a/bsd-user/riscv/signal.c b/bsd-user/riscv/signal.c
> > new file mode 100644
> > index 0000000000..005eb53cab
> > --- /dev/null
> > +++ b/bsd-user/riscv/signal.c
> > @@ -0,0 +1,63 @@
> > +/*
> > + *  RISC-V signal definitions
> > + *
> > + *  Copyright (c) 2019 Mark Corbin
> > + *
> > + *  This program is free software; you can redistribute it and/or modify
> > + *  it under the terms of the GNU General Public License as published by
> > + *  the Free Software Foundation; either version 2 of the License, or
> > + *  (at your option) any later version.
> > + *
> > + *  This program is distributed in the hope that it will be useful,
> > + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> > + *  GNU General Public License for more details.
> > + *
> > + *  You should have received a copy of the GNU General Public License
> > + *  along with this program; if not, see <http://www.gnu.org/licenses/
> >.
> > + */
> > +#include "qemu/osdep.h"
> > +
> > +#include "qemu.h"
> > +
> > +/*
> > + * Compare with sendsig() in riscv/riscv/exec_machdep.c
> > + * Assumes that target stack frame memory is locked.
> > + */
> > +abi_long
> > +set_sigtramp_args(CPURISCVState *regs, int sig, struct target_sigframe
> *frame,
> > +    abi_ulong frame_addr, struct target_sigaction *ka)
> > +{
> > +    /*
> > +     * Arguments to signal handler:
> > +     *  a0 (10) = signal number
> > +     *  a1 (11) = siginfo pointer
> > +     *  a2 (12) = ucontext pointer
> > +     *  pc      = signal pointer handler
> > +     *  sp (2)  = sigframe pointer
> > +     *  ra (1)  = sigtramp at base of user stack
> > +     */
> > +
> > +     regs->gpr[10] = sig;
> > +     regs->gpr[11] = frame_addr +
> > +         offsetof(struct target_sigframe, sf_si);
> > +     regs->gpr[12] = frame_addr +
> > +         offsetof(struct target_sigframe, sf_uc);
>
> xA0 .. xA2
>
> > +     regs->pc = ka->_sa_handler;
> > +     regs->gpr[2] = frame_addr;
> > +     regs->gpr[1] = TARGET_PS_STRINGS - TARGET_SZSIGCODE;
>
> xRA, xSP.
>

So to be clear, this is 'use these constants rather than the raw numbers
for the array subscripts' right?

Warner

Otherwise,
> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
>
> r~
>
Richard Henderson Aug. 3, 2024, 9:33 a.m. UTC | #3
On 8/3/24 10:04, Warner Losh wrote:
>      > +     regs->pc = ka->_sa_handler;
>      > +     regs->gpr[2] = frame_addr;
>      > +     regs->gpr[1] = TARGET_PS_STRINGS - TARGET_SZSIGCODE;
> 
>     xRA, xSP.
> 
> 
> So to be clear, this is 'use these constants rather than the raw numbers for the array 
> subscripts' right?

Exactly.

r~
diff mbox series

Patch

diff --git a/bsd-user/riscv/signal.c b/bsd-user/riscv/signal.c
new file mode 100644
index 0000000000..005eb53cab
--- /dev/null
+++ b/bsd-user/riscv/signal.c
@@ -0,0 +1,63 @@ 
+/*
+ *  RISC-V signal definitions
+ *
+ *  Copyright (c) 2019 Mark Corbin
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+#include "qemu/osdep.h"
+
+#include "qemu.h"
+
+/*
+ * Compare with sendsig() in riscv/riscv/exec_machdep.c
+ * Assumes that target stack frame memory is locked.
+ */
+abi_long
+set_sigtramp_args(CPURISCVState *regs, int sig, struct target_sigframe *frame,
+    abi_ulong frame_addr, struct target_sigaction *ka)
+{
+    /*
+     * Arguments to signal handler:
+     *  a0 (10) = signal number
+     *  a1 (11) = siginfo pointer
+     *  a2 (12) = ucontext pointer
+     *  pc      = signal pointer handler
+     *  sp (2)  = sigframe pointer
+     *  ra (1)  = sigtramp at base of user stack
+     */
+
+     regs->gpr[10] = sig;
+     regs->gpr[11] = frame_addr +
+         offsetof(struct target_sigframe, sf_si);
+     regs->gpr[12] = frame_addr +
+         offsetof(struct target_sigframe, sf_uc);
+     regs->pc = ka->_sa_handler;
+     regs->gpr[2] = frame_addr;
+     regs->gpr[1] = TARGET_PS_STRINGS - TARGET_SZSIGCODE;
+     return 0;
+}
+
+/*
+ * Compare to riscv/riscv/exec_machdep.c sendsig()
+ * Assumes that the memory is locked if frame points to user memory.
+ */
+abi_long setup_sigframe_arch(CPURISCVState *env, abi_ulong frame_addr,
+                             struct target_sigframe *frame, int flags)
+{
+    target_mcontext_t *mcp = &frame->sf_uc.uc_mcontext;
+
+    get_mcontext(env, mcp, flags);
+    return 0;
+}