1
0
Fork 0
forked from suyu/suyu

arm_dynarmic_cp15: Implement CP15DMB/CP15DSB/CP15ISB

This commit is contained in:
Merry 2022-08-07 21:50:21 +01:00
parent 9dc8d02acc
commit 50cda3bd7b
2 changed files with 29 additions and 4 deletions

View file

@ -8,6 +8,10 @@
#include "core/core.h" #include "core/core.h"
#include "core/core_timing.h" #include "core/core_timing.h"
#ifdef _MSC_VER
#include <intrin.h>
#endif
using Callback = Dynarmic::A32::Coprocessor::Callback; using Callback = Dynarmic::A32::Coprocessor::Callback;
using CallbackOrAccessOneWord = Dynarmic::A32::Coprocessor::CallbackOrAccessOneWord; using CallbackOrAccessOneWord = Dynarmic::A32::Coprocessor::CallbackOrAccessOneWord;
using CallbackOrAccessTwoWords = Dynarmic::A32::Coprocessor::CallbackOrAccessTwoWords; using CallbackOrAccessTwoWords = Dynarmic::A32::Coprocessor::CallbackOrAccessTwoWords;
@ -47,12 +51,31 @@ CallbackOrAccessOneWord DynarmicCP15::CompileSendOneWord(bool two, unsigned opc1
switch (opc2) { switch (opc2) {
case 4: case 4:
// CP15_DATA_SYNC_BARRIER // CP15_DATA_SYNC_BARRIER
// This is a dummy write, we ignore the value written here. return Callback{
return &dummy_value; [](Dynarmic::A32::Jit*, void*, std::uint32_t, std::uint32_t) -> std::uint64_t {
#ifdef _MSC_VER
_mm_mfence();
_mm_lfence();
#else
asm volatile("mfence\n\tlfence\n\t" : : : "memory");
#endif
return 0;
},
std::nullopt,
};
case 5: case 5:
// CP15_DATA_MEMORY_BARRIER // CP15_DATA_MEMORY_BARRIER
// This is a dummy write, we ignore the value written here. return Callback{
return &dummy_value; [](Dynarmic::A32::Jit*, void*, std::uint32_t, std::uint32_t) -> std::uint64_t {
#ifdef _MSC_VER
_mm_mfence();
#else
asm volatile("mfence\n\t" : : : "memory");
#endif
return 0;
},
std::nullopt,
};
} }
} }

View file

@ -35,6 +35,8 @@ public:
ARM_Dynarmic_32& parent; ARM_Dynarmic_32& parent;
u32 uprw = 0; u32 uprw = 0;
u32 uro = 0; u32 uro = 0;
friend class ARM_Dynarmic_32;
}; };
} // namespace Core } // namespace Core