summaryrefslogtreecommitdiffstats
path: root/src/core/file_sys/kernel_executable.h
diff options
context:
space:
mode:
authorZach Hilman <zachhilman@gmail.com>2019-06-05 06:18:25 +0200
committerZach Hilman <zachhilman@gmail.com>2019-06-05 06:18:25 +0200
commit421c3e831ac76dbcd9ab0e1c3302572b5908caef (patch)
treef69bcb3c9ec1b4f42594a91e029689881168c503 /src/core/file_sys/kernel_executable.h
parentinput_common/sdl/sdl_impl: Silence sign conversion warnings (diff)
downloadyuzu-421c3e831ac76dbcd9ab0e1c3302572b5908caef.tar
yuzu-421c3e831ac76dbcd9ab0e1c3302572b5908caef.tar.gz
yuzu-421c3e831ac76dbcd9ab0e1c3302572b5908caef.tar.bz2
yuzu-421c3e831ac76dbcd9ab0e1c3302572b5908caef.tar.lz
yuzu-421c3e831ac76dbcd9ab0e1c3302572b5908caef.tar.xz
yuzu-421c3e831ac76dbcd9ab0e1c3302572b5908caef.tar.zst
yuzu-421c3e831ac76dbcd9ab0e1c3302572b5908caef.zip
Diffstat (limited to '')
-rw-r--r--src/core/file_sys/kernel_executable.h99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/core/file_sys/kernel_executable.h b/src/core/file_sys/kernel_executable.h
new file mode 100644
index 000000000..324a57384
--- /dev/null
+++ b/src/core/file_sys/kernel_executable.h
@@ -0,0 +1,99 @@
+// Copyright 2019 yuzu emulator team
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include "common/common_funcs.h"
+#include "common/swap.h"
+#include "core/file_sys/vfs_types.h"
+#include "core/loader/loader.h"
+
+namespace FileSys {
+
+struct KIPSectionHeader {
+ u32_le offset;
+ u32_le decompressed_size;
+ u32_le compressed_size;
+ u32_le attribute;
+};
+static_assert(sizeof(KIPSectionHeader) == 0x10, "KIPSectionHeader has incorrect size.");
+
+struct KIPHeader {
+ u32_le magic;
+ std::array<char, 0xC> name;
+ u64_le title_id;
+ u32_le process_category;
+ u8 main_thread_priority;
+ u8 default_core;
+ INSERT_PADDING_BYTES(1);
+ u8 flags;
+ std::array<KIPSectionHeader, 6> sections;
+ std::array<u32, 0x20> capabilities;
+};
+static_assert(sizeof(KIPHeader) == 0x100, "KIPHeader has incorrect size.");
+
+struct INIHeader {
+ u32_le magic;
+ u32_le size;
+ u32_le kip_count;
+ INSERT_PADDING_BYTES(0x4);
+};
+static_assert(sizeof(INIHeader) == 0x10, "INIHeader has incorrect size.");
+
+// Kernel Internal Process
+class KIP {
+public:
+ explicit KIP(const VirtualFile& file);
+
+ Loader::ResultStatus GetStatus() const;
+
+ std::string GetName() const;
+ u64 GetTitleID() const;
+ std::vector<u8> GetSectionDecompressed(u8 index) const;
+
+ // Executable Flags
+ bool Is64Bit() const;
+ bool Is39BitAddressSpace() const;
+ bool IsService() const;
+
+ std::vector<u32> GetKernelCapabilities() const;
+
+ s32 GetMainThreadPriority() const;
+ u32 GetMainThreadStackSize() const;
+ u32 GetMainThreadCpuCore() const;
+
+ const std::vector<u8>& GetTextSection() const;
+ const std::vector<u8>& GetRODataSection() const;
+ const std::vector<u8>& GetDataSection() const;
+
+ u32 GetTextOffset() const;
+ u32 GetRODataOffset() const;
+ u32 GetDataOffset() const;
+
+ u32 GetBSSSize() const;
+ u32 GetBSSOffset() const;
+
+private:
+ Loader::ResultStatus status;
+
+ KIPHeader header{};
+ std::array<std::vector<u8>, 6> decompressed_sections;
+};
+
+class INI {
+public:
+ explicit INI(const VirtualFile& file);
+
+ Loader::ResultStatus GetStatus() const;
+
+ const std::vector<KIP>& GetKIPs() const;
+
+private:
+ Loader::ResultStatus status;
+
+ INIHeader header{};
+ std::vector<KIP> kips;
+};
+
+} // namespace FileSys