From cbc7e3d64a0583cbd505fdc8914cd86a3038916d Mon Sep 17 00:00:00 2001
From: Connor McLaughlin <stenzek@gmail.com>
Date: Mon, 26 Oct 2020 21:56:56 +1000
Subject: [PATCH] CPU/Recompiler: Add register allocation safety check to
 fastmem

---
 src/core/cpu_code_cache.cpp                        | 2 +-
 src/core/cpu_recompiler_code_generator_aarch64.cpp | 9 ++++++++-
 src/core/cpu_recompiler_code_generator_x64.cpp     | 7 ++++++-
 3 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/src/core/cpu_code_cache.cpp b/src/core/cpu_code_cache.cpp
index d8242d8e2..cd5359565 100644
--- a/src/core/cpu_code_cache.cpp
+++ b/src/core/cpu_code_cache.cpp
@@ -305,7 +305,7 @@ void ExecuteRecompiler()
       const u32 pc = g_state.regs.pc;
       g_state.current_instruction_pc = pc;
       const u32 fast_map_index = GetFastMapIndex(pc);
-      s_fast_map[fast_map_index]();
+      s_single_block_asm_dispatcher[fast_map_index]();
     }
 
     TimingEvents::RunEvents();
diff --git a/src/core/cpu_recompiler_code_generator_aarch64.cpp b/src/core/cpu_recompiler_code_generator_aarch64.cpp
index f51ae9b65..ff40bf48b 100644
--- a/src/core/cpu_recompiler_code_generator_aarch64.cpp
+++ b/src/core/cpu_recompiler_code_generator_aarch64.cpp
@@ -1336,7 +1336,8 @@ void CodeGenerator::EmitLoadGuestMemoryFastmem(const CodeBlockInstruction& cbi,
     actual_address = a64::MemOperand(GetFastmemBasePtrReg(), GetHostReg32(address));
   }
 
-  // TODO: movsx/zx inline here
+  m_register_cache.InhibitAllocation();
+
   switch (size)
   {
     case RegSize_8:
@@ -1370,6 +1371,7 @@ void CodeGenerator::EmitLoadGuestMemoryFastmem(const CodeBlockInstruction& cbi,
   EmitBranch(GetCurrentNearCodePointer(), false);
 
   SwitchToNearCode();
+  m_register_cache.UnunhibitAllocation();
 
   m_block->loadstore_backpatch_info.push_back(bpi);
 }
@@ -1472,6 +1474,8 @@ void CodeGenerator::EmitStoreGuestMemoryFastmem(const CodeBlockInstruction& cbi,
     actual_address = a64::MemOperand(GetFastmemBasePtrReg(), GetHostReg32(address));
   }
 
+  m_register_cache.InhibitAllocation();
+
   switch (value.size)
   {
     case RegSize_8:
@@ -1504,6 +1508,7 @@ void CodeGenerator::EmitStoreGuestMemoryFastmem(const CodeBlockInstruction& cbi,
   EmitBranch(GetCurrentNearCodePointer(), false);
 
   SwitchToNearCode();
+  m_register_cache.UnunhibitAllocation();
 
   m_block->loadstore_backpatch_info.push_back(bpi);
 }
@@ -2124,6 +2129,8 @@ CodeCache::SingleBlockDispatcherFunction CodeGenerator::CompileSingleBlockDispat
   m_register_cache.ReserveCalleeSavedRegisters();
   const u32 stack_adjust = PrepareStackForCall();
 
+  EmitLoadGlobalAddress(RCPUPTR, &g_state);
+
   m_emit->blr(GetHostReg64(RARG1));
 
   RestoreStackAfterCall(stack_adjust);
diff --git a/src/core/cpu_recompiler_code_generator_x64.cpp b/src/core/cpu_recompiler_code_generator_x64.cpp
index 6b26bf13a..9e7243aed 100644
--- a/src/core/cpu_recompiler_code_generator_x64.cpp
+++ b/src/core/cpu_recompiler_code_generator_x64.cpp
@@ -1824,7 +1824,8 @@ void CodeGenerator::EmitLoadGuestMemoryFastmem(const CodeBlockInstruction& cbi,
     bpi.host_pc = GetCurrentNearCodePointer();
   }
 
-  // TODO: movsx/zx inline here
+  m_register_cache.InhibitAllocation();
+
   switch (size)
   {
     case RegSize_8:
@@ -1896,6 +1897,7 @@ void CodeGenerator::EmitLoadGuestMemoryFastmem(const CodeBlockInstruction& cbi,
   m_emit->jmp(GetCurrentNearCodePointer());
 
   SwitchToNearCode();
+  m_register_cache.UnunhibitAllocation();
 
   m_block->loadstore_backpatch_info.push_back(bpi);
 }
@@ -1993,6 +1995,8 @@ void CodeGenerator::EmitStoreGuestMemoryFastmem(const CodeBlockInstruction& cbi,
     bpi.host_pc = GetCurrentNearCodePointer();
   }
 
+  m_register_cache.InhibitAllocation();
+
   switch (value.size)
   {
     case RegSize_8:
@@ -2107,6 +2111,7 @@ void CodeGenerator::EmitStoreGuestMemoryFastmem(const CodeBlockInstruction& cbi,
   m_emit->jmp(GetCurrentNearCodePointer());
 
   SwitchToNearCode();
+  m_register_cache.UnunhibitAllocation();
 
   m_block->loadstore_backpatch_info.push_back(bpi);
 }