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:
parent
5621a65037
commit
bca8916cea
5 changed files with 38 additions and 3 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue