From ad0f9a7fc71e129f5dc4d9cd0d8933e50f8dc825 Mon Sep 17 00:00:00 2001
From: Emmanuel Hansen <emmausssss@gmail.com>
Date: Sun, 25 Jun 2023 17:32:14 +0000
Subject: [PATCH] add helper for checking bionic

---
 .../CodeGen/Arm64/HardwareCapabilities.cs     |  2 +-
 .../Signal/NativeSignalHandlerGenerator.cs    |  2 +-
 src/ARMeilleure/Translation/PTC/Ptc.cs        |  2 +-
 src/Ryujinx.Common/Logging/Logger.cs          | 13 ++++++----
 src/Ryujinx.Cpu/Signal/NativeSignalHandler.cs |  4 ++--
 .../Signal/UnixSignalHandlerRegistration.cs   |  4 ++--
 src/Ryujinx.Graphics.Vulkan/Window.cs         |  2 +-
 src/Ryujinx.Memory/MemoryBlock.cs             |  2 +-
 src/Ryujinx.Memory/MemoryManagement.cs        | 24 +++++++++----------
 src/Ryujinx.Memory/MemoryManagementUnix.cs    |  8 +++++--
 src/Ryujinx.Memory/MemoryManagerUnixHelper.cs |  6 ++---
 .../SystemInfo/SystemInfo.cs                  |  6 +++++
 12 files changed, 44 insertions(+), 31 deletions(-)

diff --git a/src/ARMeilleure/CodeGen/Arm64/HardwareCapabilities.cs b/src/ARMeilleure/CodeGen/Arm64/HardwareCapabilities.cs
index 587776de4..d2b41bc9b 100644
--- a/src/ARMeilleure/CodeGen/Arm64/HardwareCapabilities.cs
+++ b/src/ARMeilleure/CodeGen/Arm64/HardwareCapabilities.cs
@@ -14,7 +14,7 @@ namespace ARMeilleure.CodeGen.Arm64
                 return;
             }
 
-            if (OperatingSystem.IsLinux() || OperatingSystem.IsAndroid())
+            if (OperatingSystem.IsLinux() || Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid())
             {
                 LinuxFeatureInfoHwCap = (LinuxFeatureFlagsHwCap)getauxval(AT_HWCAP);
                 LinuxFeatureInfoHwCap2 = (LinuxFeatureFlagsHwCap2)getauxval(AT_HWCAP2);
diff --git a/src/ARMeilleure/Signal/NativeSignalHandlerGenerator.cs b/src/ARMeilleure/Signal/NativeSignalHandlerGenerator.cs
index 838448bd9..245994fb4 100644
--- a/src/ARMeilleure/Signal/NativeSignalHandlerGenerator.cs
+++ b/src/ARMeilleure/Signal/NativeSignalHandlerGenerator.cs
@@ -111,7 +111,7 @@ namespace ARMeilleure.Signal
                     return context.BitwiseAnd(err, Const(2ul));
                 }
             }
-            else if (OperatingSystem.IsLinux() || OperatingSystem.IsAndroid())
+            else if (OperatingSystem.IsLinux() || Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid())
             {
                 if (RuntimeInformation.ProcessArchitecture == Architecture.Arm64)
                 {
diff --git a/src/ARMeilleure/Translation/PTC/Ptc.cs b/src/ARMeilleure/Translation/PTC/Ptc.cs
index 23ccb6824..15d574959 100644
--- a/src/ARMeilleure/Translation/PTC/Ptc.cs
+++ b/src/ARMeilleure/Translation/PTC/Ptc.cs
@@ -1010,7 +1010,7 @@ namespace ARMeilleure.Translation.PTC
             osPlatform |= (OperatingSystem.IsLinux()   ? 1u : 0u) << 1;
             osPlatform |= (OperatingSystem.IsMacOS()   ? 1u : 0u) << 2;
             osPlatform |= (OperatingSystem.IsWindows() ? 1u : 0u) << 3;
-            osPlatform |= (OperatingSystem.IsAndroid() ? 1u : 0u) << 4;
+            osPlatform |= (Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid() ? 1u : 0u) << 4;
 #pragma warning restore IDE0055
 
             return osPlatform;
diff --git a/src/Ryujinx.Common/Logging/Logger.cs b/src/Ryujinx.Common/Logging/Logger.cs
index f03a7fd8f..55cff2251 100644
--- a/src/Ryujinx.Common/Logging/Logger.cs
+++ b/src/Ryujinx.Common/Logging/Logger.cs
@@ -126,11 +126,14 @@ namespace Ryujinx.Common.Logging
 
             _time = Stopwatch.StartNew();
 
-            // Logger should log to console by default
-            AddTarget(new AsyncLogTargetWrapper(
-                new ConsoleLogTarget("console"),
-                1000,
-                AsyncLogTargetOverflowAction.Discard));
+            if (!Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid())
+            {
+                // Logger should log to console by default
+                AddTarget(new AsyncLogTargetWrapper(
+                    new ConsoleLogTarget("console"),
+                    1000,
+                    AsyncLogTargetOverflowAction.Discard));
+            }
 
             Notice = new Log(LogLevel.Notice);
 
diff --git a/src/Ryujinx.Cpu/Signal/NativeSignalHandler.cs b/src/Ryujinx.Cpu/Signal/NativeSignalHandler.cs
index 15d404554..ad6e688cc 100644
--- a/src/Ryujinx.Cpu/Signal/NativeSignalHandler.cs
+++ b/src/Ryujinx.Cpu/Signal/NativeSignalHandler.cs
@@ -88,11 +88,11 @@ namespace Ryujinx.Cpu.Signal
 
                 ref SignalHandlerConfig config = ref GetConfigRef();
 
-                if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || OperatingSystem.IsAndroid())
+                if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid())
                 {
                     _signalHandlerPtr = MapCode(NativeSignalHandlerGenerator.GenerateUnixSignalHandler(_handlerConfig, rangeStructSize, pageSize));
 
-                    if (OperatingSystem.IsAndroid())
+                    if (Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid())
                     {
                         config.StructAddressOffset = 16; // si_addr
                         config.StructWriteOffset = 8; // si_code
diff --git a/src/Ryujinx.Cpu/Signal/UnixSignalHandlerRegistration.cs b/src/Ryujinx.Cpu/Signal/UnixSignalHandlerRegistration.cs
index 065558d27..e659b236e 100644
--- a/src/Ryujinx.Cpu/Signal/UnixSignalHandlerRegistration.cs
+++ b/src/Ryujinx.Cpu/Signal/UnixSignalHandlerRegistration.cs
@@ -57,7 +57,7 @@ namespace Ryujinx.Cpu.Signal
             int result;
             SigAction old;
 
-            if (OperatingSystem.IsAndroid())
+            if (Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid())
             {
                 result = sigaction(SIGSEGV, IntPtr.Zero, out SigActionBionic tmp);
 
@@ -155,7 +155,7 @@ namespace Ryujinx.Cpu.Signal
 
         public static bool RestoreExceptionHandler(SigAction oldAction)
         {
-            if (OperatingSystem.IsAndroid())
+            if (Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid())
             {
                 SigActionBionic tmp = new SigActionBionic
                 {
diff --git a/src/Ryujinx.Graphics.Vulkan/Window.cs b/src/Ryujinx.Graphics.Vulkan/Window.cs
index 2c5764a99..1b4ad8adc 100644
--- a/src/Ryujinx.Graphics.Vulkan/Window.cs
+++ b/src/Ryujinx.Graphics.Vulkan/Window.cs
@@ -137,7 +137,7 @@ namespace Ryujinx.Graphics.Vulkan
                 ImageUsage = ImageUsageFlags.ColorAttachmentBit | ImageUsageFlags.TransferDstBit | ImageUsageFlags.StorageBit,
                 ImageSharingMode = SharingMode.Exclusive,
                 ImageArrayLayers = 1,
-                PreTransform = capabilities.CurrentTransform,
+                PreTransform = Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid() ? SurfaceTransformFlagsKHR.IdentityBitKhr : capabilities.CurrentTransform,
                 CompositeAlpha = ChooseCompositeAlpha(capabilities.SupportedCompositeAlpha),
                 PresentMode = ChooseSwapPresentMode(presentModes, _vsyncEnabled),
                 Clipped = true,
diff --git a/src/Ryujinx.Memory/MemoryBlock.cs b/src/Ryujinx.Memory/MemoryBlock.cs
index a715a9376..f3bb5c62d 100644
--- a/src/Ryujinx.Memory/MemoryBlock.cs
+++ b/src/Ryujinx.Memory/MemoryBlock.cs
@@ -426,7 +426,7 @@ namespace Ryujinx.Memory
                     return OperatingSystem.IsWindowsVersionAtLeast(10, 0, 17134);
                 }
 
-                return OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || OperatingSystem.IsAndroid();
+                return OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid();
             }
 
             return true;
diff --git a/src/Ryujinx.Memory/MemoryManagement.cs b/src/Ryujinx.Memory/MemoryManagement.cs
index 436a23272..c7683b316 100644
--- a/src/Ryujinx.Memory/MemoryManagement.cs
+++ b/src/Ryujinx.Memory/MemoryManagement.cs
@@ -10,7 +10,7 @@ namespace Ryujinx.Memory
             {
                 return MemoryManagementWindows.Allocate((IntPtr)size);
             }
-            else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || OperatingSystem.IsAndroid())
+            else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid())
             {
                 return MemoryManagementUnix.Allocate(size, forJit);
             }
@@ -26,7 +26,7 @@ namespace Ryujinx.Memory
             {
                 return MemoryManagementWindows.Reserve((IntPtr)size, viewCompatible);
             }
-            else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || OperatingSystem.IsAndroid())
+            else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid())
             {
                 return MemoryManagementUnix.Reserve(size, forJit);
             }
@@ -42,7 +42,7 @@ namespace Ryujinx.Memory
             {
                 MemoryManagementWindows.Commit(address, (IntPtr)size);
             }
-            else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || OperatingSystem.IsAndroid())
+            else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid())
             {
                 MemoryManagementUnix.Commit(address, size, forJit);
             }
@@ -58,7 +58,7 @@ namespace Ryujinx.Memory
             {
                 MemoryManagementWindows.Decommit(address, (IntPtr)size);
             }
-            else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || OperatingSystem.IsAndroid())
+            else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid())
             {
                 MemoryManagementUnix.Decommit(address, size);
             }
@@ -74,7 +74,7 @@ namespace Ryujinx.Memory
             {
                 MemoryManagementWindows.MapView(sharedMemory, srcOffset, address, (IntPtr)size, owner);
             }
-            else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || OperatingSystem.IsAndroid())
+            else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid())
             {
                 MemoryManagementUnix.MapView(sharedMemory, srcOffset, address, size);
             }
@@ -90,7 +90,7 @@ namespace Ryujinx.Memory
             {
                 MemoryManagementWindows.UnmapView(sharedMemory, address, (IntPtr)size, owner);
             }
-            else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || OperatingSystem.IsAndroid())
+            else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid())
             {
                 MemoryManagementUnix.UnmapView(address, size);
             }
@@ -108,7 +108,7 @@ namespace Ryujinx.Memory
             {
                 result = MemoryManagementWindows.Reprotect(address, (IntPtr)size, permission, forView);
             }
-            else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || OperatingSystem.IsAndroid())
+            else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid())
             {
                 result = MemoryManagementUnix.Reprotect(address, size, permission);
             }
@@ -129,7 +129,7 @@ namespace Ryujinx.Memory
             {
                 return MemoryManagementWindows.Free(address, (IntPtr)size);
             }
-            else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || OperatingSystem.IsAndroid())
+            else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid())
             {
                 return MemoryManagementUnix.Free(address);
             }
@@ -145,7 +145,7 @@ namespace Ryujinx.Memory
             {
                 return MemoryManagementWindows.CreateSharedMemory((IntPtr)size, reserve);
             }
-            else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || OperatingSystem.IsAndroid())
+            else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid())
             {
                 return MemoryManagementUnix.CreateSharedMemory(size, reserve);
             }
@@ -161,7 +161,7 @@ namespace Ryujinx.Memory
             {
                 MemoryManagementWindows.DestroySharedMemory(handle);
             }
-            else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || OperatingSystem.IsAndroid())
+            else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid())
             {
                 MemoryManagementUnix.DestroySharedMemory(handle);
             }
@@ -177,7 +177,7 @@ namespace Ryujinx.Memory
             {
                 return MemoryManagementWindows.MapSharedMemory(handle);
             }
-            else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || OperatingSystem.IsAndroid())
+            else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid())
             {
                 return MemoryManagementUnix.MapSharedMemory(handle, size);
             }
@@ -193,7 +193,7 @@ namespace Ryujinx.Memory
             {
                 MemoryManagementWindows.UnmapSharedMemory(address);
             }
-            else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || OperatingSystem.IsAndroid())
+            else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid())
             {
                 MemoryManagementUnix.UnmapSharedMemory(address, size);
             }
diff --git a/src/Ryujinx.Memory/MemoryManagementUnix.cs b/src/Ryujinx.Memory/MemoryManagementUnix.cs
index fc4508c2c..516df5a4b 100644
--- a/src/Ryujinx.Memory/MemoryManagementUnix.cs
+++ b/src/Ryujinx.Memory/MemoryManagementUnix.cs
@@ -1,3 +1,4 @@
+using Ryujinx.Common.Logging;
 using System;
 using System.Collections.Concurrent;
 using System.Runtime.InteropServices;
@@ -138,6 +139,7 @@ namespace Ryujinx.Memory
         public unsafe static IntPtr CreateSharedMemory(ulong size, bool reserve)
         {
             int fd;
+            Logger.Debug?.Print(LogClass.Cpu, $"Operating System: {RuntimeInformation.OSDescription}");
 
             if (OperatingSystem.IsMacOS())
             {
@@ -157,9 +159,11 @@ namespace Ryujinx.Memory
                     }
                 }
             }
-            else if (OperatingSystem.IsAndroid())
+            else if (Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid())
             {
-                byte[] memName = Encoding.ASCII.GetBytes("Ryujinx-XXXXXX");
+                byte[] memName = "Ryujinx-XXXXXX"u8.ToArray();
+
+                Logger.Debug?.Print(LogClass.Cpu, $"Creating Android SharedMemory of size:{size}");
 
                 fixed (byte* pMemName = memName)
                 {
diff --git a/src/Ryujinx.Memory/MemoryManagerUnixHelper.cs b/src/Ryujinx.Memory/MemoryManagerUnixHelper.cs
index f9b4f6c4c..a876a6016 100644
--- a/src/Ryujinx.Memory/MemoryManagerUnixHelper.cs
+++ b/src/Ryujinx.Memory/MemoryManagerUnixHelper.cs
@@ -113,7 +113,7 @@ namespace Ryujinx.Memory
 
             if (flags.HasFlag(MmapFlags.MAP_ANONYMOUS))
             {
-                if (OperatingSystem.IsLinux() || OperatingSystem.IsAndroid())
+                if (OperatingSystem.IsLinux() || Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid())
                 {
                     result |= MAP_ANONYMOUS_LINUX_GENERIC;
                 }
@@ -129,7 +129,7 @@ namespace Ryujinx.Memory
 
             if (flags.HasFlag(MmapFlags.MAP_NORESERVE))
             {
-                if (OperatingSystem.IsLinux() || OperatingSystem.IsAndroid())
+                if (OperatingSystem.IsLinux() || Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid())
                 {
                     result |= MAP_NORESERVE_LINUX_GENERIC;
                 }
@@ -145,7 +145,7 @@ namespace Ryujinx.Memory
 
             if (flags.HasFlag(MmapFlags.MAP_UNLOCKED))
             {
-                if (OperatingSystem.IsLinux() || OperatingSystem.IsAndroid())
+                if (OperatingSystem.IsLinux() || Ryujinx.Common.SystemInfo.SystemInfo.IsAndroid())
                 {
                     result |= MAP_UNLOCKED_LINUX_GENERIC;
                 }
diff --git a/src/Ryujinx.Ui.Common/SystemInfo/SystemInfo.cs b/src/Ryujinx.Ui.Common/SystemInfo/SystemInfo.cs
index e78db8af7..c9c47dcd9 100644
--- a/src/Ryujinx.Ui.Common/SystemInfo/SystemInfo.cs
+++ b/src/Ryujinx.Ui.Common/SystemInfo/SystemInfo.cs
@@ -9,6 +9,7 @@ namespace Ryujinx.Ui.Common.SystemInfo
 {
     public class SystemInfo
     {
+        public static bool IsBionic { get; set; }
         public string OsDescription { get; protected set; }
         public string CpuName { get; protected set; }
         public ulong RamTotal { get; protected set; }
@@ -75,5 +76,10 @@ namespace Ryujinx.Ui.Common.SystemInfo
 
             return string.IsNullOrEmpty(name) ? null : name;
         }
+
+        public static bool IsAndroid()
+        {
+            return OperatingSystem.IsAndroid() || IsBionic;
+        }
     }
 }