Message ID | 20211019164447.16359-22-imp@bsdimp.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | bsd-user: arm (32-bit) support | expand |
On Tue, Oct 19, 2021 at 11:45 AM Warner Losh <imp@bsdimp.com> wrote: > > Get the machine context from the CPU state. > > Signed-off-by: Stacey Son <sson@FreeBSD.org> > Signed-off-by: Klye Evans <kevans@FreeBSD.org> > Signed-off-by: Warner Losh <imp@bsdimp.com> > --- > bsd-user/arm/target_arch_signal.h | 38 +++++++++++++++++++++++++++++++ > 1 file changed, 38 insertions(+) > > diff --git a/bsd-user/arm/target_arch_signal.h b/bsd-user/arm/target_arch_signal.h > index b421c2522c..302fdc2846 100644 > --- a/bsd-user/arm/target_arch_signal.h > +++ b/bsd-user/arm/target_arch_signal.h > @@ -163,4 +163,42 @@ set_sigtramp_args(CPUARMState *regs, int sig, struct target_sigframe *frame, > return 0; > } > > +/* > + * Compare to arm/arm/machdep.c get_mcontext() > + * Assumes that the memory is locked if mcp points to user memory. > + */ > +static inline abi_long get_mcontext(CPUARMState *regs, target_mcontext_t *mcp, > + int flags) > +{ > + int err = 0; > + uint32_t *gr = mcp->__gregs; > + > + gr[TARGET_REG_CPSR] = tswap32(cpsr_read(regs)); > + if (flags & TARGET_MC_GET_CLEAR_RET) { > + gr[TARGET_REG_R0] = 0; > + gr[TARGET_REG_CPSR] &= ~CPSR_C; > + } else { > + gr[TARGET_REG_R0] = tswap32(regs->regs[0]); > + } > + > + gr[TARGET_REG_R1] = tswap32(regs->regs[1]); > + gr[TARGET_REG_R2] = tswap32(regs->regs[2]); > + gr[TARGET_REG_R3] = tswap32(regs->regs[3]); > + gr[TARGET_REG_R4] = tswap32(regs->regs[4]); > + gr[TARGET_REG_R5] = tswap32(regs->regs[5]); > + gr[TARGET_REG_R6] = tswap32(regs->regs[6]); > + gr[TARGET_REG_R7] = tswap32(regs->regs[7]); > + gr[TARGET_REG_R8] = tswap32(regs->regs[8]); > + gr[TARGET_REG_R9] = tswap32(regs->regs[9]); > + gr[TARGET_REG_R10] = tswap32(regs->regs[10]); > + gr[TARGET_REG_R11] = tswap32(regs->regs[11]); > + gr[TARGET_REG_R12] = tswap32(regs->regs[12]); > + > + gr[TARGET_REG_SP] = tswap32(regs->regs[13]); > + gr[TARGET_REG_LR] = tswap32(regs->regs[14]); > + gr[TARGET_REG_PC] = tswap32(regs->regs[15]); > + > + return err; > +} > + > #endif /* !_TARGET_ARCH_SIGNAL_H_ */ > -- > 2.32.0 > Reviewed-by: Kyle Evans <kevans@FreeBSD.org>
On 10/19/21 9:44 AM, Warner Losh wrote: > Get the machine context from the CPU state. > > Signed-off-by: Stacey Son<sson@FreeBSD.org> > Signed-off-by: Klye Evans<kevans@FreeBSD.org> > Signed-off-by: Warner Losh<imp@bsdimp.com> > --- > bsd-user/arm/target_arch_signal.h | 38 +++++++++++++++++++++++++++++++ > 1 file changed, 38 insertions(+) Reviewed-by: Richard Henderson <richard.henderson@linaro.org> r~
diff --git a/bsd-user/arm/target_arch_signal.h b/bsd-user/arm/target_arch_signal.h index b421c2522c..302fdc2846 100644 --- a/bsd-user/arm/target_arch_signal.h +++ b/bsd-user/arm/target_arch_signal.h @@ -163,4 +163,42 @@ set_sigtramp_args(CPUARMState *regs, int sig, struct target_sigframe *frame, return 0; } +/* + * Compare to arm/arm/machdep.c get_mcontext() + * Assumes that the memory is locked if mcp points to user memory. + */ +static inline abi_long get_mcontext(CPUARMState *regs, target_mcontext_t *mcp, + int flags) +{ + int err = 0; + uint32_t *gr = mcp->__gregs; + + gr[TARGET_REG_CPSR] = tswap32(cpsr_read(regs)); + if (flags & TARGET_MC_GET_CLEAR_RET) { + gr[TARGET_REG_R0] = 0; + gr[TARGET_REG_CPSR] &= ~CPSR_C; + } else { + gr[TARGET_REG_R0] = tswap32(regs->regs[0]); + } + + gr[TARGET_REG_R1] = tswap32(regs->regs[1]); + gr[TARGET_REG_R2] = tswap32(regs->regs[2]); + gr[TARGET_REG_R3] = tswap32(regs->regs[3]); + gr[TARGET_REG_R4] = tswap32(regs->regs[4]); + gr[TARGET_REG_R5] = tswap32(regs->regs[5]); + gr[TARGET_REG_R6] = tswap32(regs->regs[6]); + gr[TARGET_REG_R7] = tswap32(regs->regs[7]); + gr[TARGET_REG_R8] = tswap32(regs->regs[8]); + gr[TARGET_REG_R9] = tswap32(regs->regs[9]); + gr[TARGET_REG_R10] = tswap32(regs->regs[10]); + gr[TARGET_REG_R11] = tswap32(regs->regs[11]); + gr[TARGET_REG_R12] = tswap32(regs->regs[12]); + + gr[TARGET_REG_SP] = tswap32(regs->regs[13]); + gr[TARGET_REG_LR] = tswap32(regs->regs[14]); + gr[TARGET_REG_PC] = tswap32(regs->regs[15]); + + return err; +} + #endif /* !_TARGET_ARCH_SIGNAL_H_ */