aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/Loaders/Compression
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2019-01-18 20:26:39 -0200
committerGitHub <noreply@github.com>2019-01-18 20:26:39 -0200
commit22bacc618815170c0d186a82e1ea4558e36b7063 (patch)
tree79b97959481fea1ac301da6d4e9dea9b991ece6f /Ryujinx.HLE/Loaders/Compression
parent3731d0ce8412c3c48286c242842bcb4940b4ca6d (diff)
Improve kernel IPC implementation (#550)
* Implement some IPC related kernel SVCs properly * Fix BLZ decompression when the segment also has a uncompressed chunck * Set default cpu core on process start from ProgramLoader, remove debug message * Load process capabilities properly on KIPs * Fix a copy/paste error in UnmapPhysicalMemory64 * Implement smarter switching between old and new IPC system to support the old HLE services implementation without the manual switch * Implement RegisterService on sm and AcceptSession (partial) * Misc fixes and improvements on new IPC methods * Move IPC related SVCs into a separate file, and logging on RegisterService (sm) * Some small fixes related to receive list buffers and error cases * Load NSOs using the correct pool partition * Fix corner case on GetMaskFromMinMax where range is 64, doesn't happen in pratice however * Fix send static buffer copy * Session release, implement closing requests on client disconnect * Implement ConnectToPort SVC * KLightSession init
Diffstat (limited to 'Ryujinx.HLE/Loaders/Compression')
-rw-r--r--Ryujinx.HLE/Loaders/Compression/BackwardsLz.cs60
1 files changed, 31 insertions, 29 deletions
diff --git a/Ryujinx.HLE/Loaders/Compression/BackwardsLz.cs b/Ryujinx.HLE/Loaders/Compression/BackwardsLz.cs
index 166ae60a..0a76dc95 100644
--- a/Ryujinx.HLE/Loaders/Compression/BackwardsLz.cs
+++ b/Ryujinx.HLE/Loaders/Compression/BackwardsLz.cs
@@ -1,5 +1,4 @@
using System;
-using System.IO;
namespace Ryujinx.HLE.Loaders.Compression
{
@@ -7,22 +6,26 @@ namespace Ryujinx.HLE.Loaders.Compression
{
private class BackwardsReader
{
- private Stream _baseStream;
+ private byte[] _data;
- public BackwardsReader(Stream baseStream)
+ private int _position;
+
+ public int Position => _position;
+
+ public BackwardsReader(byte[] data, int end)
{
- _baseStream = baseStream;
+ _data = data;
+ _position = end;
}
- public byte ReadByte()
+ public void SeekCurrent(int offset)
{
- _baseStream.Seek(-1, SeekOrigin.Current);
-
- byte value = (byte)_baseStream.ReadByte();
-
- _baseStream.Seek(-1, SeekOrigin.Current);
+ _position += offset;
+ }
- return value;
+ public byte ReadByte()
+ {
+ return _data[--_position];
}
public short ReadInt16()
@@ -39,30 +42,24 @@ namespace Ryujinx.HLE.Loaders.Compression
}
}
- public static byte[] Decompress(Stream input, int decompressedLength)
+ public static void DecompressInPlace(byte[] buffer, int headerEnd)
{
- long end = input.Position;
-
- BackwardsReader reader = new BackwardsReader(input);
+ BackwardsReader reader = new BackwardsReader(buffer, headerEnd);
int additionalDecLength = reader.ReadInt32();
int startOffset = reader.ReadInt32();
int compressedLength = reader.ReadInt32();
- input.Seek(12 - startOffset, SeekOrigin.Current);
-
- byte[] dec = new byte[decompressedLength];
+ reader.SeekCurrent(12 - startOffset);
- int decompressedLengthUnpadded = compressedLength + additionalDecLength;
+ int decBase = headerEnd - compressedLength;
- int decompressionStart = decompressedLength - decompressedLengthUnpadded;
-
- int decPos = dec.Length;
+ int decPos = compressedLength + additionalDecLength;
byte mask = 0;
byte header = 0;
- while (decPos > decompressionStart)
+ while (decPos > 0)
{
if ((mask >>= 1) == 0)
{
@@ -72,7 +69,7 @@ namespace Ryujinx.HLE.Loaders.Compression
if ((header & mask) == 0)
{
- dec[--decPos] = reader.ReadByte();
+ buffer[decBase + --decPos] = reader.ReadByte();
}
else
{
@@ -81,25 +78,30 @@ namespace Ryujinx.HLE.Loaders.Compression
int length = (pair >> 12) + 3;
int position = (pair & 0xfff) + 3;
+ if (length > decPos)
+ {
+ length = decPos;
+ }
+
decPos -= length;
+ int dstPos = decBase + decPos;
+
if (length <= position)
{
- int srcPos = decPos + position;
+ int srcPos = dstPos + position;
- Buffer.BlockCopy(dec, srcPos, dec, decPos, length);
+ Buffer.BlockCopy(buffer, srcPos, buffer, dstPos, length);
}
else
{
for (int offset = 0; offset < length; offset++)
{
- dec[decPos + offset] = dec[decPos + position + offset];
+ buffer[dstPos + offset] = buffer[dstPos + position + offset];
}
}
}
}
-
- return dec;
}
}
} \ No newline at end of file