early-access version 1384

main
pineappleEA 2021-01-27 02:13:23 +01:00
parent db19339010
commit f56ce2aed6
3 changed files with 13 additions and 5 deletions

View File

@ -1,7 +1,7 @@
yuzu emulator early access yuzu emulator early access
============= =============
This is the source code for early-access 1382. This is the source code for early-access 1384.
## Legal Notice ## Legal Notice

View File

@ -110,6 +110,7 @@ struct UserCallbacks {
virtual void ExceptionRaised(VAddr pc, Exception exception) = 0; virtual void ExceptionRaised(VAddr pc, Exception exception) = 0;
virtual void DataCacheOperationRaised(DataCacheOperation /*op*/, VAddr /*value*/) {} virtual void DataCacheOperationRaised(DataCacheOperation /*op*/, VAddr /*value*/) {}
virtual void InstructionSynchronizationBarrierRaised() {}
// Timing-related callbacks // Timing-related callbacks
// ticks ticks have passed // ticks ticks have passed
@ -153,6 +154,11 @@ 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::InstructionSynchronizationBarrierRaised will be
/// called when an ISB instruction is executed.
/// When set to false, ISB will be treated as a NOP instruction.
bool hook_isb = false;
/// When set to true, UserCallbacks::ExceptionRaised will be called when any hint /// When set to true, UserCallbacks::ExceptionRaised will be called when any hint
/// instruction is executed. /// instruction is executed.
bool hook_hint_instructions = false; bool hook_hint_instructions = false;

View File

@ -659,11 +659,13 @@ void A64EmitX64::EmitA64DataMemoryBarrier(A64EmitContext&, IR::Inst*) {
code.lfence(); code.lfence();
} }
void A64EmitX64::EmitA64InstructionSynchronizationBarrier(A64EmitContext& ctx, IR::Inst* ) { void A64EmitX64::EmitA64InstructionSynchronizationBarrier(A64EmitContext& ctx, IR::Inst*) {
ctx.reg_alloc.HostCall(nullptr); if (!conf.hook_isb) {
return;
}
code.mov(code.ABI_PARAM1, reinterpret_cast<u64>(jit_interface)); ctx.reg_alloc.HostCall(nullptr);
code.CallLambda([](A64::Jit* jit) { jit->ClearCache(); }); Devirtualize<&A64::UserCallbacks::InstructionSynchronizationBarrierRaised>(conf.callbacks).EmitCall(code);
} }
void A64EmitX64::EmitA64GetCNTFRQ(A64EmitContext& ctx, IR::Inst* inst) { void A64EmitX64::EmitA64GetCNTFRQ(A64EmitContext& ctx, IR::Inst* inst) {