summaryrefslogtreecommitdiffstats
path: root/src/core/loader/nso.h
diff options
context:
space:
mode:
authorLioncash <mathew1800@gmail.com>2019-03-22 18:04:41 +0100
committerLioncash <mathew1800@gmail.com>2019-03-22 19:39:10 +0100
commit1cf90f45704373cd61d274d1e3c4dc6e5be87eaa (patch)
tree7654dab9069c34d32cd14f2ae3a025b7eaeff7b2 /src/core/loader/nso.h
parentloader/nso: Fix definition of the NSO header struct (diff)
downloadyuzu-1cf90f45704373cd61d274d1e3c4dc6e5be87eaa.tar
yuzu-1cf90f45704373cd61d274d1e3c4dc6e5be87eaa.tar.gz
yuzu-1cf90f45704373cd61d274d1e3c4dc6e5be87eaa.tar.bz2
yuzu-1cf90f45704373cd61d274d1e3c4dc6e5be87eaa.tar.lz
yuzu-1cf90f45704373cd61d274d1e3c4dc6e5be87eaa.tar.xz
yuzu-1cf90f45704373cd61d274d1e3c4dc6e5be87eaa.tar.zst
yuzu-1cf90f45704373cd61d274d1e3c4dc6e5be87eaa.zip
Diffstat (limited to 'src/core/loader/nso.h')
-rw-r--r--src/core/loader/nso.h39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/core/loader/nso.h b/src/core/loader/nso.h
index 167c8a694..4674c3724 100644
--- a/src/core/loader/nso.h
+++ b/src/core/loader/nso.h
@@ -4,7 +4,9 @@
#pragma once
+#include <array>
#include <optional>
+#include <type_traits>
#include "common/common_types.h"
#include "common/swap.h"
#include "core/file_sys/patch_manager.h"
@@ -16,6 +18,43 @@ class Process;
namespace Loader {
+struct NSOSegmentHeader {
+ u32_le offset;
+ u32_le location;
+ u32_le size;
+ union {
+ u32_le alignment;
+ u32_le bss_size;
+ };
+};
+static_assert(sizeof(NSOSegmentHeader) == 0x10, "NsoSegmentHeader has incorrect size.");
+
+struct NSOHeader {
+ using SHA256Hash = std::array<u8, 0x20>;
+
+ struct RODataRelativeExtent {
+ u32_le data_offset;
+ u32_le size;
+ };
+
+ u32_le magic;
+ u32_le version;
+ u32 reserved;
+ u32_le flags;
+ std::array<NSOSegmentHeader, 3> segments; // Text, RoData, Data (in that order)
+ std::array<u8, 0x20> build_id;
+ std::array<u32_le, 3> segments_compressed_size;
+ std::array<u8, 0x1C> padding;
+ RODataRelativeExtent api_info_extent;
+ RODataRelativeExtent dynstr_extent;
+ RODataRelativeExtent dynsyn_extent;
+ std::array<SHA256Hash, 3> segment_hashes;
+
+ bool IsSegmentCompressed(size_t segment_num) const;
+};
+static_assert(sizeof(NSOHeader) == 0x100, "NSOHeader has incorrect size.");
+static_assert(std::is_trivially_copyable_v<NSOHeader>, "NSOHeader must be trivially copyable.");
+
constexpr u64 NSO_ARGUMENT_DATA_ALLOCATION_SIZE = 0x9000;
struct NSOArgumentHeader {