On Thu, Jan 13, 2022 at 10:40 AM Peter Maydell <peter.mayd...@linaro.org>
wrote:

> On Sun, 9 Jan 2022 at 16:29, Warner Losh <i...@bsdimp.com> wrote:
> >
> > Update for the richer set of data faults that are now possible. Copied
> > largely from linux-user/arm/cpu_loop.c
> >
> > Signed-off-by: Warner Losh <i...@bsdimp.com>
> > ---
> >  bsd-user/arm/target_arch_cpu.h | 44 ++++++++++++++++++++++++++--------
> >  1 file changed, 34 insertions(+), 10 deletions(-)
> >
> > diff --git a/bsd-user/arm/target_arch_cpu.h
> b/bsd-user/arm/target_arch_cpu.h
> > index 996a361e3fe..51e592bcfe7 100644
> > --- a/bsd-user/arm/target_arch_cpu.h
> > +++ b/bsd-user/arm/target_arch_cpu.h
> > @@ -39,8 +39,7 @@ static inline void target_cpu_init(CPUARMState *env,
> >
> >  static inline void target_cpu_loop(CPUARMState *env)
> >  {
> > -    int trapnr;
> > -    target_siginfo_t info;
> > +    int trapnr, si_signo, si_code;
> >      unsigned int n;
> >      CPUState *cs = env_cpu(env);
> >
> > @@ -143,15 +142,40 @@ static inline void target_cpu_loop(CPUARMState
> *env)
> >              /* just indicate that signals should be handled asap */
> >              break;
> >          case EXCP_PREFETCH_ABORT:
> > -            /* See arm/arm/trap.c prefetch_abort_handler() */
> >          case EXCP_DATA_ABORT:
> > -            /* See arm/arm/trap.c data_abort_handler() */
> > -            info.si_signo = TARGET_SIGSEGV;
> > -            info.si_errno = 0;
> > -            /* XXX: check env->error_code */
> > -            info.si_code = 0;
> > -            info.si_addr = env->exception.vaddress;
> > -            queue_signal(env, info.si_signo, &info);
> > +            /*
> > +             * See arm/arm/trap-v6.c prefetch_abort_handler() and
> data_abort_handler()
> > +             *
> > +             * However, FreeBSD maps these to a generic value and then
> uses that
> > +             * to maybe fault in pages in
> vm/vm_fault.c:vm_fault_trap(). I
> > +             * believe that the indirection maps the same as Linux, but
> haven't
> > +             * chased down every single possible indirection.
> > +             */
> > +
> > +            /* For user-only we don't set TTBCR_EAE, so look at the
> FSR. */
> > +            switch (env->exception.fsr & 0x1f) {
> > +            case 0x1: /* Alignment */
> > +                si_signo = TARGET_SIGBUS;
> > +                si_code = TARGET_BUS_ADRALN;
> > +                break;
> > +            case 0x3: /* Access flag fault, level 1 */
> > +            case 0x6: /* Access flag fault, level 2 */
> > +            case 0x9: /* Domain fault, level 1 */
> > +            case 0xb: /* Domain fault, level 2 */
> > +            case 0xd: /* Permision fault, level 1 */
> > +            case 0xf: /* Permision fault, level 2 */
>
> "Permission" (I see we have this typo in linux-user).
>

Fixed. Also, if you can, please cc me if you'd like on 'back ported' fixes
into linux-user when you post them
for review that arise from this. It helps me keep track and not miss them
in this rather high volume mailing
list.


> > +                si_signo = TARGET_SIGSEGV;
> > +                si_code = TARGET_SEGV_ACCERR;
> > +                break;
> > +            case 0x5: /* Translation fault, level 1 */
> > +            case 0x7: /* Translation fault, level 2 */
> > +                si_signo = TARGET_SIGSEGV;
> > +                si_code = TARGET_SEGV_MAPERR;
> > +                break;
> > +            default:
> > +                g_assert_not_reached();
> > +            }
>
> Otherwise
> Reviewed-by: Peter Maydell <peter.mayd...@linaro.org>
>

Thanks!

Warner

Reply via email to