7 changed files with 132 additions and 7 deletions
-
2externals/dynarmic
-
2externals/nihstro
-
2src/core/CMakeLists.txt
-
11src/core/arm/dynarmic/arm_dynarmic.cpp
-
2src/core/arm/dynarmic/arm_dynarmic.h
-
88src/core/arm/dynarmic/arm_dynarmic_cp15.cpp
-
32src/core/arm/dynarmic/arm_dynarmic_cp15.h
@ -1 +1 @@ |
|||
Subproject commit 36082087ded632079b16d24137fdd0c450ce82ea |
|||
Subproject commit 9ecdd32b846bd6061852a3c35b8883d2eb5863d2 |
|||
@ -1 +1 @@ |
|||
Subproject commit 7e24743af21a7c2e3cef21ef174ae4269d0cfdac |
|||
Subproject commit 26a0a04a458df2b9ba6e39608bee183d8a0a00ec |
|||
@ -0,0 +1,88 @@ |
|||
// Copyright 2017 Citra Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include "core/arm/dynarmic/arm_dynarmic_cp15.h"
|
|||
#include "core/arm/skyeye_common/arm_regformat.h"
|
|||
#include "core/arm/skyeye_common/armstate.h"
|
|||
|
|||
using Callback = Dynarmic::Coprocessor::Callback; |
|||
using CallbackOrAccessOneWord = Dynarmic::Coprocessor::CallbackOrAccessOneWord; |
|||
using CallbackOrAccessTwoWords = Dynarmic::Coprocessor::CallbackOrAccessTwoWords; |
|||
|
|||
DynarmicCP15::DynarmicCP15(const std::shared_ptr<ARMul_State>& state) : interpreter_state(state) {} |
|||
|
|||
DynarmicCP15::~DynarmicCP15() = default; |
|||
|
|||
boost::optional<Callback> DynarmicCP15::CompileInternalOperation(bool two, unsigned opc1, |
|||
CoprocReg CRd, CoprocReg CRn, |
|||
CoprocReg CRm, unsigned opc2) { |
|||
return boost::none; |
|||
} |
|||
|
|||
CallbackOrAccessOneWord DynarmicCP15::CompileSendOneWord(bool two, unsigned opc1, CoprocReg CRn, |
|||
CoprocReg CRm, unsigned opc2) { |
|||
// TODO(merry): Privileged CP15 registers
|
|||
|
|||
if (!two && CRn == CoprocReg::C7 && opc1 == 0 && CRm == CoprocReg::C5 && opc2 == 4) { |
|||
// This is a dummy write, we ignore the value written here.
|
|||
return &interpreter_state->CP15[CP15_FLUSH_PREFETCH_BUFFER]; |
|||
} |
|||
|
|||
if (!two && CRn == CoprocReg::C7 && opc1 == 0 && CRm == CoprocReg::C10) { |
|||
switch (opc2) { |
|||
case 4: |
|||
// This is a dummy write, we ignore the value written here.
|
|||
return &interpreter_state->CP15[CP15_DATA_SYNC_BARRIER]; |
|||
case 5: |
|||
// This is a dummy write, we ignore the value written here.
|
|||
return &interpreter_state->CP15[CP15_DATA_MEMORY_BARRIER]; |
|||
default: |
|||
return boost::blank{}; |
|||
} |
|||
} |
|||
|
|||
if (!two && CRn == CoprocReg::C13 && opc1 == 0 && CRm == CoprocReg::C0 && opc2 == 2) { |
|||
return &interpreter_state->CP15[CP15_THREAD_UPRW]; |
|||
} |
|||
|
|||
return boost::blank{}; |
|||
} |
|||
|
|||
CallbackOrAccessTwoWords DynarmicCP15::CompileSendTwoWords(bool two, unsigned opc, CoprocReg CRm) { |
|||
return boost::blank{}; |
|||
} |
|||
|
|||
CallbackOrAccessOneWord DynarmicCP15::CompileGetOneWord(bool two, unsigned opc1, CoprocReg CRn, |
|||
CoprocReg CRm, unsigned opc2) { |
|||
// TODO(merry): Privileged CP15 registers
|
|||
|
|||
if (!two && CRn == CoprocReg::C13 && opc1 == 0 && CRm == CoprocReg::C0) { |
|||
switch (opc2) { |
|||
case 2: |
|||
return &interpreter_state->CP15[CP15_THREAD_UPRW]; |
|||
case 3: |
|||
return &interpreter_state->CP15[CP15_THREAD_URO]; |
|||
default: |
|||
return boost::blank{}; |
|||
} |
|||
} |
|||
|
|||
return boost::blank{}; |
|||
} |
|||
|
|||
CallbackOrAccessTwoWords DynarmicCP15::CompileGetTwoWords(bool two, unsigned opc, CoprocReg CRm) { |
|||
return boost::blank{}; |
|||
} |
|||
|
|||
boost::optional<Callback> DynarmicCP15::CompileLoadWords(bool two, bool long_transfer, |
|||
CoprocReg CRd, |
|||
boost::optional<u8> option) { |
|||
return boost::none; |
|||
} |
|||
|
|||
boost::optional<Callback> DynarmicCP15::CompileStoreWords(bool two, bool long_transfer, |
|||
CoprocReg CRd, |
|||
boost::optional<u8> option) { |
|||
return boost::none; |
|||
} |
|||
@ -0,0 +1,32 @@ |
|||
// Copyright 2017 Citra Emulator Project |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#include <memory> |
|||
#include <dynarmic/coprocessor.h> |
|||
#include "common/common_types.h" |
|||
|
|||
struct ARMul_State; |
|||
|
|||
class DynarmicCP15 final : public Dynarmic::Coprocessor { |
|||
public: |
|||
explicit DynarmicCP15(const std::shared_ptr<ARMul_State>&); |
|||
~DynarmicCP15() override; |
|||
|
|||
boost::optional<Callback> CompileInternalOperation(bool two, unsigned opc1, CoprocReg CRd, |
|||
CoprocReg CRn, CoprocReg CRm, |
|||
unsigned opc2) override; |
|||
CallbackOrAccessOneWord CompileSendOneWord(bool two, unsigned opc1, CoprocReg CRn, |
|||
CoprocReg CRm, unsigned opc2) override; |
|||
CallbackOrAccessTwoWords CompileSendTwoWords(bool two, unsigned opc, CoprocReg CRm) override; |
|||
CallbackOrAccessOneWord CompileGetOneWord(bool two, unsigned opc1, CoprocReg CRn, CoprocReg CRm, |
|||
unsigned opc2) override; |
|||
CallbackOrAccessTwoWords CompileGetTwoWords(bool two, unsigned opc, CoprocReg CRm) override; |
|||
boost::optional<Callback> CompileLoadWords(bool two, bool long_transfer, CoprocReg CRd, |
|||
boost::optional<u8> option) override; |
|||
boost::optional<Callback> CompileStoreWords(bool two, bool long_transfer, CoprocReg CRd, |
|||
boost::optional<u8> option) override; |
|||
|
|||
private: |
|||
std::shared_ptr<ARMul_State> interpreter_state; |
|||
}; |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue