Implement Reserved Instruction exception

This commit is contained in:
Lauri Kasanen 2020-12-22 15:26:09 +02:00
parent b9c36a4e7f
commit 55a46f45da
4 changed files with 17 additions and 1 deletions

View file

@ -497,6 +497,18 @@ void VR4300_TRAP(struct vr4300* vr4300) {
status, epc, 0x180);
}
// RI: Reserved Instruction exception
void VR4300_RI(struct vr4300* vr4300) {
struct vr4300_latch *common = &vr4300->pipeline.exdc_latch.common;
uint32_t cause, status;
uint64_t epc;
vr4300_ex_fault(vr4300, VR4300_FAULT_RI);
vr4300_exception_prolog(vr4300, common, &cause, &status, &epc);
vr4300_exception_epilogue(vr4300, (cause & ~0xFF) | (10 << 2),
status, epc, 0x180);
}
// WAT: Watch exception.
void VR4300_WAT(struct vr4300 *vr4300) {
struct vr4300_pipeline *pipeline = &vr4300->pipeline;

View file

@ -36,6 +36,7 @@ cen64_cold void VR4300_ICB(struct vr4300 *vr4300);
cen64_cold void VR4300_INTR(struct vr4300 *vr4300);
cen64_cold void VR4300_INV(struct vr4300 *vr4300);
cen64_cold void VR4300_LDI(struct vr4300 *vr4300);
cen64_cold void VR4300_RI(struct vr4300 *vr4300);
cen64_cold void VR4300_RST(struct vr4300 *vr4300);
cen64_cold void VR4300_SYSC(struct vr4300 *vr4300);
cen64_cold void VR4300_WAT(struct vr4300 *vr4300);

View file

@ -13,7 +13,7 @@
X(NONE) X(CP0I) X(RST) X(NMI) X(OVFL) X(TRAP) X(FPE) X(DADE) \
X(DTLB) X(WAT) X(INTR) X(DCM) X(DCB) X(COP) X(DBE) X(SYSC) X(BRPT) \
X(CPU) X(RSVD) X(LDI) X(MCI) X(IADE) X(ITM) X(ICB) X(UNC) X(ITLB) \
X(IBE)
X(IBE) X(RI)
#endif
VR4300_FAULT_LIST

View file

@ -1060,6 +1060,9 @@ int VR4300_DSRLV(struct vr4300 *vr4300,
//
int VR4300_INVALID(struct vr4300 *vr4300,
uint32_t iw, uint64_t unused(rs), uint64_t unused(rt)) {
VR4300_RI(vr4300);
#ifndef NDEBUG
struct vr4300_rfex_latch *rfex_latch = &vr4300->pipeline.rfex_latch;