瀏覽代碼

Kernel/svcBreak: Implement CacheInvalidation for Singlecore and correct svcBreak.

Fernando Sahmkow 6 年之前
父節點
當前提交
c8bf47dcfb
共有 2 個文件被更改,包括 13 次插入3 次删除
  1. 11 1
      src/core/hle/kernel/kernel.cpp
  2. 2 2
      src/core/hle/kernel/svc.cpp

+ 11 - 1
src/core/hle/kernel/kernel.cpp

@@ -545,7 +545,17 @@ const Core::ExclusiveMonitor& KernelCore::GetExclusiveMonitor() const {
 }
 
 void KernelCore::InvalidateAllInstructionCaches() {
-    //TODO: Reimplement, this
+    if (!IsMulticore()) {
+        auto& threads = GlobalScheduler().GetThreadList();
+        for (auto& thread : threads) {
+            if (!thread->IsHLEThread()) {
+                auto& arm_interface = thread->ArmInterface();
+                arm_interface.ClearInstructionCache();
+            }
+        }
+    } else {
+        UNIMPLEMENTED_MSG("Cache Invalidation unimplemented for multicore");
+    }
 }
 
 void KernelCore::PrepareReschedule(std::size_t id) {

+ 2 - 2
src/core/hle/kernel/svc.cpp

@@ -622,6 +622,7 @@ static void Break(Core::System& system, u32 reason, u64 info1, u64 info2) {
         info2, has_dumped_buffer ? std::make_optional(debug_buffer) : std::nullopt);
 
     if (!break_reason.signal_debugger) {
+        SchedulerLock lock(system.Kernel());
         LOG_CRITICAL(
             Debug_Emulated,
             "Emulated program broke execution! reason=0x{:016X}, info1=0x{:016X}, info2=0x{:016X}",
@@ -633,9 +634,8 @@ static void Break(Core::System& system, u32 reason, u64 info1, u64 info2) {
         const auto thread_processor_id = current_thread->GetProcessorID();
         system.ArmInterface(static_cast<std::size_t>(thread_processor_id)).LogBacktrace();
 
-        system.Kernel().CurrentProcess()->PrepareForTermination();
-
         // Kill the current thread
+        system.Kernel().ExceptionalExit();
         current_thread->Stop();
     }
 }