9 changed files with 175 additions and 94 deletions
-
2externals/dynarmic
-
8src/core/CMakeLists.txt
-
41src/core/arm/dynarmic/arm_dynarmic_32.cpp
-
2src/core/arm/dynarmic/arm_dynarmic_32.h
-
65src/core/arm/dynarmic/arm_dynarmic_64.cpp
-
25src/core/arm/dynarmic/arm_dynarmic_64.h
-
76src/core/arm/dynarmic/arm_exclusive_monitor.cpp
-
48src/core/arm/dynarmic/arm_exclusive_monitor.h
-
2src/core/arm/exclusive_monitor.cpp
@ -1 +1 @@ |
|||||
Subproject commit 3a50d444dcb66c868528dd12057f63dc623d09a5 |
|
||||
|
Subproject commit b759773b3b76c62200ecd4e097ec6ecfd825aacb |
||||
@ -0,0 +1,76 @@ |
|||||
|
// Copyright 2018 yuzu emulator team
|
||||
|
// Licensed under GPLv2 or any later version
|
||||
|
// Refer to the license.txt file included.
|
||||
|
|
||||
|
#include <cinttypes>
|
||||
|
#include <memory>
|
||||
|
#include "core/arm/dynarmic/arm_exclusive_monitor.h"
|
||||
|
#include "core/memory.h"
|
||||
|
|
||||
|
namespace Core { |
||||
|
|
||||
|
DynarmicExclusiveMonitor::DynarmicExclusiveMonitor(Memory::Memory& memory, std::size_t core_count) |
||||
|
: monitor(core_count), memory{memory} {} |
||||
|
|
||||
|
DynarmicExclusiveMonitor::~DynarmicExclusiveMonitor() = default; |
||||
|
|
||||
|
u8 DynarmicExclusiveMonitor::ExclusiveRead8(std::size_t core_index, VAddr addr) { |
||||
|
return monitor.ReadAndMark<u8>(core_index, addr, [&]() -> u8 { return memory.Read8(addr); }); |
||||
|
} |
||||
|
|
||||
|
u16 DynarmicExclusiveMonitor::ExclusiveRead16(std::size_t core_index, VAddr addr) { |
||||
|
return monitor.ReadAndMark<u16>(core_index, addr, [&]() -> u16 { return memory.Read16(addr); }); |
||||
|
} |
||||
|
|
||||
|
u32 DynarmicExclusiveMonitor::ExclusiveRead32(std::size_t core_index, VAddr addr) { |
||||
|
return monitor.ReadAndMark<u32>(core_index, addr, [&]() -> u32 { return memory.Read32(addr); }); |
||||
|
} |
||||
|
|
||||
|
u64 DynarmicExclusiveMonitor::ExclusiveRead64(std::size_t core_index, VAddr addr) { |
||||
|
return monitor.ReadAndMark<u64>(core_index, addr, [&]() -> u64 { return memory.Read64(addr); }); |
||||
|
} |
||||
|
|
||||
|
u128 DynarmicExclusiveMonitor::ExclusiveRead128(std::size_t core_index, VAddr addr) { |
||||
|
return monitor.ReadAndMark<u128>(core_index, addr, [&]() -> u128 { |
||||
|
u128 result; |
||||
|
result[0] = memory.Read64(addr); |
||||
|
result[1] = memory.Read64(addr + 8); |
||||
|
return result; |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
void DynarmicExclusiveMonitor::ClearExclusive() { |
||||
|
monitor.Clear(); |
||||
|
} |
||||
|
|
||||
|
bool DynarmicExclusiveMonitor::ExclusiveWrite8(std::size_t core_index, VAddr vaddr, u8 value) { |
||||
|
return monitor.DoExclusiveOperation<u8>(core_index, vaddr, [&](u8 expected) -> bool { |
||||
|
return memory.WriteExclusive8(vaddr, value, expected); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
bool DynarmicExclusiveMonitor::ExclusiveWrite16(std::size_t core_index, VAddr vaddr, u16 value) { |
||||
|
return monitor.DoExclusiveOperation<u16>(core_index, vaddr, [&](u16 expected) -> bool { |
||||
|
return memory.WriteExclusive16(vaddr, value, expected); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
bool DynarmicExclusiveMonitor::ExclusiveWrite32(std::size_t core_index, VAddr vaddr, u32 value) { |
||||
|
return monitor.DoExclusiveOperation<u32>(core_index, vaddr, [&](u32 expected) -> bool { |
||||
|
return memory.WriteExclusive32(vaddr, value, expected); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
bool DynarmicExclusiveMonitor::ExclusiveWrite64(std::size_t core_index, VAddr vaddr, u64 value) { |
||||
|
return monitor.DoExclusiveOperation<u64>(core_index, vaddr, [&](u64 expected) -> bool { |
||||
|
return memory.WriteExclusive64(vaddr, value, expected); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
bool DynarmicExclusiveMonitor::ExclusiveWrite128(std::size_t core_index, VAddr vaddr, u128 value) { |
||||
|
return monitor.DoExclusiveOperation<u128>(core_index, vaddr, [&](u128 expected) -> bool { |
||||
|
return memory.WriteExclusive128(vaddr, value, expected); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
} // namespace Core
|
||||
@ -0,0 +1,48 @@ |
|||||
|
// Copyright 2020 yuzu emulator team |
||||
|
// Licensed under GPLv2 or any later version |
||||
|
// Refer to the license.txt file included. |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include <memory> |
||||
|
#include <unordered_map> |
||||
|
|
||||
|
#include <dynarmic/exclusive_monitor.h> |
||||
|
|
||||
|
#include "common/common_types.h" |
||||
|
#include "core/arm/dynarmic/arm_dynarmic_32.h" |
||||
|
#include "core/arm/dynarmic/arm_dynarmic_64.h" |
||||
|
#include "core/arm/exclusive_monitor.h" |
||||
|
|
||||
|
namespace Core::Memory { |
||||
|
class Memory; |
||||
|
} |
||||
|
|
||||
|
namespace Core { |
||||
|
|
||||
|
class DynarmicExclusiveMonitor final : public ExclusiveMonitor { |
||||
|
public: |
||||
|
explicit DynarmicExclusiveMonitor(Memory::Memory& memory, std::size_t core_count); |
||||
|
~DynarmicExclusiveMonitor() override; |
||||
|
|
||||
|
u8 ExclusiveRead8(std::size_t core_index, VAddr addr) override; |
||||
|
u16 ExclusiveRead16(std::size_t core_index, VAddr addr) override; |
||||
|
u32 ExclusiveRead32(std::size_t core_index, VAddr addr) override; |
||||
|
u64 ExclusiveRead64(std::size_t core_index, VAddr addr) override; |
||||
|
u128 ExclusiveRead128(std::size_t core_index, VAddr addr) override; |
||||
|
void ClearExclusive() override; |
||||
|
|
||||
|
bool ExclusiveWrite8(std::size_t core_index, VAddr vaddr, u8 value) override; |
||||
|
bool ExclusiveWrite16(std::size_t core_index, VAddr vaddr, u16 value) override; |
||||
|
bool ExclusiveWrite32(std::size_t core_index, VAddr vaddr, u32 value) override; |
||||
|
bool ExclusiveWrite64(std::size_t core_index, VAddr vaddr, u64 value) override; |
||||
|
bool ExclusiveWrite128(std::size_t core_index, VAddr vaddr, u128 value) override; |
||||
|
|
||||
|
private: |
||||
|
friend class ARM_Dynarmic_32; |
||||
|
friend class ARM_Dynarmic_64; |
||||
|
Dynarmic::ExclusiveMonitor monitor; |
||||
|
Core::Memory::Memory& memory; |
||||
|
}; |
||||
|
|
||||
|
} // namespace Core |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue