forked from MeloNX/MeloNX
Add Missing iOS Patches
This commit is contained in:
parent
4d988e95f0
commit
11578ad9fa
@ -10,4 +10,34 @@ namespace ARMeilleure.Native
|
|||||||
[LibraryImport("libarmeilleure-jitsupport", EntryPoint = "armeilleure_jit_memcpy")]
|
[LibraryImport("libarmeilleure-jitsupport", EntryPoint = "armeilleure_jit_memcpy")]
|
||||||
public static partial void Copy(nint dst, nint src, ulong n);
|
public static partial void Copy(nint dst, nint src, ulong n);
|
||||||
}
|
}
|
||||||
|
[SupportedOSPlatform("ios")]
|
||||||
|
internal static partial class JitSupportDarwinAot
|
||||||
|
{
|
||||||
|
[LibraryImport("pthread", EntryPoint = "pthread_jit_write_protect_np")]
|
||||||
|
private static partial void pthread_jit_write_protect_np(int enabled);
|
||||||
|
|
||||||
|
[LibraryImport("libc", EntryPoint = "sys_icache_invalidate")]
|
||||||
|
private static partial void sys_icache_invalidate(IntPtr start, IntPtr length);
|
||||||
|
|
||||||
|
public static unsafe void Copy(IntPtr dst, IntPtr src, ulong n) {
|
||||||
|
// When NativeAOT is in use, we can toggle per-thread write protection without worrying about breaking .NET code.
|
||||||
|
|
||||||
|
//pthread_jit_write_protect_np(0);
|
||||||
|
|
||||||
|
var srcSpan = new Span<byte>(src.ToPointer(), (int)n);
|
||||||
|
var dstSpan = new Span<byte>(dst.ToPointer(), (int)n);
|
||||||
|
srcSpan.CopyTo(dstSpan);
|
||||||
|
|
||||||
|
//pthread_jit_write_protect_np(1);
|
||||||
|
|
||||||
|
// Ensure that the instruction cache for this range is invalidated.
|
||||||
|
sys_icache_invalidate(dst, (IntPtr)n);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static unsafe void Invalidate(IntPtr dst, ulong n)
|
||||||
|
{
|
||||||
|
// Ensure that the instruction cache for this range is invalidated.
|
||||||
|
sys_icache_invalidate(dst, (IntPtr)n);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@ namespace ARMeilleure.Translation.Cache
|
|||||||
|
|
||||||
private const int CodeAlignment = 4; // Bytes.
|
private const int CodeAlignment = 4; // Bytes.
|
||||||
private const int CacheSize = 2047 * 1024 * 1024;
|
private const int CacheSize = 2047 * 1024 * 1024;
|
||||||
|
private const int CacheSizeIOS = 512 * 1024 * 1024;
|
||||||
private static ReservedRegion _jitRegion;
|
private static ReservedRegion _jitRegion;
|
||||||
private static JitCacheInvalidation _jitCacheInvalidator;
|
private static JitCacheInvalidation _jitCacheInvalidator;
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ namespace ARMeilleure.Translation.Cache
|
|||||||
|
|
||||||
_jitRegion = new ReservedRegion(allocator, CacheSize);
|
_jitRegion = new ReservedRegion(allocator, CacheSize);
|
||||||
|
|
||||||
if (!OperatingSystem.IsWindows() && !OperatingSystem.IsMacOS())
|
if (!OperatingSystem.IsWindows() && !OperatingSystem.IsMacOS() && !OperatingSystem.IsIOS())
|
||||||
{
|
{
|
||||||
_jitCacheInvalidator = new JitCacheInvalidation(allocator);
|
_jitCacheInvalidator = new JitCacheInvalidation(allocator);
|
||||||
}
|
}
|
||||||
@ -77,7 +77,15 @@ namespace ARMeilleure.Translation.Cache
|
|||||||
|
|
||||||
nint funcPtr = _jitRegion.Pointer + funcOffset;
|
nint funcPtr = _jitRegion.Pointer + funcOffset;
|
||||||
|
|
||||||
if (OperatingSystem.IsMacOS() && RuntimeInformation.ProcessArchitecture == Architecture.Arm64)
|
|
||||||
|
if (OperatingSystem.IsIOS())
|
||||||
|
{
|
||||||
|
Marshal.Copy(code, 0, funcPtr, code.Length);
|
||||||
|
ReprotectAsExecutable(funcOffset, code.Length);
|
||||||
|
|
||||||
|
JitSupportDarwinAot.Invalidate(funcPtr, (ulong)code.Length);
|
||||||
|
}
|
||||||
|
else if (OperatingSystem.IsMacOS() && RuntimeInformation.ProcessArchitecture == Architecture.Arm64)
|
||||||
{
|
{
|
||||||
unsafe
|
unsafe
|
||||||
{
|
{
|
||||||
|
@ -104,6 +104,9 @@ namespace Ryujinx.Headless.SDL2
|
|||||||
ForceDpiAware.Windows();
|
ForceDpiAware.Windows();
|
||||||
CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;
|
CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;
|
||||||
|
|
||||||
|
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
|
||||||
|
CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture;
|
||||||
|
|
||||||
Silk.NET.Core.Loader.SearchPathContainer.Platform = Silk.NET.Core.Loader.UnderlyingPlatform.MacOS;
|
Silk.NET.Core.Loader.SearchPathContainer.Platform = Silk.NET.Core.Loader.UnderlyingPlatform.MacOS;
|
||||||
|
|
||||||
if (!OperatingSystem.IsIOS())
|
if (!OperatingSystem.IsIOS())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user