From 37e78de2065e5e16ac63c52dbde3fe81b006c2f1 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 3 Aug 2018 14:33:59 -0400 Subject: [PATCH] kernel/process: Use accessors instead of class members for referencing segment array Using member variables for referencing the segments array increases the size of the class in memory for little benefit. The same behavior can be achieved through the use of accessors that just return the relevant segment. --- src/core/hle/kernel/process.cpp | 6 ++--- src/core/hle/kernel/process.h | 46 +++++++++++++++++++++++++-------- src/core/loader/elf.cpp | 6 ++--- 3 files changed, 41 insertions(+), 17 deletions(-) diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp index de8bd0f96..b69acd424 100644 --- a/src/core/hle/kernel/process.cpp +++ b/src/core/hle/kernel/process.cpp @@ -133,9 +133,9 @@ void Process::Run(s32 main_thread_priority, u32 stack_size) { }; // Map CodeSet segments - MapSegment(codeset->code, VMAPermission::ReadExecute, MemoryState::Code); - MapSegment(codeset->rodata, VMAPermission::Read, MemoryState::Code); - MapSegment(codeset->data, VMAPermission::ReadWrite, MemoryState::Private); + MapSegment(codeset->CodeSegment(), VMAPermission::ReadExecute, MemoryState::Code); + MapSegment(codeset->RODataSegment(), VMAPermission::Read, MemoryState::Code); + MapSegment(codeset->DataSegment(), VMAPermission::ReadWrite, MemoryState::Private); // Allocate and map stack vm_manager diff --git a/src/core/hle/kernel/process.h b/src/core/hle/kernel/process.h index a21b8e704..5b2291bad 100644 --- a/src/core/hle/kernel/process.h +++ b/src/core/hle/kernel/process.h @@ -55,6 +55,12 @@ class ResourceLimit; struct MemoryRegionInfo; struct CodeSet final : public Object { + struct Segment { + size_t offset = 0; + VAddr addr = 0; + u32 size = 0; + }; + static SharedPtr Create(std::string name, u64 program_id); std::string GetTypeName() const override { @@ -69,22 +75,40 @@ struct CodeSet final : public Object { return HANDLE_TYPE; } + Segment& CodeSegment() { + return segments[0]; + } + + const Segment& CodeSegment() const { + return segments[0]; + } + + Segment& RODataSegment() { + return segments[1]; + } + + const Segment& RODataSegment() const { + return segments[1]; + } + + Segment& DataSegment() { + return segments[2]; + } + + const Segment& DataSegment() const { + return segments[2]; + } + + std::shared_ptr> memory; + + Segment segments[3]; + VAddr entrypoint; + /// Name of the process std::string name; /// Title ID corresponding to the process u64 program_id; - std::shared_ptr> memory; - - struct Segment { - size_t offset = 0; - VAddr addr = 0; - u32 size = 0; - }; - - Segment code, rodata, data; - VAddr entrypoint; - private: CodeSet(); ~CodeSet() override; diff --git a/src/core/loader/elf.cpp b/src/core/loader/elf.cpp index 5c45e5bb4..8bc888acc 100644 --- a/src/core/loader/elf.cpp +++ b/src/core/loader/elf.cpp @@ -310,11 +310,11 @@ SharedPtr ElfReader::LoadInto(u32 vaddr) { CodeSet::Segment* codeset_segment; u32 permission_flags = p->p_flags & (PF_R | PF_W | PF_X); if (permission_flags == (PF_R | PF_X)) { - codeset_segment = &codeset->code; + codeset_segment = &codeset->CodeSegment(); } else if (permission_flags == (PF_R)) { - codeset_segment = &codeset->rodata; + codeset_segment = &codeset->RODataSegment(); } else if (permission_flags == (PF_R | PF_W)) { - codeset_segment = &codeset->data; + codeset_segment = &codeset->DataSegment(); } else { LOG_ERROR(Loader, "Unexpected ELF PT_LOAD segment id {} with flags {:X}", i, p->p_flags);