kernel_executable.h 2.3 KB

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