On 07/06/2018 08:48 AM, Aleksandar Markovic wrote: > From: Stefan Markovic <smarko...@wavecomp.com> > > Add CP0 BadInstrX register. This register will be used in nanoMIPS. > > Signed-off-by: Stefan Markovic <smarko...@wavecomp.com> > Signed-off-by: Yongbok Kim <yongbok....@mips.com> > Signed-off-by: Aleksandar Markovic <amarko...@wavecomp.com> > Reviewed-by: Aleksandar Markovic <amarko...@wavecomp.com> > Reviewed-by: Philippe Mathieu-Daudé <f4...@amsat.org> > --- > target/mips/cpu.h | 1 + > target/mips/machine.c | 5 +++-- > target/mips/translate.c | 30 +++++++++++++++++++++++++++++- > 3 files changed, 33 insertions(+), 3 deletions(-) > > diff --git a/target/mips/cpu.h b/target/mips/cpu.h > index 100b5f4..4cd918b 100644 > --- a/target/mips/cpu.h > +++ b/target/mips/cpu.h > @@ -323,6 +323,7 @@ struct CPUMIPSState { > target_ulong CP0_BadVAddr; > uint32_t CP0_BadInstr; > uint32_t CP0_BadInstrP; > + uint32_t CP0_BadInstrX; > int32_t CP0_Count; > target_ulong CP0_EntryHi; > #define CP0EnHi_EHINV 10 > diff --git a/target/mips/machine.c b/target/mips/machine.c > index 20100d5..5ba78ac 100644 > --- a/target/mips/machine.c > +++ b/target/mips/machine.c > @@ -212,8 +212,8 @@ const VMStateDescription vmstate_tlb = { > > const VMStateDescription vmstate_mips_cpu = { > .name = "cpu", > - .version_id = 10, > - .minimum_version_id = 10, > + .version_id = 11, > + .minimum_version_id = 11, > .post_load = cpu_post_load, > .fields = (VMStateField[]) { > /* Active TC */ > @@ -266,6 +266,7 @@ const VMStateDescription vmstate_mips_cpu = { > VMSTATE_UINTTL(env.CP0_BadVAddr, MIPSCPU), > VMSTATE_UINT32(env.CP0_BadInstr, MIPSCPU), > VMSTATE_UINT32(env.CP0_BadInstrP, MIPSCPU), > + VMSTATE_UINT32(env.CP0_BadInstrX, MIPSCPU), > VMSTATE_INT32(env.CP0_Count, MIPSCPU), > VMSTATE_UINTTL(env.CP0_EntryHi, MIPSCPU), > VMSTATE_INT32(env.CP0_Compare, MIPSCPU), > diff --git a/target/mips/translate.c b/target/mips/translate.c > index 051dda5..00154d2 100644 > --- a/target/mips/translate.c > +++ b/target/mips/translate.c > @@ -5315,7 +5315,17 @@ static void gen_mfc0(DisasContext *ctx, TCGv arg, int > reg, int sel) > gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrP)); > rn = "BadInstrP"; > break; > - default: > + case 3: > + CP0_CHECK(ctx->bi); > + gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrX)); > +#if defined(TARGET_MIPS64) > + tcg_gen_andi_i64(arg, arg, ~0xffff); > +#else > + tcg_gen_andi_i32(arg, arg, ~0xffff); > +#endif
Please use tcg_gen_andi_tl() instead, it does exactly that. > + rn = "BadInstrX"; > + break; > + default: > goto cp0_unimplemented; > } > break; > @@ -6006,6 +6016,10 @@ static void gen_mtc0(DisasContext *ctx, TCGv arg, int > reg, int sel) > /* ignored */ > rn = "BadInstrP"; > break; > + case 3: > + /* ignored */ > + rn = "BadInstrX"; > + break; > default: > goto cp0_unimplemented; > } > @@ -6711,6 +6725,16 @@ static void gen_dmfc0(DisasContext *ctx, TCGv arg, int > reg, int sel) > gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrP)); > rn = "BadInstrP"; > break; > + case 3: > + CP0_CHECK(ctx->bi); > + gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrX)); > +#if defined(TARGET_MIPS64) > + tcg_gen_andi_i64(arg, arg, ~0xffff); > +#else > + tcg_gen_andi_i32(arg, arg, ~0xffff); > +#endif Ditto. > + rn = "BadInstrX"; > + break; > default: > goto cp0_unimplemented; > } > @@ -7385,6 +7409,10 @@ static void gen_dmtc0(DisasContext *ctx, TCGv arg, int > reg, int sel) > /* ignored */ > rn = "BadInstrP"; > break; > + case 3: > + /* ignored */ > + rn = "BadInstrX"; > + break; > default: > goto cp0_unimplemented; > } >