/* This file is part of the dynarmic project. * Copyright (c) 2018 MerryMage * This software may be used and distributed according to the terms of the GNU * General Public License version 2 or any later version. */ #pragma once #include #include #include #include "common/common_types.h" #include "../testenv.h" class Unicorn final { public: static constexpr size_t num_gprs = 31; using RegisterArray = std::array; using RegisterPtrArray = std::array; using RegisterConstPtrArray = std::array; static constexpr size_t num_vecs = 32; using VectorArray = std::array; using VectorPtrArray = std::array; using VectorConstPtrArray = std::array; explicit Unicorn(TestEnv& testenv); ~Unicorn(); void Run(); u64 GetSP() const; void SetSP(u64 value); u64 GetPC() const; void SetPC(u64 value); RegisterArray GetRegisters() const; void SetRegisters(const RegisterArray& value); VectorArray GetVectors() const; void SetVectors(const VectorArray& value); u32 GetFpcr() const; void SetFpcr(u32 value); u32 GetFpsr() const; void SetFpsr(u32 value); u32 GetPstate() const; void SetPstate(u32 value); void ClearPageCache(); void DumpMemoryInformation(); private: static void InterruptHook(uc_engine* uc, u32 interrupt, void* user_data); static bool UnmappedMemoryHook(uc_engine* uc, uc_mem_type type, u64 addr, int size, u64 value, void* user_data); static bool MemoryWriteHook(uc_engine* uc, uc_mem_type type, u64 addr, int size, u64 value, void* user_data); struct Page { u64 address; std::array data; }; TestEnv& testenv; uc_engine* uc{}; uc_hook intr_hook{}; uc_hook mem_invalid_hook{}; uc_hook mem_write_prot_hook{}; std::vector> pages; };