}
enter_debug_mode:
env->hflags |= MIPS_HFLAG_DM;
- env->hflags |= MIPS_HFLAG_64;
+ if ((env->CP0_Config0 & (0x3 << CP0C0_AT)))
+ env->hflags |= MIPS_HFLAG_64;
env->hflags &= ~MIPS_HFLAG_UM;
/* EJTAG probe trap enable is not implemented... */
if (!(env->CP0_Status & (1 << CP0St_EXL)))
env->CP0_ErrorEPC = env->PC;
}
env->CP0_Status |= (1 << CP0St_ERL) | (1 << CP0St_BEV);
- env->hflags |= MIPS_HFLAG_64;
+ if ((env->CP0_Config0 & (0x3 << CP0C0_AT)))
+ env->hflags |= MIPS_HFLAG_64;
env->hflags &= ~MIPS_HFLAG_UM;
if (!(env->CP0_Status & (1 << CP0St_EXL)))
env->CP0_Cause &= ~(1 << CP0Ca_BD);
env->CP0_Cause &= ~(1 << CP0Ca_BD);
}
env->CP0_Status |= (1 << CP0St_EXL);
- env->hflags |= MIPS_HFLAG_64;
+ if ((env->CP0_Config0 & (0x3 << CP0C0_AT)))
+ env->hflags |= MIPS_HFLAG_64;
env->hflags &= ~MIPS_HFLAG_UM;
}
env->hflags &= ~MIPS_HFLAG_BMASK;
(val & (1 << CP0St_UM)))
env->hflags |= MIPS_HFLAG_UM;
#ifdef TARGET_MIPS64
- if ((env->hflags & MIPS_HFLAG_UM) &&
+ if (!(env->CP0_Config0 & (0x3 << CP0C0_AT)) ||
+ ((env->hflags & MIPS_HFLAG_UM) &&
!(val & (1 << CP0St_PX)) &&
- !(val & (1 << CP0St_UX)))
+ !(val & (1 << CP0St_UX))))
env->hflags &= ~MIPS_HFLAG_64;
#endif
if (val & (1 << CP0St_CU1))
(env->CP0_Status & (1 << CP0St_UM)))
env->hflags |= MIPS_HFLAG_UM;
#ifdef TARGET_MIPS64
- if ((env->hflags & MIPS_HFLAG_UM) &&
+ if (!(env->CP0_Config0 & (0x3 << CP0C0_AT)) ||
+ ((env->hflags & MIPS_HFLAG_UM) &&
!(env->CP0_Status & (1 << CP0St_PX)) &&
- !(env->CP0_Status & (1 << CP0St_UX)))
+ !(env->CP0_Status & (1 << CP0St_UX))))
env->hflags &= ~MIPS_HFLAG_64;
#endif
if (loglevel & CPU_LOG_EXEC)
(env->CP0_Status & (1 << CP0St_UM)))
env->hflags |= MIPS_HFLAG_UM;
#ifdef TARGET_MIPS64
- if ((env->hflags & MIPS_HFLAG_UM) &&
+ if (!(env->CP0_Config0 & (0x3 << CP0C0_AT)) ||
+ ((env->hflags & MIPS_HFLAG_UM) &&
!(env->CP0_Status & (1 << CP0St_PX)) &&
- !(env->CP0_Status & (1 << CP0St_UX)))
+ !(env->CP0_Status & (1 << CP0St_UX))))
env->hflags &= ~MIPS_HFLAG_64;
#endif
if (loglevel & CPU_LOG_EXEC)
switch (sel) {
case 0:
#ifdef TARGET_MIPS64
+ if (!(ctx->hflags & MIPS_HFLAG_64))
+ goto die;
gen_op_mfc0_xcontext();
rn = "XContext";
break;
switch (sel) {
case 0:
#ifdef TARGET_MIPS64
+ if (!(ctx->hflags & MIPS_HFLAG_64))
+ goto die;
gen_op_mtc0_xcontext();
rn = "XContext";
break;
case 20:
switch (sel) {
case 0:
-#ifdef TARGET_MIPS64
gen_op_dmfc0_xcontext();
rn = "XContext";
break;
-#endif
default:
goto die;
}
case 20:
switch (sel) {
case 0:
-#ifdef TARGET_MIPS64
gen_op_mtc0_xcontext();
rn = "XContext";
break;
-#endif
default:
goto die;
}
break;
#ifdef TARGET_MIPS64
case OPC_DMFC0:
+ if (!(ctx->hflags & MIPS_HFLAG_64))
+ generate_exception(ctx, EXCP_RI);
if (rt == 0) {
/* Treat as NOP */
return;
opn = "dmfc0";
break;
case OPC_DMTC0:
+ if (!(ctx->hflags & MIPS_HFLAG_64))
+ generate_exception(ctx, EXCP_RI);
GEN_LOAD_REG_TN(T0, rt);
gen_dmtc0(env,ctx, rd, ctx->opcode & 0x7);
opn = "dmtc0";
} else {
env->CP0_ErrorEPC = env->PC;
}
-#ifdef TARGET_MIPS64
- env->hflags = MIPS_HFLAG_64;
-#else
env->hflags = 0;
-#endif
env->PC = (int32_t)0xBFC00000;
env->CP0_Wired = 0;
/* SMP not implemented */
.SYNCI_Step = 32,
.CCRes = 2,
.Status_rw_bitmask = 0x3278FF17,
- .SEGBITS = 32,
},
{
.name = "4KEcR1",
.SYNCI_Step = 32,
.CCRes = 2,
.Status_rw_bitmask = 0x3278FF17,
- .SEGBITS = 32,
},
{
.name = "4KEc",
.SYNCI_Step = 32,
.CCRes = 2,
.Status_rw_bitmask = 0x3278FF17,
- .SEGBITS = 32,
},
{
.name = "24Kc",
.SYNCI_Step = 32,
.CCRes = 2,
.Status_rw_bitmask = 0x3278FF17,
- .SEGBITS = 32,
},
{
.name = "24Kf",
.Status_rw_bitmask = 0x3678FF17,
.CP1_fcr0 = (1 << FCR0_F64) | (1 << FCR0_L) | (1 << FCR0_W) |
(1 << FCR0_D) | (1 << FCR0_S) | (0x93 << FCR0_PRID),
- .SEGBITS = 32,
},
#ifdef TARGET_MIPS64
{
env->Status_rw_bitmask = def->Status_rw_bitmask;
env->fcr0 = def->CP1_fcr0;
#ifdef TARGET_MIPS64
- env->SEGBITS = def->SEGBITS;
- env->SEGMask = (3ULL << 62) | ((1ULL << def->SEGBITS) - 1);
+ if ((env->CP0_Config0 & (0x3 << CP0C0_AT)))
+ {
+ env->hflags |= MIPS_HFLAG_64;
+ env->SEGBITS = def->SEGBITS;
+ env->SEGMask = (3ULL << 62) | ((1ULL << def->SEGBITS) - 1);
+ } else {
+ env->SEGBITS = 32;
+ env->SEGMask = 0xFFFFFFFF;
+ }
#endif
#ifdef CONFIG_USER_ONLY
if (env->CP0_Config1 & (1 << CP0C1_FP))