aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Services/Lm/LogService
diff options
context:
space:
mode:
authorAc_K <Acoustik666@gmail.com>2019-09-19 02:45:11 +0200
committerjduncanator <1518948+jduncanator@users.noreply.github.com>2019-09-19 10:45:11 +1000
commita0720b5681852f3d786d77bd3793b0359dea321c (patch)
tree9d8f61e540d1d1d827999902dad95e5c0c1e076e /Ryujinx.HLE/HOS/Services/Lm/LogService
parent4af3101b22e6957d6aa48a2768566d658699f4ed (diff)
Refactoring HOS folder structure (#771)
* Refactoring HOS folder structure Refactoring HOS folder structure: - Added some subfolders when needed (Following structure decided in private). - Added some `Types` folders when needed. - Little cleanup here and there. - Add services placeholders for every HOS services (close #766 and #753). * Remove Types namespaces
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Lm/LogService')
-rw-r--r--Ryujinx.HLE/HOS/Services/Lm/LogService/ILogger.cs86
-rw-r--r--Ryujinx.HLE/HOS/Services/Lm/LogService/Types/LmLogField.cs18
-rw-r--r--Ryujinx.HLE/HOS/Services/Lm/LogService/Types/LmLogLevel.cs11
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