summaryrefslogtreecommitdiff
path: root/src/core/arm/dyncom
diff options
context:
space:
mode:
authorGravatar Lioncash2015-03-26 15:25:04 -0400
committerGravatar Lioncash2015-04-02 00:20:52 -0400
commit490df716f327b1cff6097f607c13f08f948dbf3b (patch)
tree0ba1f8b3b58ac4c31722b5fac1dad33f0adef2ca /src/core/arm/dyncom
parentdyncom: Move CP15 register reading into its own function. (diff)
downloadyuzu-490df716f327b1cff6097f607c13f08f948dbf3b.tar.gz
yuzu-490df716f327b1cff6097f607c13f08f948dbf3b.tar.xz
yuzu-490df716f327b1cff6097f607c13f08f948dbf3b.zip
dyncom: Move CP15 register writing into its own function.
Also implements writing to the rest of the ARM11 MPCore CP15 register set.
Diffstat (limited to 'src/core/arm/dyncom')
-rw-r--r--src/core/arm/dyncom/arm_dyncom_interpreter.cpp90
1 files changed, 2 insertions, 88 deletions
diff --git a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
index 88eb49e34..b0efd7194 100644
--- a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
+++ b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
@@ -4761,94 +4761,8 @@ unsigned InterpreterMainLoop(ARMul_State* state) {
4761 if (inst_cream->Rd == 15) { 4761 if (inst_cream->Rd == 15) {
4762 DEBUG_MSG; 4762 DEBUG_MSG;
4763 } else { 4763 } else {
4764 if (inst_cream->cp_num == 15) { 4764 if (inst_cream->cp_num == 15)
4765 if (CRn == 1 && CRm == 0 && OPCODE_2 == 0) { 4765 WriteCP15Register(cpu, RD, CRn, OPCODE_1, CRm, OPCODE_2);
4766 CP15_REG(CP15_CONTROL) = RD;
4767 } else if (CRn == 1 && CRm == 0 && OPCODE_2 == 1) {
4768 CP15_REG(CP15_AUXILIARY_CONTROL) = RD;
4769 } else if (CRn == 1 && CRm == 0 && OPCODE_2 == 2) {
4770 CP15_REG(CP15_COPROCESSOR_ACCESS_CONTROL) = RD;
4771 } else if (CRn == 2 && CRm == 0 && OPCODE_2 == 0) {
4772 CP15_REG(CP15_TRANSLATION_BASE_TABLE_0) = RD;
4773 } else if (CRn == 2 && CRm == 0 && OPCODE_2 == 1) {
4774 CP15_REG(CP15_TRANSLATION_BASE_TABLE_1) = RD;
4775 } else if (CRn == 2 && CRm == 0 && OPCODE_2 == 2) {
4776 CP15_REG(CP15_TRANSLATION_BASE_CONTROL) = RD;
4777 } else if (CRn == 3 && CRm == 0 && OPCODE_2 == 0) {
4778 CP15_REG(CP15_DOMAIN_ACCESS_CONTROL) = RD;
4779 } else if(CRn == MMU_CACHE_OPS){
4780 //LOG_WARNING(Core_ARM11, "cache operations have not implemented.");
4781 } else if(CRn == MMU_TLB_OPS){
4782 switch (CRm) {
4783 case 5: // ITLB
4784 switch(OPCODE_2) {
4785 case 0: // Invalidate all
4786 LOG_DEBUG(Core_ARM11, "{TLB} [INSN] invalidate all");
4787 break;
4788 case 1: // Invalidate by MVA
4789 LOG_DEBUG(Core_ARM11, "{TLB} [INSN] invalidate by mva");
4790 break;
4791 case 2: // Invalidate by asid
4792 LOG_DEBUG(Core_ARM11, "{TLB} [INSN] invalidate by asid");
4793 break;
4794 default:
4795 break;
4796 }
4797
4798 break;
4799 case 6: // DTLB
4800 switch(OPCODE_2){
4801 case 0: // Invalidate all
4802 LOG_DEBUG(Core_ARM11, "{TLB} [DATA] invalidate all");
4803 break;
4804 case 1: // Invalidate by MVA
4805 LOG_DEBUG(Core_ARM11, "{TLB} [DATA] invalidate by mva");
4806 break;
4807 case 2: // Invalidate by asid
4808 LOG_DEBUG(Core_ARM11, "{TLB} [DATA] invalidate by asid");
4809 break;
4810 default:
4811 break;
4812 }
4813 break;
4814 case 7: // UNIFILED TLB
4815 switch(OPCODE_2){
4816 case 0: // invalidate all
4817 LOG_DEBUG(Core_ARM11, "{TLB} [UNIFILED] invalidate all");
4818 break;
4819 case 1: // Invalidate by MVA
4820 LOG_DEBUG(Core_ARM11, "{TLB} [UNIFILED] invalidate by mva");
4821 break;
4822 case 2: // Invalidate by asid
4823 LOG_DEBUG(Core_ARM11, "{TLB} [UNIFILED] invalidate by asid");
4824 break;
4825 default:
4826 break;
4827 }
4828 break;
4829 default:
4830 break;
4831 }
4832 } else if(CRn == MMU_PID) {
4833 if(OPCODE_2 == 0) {
4834 CP15_REG(CP15_PID) = RD;
4835 } else if(OPCODE_2 == 1) {
4836 CP15_REG(CP15_CONTEXT_ID) = RD;
4837 } else if (OPCODE_2 == 2) {
4838 CP15_REG(CP15_THREAD_UPRW) = RD;
4839 } else if(OPCODE_2 == 3) {
4840 if (InAPrivilegedMode(cpu))
4841 CP15_REG(CP15_THREAD_URO) = RD;
4842 } else if (OPCODE_2 == 4) {
4843 if (InAPrivilegedMode(cpu))
4844 CP15_REG(CP15_THREAD_PRW) = RD;
4845 } else {
4846 LOG_ERROR(Core_ARM11, "mmu_mcr wrote UNKNOWN - reg %d", CRn);
4847 }
4848 } else {
4849 LOG_ERROR(Core_ARM11, "mcr CRn=%d, CRm=%d OP2=%d is not implemented", CRn, CRm, OPCODE_2);
4850 }
4851 }
4852 } 4766 }
4853 } 4767 }
4854 cpu->Reg[15] += GET_INST_SIZE(cpu); 4768 cpu->Reg[15] += GET_INST_SIZE(cpu);