On Tue, Oct 19, 2021 at 11:45 AM Warner Losh <i...@bsdimp.com> wrote: > > Implement set_sigtramp_args to setup the arguments to the sigtramp > calls. > > Signed-off-by: Stacey Son <s...@freebsd.org> > Signed-off-by: Warner Losh <i...@bsdimp.com> > --- > bsd-user/arm/target_arch_signal.h | 35 +++++++++++++++++++++++++++++++ > 1 file changed, 35 insertions(+) > > diff --git a/bsd-user/arm/target_arch_signal.h > b/bsd-user/arm/target_arch_signal.h > index 67355ff28f..b421c2522c 100644 > --- a/bsd-user/arm/target_arch_signal.h > +++ b/bsd-user/arm/target_arch_signal.h > @@ -128,4 +128,39 @@ struct target_trapframe { > abi_ulong tf_pc; > }; > > +/* > + * Compare to arm/arm/machdep.c sendsig() > + * Assumes that target stack frame memory is locked. > + */ > +static inline abi_long > +set_sigtramp_args(CPUARMState *regs, int sig, struct target_sigframe *frame, > + abi_ulong frame_addr, struct target_sigaction *ka) > +{ > + /* > + * Arguments to signal handler: > + * r0 = signal number > + * r1 = siginfo pointer > + * r2 = ucontext pointer > + * r5 = ucontext pointer > + * pc = signal handler pointer > + * sp = sigframe struct pointer > + * lr = sigtramp at base of user stack > + */ > + > + regs->regs[0] = sig; > + regs->regs[1] = frame_addr + > + offsetof(struct target_sigframe, sf_si); > + regs->regs[2] = frame_addr + > + offsetof(struct target_sigframe, sf_uc); > + > + /* the trampoline uses r5 as the uc address */ > + regs->regs[5] = frame_addr + > + offsetof(struct target_sigframe, sf_uc); > + regs->regs[TARGET_REG_PC] = ka->_sa_handler; > + regs->regs[TARGET_REG_SP] = frame_addr; > + regs->regs[TARGET_REG_LR] = TARGET_PS_STRINGS - TARGET_SZSIGCODE; > + > + return 0; > +} > + > #endif /* !_TARGET_ARCH_SIGNAL_H_ */ > -- > 2.32.0 >
Reviewed-by: Kyle Evans <kev...@freebsd.org>