Переглянути джерело

Map heap on heap base region, fix for thread start on homebrew, add FCVTMU and FCVTPU (general) instructions, fix FMOV (higher 64 bits) encodings, improve emit code for FCVT* (general) instructions

gdkchan 8 роки тому
батько
коміт
3936c93448

+ 4 - 2
ChocolArm64/AOpCodeTable.cs

@@ -156,7 +156,9 @@ namespace ChocolArm64
             Set("x00111100x100100000000xxxxxxxxxx", AInstEmit.Fcvtas_Gp,     typeof(AOpCodeSimdCvt));
             Set("x00111100x100100000000xxxxxxxxxx", AInstEmit.Fcvtas_Gp,     typeof(AOpCodeSimdCvt));
             Set("x00111100x100101000000xxxxxxxxxx", AInstEmit.Fcvtau_Gp,     typeof(AOpCodeSimdCvt));
             Set("x00111100x100101000000xxxxxxxxxx", AInstEmit.Fcvtau_Gp,     typeof(AOpCodeSimdCvt));
             Set("x00111100x110000000000xxxxxxxxxx", AInstEmit.Fcvtms_Gp,     typeof(AOpCodeSimdCvt));
             Set("x00111100x110000000000xxxxxxxxxx", AInstEmit.Fcvtms_Gp,     typeof(AOpCodeSimdCvt));
+            Set("x00111100x110001000000xxxxxxxxxx", AInstEmit.Fcvtmu_Gp,     typeof(AOpCodeSimdCvt));
             Set("x00111100x101000000000xxxxxxxxxx", AInstEmit.Fcvtps_Gp,     typeof(AOpCodeSimdCvt));
             Set("x00111100x101000000000xxxxxxxxxx", AInstEmit.Fcvtps_Gp,     typeof(AOpCodeSimdCvt));
+            Set("x00111100x101001000000xxxxxxxxxx", AInstEmit.Fcvtpu_Gp,     typeof(AOpCodeSimdCvt));
             Set("x00111100x111000000000xxxxxxxxxx", AInstEmit.Fcvtzs_Gp,     typeof(AOpCodeSimdCvt));
             Set("x00111100x111000000000xxxxxxxxxx", AInstEmit.Fcvtzs_Gp,     typeof(AOpCodeSimdCvt));
             Set("x00111100x011000xxxxxxxxxxxxxxxx", AInstEmit.Fcvtzs_Gp_Fix, typeof(AOpCodeSimdCvt));
             Set("x00111100x011000xxxxxxxxxxxxxxxx", AInstEmit.Fcvtzs_Gp_Fix, typeof(AOpCodeSimdCvt));
             Set("0>0011101<100001101110xxxxxxxxxx", AInstEmit.Fcvtzs_V,      typeof(AOpCodeSimd));
             Set("0>0011101<100001101110xxxxxxxxxx", AInstEmit.Fcvtzs_V,      typeof(AOpCodeSimd));
@@ -179,8 +181,8 @@ namespace ChocolArm64
             Set("0xx0111100000xxx111101xxxxxxxxxx", AInstEmit.Fmov_V,        typeof(AOpCodeSimdImm));
             Set("0xx0111100000xxx111101xxxxxxxxxx", AInstEmit.Fmov_V,        typeof(AOpCodeSimdImm));
             Set("x00111100x100110000000xxxxxxxxxx", AInstEmit.Fmov_Ftoi,     typeof(AOpCodeSimdCvt));
             Set("x00111100x100110000000xxxxxxxxxx", AInstEmit.Fmov_Ftoi,     typeof(AOpCodeSimdCvt));
             Set("x00111100x100111000000xxxxxxxxxx", AInstEmit.Fmov_Itof,     typeof(AOpCodeSimdCvt));
             Set("x00111100x100111000000xxxxxxxxxx", AInstEmit.Fmov_Itof,     typeof(AOpCodeSimdCvt));
-            Set("x00111100x101110000000xxxxxxxxxx", AInstEmit.Fmov_Ftoi1,    typeof(AOpCodeSimdCvt));
-            Set("x00111100x101111000000xxxxxxxxxx", AInstEmit.Fmov_Itof1,    typeof(AOpCodeSimdCvt));
+            Set("1001111010101110000000xxxxxxxxxx", AInstEmit.Fmov_Ftoi1,    typeof(AOpCodeSimdCvt));
+            Set("1001111010101111000000xxxxxxxxxx", AInstEmit.Fmov_Itof1,    typeof(AOpCodeSimdCvt));
             Set("000111110x0xxxxx1xxxxxxxxxxxxxxx", AInstEmit.Fmsub_S,       typeof(AOpCodeSimdReg));
             Set("000111110x0xxxxx1xxxxxxxxxxxxxxx", AInstEmit.Fmsub_S,       typeof(AOpCodeSimdReg));
             Set("000111100x1xxxxx000010xxxxxxxxxx", AInstEmit.Fmul_S,        typeof(AOpCodeSimdReg));
             Set("000111100x1xxxxx000010xxxxxxxxxx", AInstEmit.Fmul_S,        typeof(AOpCodeSimdReg));
             Set("0>1011100<1xxxxx110111xxxxxxxxxx", AInstEmit.Fmul_V,        typeof(AOpCodeSimdReg));
             Set("0>1011100<1xxxxx110111xxxxxxxxxx", AInstEmit.Fmul_V,        typeof(AOpCodeSimdReg));

+ 57 - 48
ChocolArm64/Instruction/AInstEmitSimdCvt.cs

@@ -23,52 +23,62 @@ namespace ChocolArm64.Instruction
 
 
         public static void Fcvtas_Gp(AILEmitterCtx Context)
         public static void Fcvtas_Gp(AILEmitterCtx Context)
         {
         {
-            Fcvta__Gp(Context, Signed: true);
+            EmitFcvt_s_Gp(Context, () => EmitRoundMathCall(Context, MidpointRounding.AwayFromZero));
         }
         }
 
 
         public static void Fcvtau_Gp(AILEmitterCtx Context)
         public static void Fcvtau_Gp(AILEmitterCtx Context)
         {
         {
-            Fcvta__Gp(Context, Signed: false);
+            EmitFcvt_u_Gp(Context, () => EmitRoundMathCall(Context, MidpointRounding.AwayFromZero));
         }
         }
 
 
         public static void Fcvtms_Gp(AILEmitterCtx Context)
         public static void Fcvtms_Gp(AILEmitterCtx Context)
         {
         {
-            EmitFcvt_s_Gp(Context, nameof(Math.Floor));
+            EmitFcvt_s_Gp(Context, () => EmitUnaryMathCall(Context, nameof(Math.Floor)));
+        }
+
+        public static void Fcvtmu_Gp(AILEmitterCtx Context)
+        {
+            EmitFcvt_u_Gp(Context, () => EmitUnaryMathCall(Context, nameof(Math.Floor)));
         }
         }
 
 
         public static void Fcvtps_Gp(AILEmitterCtx Context)
         public static void Fcvtps_Gp(AILEmitterCtx Context)
         {
         {
-            EmitFcvt_s_Gp(Context, nameof(Math.Ceiling));
+            EmitFcvt_s_Gp(Context, () => EmitUnaryMathCall(Context, nameof(Math.Ceiling)));
+        }
+
+        public static void Fcvtpu_Gp(AILEmitterCtx Context)
+        {
+            EmitFcvt_u_Gp(Context, () => EmitUnaryMathCall(Context, nameof(Math.Ceiling)));
         }
         }
 
 
         public static void Fcvtzs_Gp(AILEmitterCtx Context)
         public static void Fcvtzs_Gp(AILEmitterCtx Context)
         {
         {
-            EmitFcvtz__Gp(Context, Signed: true);
+            EmitFcvt_s_Gp(Context, () => { });
         }
         }
 
 
         public static void Fcvtzs_Gp_Fix(AILEmitterCtx Context)
         public static void Fcvtzs_Gp_Fix(AILEmitterCtx Context)
         {
         {
-            EmitFcvtz__Gp_Fix(Context, Signed: true);
+            EmitFcvtzs_Gp_Fix(Context);
         }
         }
 
 
         public static void Fcvtzs_V(AILEmitterCtx Context)
         public static void Fcvtzs_V(AILEmitterCtx Context)
         {
         {
-            EmitVectorFcvt(Context, Signed: true);
+            EmitVectorFcvtzs(Context);
         }
         }
 
 
         public static void Fcvtzu_Gp(AILEmitterCtx Context)
         public static void Fcvtzu_Gp(AILEmitterCtx Context)
         {
         {
-            EmitFcvtz__Gp(Context, Signed: false);
+            EmitFcvt_u_Gp(Context, () => { });
         }
         }
 
 
         public static void Fcvtzu_Gp_Fix(AILEmitterCtx Context)
         public static void Fcvtzu_Gp_Fix(AILEmitterCtx Context)
         {
         {
-            EmitFcvtz__Gp_Fix(Context, Signed: false);
+            EmitFcvtzu_Gp_Fix(Context);
         }
         }
 
 
         public static void Fcvtzu_V(AILEmitterCtx Context)
         public static void Fcvtzu_V(AILEmitterCtx Context)
         {
         {
-            EmitVectorFcvt(Context, Signed: false);
+            EmitVectorFcvtzu(Context);
         }
         }
 
 
         public static void Scvtf_Gp(AILEmitterCtx Context)
         public static void Scvtf_Gp(AILEmitterCtx Context)
@@ -165,13 +175,23 @@ namespace ChocolArm64.Instruction
             }
             }
         }
         }
 
 
-        private static void Fcvta__Gp(AILEmitterCtx Context, bool Signed)
+        private static void EmitFcvt_s_Gp(AILEmitterCtx Context, Action Emit)
+        {
+            EmitFcvt___Gp(Context, Emit, true);
+        }
+
+        private static void EmitFcvt_u_Gp(AILEmitterCtx Context, Action Emit)
+        {
+            EmitFcvt___Gp(Context, Emit, false);
+        }
+
+        private static void EmitFcvt___Gp(AILEmitterCtx Context, Action Emit, bool Signed)
         {
         {
             AOpCodeSimdCvt Op = (AOpCodeSimdCvt)Context.CurrOp;
             AOpCodeSimdCvt Op = (AOpCodeSimdCvt)Context.CurrOp;
 
 
             EmitVectorExtractF(Context, Op.Rn, 0, Op.Size);
             EmitVectorExtractF(Context, Op.Rn, 0, Op.Size);
 
 
-            EmitRoundMathCall(Context, MidpointRounding.AwayFromZero);
+            Emit();
 
 
             if (Signed)
             if (Signed)
             {
             {
@@ -190,45 +210,14 @@ namespace ChocolArm64.Instruction
             Context.EmitStintzr(Op.Rd);
             Context.EmitStintzr(Op.Rd);
         }
         }
 
 
-        private static void EmitFcvt_s_Gp(AILEmitterCtx Context, string Name)
+        private static void EmitFcvtzs_Gp_Fix(AILEmitterCtx Context)
         {
         {
-            AOpCodeSimdCvt Op = (AOpCodeSimdCvt)Context.CurrOp;
-
-            EmitVectorExtractF(Context, Op.Rn, 0, Op.Size);
-
-            EmitUnaryMathCall(Context, Name);
-
-            EmitScalarFcvts(Context, Op.Size, 0);
-
-            if (Context.CurrOp.RegisterSize == ARegisterSize.Int32)
-            {
-                Context.Emit(OpCodes.Conv_U8);
-            }
-
-            Context.EmitStintzr(Op.Rd);
+            EmitFcvtz__Gp_Fix(Context, true);
         }
         }
 
 
-        private static void EmitFcvtz__Gp(AILEmitterCtx Context, bool Signed)
+        private static void EmitFcvtzu_Gp_Fix(AILEmitterCtx Context)
         {
         {
-            AOpCodeSimdCvt Op = (AOpCodeSimdCvt)Context.CurrOp;
-
-            EmitVectorExtractF(Context, Op.Rn, 0, Op.Size);
-
-            if (Signed)
-            {
-                EmitScalarFcvts(Context, Op.Size, 0);
-            }
-            else
-            {
-                EmitScalarFcvtu(Context, Op.Size, 0);
-            }
-
-            if (Context.CurrOp.RegisterSize == ARegisterSize.Int32)
-            {
-                Context.Emit(OpCodes.Conv_U8);
-            }
-
-            Context.EmitStintzr(Op.Rd);
+            EmitFcvtz__Gp_Fix(Context, false);
         }
         }
 
 
         private static void EmitFcvtz__Gp_Fix(AILEmitterCtx Context, bool Signed)
         private static void EmitFcvtz__Gp_Fix(AILEmitterCtx Context, bool Signed)
@@ -254,6 +243,16 @@ namespace ChocolArm64.Instruction
             Context.EmitStintzr(Op.Rd);
             Context.EmitStintzr(Op.Rd);
         }
         }
 
 
+        private static void EmitVectorScvtf(AILEmitterCtx Context)
+        {
+            EmitVectorCvtf(Context, true);
+        }
+
+        private static void EmitVectorUcvtf(AILEmitterCtx Context)
+        {
+            EmitVectorCvtf(Context, false);
+        }
+
         private static void EmitVectorCvtf(AILEmitterCtx Context, bool Signed)
         private static void EmitVectorCvtf(AILEmitterCtx Context, bool Signed)
         {
         {
             AOpCodeSimd Op = (AOpCodeSimd)Context.CurrOp;
             AOpCodeSimd Op = (AOpCodeSimd)Context.CurrOp;
@@ -289,7 +288,17 @@ namespace ChocolArm64.Instruction
             }
             }
         }
         }
 
 
-        private static void EmitVectorFcvt(AILEmitterCtx Context, bool Signed)
+        private static void EmitVectorFcvtzs(AILEmitterCtx Context)
+        {
+            EmitVectorFcvtz(Context, true);
+        }
+
+        private static void EmitVectorFcvtzu(AILEmitterCtx Context)
+        {
+            EmitVectorFcvtz(Context, false);
+        }
+
+        private static void EmitVectorFcvtz(AILEmitterCtx Context, bool Signed)
         {
         {
             AOpCodeSimd Op = (AOpCodeSimd)Context.CurrOp;
             AOpCodeSimd Op = (AOpCodeSimd)Context.CurrOp;
 
 

+ 0 - 3
Ryujinx.Core/Loaders/Executable.cs

@@ -13,7 +13,6 @@ namespace Ryujinx.Core.Loaders
 
 
         public long ImageBase { get; private set; }
         public long ImageBase { get; private set; }
         public long ImageEnd  { get; private set; }
         public long ImageEnd  { get; private set; }
-        public Extensions Extension { get; private set; }
 
 
         public Executable(IExecutable Exe, AMemory Memory, long ImageBase)
         public Executable(IExecutable Exe, AMemory Memory, long ImageBase)
         {
         {
@@ -47,8 +46,6 @@ namespace Ryujinx.Core.Loaders
             long EhHdrEndOffset   = Memory.ReadInt32(Mod0Offset + 0x14) + Mod0Offset;
             long EhHdrEndOffset   = Memory.ReadInt32(Mod0Offset + 0x14) + Mod0Offset;
             long ModObjOffset     = Memory.ReadInt32(Mod0Offset + 0x18) + Mod0Offset;
             long ModObjOffset     = Memory.ReadInt32(Mod0Offset + 0x18) + Mod0Offset;
 
 
-            Extension = Exe.Extension;
-
             MapBss(BssStartOffset, BssEndOffset - BssStartOffset);
             MapBss(BssStartOffset, BssEndOffset - BssStartOffset);
 
 
             ImageEnd = BssEndOffset;
             ImageEnd = BssEndOffset;

+ 0 - 8
Ryujinx.Core/Loaders/Executables/IExecutable.cs

@@ -2,12 +2,6 @@ using System.Collections.ObjectModel;
 
 
 namespace Ryujinx.Core.Loaders.Executables
 namespace Ryujinx.Core.Loaders.Executables
 {
 {
-    public enum Extensions
-    {
-        NRO,
-        NSO
-    }
-
     public interface IExecutable
     public interface IExecutable
     {
     {
         ReadOnlyCollection<byte> Text { get; }
         ReadOnlyCollection<byte> Text { get; }
@@ -19,7 +13,5 @@ namespace Ryujinx.Core.Loaders.Executables
         int ROOffset   { get; }
         int ROOffset   { get; }
         int DataOffset { get; }
         int DataOffset { get; }
         int BssSize    { get; }
         int BssSize    { get; }
-
-        Extensions Extension  { get; }
     }
     }
 }
 }

+ 0 - 4
Ryujinx.Core/Loaders/Executables/Nro.cs

@@ -20,8 +20,6 @@ namespace Ryujinx.Core.Loaders.Executables
         public int DataOffset { get; private set; }
         public int DataOffset { get; private set; }
         public int BssSize    { get; private set; }
         public int BssSize    { get; private set; }
 
 
-        public Extensions Extension { get; private set; }
-
         public Nro(Stream Input)
         public Nro(Stream Input)
         {
         {
             BinaryReader Reader = new BinaryReader(Input);
             BinaryReader Reader = new BinaryReader(Input);
@@ -49,8 +47,6 @@ namespace Ryujinx.Core.Loaders.Executables
             this.DataOffset = DataOffset;
             this.DataOffset = DataOffset;
             this.BssSize    = BssSize;
             this.BssSize    = BssSize;
 
 
-            this.Extension  = Extensions.NRO;
-
             byte[] Read(long Position, int Size)
             byte[] Read(long Position, int Size)
             {
             {
                 Input.Seek(Position, SeekOrigin.Begin);
                 Input.Seek(Position, SeekOrigin.Begin);

+ 0 - 4
Ryujinx.Core/Loaders/Executables/Nso.cs

@@ -21,8 +21,6 @@ namespace Ryujinx.Core.Loaders.Executables
         public int DataOffset { get; private set; }
         public int DataOffset { get; private set; }
         public int BssSize    { get; private set; }
         public int BssSize    { get; private set; }
 
 
-        public Extensions Extension { get; private set; }
-
         [Flags]
         [Flags]
         private enum NsoFlags
         private enum NsoFlags
         {
         {
@@ -81,8 +79,6 @@ namespace Ryujinx.Core.Loaders.Executables
             this.DataOffset = DataMemOffset;
             this.DataOffset = DataMemOffset;
             this.BssSize    = BssSize;
             this.BssSize    = BssSize;
 
 
-            this.Extension = Extensions.NSO;
-
             //Text segment
             //Text segment
             Input.Seek(TextOffset, SeekOrigin.Begin);
             Input.Seek(TextOffset, SeekOrigin.Begin);
 
 

+ 7 - 9
Ryujinx.Core/OsHle/Horizon.cs

@@ -114,25 +114,22 @@ namespace Ryujinx.Core.OsHle
 
 
         public void LoadProgram(string FileName)
         public void LoadProgram(string FileName)
         {
         {
+            bool IsNro = Path.GetExtension(FileName).ToLower() == ".nro";
+
             int ProcessId = IdGen.GenerateId();
             int ProcessId = IdGen.GenerateId();
 
 
             Process MainProcess = new Process(Ns, Allocator, ProcessId);
             Process MainProcess = new Process(Ns, Allocator, ProcessId);
 
 
             using (FileStream Input = new FileStream(FileName, FileMode.Open))
             using (FileStream Input = new FileStream(FileName, FileMode.Open))
             {
             {
-                if (Path.GetExtension(FileName).ToLower() == ".nro")
-                {
-                    MainProcess.LoadProgram(new Nro(Input));
-                }
-                else
-                {
-                    MainProcess.LoadProgram(new Nso(Input));
-                }
+                MainProcess.LoadProgram(IsNro
+                    ? (IExecutable)new Nro(Input)
+                    : (IExecutable)new Nso(Input));
             }
             }
 
 
             MainProcess.SetEmptyArgs();
             MainProcess.SetEmptyArgs();
             MainProcess.InitializeHeap();
             MainProcess.InitializeHeap();
-            MainProcess.Run();
+            MainProcess.Run(IsNro);
 
 
             Processes.TryAdd(ProcessId, MainProcess);
             Processes.TryAdd(ProcessId, MainProcess);
         }
         }
@@ -190,6 +187,7 @@ namespace Ryujinx.Core.OsHle
             if (SharedMem.TryGetLastVirtualPosition(out long Position))
             if (SharedMem.TryGetLastVirtualPosition(out long Position))
             {
             {
                 Logging.Info($"HID shared memory successfully mapped to {Position:x16}!");
                 Logging.Info($"HID shared memory successfully mapped to {Position:x16}!");
+
                 Ns.Hid.Init(Position);
                 Ns.Hid.Init(Position);
             }
             }
         }
         }

+ 13 - 0
Ryujinx.Core/OsHle/MemoryRegions.cs

@@ -0,0 +1,13 @@
+using ChocolArm64.Memory;
+
+namespace Ryujinx.Core.OsHle
+{
+    static class MemoryRegions
+    {
+        public const long MapRegionAddress = 0x80000000;
+        public const long MapRegionSize    = 0x40000000;
+
+        public const long HeapRegionAddress = MapRegionAddress + MapRegionSize;
+        public const long HeapRegionSize    = 0x40000000;
+    }
+}

+ 1 - 1
Ryujinx.Core/OsHle/Objects/Android/NvFlinger.cs

@@ -245,7 +245,7 @@ namespace Ryujinx.Core.OsHle.Objects.Android
 
 
             HNvMap NvMap = GetNvMap(Context, Slot);
             HNvMap NvMap = GetNvMap(Context, Slot);
 
 
-            if (NvMap.Address < 0 || NvMap.Address + FbSize > AMemoryMgr.AddrSize)
+            if (FbSize < 0 || NvMap.Address < 0 || NvMap.Address + FbSize > AMemoryMgr.AddrSize)
             {
             {
                 Logging.Error($"Frame buffer address {NvMap.Address:x16} is invalid!");
                 Logging.Error($"Frame buffer address {NvMap.Address:x16} is invalid!");
 
 

+ 11 - 2
Ryujinx.Core/OsHle/Objects/FspSrv/IFileSystem.cs

@@ -273,7 +273,16 @@ namespace Ryujinx.Core.OsHle.Objects.FspSrv
 
 
             FileStream Stream = new FileStream(FileName, FileMode.Open);
             FileStream Stream = new FileStream(FileName, FileMode.Open);
 
 
-            MakeObject(Context, new IFile(Stream, FileName));
+            IFile FileInterface = new IFile(Stream, FileName);
+
+            FileInterface.Disposed += RemoveFileInUse;
+
+            lock (OpenPaths)
+            {
+                OpenPaths.Add(FileName);
+            }
+
+            MakeObject(Context, FileInterface);
 
 
             return 0;
             return 0;
         }
         }
@@ -353,7 +362,7 @@ namespace Ryujinx.Core.OsHle.Objects.FspSrv
 
 
             lock (OpenPaths)
             lock (OpenPaths)
             {
             {
-                FileInterface.Disposed -= RemoveDirectoryInUse;
+                FileInterface.Disposed -= RemoveFileInUse;
 
 
                 OpenPaths.Remove(FileInterface.HostPath);
                 OpenPaths.Remove(FileInterface.HostPath);
             }
             }

+ 10 - 9
Ryujinx.Core/OsHle/Process.cs

@@ -86,10 +86,10 @@ namespace Ryujinx.Core.OsHle
 
 
         public void InitializeHeap()
         public void InitializeHeap()
         {
         {
-            Memory.Manager.SetHeapAddr((ImageBase + 0x3fffffff) & ~0x3fffffff);
+            Memory.Manager.SetHeapAddr(MemoryRegions.HeapRegionAddress);
         }
         }
 
 
-        public bool Run()
+        public bool Run(bool UseHbAbi = false)
         {
         {
             if (Executables.Count == 0)
             if (Executables.Count == 0)
             {
             {
@@ -109,6 +109,14 @@ namespace Ryujinx.Core.OsHle
 
 
             MainThread = Ns.Os.Handles.GetData<HThread>(Handle);
             MainThread = Ns.Os.Handles.GetData<HThread>(Handle);
 
 
+            if (UseHbAbi)
+            {
+                Homebrew Homebrew_ABI = new Homebrew(Memory, Executables[0].ImageEnd, (long)Handle);
+
+                MainThread.Thread.ThreadState.X0 = (ulong)Executables[0].ImageEnd;
+                MainThread.Thread.ThreadState.X1 = ulong.MaxValue;
+            }
+
             Scheduler.StartThread(MainThread);
             Scheduler.StartThread(MainThread);
 
 
             return true;
             return true;
@@ -186,13 +194,6 @@ namespace Ryujinx.Core.OsHle
             Thread.ThreadState.X1         = (ulong)Handle;
             Thread.ThreadState.X1         = (ulong)Handle;
             Thread.ThreadState.X31        = (ulong)StackTop;
             Thread.ThreadState.X31        = (ulong)StackTop;
 
 
-            if (Executables[0].Extension == Extensions.NRO)
-            {
-                Homebrew Homebrew_ABI = new Homebrew(Memory, Executables[0].ImageEnd, (long)Handle);
-                Thread.ThreadState.X0 = (ulong)Executables[0].ImageEnd;
-                Thread.ThreadState.X1 = 0xFFFFFFFFFFFFFFFF;
-            }
-
             Thread.WorkFinished += ThreadFinished;
             Thread.WorkFinished += ThreadFinished;
 
 
             ThreadsByTpidr.TryAdd(Thread.ThreadState.Tpidr, ThreadHnd);
             ThreadsByTpidr.TryAdd(Thread.ThreadState.Tpidr, ThreadHnd);

+ 4 - 4
Ryujinx.Core/OsHle/Svc/SvcSystem.cs

@@ -182,22 +182,22 @@ namespace Ryujinx.Core.OsHle.Svc
 
 
         private ulong GetMapRegionBaseAddr()
         private ulong GetMapRegionBaseAddr()
         {
         {
-            return 0x80000000;
+            return MemoryRegions.MapRegionAddress;
         }
         }
 
 
         private ulong GetMapRegionSize()
         private ulong GetMapRegionSize()
         {
         {
-            return 0x40000000;
+            return MemoryRegions.MapRegionSize;
         }
         }
 
 
         private ulong GetHeapRegionBaseAddr()
         private ulong GetHeapRegionBaseAddr()
         {
         {
-            return GetMapRegionBaseAddr() + GetMapRegionSize();
+            return MemoryRegions.HeapRegionAddress;
         }
         }
 
 
         private ulong GetHeapRegionSize()
         private ulong GetHeapRegionSize()
         {
         {
-            return 0x40000000;
+            return MemoryRegions.HeapRegionSize;
         }
         }
 
 
         private ulong GetTotalMem()
         private ulong GetTotalMem()

+ 1 - 4
Ryujinx.Graphics/Gal/OpenGL/OpenGLRenderer.cs

@@ -3,7 +3,6 @@ using OpenTK.Graphics.OpenGL;
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 
 
-
 namespace Ryujinx.Graphics.Gal.OpenGL
 namespace Ryujinx.Graphics.Gal.OpenGL
 {
 {
     public class OpenGLRenderer : IGalRenderer
     public class OpenGLRenderer : IGalRenderer
@@ -29,8 +28,6 @@ namespace Ryujinx.Graphics.Gal.OpenGL
 
 
         private FrameBuffer FbRenderer;
         private FrameBuffer FbRenderer;
 
 
-        public long FrameBufferPtr { get; set; }
-
         public OpenGLRenderer()
         public OpenGLRenderer()
         {
         {
             VertexBuffers = new List<VertexBuffer>();
             VertexBuffers = new List<VertexBuffer>();
@@ -58,7 +55,7 @@ namespace Ryujinx.Graphics.Gal.OpenGL
             {
             {
                 ActionsQueue.Dequeue()();
                 ActionsQueue.Dequeue()();
             }
             }
-        }        
+        }
 
 
         public void Render()
         public void Render()
         {
         {

+ 1 - 3
Ryujinx/Ui/Program.cs

@@ -59,9 +59,7 @@ namespace Ryujinx
                 Screen.Run(60.0);
                 Screen.Run(60.0);
             }
             }
 
 
-            Ns.FinalizeAllProcesses();
-
-            Ns.Dispose();
+            Environment.Exit(0);
         }
         }
     }
     }
 }
 }