diff options
| author | 2014-04-25 17:15:19 -0400 | |
|---|---|---|
| committer | 2014-04-25 17:15:19 -0400 | |
| commit | cb0663de5147f10533ecdbf6f58865f7cbe0241c (patch) | |
| tree | 30a122d3da59134e431ab2e6ef389d8f00467038 /src | |
| parent | added disassembly to unimplemented instruction (diff) | |
| download | yuzu-cb0663de5147f10533ecdbf6f58865f7cbe0241c.tar.gz yuzu-cb0663de5147f10533ecdbf6f58865f7cbe0241c.tar.xz yuzu-cb0663de5147f10533ecdbf6f58865f7cbe0241c.zip | |
moved HLE::MRC to its own module, added support for catching data synchronization barrier command
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/core/arm/interpreter/armemu.cpp | 3 | ||||
| -rw-r--r-- | src/core/arm/interpreter/armsupp.cpp | 5 | ||||
| -rw-r--r-- | src/core/core.vcxproj | 2 | ||||
| -rw-r--r-- | src/core/core.vcxproj.filters | 6 | ||||
| -rw-r--r-- | src/core/hle/hle.cpp | 8 | ||||
| -rw-r--r-- | src/core/hle/hle.h | 2 | ||||
| -rw-r--r-- | src/core/hle/mrc.cpp | 32 | ||||
| -rw-r--r-- | src/core/hle/mrc.h | 20 |
9 files changed, 66 insertions, 13 deletions
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 | |||
| 18 | file_sys/directory_file_system.cpp | 18 | file_sys/directory_file_system.cpp |
| 19 | file_sys/meta_file_system.cpp | 19 | file_sys/meta_file_system.cpp |
| 20 | hle/hle.cpp | 20 | hle/hle.cpp |
| 21 | hle/mrc.cpp | ||
| 21 | hle/syscall.cpp | 22 | hle/syscall.cpp |
| 22 | hle/service/apt.cpp | 23 | hle/service/apt.cpp |
| 23 | hle/service/gsp.cpp | 24 | 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) | |||
| 4467 | } | 4467 | } |
| 4468 | /* Drop through. */ | 4468 | /* Drop through. */ |
| 4469 | 4469 | ||
| 4470 | case 0xe0: | 4470 | //case 0xe0: |
| 4471 | case 0xe4: | 4471 | case 0xe4: |
| 4472 | case 0xe6: | 4472 | case 0xe6: |
| 4473 | case 0xe8: | 4473 | case 0xe8: |
| @@ -4502,6 +4502,7 @@ ARMul_Emulate26 (ARMul_State * state) | |||
| 4502 | 4502 | ||
| 4503 | 4503 | ||
| 4504 | /* Co-Processor Register Transfers (MRC) and Data Ops. */ | 4504 | /* Co-Processor Register Transfers (MRC) and Data Ops. */ |
| 4505 | case 0xe0: | ||
| 4505 | case 0xe1: | 4506 | case 0xe1: |
| 4506 | case 0xe3: | 4507 | case 0xe3: |
| 4507 | case 0xe5: | 4508 | 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 @@ | |||
| 20 | 20 | ||
| 21 | //#include "ansidecl.h" | 21 | //#include "ansidecl.h" |
| 22 | #include "skyeye_defs.h" | 22 | #include "skyeye_defs.h" |
| 23 | #include "core/hle/hle.h" | 23 | #include "core/hle/mrc.h" |
| 24 | #include "core/arm/disassembler/arm_disasm.h" | 24 | #include "core/arm/disassembler/arm_disasm.h" |
| 25 | 25 | ||
| 26 | unsigned xscale_cp15_cp_access_allowed (ARMul_State * state, unsigned reg, | 26 | unsigned xscale_cp15_cp_access_allowed (ARMul_State * state, unsigned reg, |
| @@ -738,7 +738,8 @@ ARMword | |||
| 738 | ARMul_MRC (ARMul_State * state, ARMword instr) | 738 | ARMul_MRC (ARMul_State * state, ARMword instr) |
| 739 | { | 739 | { |
| 740 | unsigned cpab; | 740 | unsigned cpab; |
| 741 | ARMword result = HLE::CallGetThreadCommandBuffer(); | 741 | |
| 742 | ARMword result = HLE::CallMRC((HLE::ARM11_MRC_OPERATION)BITS(20, 27)); | ||
| 742 | 743 | ||
| 743 | ////printf("SKYEYE ARMul_MRC, CPnum is %x, instr %x\n",CPNum, instr); | 744 | ////printf("SKYEYE ARMul_MRC, CPnum is %x, instr %x\n",CPNum, instr); |
| 744 | //if (!CP_ACCESS_ALLOWED (state, CPNum)) { | 745 | //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 @@ | |||
| 153 | <ClCompile Include="file_sys\directory_file_system.cpp" /> | 153 | <ClCompile Include="file_sys\directory_file_system.cpp" /> |
| 154 | <ClCompile Include="file_sys\meta_file_system.cpp" /> | 154 | <ClCompile Include="file_sys\meta_file_system.cpp" /> |
| 155 | <ClCompile Include="hle\hle.cpp" /> | 155 | <ClCompile Include="hle\hle.cpp" /> |
| 156 | <ClCompile Include="hle\mrc.cpp" /> | ||
| 156 | <ClCompile Include="hle\service\apt.cpp" /> | 157 | <ClCompile Include="hle\service\apt.cpp" /> |
| 157 | <ClCompile Include="hle\service\gsp.cpp" /> | 158 | <ClCompile Include="hle\service\gsp.cpp" /> |
| 158 | <ClCompile Include="hle\service\hid.cpp" /> | 159 | <ClCompile Include="hle\service\hid.cpp" /> |
| @@ -192,6 +193,7 @@ | |||
| 192 | <ClInclude Include="file_sys\meta_file_system.h" /> | 193 | <ClInclude Include="file_sys\meta_file_system.h" /> |
| 193 | <ClInclude Include="hle\function_wrappers.h" /> | 194 | <ClInclude Include="hle\function_wrappers.h" /> |
| 194 | <ClInclude Include="hle\hle.h" /> | 195 | <ClInclude Include="hle\hle.h" /> |
| 196 | <ClInclude Include="hle\mrc.h" /> | ||
| 195 | <ClInclude Include="hle\service\apt.h" /> | 197 | <ClInclude Include="hle\service\apt.h" /> |
| 196 | <ClInclude Include="hle\service\gsp.h" /> | 198 | <ClInclude Include="hle\service\gsp.h" /> |
| 197 | <ClInclude Include="hle\service\hid.h" /> | 199 | <ClInclude Include="hle\service\hid.h" /> |
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 @@ | |||
| 105 | <ClCompile Include="hw\lcd.cpp"> | 105 | <ClCompile Include="hw\lcd.cpp"> |
| 106 | <Filter>hw</Filter> | 106 | <Filter>hw</Filter> |
| 107 | </ClCompile> | 107 | </ClCompile> |
| 108 | <ClCompile Include="hle\mrc.cpp"> | ||
| 109 | <Filter>hle</Filter> | ||
| 110 | </ClCompile> | ||
| 108 | </ItemGroup> | 111 | </ItemGroup> |
| 109 | <ItemGroup> | 112 | <ItemGroup> |
| 110 | <ClInclude Include="arm\disassembler\arm_disasm.h"> | 113 | <ClInclude Include="arm\disassembler\arm_disasm.h"> |
| @@ -205,6 +208,9 @@ | |||
| 205 | <ClInclude Include="hw\lcd.h"> | 208 | <ClInclude Include="hw\lcd.h"> |
| 206 | <Filter>hw</Filter> | 209 | <Filter>hw</Filter> |
| 207 | </ClInclude> | 210 | </ClInclude> |
| 211 | <ClInclude Include="hle\mrc.h"> | ||
| 212 | <Filter>hle</Filter> | ||
| 213 | </ClInclude> | ||
| 208 | </ItemGroup> | 214 | </ItemGroup> |
| 209 | <ItemGroup> | 215 | <ItemGroup> |
| 210 | <Text Include="CMakeLists.txt" /> | 216 | <Text Include="CMakeLists.txt" /> |
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) { | |||
| 80 | } | 80 | } |
| 81 | } | 81 | } |
| 82 | 82 | ||
| 83 | /// Returns the coprocessor (in this case, syscore) command buffer pointer | ||
| 84 | Addr CallGetThreadCommandBuffer() { | ||
| 85 | // Called on insruction: mrc p15, 0, r0, c13, c0, 3 | ||
| 86 | // Returns an address in OSHLE memory for the CPU to read/write to | ||
| 87 | RETURN(CMD_BUFFER_ADDR); | ||
| 88 | return CMD_BUFFER_ADDR; | ||
| 89 | } | ||
| 90 | |||
| 91 | void RegisterModule(std::string name, int num_functions, const FunctionDef* func_table) { | 83 | void RegisterModule(std::string name, int num_functions, const FunctionDef* func_table) { |
| 92 | ModuleDef module = {name, num_functions, func_table}; | 84 | ModuleDef module = {name, num_functions, func_table}; |
| 93 | g_module_db.push_back(module); | 85 | 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 | |||
| 57 | 57 | ||
| 58 | void CallSyscall(u32 opcode); | 58 | void CallSyscall(u32 opcode); |
| 59 | 59 | ||
| 60 | Addr CallGetThreadCommandBuffer(); | ||
| 61 | |||
| 62 | void Init(); | 60 | void Init(); |
| 63 | 61 | ||
| 64 | void Shutdown(); | 62 | 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 @@ | |||
| 1 | #include "mrc.h" | ||
| 2 | #include "hle.h" | ||
| 3 | |||
| 4 | namespace HLE { | ||
| 5 | |||
| 6 | /// Returns the coprocessor (in this case, syscore) command buffer pointer | ||
| 7 | Addr CallGetThreadCommandBuffer() { | ||
| 8 | // Called on insruction: mrc p15, 0, r0, c13, c0, 3 | ||
| 9 | // Returns an address in OSHLE memory for the CPU to read/write to | ||
| 10 | RETURN(CMD_BUFFER_ADDR); | ||
| 11 | return CMD_BUFFER_ADDR; | ||
| 12 | } | ||
| 13 | |||
| 14 | /// Call an MRC operation in HLE | ||
| 15 | u32 CallMRC(ARM11_MRC_OPERATION operation) { | ||
| 16 | switch (operation) { | ||
| 17 | |||
| 18 | case DATA_SYNCHRONIZATION_BARRIER: | ||
| 19 | ERROR_LOG(OSHLE, "Unimplemented MRC operation DATA_SYNCHRONIZATION_BARRIER"); | ||
| 20 | break; | ||
| 21 | |||
| 22 | case CALL_GET_THREAD_COMMAND_BUFFER: | ||
| 23 | return CallGetThreadCommandBuffer(); | ||
| 24 | |||
| 25 | default: | ||
| 26 | ERROR_LOG(OSHLE, "Unimplemented MRC operation 0x%02X", operation); | ||
| 27 | break; | ||
| 28 | } | ||
| 29 | return -1; | ||
| 30 | } | ||
| 31 | |||
| 32 | } // 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 @@ | |||
| 1 | // Copyright 2014 Citra Emulator Project | ||
| 2 | // Licensed under GPLv2 | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include "common/common_types.h" | ||
| 8 | |||
| 9 | namespace HLE { | ||
| 10 | |||
| 11 | /// MRC operations (ARM register from coprocessor), decoded as instr[20:27] | ||
| 12 | enum ARM11_MRC_OPERATION { | ||
| 13 | DATA_SYNCHRONIZATION_BARRIER = 0xE0, | ||
| 14 | CALL_GET_THREAD_COMMAND_BUFFER = 0xE1, | ||
| 15 | }; | ||
| 16 | |||
| 17 | /// Call an MRC operation in HLE | ||
| 18 | u32 CallMRC(ARM11_MRC_OPERATION operation); | ||
| 19 | |||
| 20 | } // namespace | ||