summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/process.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2021-02-12 17:02:51 -0800
committerGravatar bunnei2021-02-18 16:16:25 -0800
commit65e0178cc09299550aee949d7b89e211017bddee (patch)
tree97abf71a48320fc5628b4946d793191f2fb9dbb0 /src/core/hle/kernel/process.cpp
parenthle: kernel: Migrate SlabHeap to KSlabHeap. (diff)
downloadyuzu-65e0178cc09299550aee949d7b89e211017bddee.tar.gz
yuzu-65e0178cc09299550aee949d7b89e211017bddee.tar.xz
yuzu-65e0178cc09299550aee949d7b89e211017bddee.zip
hle: kernel: Migrate to KMemoryBlock, KMemoryBlockManager, and others.
Diffstat (limited to 'src/core/hle/kernel/process.cpp')
-rw-r--r--src/core/hle/kernel/process.cpp41
1 files changed, 20 insertions, 21 deletions
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp
index 47b3ac57b..f83977a8e 100644
--- a/src/core/hle/kernel/process.cpp
+++ b/src/core/hle/kernel/process.cpp
@@ -14,14 +14,14 @@
14#include "core/device_memory.h" 14#include "core/device_memory.h"
15#include "core/file_sys/program_metadata.h" 15#include "core/file_sys/program_metadata.h"
16#include "core/hle/kernel/code_set.h" 16#include "core/hle/kernel/code_set.h"
17#include "core/hle/kernel/k_memory_block_manager.h"
17#include "core/hle/kernel/k_resource_limit.h" 18#include "core/hle/kernel/k_resource_limit.h"
18#include "core/hle/kernel/k_scheduler.h" 19#include "core/hle/kernel/k_scheduler.h"
19#include "core/hle/kernel/k_scoped_resource_reservation.h" 20#include "core/hle/kernel/k_scoped_resource_reservation.h"
21#include "core/hle/kernel/k_slab_heap.h"
20#include "core/hle/kernel/k_thread.h" 22#include "core/hle/kernel/k_thread.h"
21#include "core/hle/kernel/kernel.h" 23#include "core/hle/kernel/kernel.h"
22#include "core/hle/kernel/memory/memory_block_manager.h"
23#include "core/hle/kernel/memory/page_table.h" 24#include "core/hle/kernel/memory/page_table.h"
24#include "core/hle/kernel/memory/slab_heap.h"
25#include "core/hle/kernel/process.h" 25#include "core/hle/kernel/process.h"
26#include "core/hle/kernel/svc_results.h" 26#include "core/hle/kernel/svc_results.h"
27#include "core/hle/lock.h" 27#include "core/hle/lock.h"
@@ -291,9 +291,9 @@ ResultCode Process::LoadFromMetadata(const FileSys::ProgramMetadata& metadata,
291 } 291 }
292 292
293 // Map process code region 293 // Map process code region
294 if (const ResultCode result{page_table->MapProcessCode( 294 if (const ResultCode result{page_table->MapProcessCode(page_table->GetCodeRegionStart(),
295 page_table->GetCodeRegionStart(), code_size / Memory::PageSize, 295 code_size / PageSize, KMemoryState::Code,
296 Memory::MemoryState::Code, Memory::MemoryPermission::None)}; 296 KMemoryPermission::None)};
297 result.IsError()) { 297 result.IsError()) {
298 return result; 298 return result;
299 } 299 }
@@ -400,22 +400,22 @@ VAddr Process::CreateTLSRegion() {
400 return *tls_page_iter->ReserveSlot(); 400 return *tls_page_iter->ReserveSlot();
401 } 401 }
402 402
403 Memory::Page* const tls_page_ptr{kernel.GetUserSlabHeapPages().Allocate()}; 403 Page* const tls_page_ptr{kernel.GetUserSlabHeapPages().Allocate()};
404 ASSERT(tls_page_ptr); 404 ASSERT(tls_page_ptr);
405 405
406 const VAddr start{page_table->GetKernelMapRegionStart()}; 406 const VAddr start{page_table->GetKernelMapRegionStart()};
407 const VAddr size{page_table->GetKernelMapRegionEnd() - start}; 407 const VAddr size{page_table->GetKernelMapRegionEnd() - start};
408 const PAddr tls_map_addr{system.DeviceMemory().GetPhysicalAddr(tls_page_ptr)}; 408 const PAddr tls_map_addr{system.DeviceMemory().GetPhysicalAddr(tls_page_ptr)};
409 const VAddr tls_page_addr{ 409 const VAddr tls_page_addr{page_table
410 page_table 410 ->AllocateAndMapMemory(1, PageSize, true, start, size / PageSize,
411 ->AllocateAndMapMemory(1, Memory::PageSize, true, start, size / Memory::PageSize, 411 KMemoryState::ThreadLocal,
412 Memory::MemoryState::ThreadLocal, 412 KMemoryPermission::ReadAndWrite,
413 Memory::MemoryPermission::ReadAndWrite, tls_map_addr) 413 tls_map_addr)
414 .ValueOr(0)}; 414 .ValueOr(0)};
415 415
416 ASSERT(tls_page_addr); 416 ASSERT(tls_page_addr);
417 417
418 std::memset(tls_page_ptr, 0, Memory::PageSize); 418 std::memset(tls_page_ptr, 0, PageSize);
419 tls_pages.emplace_back(tls_page_addr); 419 tls_pages.emplace_back(tls_page_addr);
420 420
421 const auto reserve_result{tls_pages.back().ReserveSlot()}; 421 const auto reserve_result{tls_pages.back().ReserveSlot()};
@@ -442,15 +442,15 @@ void Process::FreeTLSRegion(VAddr tls_address) {
442void Process::LoadModule(CodeSet code_set, VAddr base_addr) { 442void Process::LoadModule(CodeSet code_set, VAddr base_addr) {
443 std::lock_guard lock{HLE::g_hle_lock}; 443 std::lock_guard lock{HLE::g_hle_lock};
444 const auto ReprotectSegment = [&](const CodeSet::Segment& segment, 444 const auto ReprotectSegment = [&](const CodeSet::Segment& segment,
445 Memory::MemoryPermission permission) { 445 KMemoryPermission permission) {
446 page_table->SetCodeMemoryPermission(segment.addr + base_addr, segment.size, permission); 446 page_table->SetCodeMemoryPermission(segment.addr + base_addr, segment.size, permission);
447 }; 447 };
448 448
449 system.Memory().WriteBlock(*this, base_addr, code_set.memory.data(), code_set.memory.size()); 449 system.Memory().WriteBlock(*this, base_addr, code_set.memory.data(), code_set.memory.size());
450 450
451 ReprotectSegment(code_set.CodeSegment(), Memory::MemoryPermission::ReadAndExecute); 451 ReprotectSegment(code_set.CodeSegment(), KMemoryPermission::ReadAndExecute);
452 ReprotectSegment(code_set.RODataSegment(), Memory::MemoryPermission::Read); 452 ReprotectSegment(code_set.RODataSegment(), KMemoryPermission::Read);
453 ReprotectSegment(code_set.DataSegment(), Memory::MemoryPermission::ReadAndWrite); 453 ReprotectSegment(code_set.DataSegment(), KMemoryPermission::ReadAndWrite);
454} 454}
455 455
456bool Process::IsSignaled() const { 456bool Process::IsSignaled() const {
@@ -479,16 +479,15 @@ ResultCode Process::AllocateMainThreadStack(std::size_t stack_size) {
479 ASSERT(stack_size); 479 ASSERT(stack_size);
480 480
481 // The kernel always ensures that the given stack size is page aligned. 481 // The kernel always ensures that the given stack size is page aligned.
482 main_thread_stack_size = Common::AlignUp(stack_size, Memory::PageSize); 482 main_thread_stack_size = Common::AlignUp(stack_size, PageSize);
483 483
484 const VAddr start{page_table->GetStackRegionStart()}; 484 const VAddr start{page_table->GetStackRegionStart()};
485 const std::size_t size{page_table->GetStackRegionEnd() - start}; 485 const std::size_t size{page_table->GetStackRegionEnd() - start};
486 486
487 CASCADE_RESULT(main_thread_stack_top, 487 CASCADE_RESULT(main_thread_stack_top,
488 page_table->AllocateAndMapMemory( 488 page_table->AllocateAndMapMemory(
489 main_thread_stack_size / Memory::PageSize, Memory::PageSize, false, start, 489 main_thread_stack_size / PageSize, PageSize, false, start, size / PageSize,
490 size / Memory::PageSize, Memory::MemoryState::Stack, 490 KMemoryState::Stack, KMemoryPermission::ReadAndWrite));
491 Memory::MemoryPermission::ReadAndWrite));
492 491
493 main_thread_stack_top += main_thread_stack_size; 492 main_thread_stack_top += main_thread_stack_size;
494 493