diff options
Diffstat (limited to 'src/core/hle/kernel/process.cpp')
| -rw-r--r-- | src/core/hle/kernel/process.cpp | 41 |
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) { | |||
| 442 | void Process::LoadModule(CodeSet code_set, VAddr base_addr) { | 442 | void 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 | ||
| 456 | bool Process::IsSignaled() const { | 456 | bool 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 | ||