A64: Add hook_hint_instructions option

This commit is contained in:
MerryMage 2019-07-25 12:15:54 +01:00
parent 396116ee61
commit 717bd2fbb2
3 changed files with 30 additions and 6 deletions

View file

@ -28,17 +28,17 @@ enum class Exception {
/// This behaviour is up to the user of this library to define. /// This behaviour is up to the user of this library to define.
/// Note: Constraints on unpredictable behaviour are specified in the ARMv8 ARM. /// Note: Constraints on unpredictable behaviour are specified in the ARMv8 ARM.
UnpredictableInstruction, UnpredictableInstruction,
/// A WFI instruction was executed. You may now enter a low-power state. /// A WFI instruction was executed. You may now enter a low-power state. (Hint instruction.)
WaitForInterrupt, WaitForInterrupt,
/// A WFE instruction was executed. You may now enter a low-power state if the event register is clear. /// A WFE instruction was executed. You may now enter a low-power state if the event register is clear. (Hint instruction.)
WaitForEvent, WaitForEvent,
/// A SEV instruction was executed. The event register of all PEs should be set. /// A SEV instruction was executed. The event register of all PEs should be set. (Hint instruction.)
SendEvent, SendEvent,
/// A SEVL instruction was executed. The event register of the current PE should be set. /// A SEVL instruction was executed. The event register of the current PE should be set. (Hint instruction.)
SendEventLocal, SendEventLocal,
/// A YIELD instruction was executed. /// A YIELD instruction was executed. (Hint instruction.)
Yield, Yield,
/// A BRK instruction was executed. /// A BRK instruction was executed. (Hint instruction.)
Breakpoint, Breakpoint,
}; };
@ -122,6 +122,10 @@ struct UserConfig {
/// Executing DC ZVA in this mode will result in zeros being written to memory. /// Executing DC ZVA in this mode will result in zeros being written to memory.
bool hook_data_cache_operations = false; bool hook_data_cache_operations = false;
/// When set to true, UserCallbacks::ExceptionRaised will be called when any hint
/// instruction is executed.
bool hook_hint_instructions = false;
/// Counter-timer frequency register. The value of the register is not interpreted by /// Counter-timer frequency register. The value of the register is not interpreted by
/// dynarmic. /// dynarmic.
std::uint32_t cntfrq_el0 = 600000000; std::uint32_t cntfrq_el0 = 600000000;

View file

@ -37,22 +37,37 @@ bool TranslatorVisitor::NOP() {
} }
bool TranslatorVisitor::YIELD() { bool TranslatorVisitor::YIELD() {
if (!options.hook_hint_instructions) {
return true;
}
return RaiseException(Exception::Yield); return RaiseException(Exception::Yield);
} }
bool TranslatorVisitor::WFE() { bool TranslatorVisitor::WFE() {
if (!options.hook_hint_instructions) {
return true;
}
return RaiseException(Exception::WaitForEvent); return RaiseException(Exception::WaitForEvent);
} }
bool TranslatorVisitor::WFI() { bool TranslatorVisitor::WFI() {
if (!options.hook_hint_instructions) {
return true;
}
return RaiseException(Exception::WaitForInterrupt); return RaiseException(Exception::WaitForInterrupt);
} }
bool TranslatorVisitor::SEV() { bool TranslatorVisitor::SEV() {
if (!options.hook_hint_instructions) {
return true;
}
return RaiseException(Exception::SendEvent); return RaiseException(Exception::SendEvent);
} }
bool TranslatorVisitor::SEVL() { bool TranslatorVisitor::SEVL() {
if (!options.hook_hint_instructions) {
return true;
}
return RaiseException(Exception::SendEventLocal); return RaiseException(Exception::SendEventLocal);
} }

View file

@ -26,6 +26,11 @@ struct TranslationOptions {
/// If this is false, the ExceptionRaised IR instruction is emitted. /// If this is false, the ExceptionRaised IR instruction is emitted.
/// If this is true, we define some behaviour for some instructions. /// If this is true, we define some behaviour for some instructions.
bool define_unpredictable_behaviour = false; bool define_unpredictable_behaviour = false;
/// This changes what IR we emit when we translate a hint instruction.
/// If this is false, we treat the instruction as a NOP.
/// If this is true, we emit an ExceptionRaised instruction.
bool hook_hint_instructions = true;
}; };
/** /**