diff options
| author | 2015-03-26 15:25:04 -0400 | |
|---|---|---|
| committer | 2015-04-02 00:20:52 -0400 | |
| commit | 490df716f327b1cff6097f607c13f08f948dbf3b (patch) | |
| tree | 0ba1f8b3b58ac4c31722b5fac1dad33f0adef2ca /src/core/arm/dyncom | |
| parent | dyncom: Move CP15 register reading into its own function. (diff) | |
| download | yuzu-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.cpp | 90 |
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); |