summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGravatar bunnei2018-08-04 02:17:25 -0400
committerGravatar GitHub2018-08-04 02:17:25 -0400
commit206f2e3436a2c1dddee7503edc4e142fb9a9dbd4 (patch)
tree69c99523b435fe2c2bff9b022534035a9b4b4020 /src/core
parentMerge pull request #917 from lioncash/crash (diff)
parentkernel/process: Use std::array where applicable (diff)
downloadyuzu-206f2e3436a2c1dddee7503edc4e142fb9a9dbd4.tar.gz
yuzu-206f2e3436a2c1dddee7503edc4e142fb9a9dbd4.tar.xz
yuzu-206f2e3436a2c1dddee7503edc4e142fb9a9dbd4.zip
Merge pull request #914 from lioncash/codeset
kernel/process: Use accessors instead of class members for referencing segment array
Diffstat (limited to 'src/core')
-rw-r--r--src/core/hle/kernel/process.cpp6
-rw-r--r--src/core/hle/kernel/process.h45
-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, 41 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..992689186 100644
--- a/src/core/hle/kernel/process.h
+++ b/src/core/hle/kernel/process.h
@@ -4,6 +4,7 @@
4 4
5#pragma once 5#pragma once
6 6
7#include <array>
7#include <bitset> 8#include <bitset>
8#include <cstddef> 9#include <cstddef>
9#include <memory> 10#include <memory>
@@ -55,6 +56,12 @@ enum class ProcessStatus { Created, Running, Exited };
55class ResourceLimit; 56class ResourceLimit;
56 57
57struct CodeSet final : public Object { 58struct CodeSet final : public Object {
59 struct Segment {
60 size_t offset = 0;
61 VAddr addr = 0;
62 u32 size = 0;
63 };
64
58 static SharedPtr<CodeSet> Create(std::string name); 65 static SharedPtr<CodeSet> Create(std::string name);
59 66
60 std::string GetTypeName() const override { 67 std::string GetTypeName() const override {
@@ -69,24 +76,38 @@ struct CodeSet final : public Object {
69 return HANDLE_TYPE; 76 return HANDLE_TYPE;
70 } 77 }
71 78
72 /// Name of the process 79 Segment& CodeSegment() {
73 std::string name; 80 return segments[0];
81 }
74 82
75 std::shared_ptr<std::vector<u8>> memory; 83 const Segment& CodeSegment() const {
84 return segments[0];
85 }
76 86
77 struct Segment { 87 Segment& RODataSegment() {
78 size_t offset = 0; 88 return segments[1];
79 VAddr addr = 0; 89 }
80 u32 size = 0;
81 };
82 90
83 Segment segments[3]; 91 const Segment& RODataSegment() const {
84 Segment& code = segments[0]; 92 return segments[1];
85 Segment& rodata = segments[1]; 93 }
86 Segment& data = segments[2];
87 94
95 Segment& DataSegment() {
96 return segments[2];
97 }
98
99 const Segment& DataSegment() const {
100 return segments[2];
101 }
102
103 std::shared_ptr<std::vector<u8>> memory;
104
105 std::array<Segment, 3> segments;
88 VAddr entrypoint; 106 VAddr entrypoint;
89 107
108 /// Name of the process
109 std::string name;
110
90private: 111private:
91 CodeSet(); 112 CodeSet();
92 ~CodeSet() override; 113 ~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