diff options
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Time')
-rw-r--r-- | Ryujinx.HLE/HOS/Services/Time/Clock/Types/ClockSnapshot.cs | 13 | ||||
-rw-r--r-- | Ryujinx.HLE/HOS/Services/Time/IStaticServiceForPsc.cs | 13 | ||||
-rw-r--r-- | Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZone.cs | 5 |
3 files changed, 20 insertions, 11 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Time/Clock/Types/ClockSnapshot.cs b/Ryujinx.HLE/HOS/Services/Time/Clock/Types/ClockSnapshot.cs index df1f151f..07c1b405 100644 --- a/Ryujinx.HLE/HOS/Services/Time/Clock/Types/ClockSnapshot.cs +++ b/Ryujinx.HLE/HOS/Services/Time/Clock/Types/ClockSnapshot.cs @@ -1,4 +1,5 @@ using Ryujinx.HLE.HOS.Services.Time.TimeZone; +using System; using System.Runtime.InteropServices; namespace Ryujinx.HLE.HOS.Services.Time.Clock @@ -16,14 +17,22 @@ namespace Ryujinx.HLE.HOS.Services.Time.Clock public CalendarAdditionalInfo NetworkCalendarAdditionalTime; public SteadyClockTimePoint SteadyClockTimePoint; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x24)] - public char[] LocationName; + private LocationNameStorageHolder _locationName; + + public Span<byte> LocationName => MemoryMarshal.Cast<LocationNameStorageHolder, byte>(MemoryMarshal.CreateSpan(ref _locationName, LocationNameStorageHolder.Size)); [MarshalAs(UnmanagedType.I1)] public bool IsAutomaticCorrectionEnabled; public byte Type; public ushort Unknown; + + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = Size)] + private struct LocationNameStorageHolder + { + public const int Size = 0x24; + } + public static ResultCode GetCurrentTime(out long currentTime, SteadyClockTimePoint steadyClockTimePoint, SystemClockContext context) { currentTime = 0; diff --git a/Ryujinx.HLE/HOS/Services/Time/IStaticServiceForPsc.cs b/Ryujinx.HLE/HOS/Services/Time/IStaticServiceForPsc.cs index 441e4267..4f351812 100644 --- a/Ryujinx.HLE/HOS/Services/Time/IStaticServiceForPsc.cs +++ b/Ryujinx.HLE/HOS/Services/Time/IStaticServiceForPsc.cs @@ -8,7 +8,9 @@ using Ryujinx.HLE.HOS.Services.Time.TimeZone; using System; using System.Diagnostics; using System.IO; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Text; namespace Ryujinx.HLE.HOS.Services.Time { @@ -281,7 +283,7 @@ namespace Ryujinx.HLE.HOS.Services.Time { byte type = context.RequestData.ReadByte(); - context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize((uint)Marshal.SizeOf<ClockSnapshot>()); + context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize((uint)Unsafe.SizeOf<ClockSnapshot>()); context.RequestData.BaseStream.Position += 7; @@ -372,12 +374,9 @@ namespace Ryujinx.HLE.HOS.Services.Time return result; } - char[] tzName = deviceLocationName.ToCharArray(); - char[] locationName = new char[0x24]; - - Array.Copy(tzName, locationName, tzName.Length); + ReadOnlySpan<byte> tzName = Encoding.ASCII.GetBytes(deviceLocationName); - clockSnapshot.LocationName = locationName; + tzName.CopyTo(clockSnapshot.LocationName); result = ClockSnapshot.GetCurrentTime(out clockSnapshot.UserTime, currentTimePoint, clockSnapshot.UserContext); @@ -414,7 +413,7 @@ namespace Ryujinx.HLE.HOS.Services.Time private ClockSnapshot ReadClockSnapshotFromBuffer(ServiceCtx context, IpcPtrBuffDesc ipcDesc) { - Debug.Assert(ipcDesc.Size == (ulong)Marshal.SizeOf<ClockSnapshot>()); + Debug.Assert(ipcDesc.Size == (ulong)Unsafe.SizeOf<ClockSnapshot>()); byte[] temp = new byte[ipcDesc.Size]; diff --git a/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZone.cs b/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZone.cs index 12f6e90d..f7477e97 100644 --- a/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZone.cs +++ b/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZone.cs @@ -5,6 +5,7 @@ using Ryujinx.HLE.Utilities; using System; using System.Buffers.Binary; using System.IO; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; @@ -890,14 +891,14 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone long streamLength = reader.BaseStream.Length; - if (streamLength < Marshal.SizeOf<TzifHeader>()) + if (streamLength < Unsafe.SizeOf<TzifHeader>()) { return false; } TzifHeader header = reader.ReadStruct<TzifHeader>(); - streamLength -= Marshal.SizeOf<TzifHeader>(); + streamLength -= Unsafe.SizeOf<TzifHeader>(); int ttisGMTCount = Detzcode32(header.TtisGMTCount); int ttisSTDCount = Detzcode32(header.TtisSTDCount); |