ILogger.cs 3.1 KB

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