From 6151e26958fa243b6322a9a544446dda5020204b Mon Sep 17 00:00:00 2001 From: bunnei Date: Fri, 25 Apr 2014 15:57:32 -0400 Subject: added disassembly to unimplemented instruction --- src/core/arm/interpreter/armsupp.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src/core/arm') diff --git a/src/core/arm/interpreter/armsupp.cpp b/src/core/arm/interpreter/armsupp.cpp index 101b9807a..48e55c63a 100644 --- a/src/core/arm/interpreter/armsupp.cpp +++ b/src/core/arm/interpreter/armsupp.cpp @@ -17,9 +17,11 @@ #include "armdefs.h" #include "armemu.h" + //#include "ansidecl.h" #include "skyeye_defs.h" #include "core/hle/hle.h" +#include "core/arm/disassembler/arm_disasm.h" unsigned xscale_cp15_cp_access_allowed (ARMul_State * state, unsigned reg, unsigned cpnum); @@ -846,7 +848,10 @@ ARMul_CDP (ARMul_State * state, ARMword instr) void ARMul_UndefInstr (ARMul_State * state, ARMword instr) { - ERROR_LOG(ARM11, "Undefined instruction!! Instr: 0x%x", instr); + char buff[512]; + ARM_Disasm disasm = ARM_Disasm(); + disasm.disasm(state->pc, instr, buff); + ERROR_LOG(ARM11, "Undefined instruction!! Disasm: %s Opcode: 0x%x", buff, instr); ARMul_Abort (state, ARMul_UndefinedInstrV); } -- cgit v1.2.3 From cb0663de5147f10533ecdbf6f58865f7cbe0241c Mon Sep 17 00:00:00 2001 From: bunnei Date: Fri, 25 Apr 2014 17:15:19 -0400 Subject: moved HLE::MRC to its own module, added support for catching data synchronization barrier command --- src/core/CMakeLists.txt | 1 + src/core/arm/interpreter/armemu.cpp | 3 ++- src/core/arm/interpreter/armsupp.cpp | 5 +++-- src/core/core.vcxproj | 2 ++ src/core/core.vcxproj.filters | 6 ++++++ src/core/hle/hle.cpp | 8 -------- src/core/hle/hle.h | 2 -- src/core/hle/mrc.cpp | 32 ++++++++++++++++++++++++++++++++ src/core/hle/mrc.h | 20 ++++++++++++++++++++ 9 files changed, 66 insertions(+), 13 deletions(-) create mode 100644 src/core/hle/mrc.cpp create mode 100644 src/core/hle/mrc.h (limited to 'src/core/arm') diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 3ba3afa70..314f6e64c 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -18,6 +18,7 @@ set(SRCS core.cpp file_sys/directory_file_system.cpp file_sys/meta_file_system.cpp hle/hle.cpp + hle/mrc.cpp hle/syscall.cpp hle/service/apt.cpp hle/service/gsp.cpp diff --git a/src/core/arm/interpreter/armemu.cpp b/src/core/arm/interpreter/armemu.cpp index 6074ff480..c137c61fe 100644 --- a/src/core/arm/interpreter/armemu.cpp +++ b/src/core/arm/interpreter/armemu.cpp @@ -4467,7 +4467,7 @@ ARMul_Emulate26 (ARMul_State * state) } /* Drop through. */ - case 0xe0: + //case 0xe0: case 0xe4: case 0xe6: case 0xe8: @@ -4502,6 +4502,7 @@ ARMul_Emulate26 (ARMul_State * state) /* Co-Processor Register Transfers (MRC) and Data Ops. */ + case 0xe0: case 0xe1: case 0xe3: case 0xe5: diff --git a/src/core/arm/interpreter/armsupp.cpp b/src/core/arm/interpreter/armsupp.cpp index 48e55c63a..b2bbedc18 100644 --- a/src/core/arm/interpreter/armsupp.cpp +++ b/src/core/arm/interpreter/armsupp.cpp @@ -20,7 +20,7 @@ //#include "ansidecl.h" #include "skyeye_defs.h" -#include "core/hle/hle.h" +#include "core/hle/mrc.h" #include "core/arm/disassembler/arm_disasm.h" unsigned xscale_cp15_cp_access_allowed (ARMul_State * state, unsigned reg, @@ -738,7 +738,8 @@ ARMword ARMul_MRC (ARMul_State * state, ARMword instr) { unsigned cpab; - ARMword result = HLE::CallGetThreadCommandBuffer(); + + ARMword result = HLE::CallMRC((HLE::ARM11_MRC_OPERATION)BITS(20, 27)); ////printf("SKYEYE ARMul_MRC, CPnum is %x, instr %x\n",CPNum, instr); //if (!CP_ACCESS_ALLOWED (state, CPNum)) { diff --git a/src/core/core.vcxproj b/src/core/core.vcxproj index b6fc604c6..be8448969 100644 --- a/src/core/core.vcxproj +++ b/src/core/core.vcxproj @@ -153,6 +153,7 @@ + @@ -192,6 +193,7 @@ + diff --git a/src/core/core.vcxproj.filters b/src/core/core.vcxproj.filters index ff7877feb..b5473bc41 100644 --- a/src/core/core.vcxproj.filters +++ b/src/core/core.vcxproj.filters @@ -105,6 +105,9 @@ hw + + hle + @@ -205,6 +208,9 @@ hw + + hle + diff --git a/src/core/hle/hle.cpp b/src/core/hle/hle.cpp index 5672a659f..aae9a3943 100644 --- a/src/core/hle/hle.cpp +++ b/src/core/hle/hle.cpp @@ -80,14 +80,6 @@ void CallSyscall(u32 opcode) { } } -/// Returns the coprocessor (in this case, syscore) command buffer pointer -Addr CallGetThreadCommandBuffer() { - // Called on insruction: mrc p15, 0, r0, c13, c0, 3 - // Returns an address in OSHLE memory for the CPU to read/write to - RETURN(CMD_BUFFER_ADDR); - return CMD_BUFFER_ADDR; -} - void RegisterModule(std::string name, int num_functions, const FunctionDef* func_table) { ModuleDef module = {name, num_functions, func_table}; g_module_db.push_back(module); diff --git a/src/core/hle/hle.h b/src/core/hle/hle.h index 628a1da89..907e2d741 100644 --- a/src/core/hle/hle.h +++ b/src/core/hle/hle.h @@ -57,8 +57,6 @@ void RegisterModule(std::string name, int num_functions, const FunctionDef *func void CallSyscall(u32 opcode); -Addr CallGetThreadCommandBuffer(); - void Init(); void Shutdown(); diff --git a/src/core/hle/mrc.cpp b/src/core/hle/mrc.cpp new file mode 100644 index 000000000..04d6cb5a5 --- /dev/null +++ b/src/core/hle/mrc.cpp @@ -0,0 +1,32 @@ +#include "mrc.h" +#include "hle.h" + +namespace HLE { + +/// Returns the coprocessor (in this case, syscore) command buffer pointer +Addr CallGetThreadCommandBuffer() { + // Called on insruction: mrc p15, 0, r0, c13, c0, 3 + // Returns an address in OSHLE memory for the CPU to read/write to + RETURN(CMD_BUFFER_ADDR); + return CMD_BUFFER_ADDR; +} + +/// Call an MRC operation in HLE +u32 CallMRC(ARM11_MRC_OPERATION operation) { + switch (operation) { + + case DATA_SYNCHRONIZATION_BARRIER: + ERROR_LOG(OSHLE, "Unimplemented MRC operation DATA_SYNCHRONIZATION_BARRIER"); + break; + + case CALL_GET_THREAD_COMMAND_BUFFER: + return CallGetThreadCommandBuffer(); + + default: + ERROR_LOG(OSHLE, "Unimplemented MRC operation 0x%02X", operation); + break; + } + return -1; +} + +} // namespace diff --git a/src/core/hle/mrc.h b/src/core/hle/mrc.h new file mode 100644 index 000000000..d6b9f162f --- /dev/null +++ b/src/core/hle/mrc.h @@ -0,0 +1,20 @@ +// Copyright 2014 Citra Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#pragma once + +#include "common/common_types.h" + +namespace HLE { + +/// MRC operations (ARM register from coprocessor), decoded as instr[20:27] +enum ARM11_MRC_OPERATION { + DATA_SYNCHRONIZATION_BARRIER = 0xE0, + CALL_GET_THREAD_COMMAND_BUFFER = 0xE1, +}; + +/// Call an MRC operation in HLE +u32 CallMRC(ARM11_MRC_OPERATION operation); + +} // namespace -- cgit v1.2.3 From f76a60be05ea1b12fda9ad9852719b50dee9649e Mon Sep 17 00:00:00 2001 From: bunnei Date: Sun, 27 Apr 2014 18:22:30 -0400 Subject: removed commented out line - this was for an unimplemented MRC call, no longer need to leave this here --- src/core/arm/interpreter/armemu.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src/core/arm') diff --git a/src/core/arm/interpreter/armemu.cpp b/src/core/arm/interpreter/armemu.cpp index c137c61fe..a35c5c8dc 100644 --- a/src/core/arm/interpreter/armemu.cpp +++ b/src/core/arm/interpreter/armemu.cpp @@ -4467,7 +4467,6 @@ ARMul_Emulate26 (ARMul_State * state) } /* Drop through. */ - //case 0xe0: case 0xe4: case 0xe6: case 0xe8: -- cgit v1.2.3 From a48c6b947d5314ab804f375cca22af159cc3b77b Mon Sep 17 00:00:00 2001 From: bunnei Date: Sun, 27 Apr 2014 18:29:51 -0400 Subject: removed DISALLOW_COPY_AND_ASSIGN in favor of NonCopyable class --- src/common/common.h | 5 ----- src/core/arm/arm_interface.h | 3 +-- src/core/arm/interpreter/arm_interpreter.h | 1 - src/core/hle/service/gsp.h | 3 --- src/core/hle/service/hid.h | 3 --- src/core/hle/service/srv.h | 3 --- src/video_core/renderer_base.h | 4 +--- src/video_core/renderer_opengl/renderer_opengl.h | 1 - 8 files changed, 2 insertions(+), 21 deletions(-) (limited to 'src/core/arm') diff --git a/src/common/common.h b/src/common/common.h index a281b21cc..418757855 100644 --- a/src/common/common.h +++ b/src/common/common.h @@ -159,9 +159,4 @@ enum EMUSTATE_CHANGE EMUSTATE_CHANGE_STOP }; -// This should be used in the private: declarations for a class -#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ - TypeName(const TypeName&); \ - void operator=(const TypeName&) - #endif // _COMMON_H_ diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h index eee4726db..4dfe0570b 100644 --- a/src/core/arm/arm_interface.h +++ b/src/core/arm/arm_interface.h @@ -8,7 +8,7 @@ #include "common/common_types.h" /// Generic ARM11 CPU interface -class ARM_Interface { +class ARM_Interface : NonCopyable { public: ARM_Interface() { m_num_instructions = 0; @@ -75,5 +75,4 @@ private: u64 m_num_instructions; ///< Number of instructions executed - DISALLOW_COPY_AND_ASSIGN(ARM_Interface); }; diff --git a/src/core/arm/interpreter/arm_interpreter.h b/src/core/arm/interpreter/arm_interpreter.h index f3c86f8dd..625c0c652 100644 --- a/src/core/arm/interpreter/arm_interpreter.h +++ b/src/core/arm/interpreter/arm_interpreter.h @@ -63,5 +63,4 @@ private: ARMul_State* m_state; - DISALLOW_COPY_AND_ASSIGN(ARM_Interpreter); }; diff --git a/src/core/hle/service/gsp.h b/src/core/hle/service/gsp.h index 3b1846082..5ba09ab70 100644 --- a/src/core/hle/service/gsp.h +++ b/src/core/hle/service/gsp.h @@ -27,9 +27,6 @@ public: return "gsp::Gpu"; } -private: - - DISALLOW_COPY_AND_ASSIGN(Interface); }; } // namespace diff --git a/src/core/hle/service/hid.h b/src/core/hle/service/hid.h index 746c1b1fc..b17fcfa86 100644 --- a/src/core/hle/service/hid.h +++ b/src/core/hle/service/hid.h @@ -29,9 +29,6 @@ public: return "hid:USER"; } -private: - - DISALLOW_COPY_AND_ASSIGN(Interface); }; } // namespace diff --git a/src/core/hle/service/srv.h b/src/core/hle/service/srv.h index d9ac8fc88..760c976b4 100644 --- a/src/core/hle/service/srv.h +++ b/src/core/hle/service/srv.h @@ -32,9 +32,6 @@ public: */ Syscall::Result Sync(); -private: - - DISALLOW_COPY_AND_ASSIGN(Interface); }; } // namespace diff --git a/src/video_core/renderer_base.h b/src/video_core/renderer_base.h index bc65bf0ce..2650620b4 100644 --- a/src/video_core/renderer_base.h +++ b/src/video_core/renderer_base.h @@ -6,7 +6,7 @@ #include "common/common.h" -class RendererBase { +class RendererBase : NonCopyable { public: /// Used to reference a framebuffer @@ -52,6 +52,4 @@ protected: f32 m_current_fps; ///< Current framerate, should be set by the renderer int m_current_frame; ///< Current frame, should be set by the renderer -private: - DISALLOW_COPY_AND_ASSIGN(RendererBase); }; diff --git a/src/video_core/renderer_opengl/renderer_opengl.h b/src/video_core/renderer_opengl/renderer_opengl.h index 676a0ea02..4c0b6e59d 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.h +++ b/src/video_core/renderer_opengl/renderer_opengl.h @@ -87,5 +87,4 @@ private: u8 m_xfb_top_flipped[VideoCore::kScreenTopWidth * VideoCore::kScreenTopWidth * 4]; u8 m_xfb_bottom_flipped[VideoCore::kScreenTopWidth * VideoCore::kScreenTopWidth * 4]; - DISALLOW_COPY_AND_ASSIGN(RendererOpenGL); }; \ No newline at end of file -- cgit v1.2.3