We ported MIPS64 r2 user mode emulation. When a binary is given to
qemu-mips64, our code first check whether it is Octeon binary or not if yes
it  enable Octeon specific Instructions for. The following code snippet do
this job:

>
> > diff --git a/linux-user/elfload.c b/linux-user/elfload.c
> > index 2832a33..9399e44 100644
> > --- a/linux-user/elfload.c
> > +++ b/linux-user/elfload.c
> > @@ -1662,6 +1662,11 @@ int load_elf_binary(struct linux_binprm * bprm,
> > struct target_pt_regs * regs,
> >         when we load the interpreter.  */
> >      elf_ex = *(struct elfhdr *)bprm->buf;
> >
> > +#if defined(TARGET_MIPS64)
> > +    if ((elf_ex.e_flags & EF_MIPS_MARCH) == E_MIPS_MACH_OCTEON) {
> > +        info->elf_arch = 1;
> > +    }
> > +#endif
> > +++ b/linux-user/main.c
> > @@ -3348,6 +3348,11 @@ int main(int argc, char **argv, char **envp)
> >          if (regs->cp0_epc & 1) {
> >              env->hflags |= MIPS_HFLAG_M16;
> >          }
> > +#if defined(TARGET_MIPS64)
> > +        if (info->elf_arch) {
> > +            env->insn_flags |=  INSN_OCTEON;
> > +        }
> > +#endif
> >      }
>

where we put elf_arch in image_info

and INSN_OCTEON is in target_mips/mips-defs.h as follows
  #define INSN_LOONGSON2E  0x20000000
  #define INSN_LOONGSON2F  0x40000000
  #define INSN_VR54XX 0x80000000
+#define            INSN_OCTEON 0x10000000

Is this solution acceptable for you?

Reply via email to