diff options
| author | bunnei <bunneidev@gmail.com> | 2018-02-23 08:51:52 -0800 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-02-23 08:51:52 -0800 | 
| commit | 6bf71085459e22b6d43a8c6ba8986b4e94ceead3 (patch) | |
| tree | fc49393b5b0566579d85a87b969485bb6d2cd9c9 /src/core/arm/dynarmic | |
| parent | 7f0ecbf8596a51da47707de147669267efaa123f (diff) | |
| parent | 32d127ad3e94b09566ca17b83072ff42018b02b3 (diff) | |
Merge pull request #210 from MerryMage/f/dynarmic/sysreg
arm_dynarmic: Implement system registers and provide more hooks
Diffstat (limited to 'src/core/arm/dynarmic')
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic.cpp | 24 | 
1 files changed, 22 insertions, 2 deletions
| diff --git a/src/core/arm/dynarmic/arm_dynarmic.cpp b/src/core/arm/dynarmic/arm_dynarmic.cpp index 283d20831..e7f6bf8c2 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic.cpp @@ -6,6 +6,7 @@  #include <memory>  #include <dynarmic/A64/a64.h>  #include <dynarmic/A64/config.h> +#include "common/logging/log.h"  #include "core/arm/dynarmic/arm_dynarmic.h"  #include "core/core_timing.h"  #include "core/hle/kernel/memory.h" @@ -53,6 +54,9 @@ public:      }      void InterpreterFallback(u64 pc, size_t num_instructions) override { +        LOG_INFO(Core_ARM, "Unicorn fallback @ 0x%" PRIx64 " for %zu instructions (instr = %08x)", +                 pc, num_instructions, MemoryReadCode(pc)); +          ARM_Interface::ThreadContext ctx;          parent.SaveContext(ctx);          parent.inner_unicorn.LoadContext(ctx); @@ -63,8 +67,17 @@ public:      }      void ExceptionRaised(u64 pc, Dynarmic::A64::Exception exception) override { -        ASSERT_MSG(false, "ExceptionRaised(exception = %zu, pc = %" PRIx64 ")", -                   static_cast<size_t>(exception), pc); +        switch (exception) { +        case Dynarmic::A64::Exception::WaitForInterrupt: +        case Dynarmic::A64::Exception::WaitForEvent: +        case Dynarmic::A64::Exception::SendEvent: +        case Dynarmic::A64::Exception::SendEventLocal: +        case Dynarmic::A64::Exception::Yield: +            return; +        default: +            ASSERT_MSG(false, "ExceptionRaised(exception = %zu, pc = %" PRIx64 ")", +                       static_cast<size_t>(exception), pc); +        }      }      void CallSVC(u32 swi) override { @@ -81,11 +94,15 @@ public:      u64 GetTicksRemaining() override {          return ticks_remaining;      } +    u64 GetCNTPCT() override { +        return CoreTiming::GetTicks(); +    }      ARM_Dynarmic& parent;      size_t ticks_remaining = 0;      size_t num_interpreted_instructions = 0;      u64 tpidrro_el0 = 0; +    u64 tpidr_el0 = 0;  };  std::unique_ptr<Dynarmic::A64::Jit> MakeJit(const std::unique_ptr<ARM_Dynarmic_Callbacks>& cb) { @@ -94,10 +111,13 @@ std::unique_ptr<Dynarmic::A64::Jit> MakeJit(const std::unique_ptr<ARM_Dynarmic_C      Dynarmic::A64::UserConfig config;      config.callbacks = cb.get();      config.tpidrro_el0 = &cb->tpidrro_el0; +    config.tpidr_el0 = &cb->tpidr_el0;      config.dczid_el0 = 4; +    config.ctr_el0 = 0x8444c004;      config.page_table = reinterpret_cast<void**>(page_table);      config.page_table_address_space_bits = Memory::ADDRESS_SPACE_BITS;      config.silently_mirror_page_table = false; +      return std::make_unique<Dynarmic::A64::Jit>(config);  } | 
