diff options
| author | 2018-10-12 22:52:12 -0400 | |
|---|---|---|
| committer | 2018-10-12 22:52:12 -0400 | |
| commit | c2aa4293ec647a3712299c5b53f3ca592aaf9c0e (patch) | |
| tree | 08a703b6913733042091e16c7c90cc34d991f537 /src/core/hle/kernel | |
| parent | Merge pull request #1484 from FernandoS27/calculate-size (diff) | |
| parent | kernel/process: Make CodeSet a regular non-inherited object (diff) | |
| download | yuzu-c2aa4293ec647a3712299c5b53f3ca592aaf9c0e.tar.gz yuzu-c2aa4293ec647a3712299c5b53f3ca592aaf9c0e.tar.xz yuzu-c2aa4293ec647a3712299c5b53f3ca592aaf9c0e.zip | |
Merge pull request #1483 from lioncash/codeset
kernel/process: Make CodeSet a regular non-inherited object
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/object.cpp | 1 | ||||
| -rw-r--r-- | src/core/hle/kernel/object.h | 1 | ||||
| -rw-r--r-- | src/core/hle/kernel/process.cpp | 24 | ||||
| -rw-r--r-- | src/core/hle/kernel/process.h | 28 |
4 files changed, 14 insertions, 40 deletions
diff --git a/src/core/hle/kernel/object.cpp b/src/core/hle/kernel/object.cpp index d51562d92..d87a62bb9 100644 --- a/src/core/hle/kernel/object.cpp +++ b/src/core/hle/kernel/object.cpp | |||
| @@ -25,7 +25,6 @@ bool Object::IsWaitable() const { | |||
| 25 | case HandleType::Process: | 25 | case HandleType::Process: |
| 26 | case HandleType::AddressArbiter: | 26 | case HandleType::AddressArbiter: |
| 27 | case HandleType::ResourceLimit: | 27 | case HandleType::ResourceLimit: |
| 28 | case HandleType::CodeSet: | ||
| 29 | case HandleType::ClientPort: | 28 | case HandleType::ClientPort: |
| 30 | case HandleType::ClientSession: | 29 | case HandleType::ClientSession: |
| 31 | return false; | 30 | return false; |
diff --git a/src/core/hle/kernel/object.h b/src/core/hle/kernel/object.h index 9eb72315c..c9f4d0bb3 100644 --- a/src/core/hle/kernel/object.h +++ b/src/core/hle/kernel/object.h | |||
| @@ -26,7 +26,6 @@ enum class HandleType : u32 { | |||
| 26 | AddressArbiter, | 26 | AddressArbiter, |
| 27 | Timer, | 27 | Timer, |
| 28 | ResourceLimit, | 28 | ResourceLimit, |
| 29 | CodeSet, | ||
| 30 | ClientPort, | 29 | ClientPort, |
| 31 | ServerPort, | 30 | ServerPort, |
| 32 | ClientSession, | 31 | ClientSession, |
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp index fb0027a71..c80b2c507 100644 --- a/src/core/hle/kernel/process.cpp +++ b/src/core/hle/kernel/process.cpp | |||
| @@ -20,13 +20,7 @@ | |||
| 20 | 20 | ||
| 21 | namespace Kernel { | 21 | namespace Kernel { |
| 22 | 22 | ||
| 23 | SharedPtr<CodeSet> CodeSet::Create(KernelCore& kernel, std::string name) { | 23 | CodeSet::CodeSet() = default; |
| 24 | SharedPtr<CodeSet> codeset(new CodeSet(kernel)); | ||
| 25 | codeset->name = std::move(name); | ||
| 26 | return codeset; | ||
| 27 | } | ||
| 28 | |||
| 29 | CodeSet::CodeSet(KernelCore& kernel) : Object{kernel} {} | ||
| 30 | CodeSet::~CodeSet() = default; | 24 | CodeSet::~CodeSet() = default; |
| 31 | 25 | ||
| 32 | SharedPtr<Process> Process::Create(KernelCore& kernel, std::string&& name) { | 26 | SharedPtr<Process> Process::Create(KernelCore& kernel, std::string&& name) { |
| @@ -224,20 +218,20 @@ void Process::FreeTLSSlot(VAddr tls_address) { | |||
| 224 | tls_slots[tls_page].reset(tls_slot); | 218 | tls_slots[tls_page].reset(tls_slot); |
| 225 | } | 219 | } |
| 226 | 220 | ||
| 227 | void Process::LoadModule(SharedPtr<CodeSet> module_, VAddr base_addr) { | 221 | void Process::LoadModule(CodeSet module_, VAddr base_addr) { |
| 228 | const auto MapSegment = [&](CodeSet::Segment& segment, VMAPermission permissions, | 222 | const auto MapSegment = [&](CodeSet::Segment& segment, VMAPermission permissions, |
| 229 | MemoryState memory_state) { | 223 | MemoryState memory_state) { |
| 230 | auto vma = vm_manager | 224 | const auto vma = vm_manager |
| 231 | .MapMemoryBlock(segment.addr + base_addr, module_->memory, segment.offset, | 225 | .MapMemoryBlock(segment.addr + base_addr, module_.memory, |
| 232 | segment.size, memory_state) | 226 | segment.offset, segment.size, memory_state) |
| 233 | .Unwrap(); | 227 | .Unwrap(); |
| 234 | vm_manager.Reprotect(vma, permissions); | 228 | vm_manager.Reprotect(vma, permissions); |
| 235 | }; | 229 | }; |
| 236 | 230 | ||
| 237 | // Map CodeSet segments | 231 | // Map CodeSet segments |
| 238 | MapSegment(module_->CodeSegment(), VMAPermission::ReadExecute, MemoryState::CodeStatic); | 232 | MapSegment(module_.CodeSegment(), VMAPermission::ReadExecute, MemoryState::CodeStatic); |
| 239 | MapSegment(module_->RODataSegment(), VMAPermission::Read, MemoryState::CodeMutable); | 233 | MapSegment(module_.RODataSegment(), VMAPermission::Read, MemoryState::CodeMutable); |
| 240 | MapSegment(module_->DataSegment(), VMAPermission::ReadWrite, MemoryState::CodeMutable); | 234 | MapSegment(module_.DataSegment(), VMAPermission::ReadWrite, MemoryState::CodeMutable); |
| 241 | } | 235 | } |
| 242 | 236 | ||
| 243 | ResultVal<VAddr> Process::HeapAllocate(VAddr target, u64 size, VMAPermission perms) { | 237 | ResultVal<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 590e0c73d..73ec01e11 100644 --- a/src/core/hle/kernel/process.h +++ b/src/core/hle/kernel/process.h | |||
| @@ -61,26 +61,15 @@ enum class ProcessStatus { Created, Running, Exited }; | |||
| 61 | 61 | ||
| 62 | class ResourceLimit; | 62 | class ResourceLimit; |
| 63 | 63 | ||
| 64 | struct CodeSet final : public Object { | 64 | struct CodeSet final { |
| 65 | struct Segment { | 65 | struct Segment { |
| 66 | std::size_t offset = 0; | 66 | std::size_t offset = 0; |
| 67 | VAddr addr = 0; | 67 | VAddr addr = 0; |
| 68 | u32 size = 0; | 68 | u32 size = 0; |
| 69 | }; | 69 | }; |
| 70 | 70 | ||
| 71 | static SharedPtr<CodeSet> Create(KernelCore& kernel, std::string name); | 71 | explicit CodeSet(); |
| 72 | 72 | ~CodeSet(); | |
| 73 | std::string GetTypeName() const override { | ||
| 74 | return "CodeSet"; | ||
| 75 | } | ||
| 76 | std::string GetName() const override { | ||
| 77 | return name; | ||
| 78 | } | ||
| 79 | |||
| 80 | static const HandleType HANDLE_TYPE = HandleType::CodeSet; | ||
| 81 | HandleType GetHandleType() const override { | ||
| 82 | return HANDLE_TYPE; | ||
| 83 | } | ||
| 84 | 73 | ||
| 85 | Segment& CodeSegment() { | 74 | Segment& CodeSegment() { |
| 86 | return segments[0]; | 75 | return segments[0]; |
| @@ -109,14 +98,7 @@ struct CodeSet final : public Object { | |||
| 109 | std::shared_ptr<std::vector<u8>> memory; | 98 | std::shared_ptr<std::vector<u8>> memory; |
| 110 | 99 | ||
| 111 | std::array<Segment, 3> segments; | 100 | std::array<Segment, 3> segments; |
| 112 | VAddr entrypoint; | 101 | VAddr entrypoint = 0; |
| 113 | |||
| 114 | /// Name of the process | ||
| 115 | std::string name; | ||
| 116 | |||
| 117 | private: | ||
| 118 | explicit CodeSet(KernelCore& kernel); | ||
| 119 | ~CodeSet() override; | ||
| 120 | }; | 102 | }; |
| 121 | 103 | ||
| 122 | class Process final : public Object { | 104 | class Process final : public Object { |
| @@ -219,7 +201,7 @@ public: | |||
| 219 | */ | 201 | */ |
| 220 | void PrepareForTermination(); | 202 | void PrepareForTermination(); |
| 221 | 203 | ||
| 222 | void LoadModule(SharedPtr<CodeSet> module_, VAddr base_addr); | 204 | void LoadModule(CodeSet module_, VAddr base_addr); |
| 223 | 205 | ||
| 224 | /////////////////////////////////////////////////////////////////////////////////////////////// | 206 | /////////////////////////////////////////////////////////////////////////////////////////////// |
| 225 | // Memory Management | 207 | // Memory Management |