diff options
author | Lioncash <mathew1800@gmail.com> | 2015-04-06 15:12:55 +0200 |
---|---|---|
committer | Lioncash <mathew1800@gmail.com> | 2015-04-06 15:16:42 +0200 |
commit | e628ed481079d26cad4980f5094dbca16bae96c8 (patch) | |
tree | 773a71ee934b84927ba3f6a80faff35c67ac276a /src/core/arm | |
parent | Merge pull request #682 from yuriks/virtmem2 (diff) | |
download | yuzu-e628ed481079d26cad4980f5094dbca16bae96c8.tar yuzu-e628ed481079d26cad4980f5094dbca16bae96c8.tar.gz yuzu-e628ed481079d26cad4980f5094dbca16bae96c8.tar.bz2 yuzu-e628ed481079d26cad4980f5094dbca16bae96c8.tar.lz yuzu-e628ed481079d26cad4980f5094dbca16bae96c8.tar.xz yuzu-e628ed481079d26cad4980f5094dbca16bae96c8.tar.zst yuzu-e628ed481079d26cad4980f5094dbca16bae96c8.zip |
Diffstat (limited to 'src/core/arm')
-rw-r--r-- | src/core/arm/interpreter/arminit.cpp | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/core/arm/interpreter/arminit.cpp b/src/core/arm/interpreter/arminit.cpp index 4ac827e0a..710115375 100644 --- a/src/core/arm/interpreter/arminit.cpp +++ b/src/core/arm/interpreter/arminit.cpp @@ -66,6 +66,64 @@ void ARMul_SelectProcessor(ARMul_State* state, unsigned properties) ARMul_CoProInit(state); } +// Resets certain MPCore CP15 values to their ARM-defined reset values. +static void ResetMPCoreCP15Registers(ARMul_State* cpu) +{ + // c0 + cpu->CP15[CP15(CP15_MAIN_ID)] = 0x410FB024; + cpu->CP15[CP15(CP15_TLB_TYPE)] = 0x00000800; + cpu->CP15[CP15(CP15_PROCESSOR_FEATURE_0)] = 0x00000111; + cpu->CP15[CP15(CP15_PROCESSOR_FEATURE_1)] = 0x00000001; + cpu->CP15[CP15(CP15_DEBUG_FEATURE_0)] = 0x00000002; + cpu->CP15[CP15(CP15_MEMORY_MODEL_FEATURE_0)] = 0x01100103; + cpu->CP15[CP15(CP15_MEMORY_MODEL_FEATURE_1)] = 0x10020302; + cpu->CP15[CP15(CP15_MEMORY_MODEL_FEATURE_2)] = 0x01222000; + cpu->CP15[CP15(CP15_MEMORY_MODEL_FEATURE_3)] = 0x00000000; + cpu->CP15[CP15(CP15_ISA_FEATURE_0)] = 0x00100011; + cpu->CP15[CP15(CP15_ISA_FEATURE_1)] = 0x12002111; + cpu->CP15[CP15(CP15_ISA_FEATURE_2)] = 0x11221011; + cpu->CP15[CP15(CP15_ISA_FEATURE_3)] = 0x01102131; + cpu->CP15[CP15(CP15_ISA_FEATURE_4)] = 0x00000141; + + // c1 + cpu->CP15[CP15(CP15_CONTROL)] = 0x00054078; + cpu->CP15[CP15(CP15_AUXILIARY_CONTROL)] = 0x0000000F; + cpu->CP15[CP15(CP15_COPROCESSOR_ACCESS_CONTROL)] = 0x00000000; + + // c2 + cpu->CP15[CP15(CP15_TRANSLATION_BASE_TABLE_0)] = 0x00000000; + cpu->CP15[CP15(CP15_TRANSLATION_BASE_TABLE_1)] = 0x00000000; + cpu->CP15[CP15(CP15_TRANSLATION_BASE_CONTROL)] = 0x00000000; + + // c3 + cpu->CP15[CP15(CP15_DOMAIN_ACCESS_CONTROL)] = 0x00000000; + + // c7 + cpu->CP15[CP15(CP15_PHYS_ADDRESS)] = 0x00000000; + + // c9 + cpu->CP15[CP15(CP15_DATA_CACHE_LOCKDOWN)] = 0xFFFFFFF0; + + // c10 + cpu->CP15[CP15(CP15_TLB_LOCKDOWN)] = 0x00000000; + cpu->CP15[CP15(CP15_PRIMARY_REGION_REMAP)] = 0x00098AA4; + cpu->CP15[CP15(CP15_NORMAL_REGION_REMAP)] = 0x44E048E0; + + // c13 + cpu->CP15[CP15(CP15_PID)] = 0x00000000; + cpu->CP15[CP15(CP15_CONTEXT_ID)] = 0x00000000; + cpu->CP15[CP15(CP15_THREAD_UPRW)] = 0x00000000; + cpu->CP15[CP15(CP15_THREAD_URO)] = 0x00000000; + cpu->CP15[CP15(CP15_THREAD_PRW)] = 0x00000000; + + // c15 + cpu->CP15[CP15(CP15_PERFORMANCE_MONITOR_CONTROL)] = 0x00000000; + cpu->CP15[CP15(CP15_MAIN_TLB_LOCKDOWN_VIRT_ADDRESS)] = 0x00000000; + cpu->CP15[CP15(CP15_MAIN_TLB_LOCKDOWN_PHYS_ADDRESS)] = 0x00000000; + cpu->CP15[CP15(CP15_MAIN_TLB_LOCKDOWN_ATTRIBUTE)] = 0x00000000; + cpu->CP15[CP15(CP15_TLB_DEBUG_CONTROL)] = 0x00000000; +} + /***************************************************************************\ * Call this routine to set up the initial machine state (or perform a RESET * \***************************************************************************/ @@ -80,6 +138,8 @@ void ARMul_Reset(ARMul_State* state) state->Bank = SVCBANK; FLUSHPIPE; + ResetMPCoreCP15Registers(state); + state->EndCondition = 0; state->ErrorCode = 0; |