Просмотр исходного кода

Improve LM implementation (#373)

- Manage end of the log packet correctly.
- Add drop count, time, and program name parsing.
- Use the correct buffer type. (0x21 not 0x9)
- Prefix unknown fields with "Field"
Thomas Guillemard 7 лет назад
Родитель
Сommit
57dfa09e3a
2 измененных файлов с 34 добавлено и 13 удалено
  1. 22 6
      Ryujinx.HLE/HOS/Services/Lm/ILogger.cs
  2. 12 7
      Ryujinx.HLE/HOS/Services/Lm/LmLogField.cs

+ 22 - 6
Ryujinx.HLE/HOS/Services/Lm/ILogger.cs

@@ -22,9 +22,9 @@ namespace Ryujinx.HLE.HOS.Services.Lm
 
 
         public long Log(ServiceCtx Context)
         public long Log(ServiceCtx Context)
         {
         {
-            byte[] LogBuffer = Context.Memory.ReadBytes(
-                Context.Request.PtrBuff[0].Position,
-                Context.Request.PtrBuff[0].Size);
+
+            (long BufPos, long BufSize) = Context.Request.GetBufferType0x21();
+            byte[] LogBuffer = Context.Memory.ReadBytes(BufPos, BufSize);
 
 
             using (MemoryStream MS = new MemoryStream(LogBuffer))
             using (MemoryStream MS = new MemoryStream(LogBuffer))
             {
             {
@@ -50,20 +50,36 @@ namespace Ryujinx.HLE.HOS.Services.Lm
 
 
                     string FieldStr = string.Empty;
                     string FieldStr = string.Empty;
 
 
-                    if (Field == LmLogField.Skip)
+                    if (Field == LmLogField.Start)
                     {
                     {
-                        Reader.ReadByte();
+                        Reader.ReadBytes(Size);
 
 
                         continue;
                         continue;
                     }
                     }
+                    else if (Field == LmLogField.Stop)
+                    {
+                        break;
+                    }
                     else if (Field == LmLogField.Line)
                     else if (Field == LmLogField.Line)
                     {
                     {
                         FieldStr = Field + ": " + Reader.ReadInt32();
                         FieldStr = Field + ": " + Reader.ReadInt32();
                     }
                     }
-                    else
+                    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)) + "\"";
                         FieldStr = Field + ": \"" + Encoding.UTF8.GetString(Reader.ReadBytes(Size)) + "\"";
                     }
                     }
+                    else
+                    {
+                        FieldStr = "Field" + Field + ": \"" + Encoding.UTF8.GetString(Reader.ReadBytes(Size)) + "\"";
+                    }
 
 
                     SB.AppendLine(" " + FieldStr);
                     SB.AppendLine(" " + FieldStr);
                 }
                 }

+ 12 - 7
Ryujinx.HLE/HOS/Services/Lm/LmLogField.cs

@@ -2,12 +2,17 @@ namespace Ryujinx.HLE.HOS.Services.Lm
 {
 {
     enum LmLogField
     enum LmLogField
     {
     {
-        Skip     = 1,
-        Message  = 2,
-        Line     = 3,
-        Filename = 4,
-        Function = 5,
-        Module   = 6,
-        Thread   = 7
+        Start       = 0,
+        Stop        = 1,
+        Message     = 2,
+        Line        = 3,
+        Filename    = 4,
+        Function    = 5,
+        Module      = 6,
+        Thread      = 7,
+        DropCount   = 8,
+        Time        = 9,
+        ProgramName = 10,
+        Count
     }
     }
 }
 }