diff options
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Lm/LogService')
3 files changed, 115 insertions, 0 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Lm/LogService/ILogger.cs b/Ryujinx.HLE/HOS/Services/Lm/LogService/ILogger.cs new file mode 100644 index 00000000..357a1332 --- /dev/null +++ b/Ryujinx.HLE/HOS/Services/Lm/LogService/ILogger.cs @@ -0,0 +1,86 @@ +using Ryujinx.Common.Logging; +using System.IO; +using System.Text; + +namespace Ryujinx.HLE.HOS.Services.Lm.LogService +{ + class ILogger : IpcService + { + public ILogger() { } + + [Command(0)] + // Log(buffer<unknown, 0x21>) + public ResultCode Log(ServiceCtx context) + { + (long bufPos, long bufSize) = context.Request.GetBufferType0x21(); + byte[] logBuffer = context.Memory.ReadBytes(bufPos, bufSize); + + using (MemoryStream ms = new MemoryStream(logBuffer)) + { + BinaryReader reader = new BinaryReader(ms); + + long pid = reader.ReadInt64(); + long threadContext = reader.ReadInt64(); + short flags = reader.ReadInt16(); + byte level = reader.ReadByte(); + byte verbosity = reader.ReadByte(); + int payloadLength = reader.ReadInt32(); + + StringBuilder sb = new StringBuilder(); + + sb.AppendLine("Guest log:"); + + sb.AppendLine($" Log level: {(LmLogLevel)level}"); + + while (ms.Position < ms.Length) + { + byte type = reader.ReadByte(); + byte size = reader.ReadByte(); + + LmLogField field = (LmLogField)type; + + string fieldStr = string.Empty; + + if (field == LmLogField.Start) + { + reader.ReadBytes(size); + + continue; + } + else if (field == LmLogField.Stop) + { + break; + } + else if (field == LmLogField.Line) + { + fieldStr = $"{field}: {reader.ReadInt32()}"; + } + else if (field == LmLogField.DropCount) + { + fieldStr = $"{field}: {reader.ReadInt64()}"; + } + else if (field == LmLogField.Time) + { + fieldStr = $"{field}: {reader.ReadInt64()}s"; + } + else if (field < LmLogField.Count) + { + fieldStr = $"{field}: '{Encoding.UTF8.GetString(reader.ReadBytes(size)).TrimEnd()}'"; + } + else + { + fieldStr = $"Field{field}: '{Encoding.UTF8.GetString(reader.ReadBytes(size)).TrimEnd()}'"; + } + + sb.AppendLine(" " + fieldStr); + } + + string text = sb.ToString(); + + Logger.PrintGuest(LogClass.ServiceLm, text); + } + + return ResultCode.Success; + } + } +}
\ No newline at end of file diff --git a/Ryujinx.HLE/HOS/Services/Lm/LogService/Types/LmLogField.cs b/Ryujinx.HLE/HOS/Services/Lm/LogService/Types/LmLogField.cs new file mode 100644 index 00000000..3f93e167 --- /dev/null +++ b/Ryujinx.HLE/HOS/Services/Lm/LogService/Types/LmLogField.cs @@ -0,0 +1,18 @@ +namespace Ryujinx.HLE.HOS.Services.Lm.LogService +{ + enum LmLogField + { + Start = 0, + Stop = 1, + Message = 2, + Line = 3, + Filename = 4, + Function = 5, + Module = 6, + Thread = 7, + DropCount = 8, + Time = 9, + ProgramName = 10, + Count + } +}
\ No newline at end of file diff --git a/Ryujinx.HLE/HOS/Services/Lm/LogService/Types/LmLogLevel.cs b/Ryujinx.HLE/HOS/Services/Lm/LogService/Types/LmLogLevel.cs new file mode 100644 index 00000000..ee1a8396 --- /dev/null +++ b/Ryujinx.HLE/HOS/Services/Lm/LogService/Types/LmLogLevel.cs @@ -0,0 +1,11 @@ +namespace Ryujinx.HLE.HOS.Services.Lm.LogService +{ + enum LmLogLevel + { + Trace, + Info, + Warning, + Error, + Critical + } +}
\ No newline at end of file |
