Kernel/HLE: Use a mutex to synchronize access to the HLE kernel state between the cpu thread and any other possible threads that might touch the kernel (network thread, etc).

This mutex is acquired in SVC::CallSVC, ie, as soon as the guest application enters the HLE kernel, and should be acquired by the aforementioned threads before modifying kernel structures.
This commit is contained in:
Subv 2017-07-20 23:52:50 -05:00
parent a32e38fba0
commit 9cf64ca2cf
5 changed files with 38 additions and 3 deletions

View file

@ -31,6 +31,7 @@
#include "core/hle/kernel/timer.h"
#include "core/hle/kernel/vm_manager.h"
#include "core/hle/kernel/wait_object.h"
#include "core/hle/lock.h"
#include "core/hle/result.h"
#include "core/hle/service/service.h"
@ -1188,7 +1189,7 @@ struct FunctionDef {
Func* func;
const char* name;
};
}
} // namespace
static const FunctionDef SVC_Table[] = {
{0x00, nullptr, "Unknown"},
@ -1332,6 +1333,9 @@ MICROPROFILE_DEFINE(Kernel_SVC, "Kernel", "SVC", MP_RGB(70, 200, 70));
void CallSVC(u32 immediate) {
MICROPROFILE_SCOPE(Kernel_SVC);
// Lock the global kernel mutex when we enter the kernel HLE.
std::lock_guard<std::mutex> lock(HLE::g_hle_lock);
const FunctionDef* info = GetSVCInfo(immediate);
if (info) {
if (info->func) {
@ -1342,4 +1346,4 @@ void CallSVC(u32 immediate) {
}
}
} // namespace
} // namespace SVC