ILogger.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using Ryujinx.Common.Logging;
  2. using System.IO;
  3. using System.Text;
  4. namespace Ryujinx.HLE.HOS.Services.Lm.LogService
  5. {
  6. class ILogger : IpcService
  7. {
  8. public ILogger() { }
  9. private static int ReadEncodedInt(BinaryReader reader)
  10. {
  11. int result = 0;
  12. int position = 0;
  13. byte encoded;
  14. do
  15. {
  16. encoded = reader.ReadByte();
  17. result += (encoded & 0x7F) << (7 * position);
  18. position++;
  19. } while ((encoded & 0x80) != 0);
  20. return result;
  21. }
  22. [Command(0)]
  23. // Log(buffer<unknown, 0x21>)
  24. public ResultCode Log(ServiceCtx context)
  25. {
  26. (long bufPos, long bufSize) = context.Request.GetBufferType0x21();
  27. byte[] logBuffer = new byte[bufSize];
  28. context.Memory.Read((ulong)bufPos, logBuffer);
  29. using (MemoryStream ms = new MemoryStream(logBuffer))
  30. {
  31. BinaryReader reader = new BinaryReader(ms);
  32. long pid = reader.ReadInt64();
  33. long threadContext = reader.ReadInt64();
  34. short flags = reader.ReadInt16();
  35. byte level = reader.ReadByte();
  36. byte verbosity = reader.ReadByte();
  37. int payloadLength = reader.ReadInt32();
  38. StringBuilder sb = new StringBuilder();
  39. sb.AppendLine("Guest log:");
  40. sb.AppendLine($" Log level: {(LmLogLevel)level}");
  41. while (ms.Position < ms.Length)
  42. {
  43. int type = ReadEncodedInt(reader);
  44. int size = ReadEncodedInt(reader);
  45. LmLogField field = (LmLogField)type;
  46. string fieldStr = string.Empty;
  47. if (field == LmLogField.Start)
  48. {
  49. reader.ReadBytes(size);
  50. continue;
  51. }
  52. else if (field == LmLogField.Stop)
  53. {
  54. break;
  55. }
  56. else if (field == LmLogField.Line)
  57. {
  58. fieldStr = $"{field}: {reader.ReadInt32()}";
  59. }
  60. else if (field == LmLogField.DropCount)
  61. {
  62. fieldStr = $"{field}: {reader.ReadInt64()}";
  63. }
  64. else if (field == LmLogField.Time)
  65. {
  66. fieldStr = $"{field}: {reader.ReadInt64()}s";
  67. }
  68. else if (field < LmLogField.Count)
  69. {
  70. fieldStr = $"{field}: '{Encoding.UTF8.GetString(reader.ReadBytes(size)).TrimEnd()}'";
  71. }
  72. else
  73. {
  74. fieldStr = $"Field{field}: '{Encoding.UTF8.GetString(reader.ReadBytes(size)).TrimEnd()}'";
  75. }
  76. sb.AppendLine(" " + fieldStr);
  77. }
  78. string text = sb.ToString();
  79. Logger.PrintGuest(LogClass.ServiceLm, text);
  80. }
  81. return ResultCode.Success;
  82. }
  83. }
  84. }