Message ID | 20240802083423.142365-16-itachis@FreeBSD.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | bsd-user: Comprehensive RISCV support | expand |
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~
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~ >
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 --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; +}