mirror of
https://github.com/par274/sharpemu.git
synced 2026-08-01 15:39:47 +08:00
Fix virtual memory allocation and access (#193)
* Fix virtual memory allocation and access * Update test dependency lock file
This commit is contained in:
@@ -629,6 +629,7 @@ public static class KernelPthreadCompatExports
|
||||
}
|
||||
if (!InitializeMutexObject(ctx, handle, state))
|
||||
{
|
||||
TryFreeOpaqueObject(ctx, handle);
|
||||
state.Semaphore.Dispose();
|
||||
return (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT;
|
||||
}
|
||||
@@ -641,6 +642,7 @@ public static class KernelPthreadCompatExports
|
||||
_mutexStates.TryRemove(mutexAddress, out _);
|
||||
_mutexStates.TryRemove(handle, out _);
|
||||
|
||||
TryFreeOpaqueObject(ctx, handle);
|
||||
state.Semaphore.Dispose();
|
||||
return (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT;
|
||||
}
|
||||
@@ -668,6 +670,7 @@ public static class KernelPthreadCompatExports
|
||||
}
|
||||
|
||||
_ = KernelMemoryCompatExports.TryWriteUInt64Compat(ctx, mutexAddress, 0);
|
||||
TryFreeOpaqueObject(ctx, resolvedAddress);
|
||||
state.Semaphore.Dispose();
|
||||
return (int)OrbisGen2Result.ORBIS_GEN2_OK;
|
||||
}
|
||||
@@ -895,6 +898,7 @@ public static class KernelPthreadCompatExports
|
||||
var initialState = new PthreadMutexAttrState(MutexTypeErrorCheck, 0);
|
||||
if (!WriteMutexAttrObject(ctx, handle, initialState))
|
||||
{
|
||||
TryFreeOpaqueObject(ctx, handle);
|
||||
return (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT;
|
||||
}
|
||||
|
||||
@@ -912,6 +916,7 @@ public static class KernelPthreadCompatExports
|
||||
_mutexAttrStates.Remove(handle);
|
||||
}
|
||||
|
||||
TryFreeOpaqueObject(ctx, handle);
|
||||
return (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT;
|
||||
}
|
||||
|
||||
@@ -935,6 +940,7 @@ public static class KernelPthreadCompatExports
|
||||
}
|
||||
}
|
||||
|
||||
TryFreeOpaqueObject(ctx, resolvedAddress);
|
||||
return (int)OrbisGen2Result.ORBIS_GEN2_OK;
|
||||
}
|
||||
|
||||
@@ -1195,6 +1201,7 @@ public static class KernelPthreadCompatExports
|
||||
{
|
||||
if (_condStates.TryGetValue(condAddress, out var raced))
|
||||
{
|
||||
TryFreeOpaqueObject(ctx, handle);
|
||||
resolvedAddress = condAddress;
|
||||
state = raced;
|
||||
return true;
|
||||
@@ -1212,6 +1219,7 @@ public static class KernelPthreadCompatExports
|
||||
_condStates.Remove(handle);
|
||||
}
|
||||
|
||||
TryFreeOpaqueObject(ctx, handle);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1231,7 +1239,22 @@ public static class KernelPthreadCompatExports
|
||||
|
||||
Span<byte> initialData = stackalloc byte[size];
|
||||
initialData.Clear();
|
||||
return ctx.Memory.TryWrite(address, initialData);
|
||||
if (ctx.Memory.TryWrite(address, initialData))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
allocator.TryFreeGuestMemory(address);
|
||||
address = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
private static void TryFreeOpaqueObject(CpuContext ctx, ulong address)
|
||||
{
|
||||
if (ctx.Memory is IGuestMemoryAllocator allocator)
|
||||
{
|
||||
allocator.TryFreeGuestMemory(address);
|
||||
}
|
||||
}
|
||||
|
||||
private static bool InitializeMutexObject(CpuContext ctx, ulong address, PthreadMutexState state) =>
|
||||
@@ -1269,6 +1292,7 @@ public static class KernelPthreadCompatExports
|
||||
_condStates.Remove(handle);
|
||||
}
|
||||
|
||||
TryFreeOpaqueObject(ctx, handle);
|
||||
return (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT;
|
||||
}
|
||||
|
||||
@@ -1293,6 +1317,7 @@ public static class KernelPthreadCompatExports
|
||||
}
|
||||
|
||||
_ = KernelMemoryCompatExports.TryWriteUInt64Compat(ctx, condAddress, 0);
|
||||
TryFreeOpaqueObject(ctx, resolvedAddress);
|
||||
return (int)OrbisGen2Result.ORBIS_GEN2_OK;
|
||||
}
|
||||
|
||||
@@ -1775,6 +1800,7 @@ public static class KernelPthreadCompatExports
|
||||
}
|
||||
if (!InitializeMutexObject(ctx, handle, createdState))
|
||||
{
|
||||
TryFreeOpaqueObject(ctx, handle);
|
||||
resolvedAddress = 0;
|
||||
state = null;
|
||||
return false;
|
||||
@@ -1784,12 +1810,14 @@ public static class KernelPthreadCompatExports
|
||||
{
|
||||
if (_mutexStates.TryGetValue(mutexAddress, out state))
|
||||
{
|
||||
TryFreeOpaqueObject(ctx, handle);
|
||||
resolvedAddress = mutexAddress;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (_mutexStates.TryGetValue(handle, out state))
|
||||
{
|
||||
TryFreeOpaqueObject(ctx, handle);
|
||||
resolvedAddress = handle;
|
||||
return true;
|
||||
}
|
||||
@@ -1803,6 +1831,7 @@ public static class KernelPthreadCompatExports
|
||||
_mutexStates.TryRemove(mutexAddress, out _);
|
||||
_mutexStates.TryRemove(handle, out _);
|
||||
|
||||
TryFreeOpaqueObject(ctx, handle);
|
||||
resolvedAddress = 0;
|
||||
state = null;
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user