summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Lioncash2015-02-10 09:34:39 -0500
committerGravatar Lioncash2015-02-10 09:34:42 -0500
commit3eccc66abf5f4a47e3d821cfaaacbe76b4bc3406 (patch)
treed3d70fbf67548ac2790b603f145746fbd3a0cfcc /src
parentMerge pull request #543 from Alegend45/master (diff)
downloadyuzu-3eccc66abf5f4a47e3d821cfaaacbe76b4bc3406.tar.gz
yuzu-3eccc66abf5f4a47e3d821cfaaacbe76b4bc3406.tar.xz
yuzu-3eccc66abf5f4a47e3d821cfaaacbe76b4bc3406.zip
dyncom: Add more regs to MCR/MRC
Adds the registers that were left out of some coprocessor ranges.
Diffstat (limited to 'src')
-rw-r--r--src/core/arm/dyncom/arm_dyncom_interpreter.cpp49
-rw-r--r--src/core/arm/skyeye_common/arm_regformat.h4
2 files changed, 35 insertions, 18 deletions
diff --git a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
index 786ea91cb..c91943f24 100644
--- a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
+++ b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
@@ -4725,20 +4725,20 @@ unsigned InterpreterMainLoop(ARMul_State* state) {
4725 if (inst_cream->cp_num == 15) { 4725 if (inst_cream->cp_num == 15) {
4726 if(CRn == 0 && OPCODE_2 == 0 && CRm == 0) { 4726 if(CRn == 0 && OPCODE_2 == 0 && CRm == 0) {
4727 CP15_REG(CP15_MAIN_ID) = RD; 4727 CP15_REG(CP15_MAIN_ID) = RD;
4728 } else if(CRn == 1 && CRm == 0 && OPCODE_2 == 0) {
4729 CP15_REG(CP15_CONTROL) = RD;
4728 } else if (CRn == 1 && CRm == 0 && OPCODE_2 == 1) { 4730 } else if (CRn == 1 && CRm == 0 && OPCODE_2 == 1) {
4729 CP15_REG(CP15_AUXILIARY_CONTROL) = RD; 4731 CP15_REG(CP15_AUXILIARY_CONTROL) = RD;
4730 } else if (CRn == 1 && CRm == 0 && OPCODE_2 == 2) { 4732 } else if (CRn == 1 && CRm == 0 && OPCODE_2 == 2) {
4731 CP15_REG(CP15_COPROCESSOR_ACCESS_CONTROL) = RD; 4733 CP15_REG(CP15_COPROCESSOR_ACCESS_CONTROL) = RD;
4732 } else if(CRn == 1 && CRm == 0 && OPCODE_2 == 0) {
4733 CP15_REG(CP15_CONTROL) = RD;
4734 } else if (CRn == 3 && CRm == 0 && OPCODE_2 == 0) {
4735 CP15_REG(CP15_DOMAIN_ACCESS_CONTROL) = RD;
4736 } else if (CRn == 2 && CRm == 0 && OPCODE_2 == 0) { 4734 } else if (CRn == 2 && CRm == 0 && OPCODE_2 == 0) {
4737 CP15_REG(CP15_TRANSLATION_BASE_TABLE_0) = RD; 4735 CP15_REG(CP15_TRANSLATION_BASE_TABLE_0) = RD;
4738 } else if (CRn == 2 && CRm == 0 && OPCODE_2 == 1) { 4736 } else if (CRn == 2 && CRm == 0 && OPCODE_2 == 1) {
4739 CP15_REG(CP15_TRANSLATION_BASE_TABLE_1) = RD; 4737 CP15_REG(CP15_TRANSLATION_BASE_TABLE_1) = RD;
4740 } else if (CRn == 2 && CRm == 0 && OPCODE_2 == 2) { 4738 } else if (CRn == 2 && CRm == 0 && OPCODE_2 == 2) {
4741 CP15_REG(CP15_TRANSLATION_BASE_CONTROL) = RD; 4739 CP15_REG(CP15_TRANSLATION_BASE_CONTROL) = RD;
4740 } else if (CRn == 3 && CRm == 0 && OPCODE_2 == 0) {
4741 CP15_REG(CP15_DOMAIN_ACCESS_CONTROL) = RD;
4742 } else if(CRn == MMU_CACHE_OPS){ 4742 } else if(CRn == MMU_CACHE_OPS){
4743 //LOG_WARNING(Core_ARM11, "cache operations have not implemented."); 4743 //LOG_WARNING(Core_ARM11, "cache operations have not implemented.");
4744 } else if(CRn == MMU_TLB_OPS){ 4744 } else if(CRn == MMU_TLB_OPS){
@@ -4793,12 +4793,18 @@ unsigned InterpreterMainLoop(ARMul_State* state) {
4793 break; 4793 break;
4794 } 4794 }
4795 } else if(CRn == MMU_PID) { 4795 } else if(CRn == MMU_PID) {
4796 if(OPCODE_2 == 0) 4796 if(OPCODE_2 == 0) {
4797 CP15_REG(CP15_PID) = RD; 4797 CP15_REG(CP15_PID) = RD;
4798 else if(OPCODE_2 == 1) 4798 } else if(OPCODE_2 == 1) {
4799 CP15_REG(CP15_CONTEXT_ID) = RD; 4799 CP15_REG(CP15_CONTEXT_ID) = RD;
4800 else if(OPCODE_2 == 3) { 4800 } else if (OPCODE_2 == 2) {
4801 CP15_REG(CP15_THREAD_URO) = RD; 4801 CP15_REG(CP15_THREAD_UPRW) = RD;
4802 } else if(OPCODE_2 == 3) {
4803 if (InAPrivilegedMode(cpu))
4804 CP15_REG(CP15_THREAD_URO) = RD;
4805 } else if (OPCODE_2 == 4) {
4806 if (InAPrivilegedMode(cpu))
4807 CP15_REG(CP15_THREAD_PRW) = RD;
4802 } else { 4808 } else {
4803 LOG_ERROR(Core_ARM11, "mmu_mcr wrote UNKNOWN - reg %d", CRn); 4809 LOG_ERROR(Core_ARM11, "mmu_mcr wrote UNKNOWN - reg %d", CRn);
4804 } 4810 }
@@ -4886,31 +4892,40 @@ unsigned InterpreterMainLoop(ARMul_State* state) {
4886 if (inst_cream->cp_num == 15) { 4892 if (inst_cream->cp_num == 15) {
4887 if(CRn == 0 && OPCODE_2 == 0 && CRm == 0) { 4893 if(CRn == 0 && OPCODE_2 == 0 && CRm == 0) {
4888 RD = cpu->CP15[CP15(CP15_MAIN_ID)]; 4894 RD = cpu->CP15[CP15(CP15_MAIN_ID)];
4895 } else if (CRn == 0 && CRm == 0 && OPCODE_2 == 1) {
4896 RD = cpu->CP15[CP15(CP15_CACHE_TYPE)];
4889 } else if (CRn == 1 && CRm == 0 && OPCODE_2 == 0) { 4897 } else if (CRn == 1 && CRm == 0 && OPCODE_2 == 0) {
4890 RD = cpu->CP15[CP15(CP15_CONTROL)]; 4898 RD = cpu->CP15[CP15(CP15_CONTROL)];
4891 } else if (CRn == 1 && CRm == 0 && OPCODE_2 == 1) { 4899 } else if (CRn == 1 && CRm == 0 && OPCODE_2 == 1) {
4892 RD = cpu->CP15[CP15(CP15_AUXILIARY_CONTROL)]; 4900 RD = cpu->CP15[CP15(CP15_AUXILIARY_CONTROL)];
4893 } else if (CRn == 1 && CRm == 0 && OPCODE_2 == 2) { 4901 } else if (CRn == 1 && CRm == 0 && OPCODE_2 == 2) {
4894 RD = cpu->CP15[CP15(CP15_COPROCESSOR_ACCESS_CONTROL)]; 4902 RD = cpu->CP15[CP15(CP15_COPROCESSOR_ACCESS_CONTROL)];
4895 } else if (CRn == 3 && CRm == 0 && OPCODE_2 == 0) {
4896 RD = cpu->CP15[CP15(CP15_DOMAIN_ACCESS_CONTROL)];
4897 } else if (CRn == 2 && CRm == 0 && OPCODE_2 == 0) { 4903 } else if (CRn == 2 && CRm == 0 && OPCODE_2 == 0) {
4898 RD = cpu->CP15[CP15(CP15_TRANSLATION_BASE_TABLE_0)]; 4904 RD = cpu->CP15[CP15(CP15_TRANSLATION_BASE_TABLE_0)];
4905 } else if (CRn == 2 && CRm == 0 && OPCODE_2 == 1) {
4906 RD = cpu->CP15[CP15(CP15_TRANSLATION_BASE_TABLE_1)];
4907 } else if (CRn == 2 && CRm == 0 && OPCODE_2 == 2) {
4908 RD = cpu->CP15[CP15(CP15_TRANSLATION_BASE_CONTROL)];
4909 } else if (CRn == 3 && CRm == 0 && OPCODE_2 == 0) {
4910 RD = cpu->CP15[CP15(CP15_DOMAIN_ACCESS_CONTROL)];
4899 } else if (CRn == 5 && CRm == 0 && OPCODE_2 == 0) { 4911 } else if (CRn == 5 && CRm == 0 && OPCODE_2 == 0) {
4900 RD = cpu->CP15[CP15(CP15_FAULT_STATUS)]; 4912 RD = cpu->CP15[CP15(CP15_FAULT_STATUS)];
4901 } else if (CRn == 6 && CRm == 0 && OPCODE_2 == 0) {
4902 RD = cpu->CP15[CP15(CP15_FAULT_ADDRESS)];
4903 } else if (CRn == 0 && CRm == 0 && OPCODE_2 == 1) {
4904 RD = cpu->CP15[CP15(CP15_CACHE_TYPE)];
4905 } else if (CRn == 5 && CRm == 0 && OPCODE_2 == 1) { 4913 } else if (CRn == 5 && CRm == 0 && OPCODE_2 == 1) {
4906 RD = cpu->CP15[CP15(CP15_INSTR_FAULT_STATUS)]; 4914 RD = cpu->CP15[CP15(CP15_INSTR_FAULT_STATUS)];
4915 } else if (CRn == 6 && CRm == 0 && OPCODE_2 == 0) {
4916 RD = cpu->CP15[CP15(CP15_FAULT_ADDRESS)];
4907 } else if (CRn == 13) { 4917 } else if (CRn == 13) {
4908 if(OPCODE_2 == 0) 4918 if(OPCODE_2 == 0) {
4909 RD = CP15_REG(CP15_PID); 4919 RD = CP15_REG(CP15_PID);
4910 else if(OPCODE_2 == 1) 4920 } else if(OPCODE_2 == 1) {
4911 RD = CP15_REG(CP15_CONTEXT_ID); 4921 RD = CP15_REG(CP15_CONTEXT_ID);
4912 else if(OPCODE_2 == 3) { 4922 } else if (OPCODE_2 == 2) {
4923 RD = CP15_REG(CP15_THREAD_UPRW);
4924 } else if(OPCODE_2 == 3) {
4913 RD = Memory::KERNEL_MEMORY_VADDR; 4925 RD = Memory::KERNEL_MEMORY_VADDR;
4926 } else if (OPCODE_2 == 4) {
4927 if (InAPrivilegedMode(cpu))
4928 RD = CP15_REG(CP15_THREAD_PRW);
4914 } else { 4929 } else {
4915 LOG_ERROR(Core_ARM11, "mmu_mrr wrote UNKNOWN - reg %d", CRn); 4930 LOG_ERROR(Core_ARM11, "mmu_mrr wrote UNKNOWN - reg %d", CRn);
4916 } 4931 }
diff --git a/src/core/arm/skyeye_common/arm_regformat.h b/src/core/arm/skyeye_common/arm_regformat.h
index 997874764..5be3a561f 100644
--- a/src/core/arm/skyeye_common/arm_regformat.h
+++ b/src/core/arm/skyeye_common/arm_regformat.h
@@ -86,7 +86,9 @@ enum {
86 CP15_IFAR, 86 CP15_IFAR,
87 CP15_PID, 87 CP15_PID,
88 CP15_CONTEXT_ID, 88 CP15_CONTEXT_ID,
89 CP15_THREAD_URO, 89 CP15_THREAD_UPRW, // Thread ID register - User/Privileged Read/Write
90 CP15_THREAD_URO, // Thread ID register - User Read Only (Privileged R/W)
91 CP15_THREAD_PRW, // Thread ID register - Privileged R/W only.
90 CP15_TLB_FAULT_ADDR, /* defined by SkyEye */ 92 CP15_TLB_FAULT_ADDR, /* defined by SkyEye */
91 CP15_TLB_FAULT_STATUS, /* defined by SkyEye */ 93 CP15_TLB_FAULT_STATUS, /* defined by SkyEye */
92 /* VFP registers */ 94 /* VFP registers */