kernel_executable.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <array>
  5. #include <string>
  6. #include <vector>
  7. #include "common/common_funcs.h"
  8. #include "common/common_types.h"
  9. #include "common/swap.h"
  10. #include "core/file_sys/vfs_types.h"
  11. namespace Loader {
  12. enum class ResultStatus : u16;
  13. }
  14. namespace FileSys {
  15. struct KIPSectionHeader {
  16. u32_le offset;
  17. u32_le decompressed_size;
  18. u32_le compressed_size;
  19. u32_le attribute;
  20. };
  21. static_assert(sizeof(KIPSectionHeader) == 0x10, "KIPSectionHeader has incorrect size.");
  22. struct KIPHeader {
  23. u32_le magic;
  24. std::array<char, 0xC> name;
  25. u64_le title_id;
  26. u32_le process_category;
  27. u8 main_thread_priority;
  28. u8 default_core;
  29. INSERT_PADDING_BYTES(1);
  30. u8 flags;
  31. std::array<KIPSectionHeader, 6> sections;
  32. std::array<u32, 0x20> capabilities;
  33. };
  34. static_assert(sizeof(KIPHeader) == 0x100, "KIPHeader has incorrect size.");
  35. struct INIHeader {
  36. u32_le magic;
  37. u32_le size;
  38. u32_le kip_count;
  39. INSERT_PADDING_BYTES(0x4);
  40. };
  41. static_assert(sizeof(INIHeader) == 0x10, "INIHeader has incorrect size.");
  42. // Kernel Internal Process
  43. class KIP {
  44. public:
  45. explicit KIP(const VirtualFile& file);
  46. Loader::ResultStatus GetStatus() const;
  47. std::string GetName() const;
  48. u64 GetTitleID() const;
  49. std::vector<u8> GetSectionDecompressed(u8 index) const;
  50. // Executable Flags
  51. bool Is64Bit() const;
  52. bool Is39BitAddressSpace() const;
  53. bool IsService() const;
  54. std::vector<u32> GetKernelCapabilities() const;
  55. s32 GetMainThreadPriority() const;
  56. u32 GetMainThreadStackSize() const;
  57. u32 GetMainThreadCpuCore() const;
  58. const std::vector<u8>& GetTextSection() const;
  59. const std::vector<u8>& GetRODataSection() const;
  60. const std::vector<u8>& GetDataSection() const;
  61. u32 GetTextOffset() const;
  62. u32 GetRODataOffset() const;
  63. u32 GetDataOffset() const;
  64. u32 GetBSSSize() const;
  65. u32 GetBSSOffset() const;
  66. private:
  67. Loader::ResultStatus status;
  68. KIPHeader header{};
  69. std::array<std::vector<u8>, 6> decompressed_sections;
  70. };
  71. class INI {
  72. public:
  73. explicit INI(const VirtualFile& file);
  74. Loader::ResultStatus GetStatus() const;
  75. const std::vector<KIP>& GetKIPs() const;
  76. private:
  77. Loader::ResultStatus status;
  78. INIHeader header{};
  79. std::vector<KIP> kips;
  80. };
  81. } // namespace FileSys