arm_dynarmic_cp15.cpp 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // Copyright 2017 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include "core/arm/dynarmic/arm_dynarmic_cp15.h"
  5. #include "core/arm/skyeye_common/arm_regformat.h"
  6. #include "core/arm/skyeye_common/armstate.h"
  7. using Callback = Dynarmic::Coprocessor::Callback;
  8. using CallbackOrAccessOneWord = Dynarmic::Coprocessor::CallbackOrAccessOneWord;
  9. using CallbackOrAccessTwoWords = Dynarmic::Coprocessor::CallbackOrAccessTwoWords;
  10. DynarmicCP15::DynarmicCP15(const std::shared_ptr<ARMul_State>& state) : interpreter_state(state) {}
  11. DynarmicCP15::~DynarmicCP15() = default;
  12. boost::optional<Callback> DynarmicCP15::CompileInternalOperation(bool two, unsigned opc1,
  13. CoprocReg CRd, CoprocReg CRn,
  14. CoprocReg CRm, unsigned opc2) {
  15. return boost::none;
  16. }
  17. CallbackOrAccessOneWord DynarmicCP15::CompileSendOneWord(bool two, unsigned opc1, CoprocReg CRn,
  18. CoprocReg CRm, unsigned opc2) {
  19. // TODO(merry): Privileged CP15 registers
  20. if (!two && CRn == CoprocReg::C7 && opc1 == 0 && CRm == CoprocReg::C5 && opc2 == 4) {
  21. // This is a dummy write, we ignore the value written here.
  22. return &interpreter_state->CP15[CP15_FLUSH_PREFETCH_BUFFER];
  23. }
  24. if (!two && CRn == CoprocReg::C7 && opc1 == 0 && CRm == CoprocReg::C10) {
  25. switch (opc2) {
  26. case 4:
  27. // This is a dummy write, we ignore the value written here.
  28. return &interpreter_state->CP15[CP15_DATA_SYNC_BARRIER];
  29. case 5:
  30. // This is a dummy write, we ignore the value written here.
  31. return &interpreter_state->CP15[CP15_DATA_MEMORY_BARRIER];
  32. default:
  33. return boost::blank{};
  34. }
  35. }
  36. if (!two && CRn == CoprocReg::C13 && opc1 == 0 && CRm == CoprocReg::C0 && opc2 == 2) {
  37. return &interpreter_state->CP15[CP15_THREAD_UPRW];
  38. }
  39. return boost::blank{};
  40. }
  41. CallbackOrAccessTwoWords DynarmicCP15::CompileSendTwoWords(bool two, unsigned opc, CoprocReg CRm) {
  42. return boost::blank{};
  43. }
  44. CallbackOrAccessOneWord DynarmicCP15::CompileGetOneWord(bool two, unsigned opc1, CoprocReg CRn,
  45. CoprocReg CRm, unsigned opc2) {
  46. // TODO(merry): Privileged CP15 registers
  47. if (!two && CRn == CoprocReg::C13 && opc1 == 0 && CRm == CoprocReg::C0) {
  48. switch (opc2) {
  49. case 2:
  50. return &interpreter_state->CP15[CP15_THREAD_UPRW];
  51. case 3:
  52. return &interpreter_state->CP15[CP15_THREAD_URO];
  53. default:
  54. return boost::blank{};
  55. }
  56. }
  57. return boost::blank{};
  58. }
  59. CallbackOrAccessTwoWords DynarmicCP15::CompileGetTwoWords(bool two, unsigned opc, CoprocReg CRm) {
  60. return boost::blank{};
  61. }
  62. boost::optional<Callback> DynarmicCP15::CompileLoadWords(bool two, bool long_transfer,
  63. CoprocReg CRd,
  64. boost::optional<u8> option) {
  65. return boost::none;
  66. }
  67. boost::optional<Callback> DynarmicCP15::CompileStoreWords(bool two, bool long_transfer,
  68. CoprocReg CRd,
  69. boost::optional<u8> option) {
  70. return boost::none;
  71. }