diff options
| author | 2022-08-07 21:50:21 +0100 | |
|---|---|---|
| committer | 2022-08-07 22:16:49 +0100 | |
| commit | 50cda3bd7b206c7ec35a336201ab514605413091 (patch) | |
| tree | c60a3d09f5fb112251d60d4601794aed5a760f96 /src/core | |
| parent | Merge pull request #8658 from liamwhite/plgp (diff) | |
| download | yuzu-50cda3bd7b206c7ec35a336201ab514605413091.tar.gz yuzu-50cda3bd7b206c7ec35a336201ab514605413091.tar.xz yuzu-50cda3bd7b206c7ec35a336201ab514605413091.zip | |
arm_dynarmic_cp15: Implement CP15DMB/CP15DSB/CP15ISB
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_cp15.cpp | 31 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_cp15.h | 2 |
2 files changed, 29 insertions, 4 deletions
diff --git a/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp b/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp index e9123c13d..200efe4db 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp | |||
| @@ -8,6 +8,10 @@ | |||
| 8 | #include "core/core.h" | 8 | #include "core/core.h" |
| 9 | #include "core/core_timing.h" | 9 | #include "core/core_timing.h" |
| 10 | 10 | ||
| 11 | #ifdef _MSC_VER | ||
| 12 | #include <intrin.h> | ||
| 13 | #endif | ||
| 14 | |||
| 11 | using Callback = Dynarmic::A32::Coprocessor::Callback; | 15 | using Callback = Dynarmic::A32::Coprocessor::Callback; |
| 12 | using CallbackOrAccessOneWord = Dynarmic::A32::Coprocessor::CallbackOrAccessOneWord; | 16 | using CallbackOrAccessOneWord = Dynarmic::A32::Coprocessor::CallbackOrAccessOneWord; |
| 13 | using CallbackOrAccessTwoWords = Dynarmic::A32::Coprocessor::CallbackOrAccessTwoWords; | 17 | using CallbackOrAccessTwoWords = Dynarmic::A32::Coprocessor::CallbackOrAccessTwoWords; |
| @@ -47,12 +51,31 @@ CallbackOrAccessOneWord DynarmicCP15::CompileSendOneWord(bool two, unsigned opc1 | |||
| 47 | switch (opc2) { | 51 | switch (opc2) { |
| 48 | case 4: | 52 | case 4: |
| 49 | // CP15_DATA_SYNC_BARRIER | 53 | // CP15_DATA_SYNC_BARRIER |
| 50 | // This is a dummy write, we ignore the value written here. | 54 | return Callback{ |
| 51 | return &dummy_value; | 55 | [](Dynarmic::A32::Jit*, void*, std::uint32_t, std::uint32_t) -> std::uint64_t { |
| 56 | #ifdef _MSC_VER | ||
| 57 | _mm_mfence(); | ||
| 58 | _mm_lfence(); | ||
| 59 | #else | ||
| 60 | asm volatile("mfence\n\tlfence\n\t" : : : "memory"); | ||
| 61 | #endif | ||
| 62 | return 0; | ||
| 63 | }, | ||
| 64 | std::nullopt, | ||
| 65 | }; | ||
| 52 | case 5: | 66 | case 5: |
| 53 | // CP15_DATA_MEMORY_BARRIER | 67 | // CP15_DATA_MEMORY_BARRIER |
| 54 | // This is a dummy write, we ignore the value written here. | 68 | return Callback{ |
| 55 | return &dummy_value; | 69 | [](Dynarmic::A32::Jit*, void*, std::uint32_t, std::uint32_t) -> std::uint64_t { |
| 70 | #ifdef _MSC_VER | ||
| 71 | _mm_mfence(); | ||
| 72 | #else | ||
| 73 | asm volatile("mfence\n\t" : : : "memory"); | ||
| 74 | #endif | ||
| 75 | return 0; | ||
| 76 | }, | ||
| 77 | std::nullopt, | ||
| 78 | }; | ||
| 56 | } | 79 | } |
| 57 | } | 80 | } |
| 58 | 81 | ||
diff --git a/src/core/arm/dynarmic/arm_dynarmic_cp15.h b/src/core/arm/dynarmic/arm_dynarmic_cp15.h index 5b2a51636..d90b3e568 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_cp15.h +++ b/src/core/arm/dynarmic/arm_dynarmic_cp15.h | |||
| @@ -35,6 +35,8 @@ public: | |||
| 35 | ARM_Dynarmic_32& parent; | 35 | ARM_Dynarmic_32& parent; |
| 36 | u32 uprw = 0; | 36 | u32 uprw = 0; |
| 37 | u32 uro = 0; | 37 | u32 uro = 0; |
| 38 | |||
| 39 | friend class ARM_Dynarmic_32; | ||
| 38 | }; | 40 | }; |
| 39 | 41 | ||
| 40 | } // namespace Core | 42 | } // namespace Core |