From 1aa7b62e92fb7b7c842d2d1b91ca3b08592ec8f9 Mon Sep 17 00:00:00 2001 From: MerryMage Date: Sat, 27 Jul 2019 19:56:18 +0100 Subject: [PATCH] A32/Thumb: Correct behaviour for UDF and Unpredictable instructions Raise an exception instead of calling the interpreter and ASSERT-ing respectively. --- src/frontend/A32/translate/impl/thumb16.cpp | 2 +- src/frontend/A32/translate/impl/translate_thumb.h | 1 + src/frontend/A32/translate/translate_thumb.cpp | 11 +++++++++-- tests/A32/testenv.h | 2 +- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/frontend/A32/translate/impl/thumb16.cpp b/src/frontend/A32/translate/impl/thumb16.cpp index 9d70b1ea..bf19e265 100644 --- a/src/frontend/A32/translate/impl/thumb16.cpp +++ b/src/frontend/A32/translate/impl/thumb16.cpp @@ -885,7 +885,7 @@ bool ThumbTranslatorVisitor::thumb16_CBZ_CBNZ(bool nonzero, Imm<1> i, Imm<5> imm } bool ThumbTranslatorVisitor::thumb16_UDF() { - return InterpretThisInstruction(); + return UndefinedInstruction(); } // BX diff --git a/src/frontend/A32/translate/impl/translate_thumb.h b/src/frontend/A32/translate/impl/translate_thumb.h index db053d3c..9aa21dab 100644 --- a/src/frontend/A32/translate/impl/translate_thumb.h +++ b/src/frontend/A32/translate/impl/translate_thumb.h @@ -29,6 +29,7 @@ struct ThumbTranslatorVisitor final { bool InterpretThisInstruction(); bool UnpredictableInstruction(); + bool UndefinedInstruction(); bool RaiseException(Exception exception); // thumb16 diff --git a/src/frontend/A32/translate/translate_thumb.cpp b/src/frontend/A32/translate/translate_thumb.cpp index 4e121277..21b0949c 100644 --- a/src/frontend/A32/translate/translate_thumb.cpp +++ b/src/frontend/A32/translate/translate_thumb.cpp @@ -122,12 +122,19 @@ bool ThumbTranslatorVisitor::InterpretThisInstruction() { } bool ThumbTranslatorVisitor::UnpredictableInstruction() { - ASSERT_MSG(false, "UNPREDICTABLE"); + ir.ExceptionRaised(Exception::UnpredictableInstruction); + ir.SetTerm(IR::Term::CheckHalt{IR::Term::ReturnToDispatch{}}); + return false; +} + +bool ThumbTranslatorVisitor::UndefinedInstruction() { + ir.ExceptionRaised(Exception::UndefinedInstruction); + ir.SetTerm(IR::Term::CheckHalt{IR::Term::ReturnToDispatch{}}); return false; } bool ThumbTranslatorVisitor::RaiseException(Exception exception) { - ir.BranchWritePC(ir.Imm32(ir.current_location.PC() + 2)); + ir.BranchWritePC(ir.Imm32(ir.current_location.PC() + 2)); // TODO: T32 ir.ExceptionRaised(exception); ir.SetTerm(IR::Term::CheckHalt{IR::Term::ReturnToDispatch{}}); return false; diff --git a/tests/A32/testenv.h b/tests/A32/testenv.h index a1968ff3..f4db4de4 100644 --- a/tests/A32/testenv.h +++ b/tests/A32/testenv.h @@ -78,7 +78,7 @@ public: MemoryWrite32(vaddr + 4, static_cast(value >> 32)); } - void InterpreterFallback(u32 pc, size_t num_instructions) override { ASSERT_MSG(false, "InterpreterFallback({:08x}, {})", pc, num_instructions); } + void InterpreterFallback(u32 pc, size_t num_instructions) override { ASSERT_MSG(false, "InterpreterFallback({:08x}, {}) code = {:08x}", pc, num_instructions, MemoryReadCode(pc)); } void CallSVC(std::uint32_t swi) override { ASSERT_MSG(false, "CallSVC({})", swi); }