diff options
Diffstat (limited to '')
| -rw-r--r-- | src/core/arm/dyncom/arm_dyncom_interpreter.cpp | 49 | ||||
| -rw-r--r-- | src/core/arm/skyeye_common/arm_regformat.h | 4 |
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 */ |