kernel_executable.h 2.4 KB

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