system: Raise exception for YIELD, WFE, WFI, SEV, SEVL

This commit is contained in:
MerryMage 2018-01-26 18:50:41 +00:00
parent c832cec96d
commit fd075d8d68
4 changed files with 23 additions and 12 deletions

View file

@ -28,6 +28,16 @@ enum class Exception {
/// This behaviour is up to the user of this library to define.
/// Note: Constraints on unpredictable behaviour are specified in the ARMv8 ARM.
UnpredictableInstruction,
/// A WFI instruction was executed. You may now enter a low-power state.
WaitForInterrupt,
/// A WFE instruction was executed. You may now enter a low-power state if the event register is clear.
WaitForEvent,
/// A SEV instruction was executed. The event register of all PEs should be set.
SendEvent,
/// A SEV instruction was executed. The event register of the current PE should be set.
SendEventLocal,
/// A YIELD instruction was executed.
Yield,
};
enum class DataCacheOperation {

View file

@ -16,9 +16,7 @@ bool TranslatorVisitor::InterpretThisInstruction() {
}
bool TranslatorVisitor::UnpredictableInstruction() {
ir.ExceptionRaised(Exception::UnpredictableInstruction);
ir.SetTerm(IR::Term::CheckHalt{IR::Term::ReturnToDispatch{}});
return false;
return RaiseException(Exception::UnpredictableInstruction);
}
bool TranslatorVisitor::DecodeError() {
@ -27,13 +25,15 @@ bool TranslatorVisitor::DecodeError() {
}
bool TranslatorVisitor::ReservedValue() {
ir.ExceptionRaised(Exception::ReservedValue);
ir.SetTerm(IR::Term::CheckHalt{IR::Term::ReturnToDispatch{}});
return false;
return RaiseException(Exception::ReservedValue);
}
bool TranslatorVisitor::UnallocatedEncoding() {
ir.ExceptionRaised(Exception::UnallocatedEncoding);
return RaiseException(Exception::UnallocatedEncoding);
}
bool TranslatorVisitor::RaiseException(Exception exception) {
ir.ExceptionRaised(exception);
ir.SetTerm(IR::Term::CheckHalt{IR::Term::ReturnToDispatch{}});
return false;
}

View file

@ -35,6 +35,7 @@ struct TranslatorVisitor final {
bool DecodeError();
bool ReservedValue();
bool UnallocatedEncoding();
bool RaiseException(Exception exception);
struct BitMasks {
u64 wmask, tmask;

View file

@ -17,23 +17,23 @@ bool TranslatorVisitor::NOP() {
}
bool TranslatorVisitor::YIELD() {
return true;
return RaiseException(Exception::Yield);
}
bool TranslatorVisitor::WFE() {
return true;
return RaiseException(Exception::WaitForEvent);
}
bool TranslatorVisitor::WFI() {
return true;
return RaiseException(Exception::WaitForInterrupt);
}
bool TranslatorVisitor::SEV() {
return true;
return RaiseException(Exception::SendEvent);
}
bool TranslatorVisitor::SEVL() {
return true;
return RaiseException(Exception::SendEventLocal);
}
bool TranslatorVisitor::CLREX(Imm<4> /*CRm*/) {