#define RET_PRIVREG(ctx) \
RET_EXCP((ctx), EXCP_PROGRAM, EXCP_INVAL | EXCP_PRIV_REG)
-#define RET_MTMSR(ctx) \
-RET_EXCP((ctx), EXCP_MTMSR, 0)
-
+/* Stop translation */
static inline void RET_STOP (DisasContext *ctx)
{
- RET_EXCP(ctx, EXCP_MTMSR, 0);
+ gen_op_update_nip((ctx)->nip);
+ ctx->exception = EXCP_MTMSR;
}
+/* No need to update nip here, as execution flow will change */
static inline void RET_CHG_FLOW (DisasContext *ctx)
{
- gen_op_raise_exception_err(EXCP_MTMSR, 0);
ctx->exception = EXCP_MTMSR;
}
gen_op_store_T0_gpr(rD(ctx->opcode));
} else {
/* Privilege exception */
+ if (loglevel) {
+ fprintf(logfile, "Trying to read priviledged spr %d %03x\n",
+ sprn, sprn);
+ }
printf("Trying to read priviledged spr %d %03x\n", sprn, sprn);
RET_PRIVREG(ctx);
}
} else {
/* Not defined */
+ if (loglevel) {
+ fprintf(logfile, "Trying to read invalid spr %d %03x\n",
+ sprn, sprn);
+ }
printf("Trying to read invalid spr %d %03x\n", sprn, sprn);
RET_EXCP(ctx, EXCP_PROGRAM, EXCP_INVAL | EXCP_INVAL_SPR);
}
gen_op_load_gpr_T0(rS(ctx->opcode));
gen_op_store_msr();
/* Must stop the translation as machine state (may have) changed */
- RET_MTMSR(ctx);
+ RET_STOP(ctx);
#endif
}
(*write_cb)(ctx, sprn);
} else {
/* Privilege exception */
+ if (loglevel) {
+ fprintf(logfile, "Trying to write priviledged spr %d %03x\n",
+ sprn, sprn);
+ }
printf("Trying to write priviledged spr %d %03x\n", sprn, sprn);
RET_PRIVREG(ctx);
}
} else {
/* Not defined */
+ if (loglevel) {
+ fprintf(logfile, "Trying to write invalid spr %d %03x\n",
+ sprn, sprn);
+ }
printf("Trying to write invalid spr %d %03x\n", sprn, sprn);
RET_EXCP(ctx, EXCP_PROGRAM, EXCP_INVAL | EXCP_INVAL_SPR);
}
}
gen_op_load_gpr_T0(rS(ctx->opcode));
gen_op_store_sr(SR(ctx->opcode));
- RET_MTMSR(ctx);
+ RET_STOP(ctx);
#endif
}
gen_op_load_gpr_T0(rS(ctx->opcode));
gen_op_load_gpr_T1(rB(ctx->opcode));
gen_op_store_srin();
- RET_MTMSR(ctx);
+ RET_STOP(ctx);
#endif
}
return;
}
gen_op_tlbia();
- RET_MTMSR(ctx);
+ RET_STOP(ctx);
#endif
}
}
gen_op_load_gpr_T0(rB(ctx->opcode));
gen_op_tlbie();
- RET_MTMSR(ctx);
+ RET_STOP(ctx);
#endif
}
/* This has no effect: it should ensure that all previous
* tlbie have completed
*/
- RET_MTMSR(ctx);
+ RET_STOP(ctx);
#endif
}