A64: Add hook_hint_instructions option
This commit is contained in:
parent
396116ee61
commit
717bd2fbb2
3 changed files with 30 additions and 6 deletions
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue