From 305f06eb71a7832e6b0081a67015b66ced8a23cd Mon Sep 17 00:00:00 2001 From: Mary Date: Sat, 24 Apr 2021 12:16:01 +0200 Subject: HLE: Fix integer sign inconcistency accross the codebase (#2222) * Make all title id instances unsigned * Replace address and size with ulong instead of signed types Long overdue change. Also change some logics here and there to optimize with the new memory manager. * Address Ac_K's comments * Remove uneeded cast all around * Fixes some others misalignment --- Ryujinx.HLE/Utilities/StringUtils.cs | 10 +++++----- Ryujinx.HLE/Utilities/StructReader.cs | 26 +++++++++----------------- Ryujinx.HLE/Utilities/StructWriter.cs | 8 ++++---- 3 files changed, 18 insertions(+), 26 deletions(-) (limited to 'Ryujinx.HLE/Utilities') diff --git a/Ryujinx.HLE/Utilities/StringUtils.cs b/Ryujinx.HLE/Utilities/StringUtils.cs index 4399da21..0259a4fd 100644 --- a/Ryujinx.HLE/Utilities/StringUtils.cs +++ b/Ryujinx.HLE/Utilities/StringUtils.cs @@ -53,14 +53,14 @@ namespace Ryujinx.HLE.Utilities public static string ReadUtf8String(ServiceCtx context, int index = 0) { - long position = context.Request.PtrBuff[index].Position; - long size = context.Request.PtrBuff[index].Size; + ulong position = context.Request.PtrBuff[index].Position; + ulong size = context.Request.PtrBuff[index].Size; using (MemoryStream ms = new MemoryStream()) { while (size-- > 0) { - byte value = context.Memory.Read((ulong)position++); + byte value = context.Memory.Read(position++); if (value == 0) { @@ -86,8 +86,8 @@ namespace Ryujinx.HLE.Utilities public static string ReadUtf8StringSend(ServiceCtx context, int index = 0) { - long position = context.Request.SendBuff[index].Position; - long size = context.Request.SendBuff[index].Size; + ulong position = context.Request.SendBuff[index].Position; + ulong size = context.Request.SendBuff[index].Size; using (MemoryStream ms = new MemoryStream()) { diff --git a/Ryujinx.HLE/Utilities/StructReader.cs b/Ryujinx.HLE/Utilities/StructReader.cs index 3bde1c77..81e758a8 100644 --- a/Ryujinx.HLE/Utilities/StructReader.cs +++ b/Ryujinx.HLE/Utilities/StructReader.cs @@ -1,5 +1,6 @@ using Ryujinx.Cpu; using Ryujinx.Memory; +using System; using System.Runtime.InteropServices; namespace Ryujinx.HLE.Utilities @@ -8,39 +9,30 @@ namespace Ryujinx.HLE.Utilities { private IVirtualMemoryManager _memory; - public long Position { get; private set; } + public ulong Position { get; private set; } - public StructReader(IVirtualMemoryManager memory, long position) + public StructReader(IVirtualMemoryManager memory, ulong position) { _memory = memory; Position = position; } - public T Read() where T : struct + public T Read() where T : unmanaged { T value = MemoryHelper.Read(_memory, Position); - Position += Marshal.SizeOf(); + Position += (uint)Marshal.SizeOf(); return value; } - public T[] Read(int size) where T : struct + public ReadOnlySpan Read(int size) where T : unmanaged { - int structSize = Marshal.SizeOf(); + ReadOnlySpan data = _memory.GetSpan(Position, size); - int count = size / structSize; + Position += (uint)size; - T[] output = new T[count]; - - for (int index = 0; index < count; index++) - { - output[index] = MemoryHelper.Read(_memory, Position); - - Position += structSize; - } - - return output; + return MemoryMarshal.Cast(data); } } } diff --git a/Ryujinx.HLE/Utilities/StructWriter.cs b/Ryujinx.HLE/Utilities/StructWriter.cs index 6b1e0838..39644db5 100644 --- a/Ryujinx.HLE/Utilities/StructWriter.cs +++ b/Ryujinx.HLE/Utilities/StructWriter.cs @@ -8,9 +8,9 @@ namespace Ryujinx.HLE.Utilities { private IVirtualMemoryManager _memory; - public long Position { get; private set; } + public ulong Position { get; private set; } - public StructWriter(IVirtualMemoryManager memory, long position) + public StructWriter(IVirtualMemoryManager memory, ulong position) { _memory = memory; Position = position; @@ -20,10 +20,10 @@ namespace Ryujinx.HLE.Utilities { MemoryHelper.Write(_memory, Position, value); - Position += Marshal.SizeOf(); + Position += (ulong)Marshal.SizeOf(); } - public void SkipBytes(long count) + public void SkipBytes(ulong count) { Position += count; } -- cgit v1.2.3