summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Lioncash2018-08-03 14:33:59 -0400
committerGravatar Lioncash2018-08-03 14:45:45 -0400
commit2beda7c2b3d2fe70ff36edf178d9bb2f5b308bf9 (patch)
tree8decd2e8d79f579920f1da76190b46a68eac5f88
parentMerge pull request #908 from lioncash/memory (diff)
downloadyuzu-2beda7c2b3d2fe70ff36edf178d9bb2f5b308bf9.tar.gz
yuzu-2beda7c2b3d2fe70ff36edf178d9bb2f5b308bf9.tar.xz
yuzu-2beda7c2b3d2fe70ff36edf178d9bb2f5b308bf9.zip
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.
-rw-r--r--src/core/hle/kernel/process.cpp6
-rw-r--r--src/core/hle/kernel/process.h44
-rw-r--r--src/core/loader/elf.cpp6
-rw-r--r--src/core/loader/nro.cpp2
-rw-r--r--src/core/loader/nso.cpp2
5 files changed, 40 insertions, 20 deletions
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp
index 5403ceef5..edf34c5a3 100644
--- a/src/core/hle/kernel/process.cpp
+++ b/src/core/hle/kernel/process.cpp
@@ -142,9 +142,9 @@ void Process::LoadModule(SharedPtr<CodeSet> module_, VAddr base_addr) {
142 }; 142 };
143 143
144 // Map CodeSet segments 144 // Map CodeSet segments
145 MapSegment(module_->code, VMAPermission::ReadExecute, MemoryState::CodeStatic); 145 MapSegment(module_->CodeSegment(), VMAPermission::ReadExecute, MemoryState::CodeStatic);
146 MapSegment(module_->rodata, VMAPermission::Read, MemoryState::CodeMutable); 146 MapSegment(module_->RODataSegment(), VMAPermission::Read, MemoryState::CodeMutable);
147 MapSegment(module_->data, VMAPermission::ReadWrite, MemoryState::CodeMutable); 147 MapSegment(module_->DataSegment(), VMAPermission::ReadWrite, MemoryState::CodeMutable);
148} 148}
149 149
150ResultVal<VAddr> Process::HeapAllocate(VAddr target, u64 size, VMAPermission perms) { 150ResultVal<VAddr> Process::HeapAllocate(VAddr target, u64 size, VMAPermission perms) {
diff --git a/src/core/hle/kernel/process.h b/src/core/hle/kernel/process.h
index 98d8da35e..f29ee67c6 100644
--- a/src/core/hle/kernel/process.h
+++ b/src/core/hle/kernel/process.h
@@ -55,6 +55,12 @@ enum class ProcessStatus { Created, Running, Exited };
55class ResourceLimit; 55class ResourceLimit;
56 56
57struct CodeSet final : public Object { 57struct CodeSet final : public Object {
58 struct Segment {
59 size_t offset = 0;
60 VAddr addr = 0;
61 u32 size = 0;
62 };
63
58 static SharedPtr<CodeSet> Create(std::string name); 64 static SharedPtr<CodeSet> Create(std::string name);
59 65
60 std::string GetTypeName() const override { 66 std::string GetTypeName() const override {
@@ -69,24 +75,38 @@ struct CodeSet final : public Object {
69 return HANDLE_TYPE; 75 return HANDLE_TYPE;
70 } 76 }
71 77
72 /// Name of the process 78 Segment& CodeSegment() {
73 std::string name; 79 return segments[0];
80 }
74 81
75 std::shared_ptr<std::vector<u8>> memory; 82 const Segment& CodeSegment() const {
83 return segments[0];
84 }
76 85
77 struct Segment { 86 Segment& RODataSegment() {
78 size_t offset = 0; 87 return segments[1];
79 VAddr addr = 0; 88 }
80 u32 size = 0;
81 };
82 89
83 Segment segments[3]; 90 const Segment& RODataSegment() const {
84 Segment& code = segments[0]; 91 return segments[1];
85 Segment& rodata = segments[1]; 92 }
86 Segment& data = segments[2]; 93
94 Segment& DataSegment() {
95 return segments[2];
96 }
97
98 const Segment& DataSegment() const {
99 return segments[2];
100 }
101
102 std::shared_ptr<std::vector<u8>> memory;
87 103
104 Segment segments[3];
88 VAddr entrypoint; 105 VAddr entrypoint;
89 106
107 /// Name of the process
108 std::string name;
109
90private: 110private:
91 CodeSet(); 111 CodeSet();
92 ~CodeSet() override; 112 ~CodeSet() override;
diff --git a/src/core/loader/elf.cpp b/src/core/loader/elf.cpp
index 352938dcb..a7133f5a6 100644
--- a/src/core/loader/elf.cpp
+++ b/src/core/loader/elf.cpp
@@ -311,11 +311,11 @@ SharedPtr<CodeSet> ElfReader::LoadInto(u32 vaddr) {
311 CodeSet::Segment* codeset_segment; 311 CodeSet::Segment* codeset_segment;
312 u32 permission_flags = p->p_flags & (PF_R | PF_W | PF_X); 312 u32 permission_flags = p->p_flags & (PF_R | PF_W | PF_X);
313 if (permission_flags == (PF_R | PF_X)) { 313 if (permission_flags == (PF_R | PF_X)) {
314 codeset_segment = &codeset->code; 314 codeset_segment = &codeset->CodeSegment();
315 } else if (permission_flags == (PF_R)) { 315 } else if (permission_flags == (PF_R)) {
316 codeset_segment = &codeset->rodata; 316 codeset_segment = &codeset->RODataSegment();
317 } else if (permission_flags == (PF_R | PF_W)) { 317 } else if (permission_flags == (PF_R | PF_W)) {
318 codeset_segment = &codeset->data; 318 codeset_segment = &codeset->DataSegment();
319 } else { 319 } else {
320 LOG_ERROR(Loader, "Unexpected ELF PT_LOAD segment id {} with flags {:X}", i, 320 LOG_ERROR(Loader, "Unexpected ELF PT_LOAD segment id {} with flags {:X}", i,
321 p->p_flags); 321 p->p_flags);
diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp
index 7d3ec2a76..dc053cdad 100644
--- a/src/core/loader/nro.cpp
+++ b/src/core/loader/nro.cpp
@@ -159,7 +159,7 @@ bool AppLoader_NRO::LoadNro(FileSys::VirtualFile file, VAddr load_base) {
159 // Resize program image to include .bss section and page align each section 159 // Resize program image to include .bss section and page align each section
160 bss_size = PageAlignSize(mod_header.bss_end_offset - mod_header.bss_start_offset); 160 bss_size = PageAlignSize(mod_header.bss_end_offset - mod_header.bss_start_offset);
161 } 161 }
162 codeset->data.size += bss_size; 162 codeset->DataSegment().size += bss_size;
163 program_image.resize(static_cast<u32>(program_image.size()) + bss_size); 163 program_image.resize(static_cast<u32>(program_image.size()) + bss_size);
164 164
165 // Load codeset for current process 165 // Load codeset for current process
diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp
index 06b1b33f4..fee7d58c6 100644
--- a/src/core/loader/nso.cpp
+++ b/src/core/loader/nso.cpp
@@ -127,7 +127,7 @@ VAddr AppLoader_NSO::LoadModule(FileSys::VirtualFile file, VAddr load_base) {
127 // Resize program image to include .bss section and page align each section 127 // Resize program image to include .bss section and page align each section
128 bss_size = PageAlignSize(mod_header.bss_end_offset - mod_header.bss_start_offset); 128 bss_size = PageAlignSize(mod_header.bss_end_offset - mod_header.bss_start_offset);
129 } 129 }
130 codeset->data.size += bss_size; 130 codeset->DataSegment().size += bss_size;
131 const u32 image_size{PageAlignSize(static_cast<u32>(program_image.size()) + bss_size)}; 131 const u32 image_size{PageAlignSize(static_cast<u32>(program_image.size()) + bss_size)};
132 program_image.resize(image_size); 132 program_image.resize(image_size);
133 133