aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Core/Loaders
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-03-10 20:39:16 -0300
committergdkchan <gab.dark.100@gmail.com>2018-03-10 20:39:16 -0300
commit3777fb44cf03d05fdedee00f1a19d30fac73b31b (patch)
tree315dc98309bc19c05ee6ac79d1648ddfa2a87964 /Ryujinx.Core/Loaders
parent553f6c2976818b3abcd0fd09de582dc71f03736e (diff)
Allow to enable/disable memory checks even on release mode through the flag, return error for invalid addresses on SvcMap*Memory svcs, do not return error on SvcQueryMemory (instead, return reserved for the end of the address space), other minor tweaks
Diffstat (limited to 'Ryujinx.Core/Loaders')
-rw-r--r--Ryujinx.Core/Loaders/Executable.cs13
-rw-r--r--Ryujinx.Core/Loaders/Executables/IExecutable.cs8
-rw-r--r--Ryujinx.Core/Loaders/Executables/Nro.cs18
-rw-r--r--Ryujinx.Core/Loaders/Executables/Nso.cs35
4 files changed, 29 insertions, 45 deletions
diff --git a/Ryujinx.Core/Loaders/Executable.cs b/Ryujinx.Core/Loaders/Executable.cs
index fa204460..943b8e51 100644
--- a/Ryujinx.Core/Loaders/Executable.cs
+++ b/Ryujinx.Core/Loaders/Executable.cs
@@ -34,7 +34,7 @@ namespace Ryujinx.Core.Loaders
if (Exe.Mod0Offset == 0)
{
- int BssOffset = Exe.DataOffset + Exe.Data.Count;
+ int BssOffset = Exe.DataOffset + Exe.Data.Length;
int BssSize = Exe.BssSize;
MapBss(ImageBase + BssOffset, BssSize);
@@ -92,18 +92,15 @@ namespace Ryujinx.Core.Loaders
private void WriteData(
long Position,
- IList<byte> Data,
+ byte[] Data,
MemoryType Type,
AMemoryPerm Perm)
{
- Memory.Manager.Map(Position, Data.Count, (int)Type, AMemoryPerm.Write);
+ Memory.Manager.Map(Position, Data.Length, (int)Type, AMemoryPerm.Write);
- for (int Index = 0; Index < Data.Count; Index++)
- {
- Memory.WriteByte(Position + Index, Data[Index]);
- }
+ AMemoryHelper.WriteBytes(Memory, Position, Data);
- Memory.Manager.Reprotect(Position, Data.Count, Perm);
+ Memory.Manager.Reprotect(Position, Data.Length, Perm);
}
private void MapBss(long Position, long Size)
diff --git a/Ryujinx.Core/Loaders/Executables/IExecutable.cs b/Ryujinx.Core/Loaders/Executables/IExecutable.cs
index 73787b1d..09d0aab2 100644
--- a/Ryujinx.Core/Loaders/Executables/IExecutable.cs
+++ b/Ryujinx.Core/Loaders/Executables/IExecutable.cs
@@ -1,12 +1,10 @@
-using System.Collections.ObjectModel;
-
namespace Ryujinx.Core.Loaders.Executables
{
public interface IExecutable
{
- ReadOnlyCollection<byte> Text { get; }
- ReadOnlyCollection<byte> RO { get; }
- ReadOnlyCollection<byte> Data { get; }
+ byte[] Text { get; }
+ byte[] RO { get; }
+ byte[] Data { get; }
int Mod0Offset { get; }
int TextOffset { get; }
diff --git a/Ryujinx.Core/Loaders/Executables/Nro.cs b/Ryujinx.Core/Loaders/Executables/Nro.cs
index 3cbc4c5d..9f4ef59f 100644
--- a/Ryujinx.Core/Loaders/Executables/Nro.cs
+++ b/Ryujinx.Core/Loaders/Executables/Nro.cs
@@ -1,18 +1,12 @@
-using System;
-using System.Collections.ObjectModel;
using System.IO;
namespace Ryujinx.Core.Loaders.Executables
{
class Nro : IExecutable
{
- private byte[] m_Text;
- private byte[] m_RO;
- private byte[] m_Data;
-
- public ReadOnlyCollection<byte> Text => Array.AsReadOnly(m_Text);
- public ReadOnlyCollection<byte> RO => Array.AsReadOnly(m_RO);
- public ReadOnlyCollection<byte> Data => Array.AsReadOnly(m_Data);
+ public byte[] Text { get; private set; }
+ public byte[] RO { get; private set; }
+ public byte[] Data { get; private set; }
public int Mod0Offset { get; private set; }
public int TextOffset { get; private set; }
@@ -54,9 +48,9 @@ namespace Ryujinx.Core.Loaders.Executables
return Reader.ReadBytes(Size);
}
- m_Text = Read(TextOffset, TextSize);
- m_RO = Read(ROOffset, ROSize);
- m_Data = Read(DataOffset, DataSize);
+ Text = Read(TextOffset, TextSize);
+ RO = Read(ROOffset, ROSize);
+ Data = Read(DataOffset, DataSize);
}
}
} \ No newline at end of file
diff --git a/Ryujinx.Core/Loaders/Executables/Nso.cs b/Ryujinx.Core/Loaders/Executables/Nso.cs
index 7b8bf253..7341ba62 100644
--- a/Ryujinx.Core/Loaders/Executables/Nso.cs
+++ b/Ryujinx.Core/Loaders/Executables/Nso.cs
@@ -1,19 +1,14 @@
using Ryujinx.Core.Loaders.Compression;
using System;
-using System.Collections.ObjectModel;
using System.IO;
namespace Ryujinx.Core.Loaders.Executables
{
class Nso : IExecutable
{
- private byte[] m_Text;
- private byte[] m_RO;
- private byte[] m_Data;
-
- public ReadOnlyCollection<byte> Text => Array.AsReadOnly(m_Text);
- public ReadOnlyCollection<byte> RO => Array.AsReadOnly(m_RO);
- public ReadOnlyCollection<byte> Data => Array.AsReadOnly(m_Data);
+ public byte[] Text { get; private set; }
+ public byte[] RO { get; private set; }
+ public byte[] Data { get; private set; }
public int Mod0Offset { get; private set; }
public int TextOffset { get; private set; }
@@ -57,9 +52,9 @@ namespace Ryujinx.Core.Loaders.Executables
byte[] BuildId = Reader.ReadBytes(0x20);
- int TextSize = Reader.ReadInt32();
- int ROSize = Reader.ReadInt32();
- int DataSize = Reader.ReadInt32();
+ int TextSize = Reader.ReadInt32();
+ int ROSize = Reader.ReadInt32();
+ int DataSize = Reader.ReadInt32();
Input.Seek(0x24, SeekOrigin.Current);
@@ -82,38 +77,38 @@ namespace Ryujinx.Core.Loaders.Executables
//Text segment
Input.Seek(TextOffset, SeekOrigin.Begin);
- m_Text = Reader.ReadBytes(TextSize);
+ Text = Reader.ReadBytes(TextSize);
if (Flags.HasFlag(NsoFlags.IsTextCompressed) || true)
{
- m_Text = Lz4.Decompress(m_Text, TextDecSize);
+ Text = Lz4.Decompress(Text, TextDecSize);
}
//Read-only data segment
Input.Seek(ROOffset, SeekOrigin.Begin);
- m_RO = Reader.ReadBytes(ROSize);
+ RO = Reader.ReadBytes(ROSize);
if (Flags.HasFlag(NsoFlags.IsROCompressed) || true)
{
- m_RO = Lz4.Decompress(m_RO, RODecSize);
+ RO = Lz4.Decompress(RO, RODecSize);
}
//Data segment
Input.Seek(DataOffset, SeekOrigin.Begin);
- m_Data = Reader.ReadBytes(DataSize);
+ Data = Reader.ReadBytes(DataSize);
if (Flags.HasFlag(NsoFlags.IsDataCompressed) || true)
{
- m_Data = Lz4.Decompress(m_Data, DataDecSize);
+ Data = Lz4.Decompress(Data, DataDecSize);
}
- using (MemoryStream Text = new MemoryStream(m_Text))
+ using (MemoryStream TextMS = new MemoryStream(Text))
{
- BinaryReader TextReader = new BinaryReader(Text);
+ BinaryReader TextReader = new BinaryReader(TextMS);
- Text.Seek(4, SeekOrigin.Begin);
+ TextMS.Seek(4, SeekOrigin.Begin);
Mod0Offset = TextReader.ReadInt32();
}