diff options
| author | 2018-09-29 10:54:39 -0400 | |
|---|---|---|
| committer | 2018-09-29 10:54:39 -0400 | |
| commit | f7b69d61f2a871e8afcd9819b014e873f6e0b80d (patch) | |
| tree | ab6fa797e0a0edd41cc84138ac56aaba0c5238fe /src/core/hle/kernel/svc.cpp | |
| parent | Merge pull request #1360 from FearlessTobi/port-3979 (diff) | |
| parent | memory: Dehardcode the use of fixed memory range constants (diff) | |
| download | yuzu-f7b69d61f2a871e8afcd9819b014e873f6e0b80d.tar.gz yuzu-f7b69d61f2a871e8afcd9819b014e873f6e0b80d.tar.xz yuzu-f7b69d61f2a871e8afcd9819b014e873f6e0b80d.zip | |
Merge pull request #1395 from lioncash/vm
process/vm_manager: Initial modifications to load NPDM metadata
Diffstat (limited to 'src/core/hle/kernel/svc.cpp')
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 45 |
1 files changed, 30 insertions, 15 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index c9d212a4c..44bbaf0c8 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -51,8 +51,9 @@ static ResultCode SetHeapSize(VAddr* heap_addr, u64 heap_size) { | |||
| 51 | } | 51 | } |
| 52 | 52 | ||
| 53 | auto& process = *Core::CurrentProcess(); | 53 | auto& process = *Core::CurrentProcess(); |
| 54 | const VAddr heap_base = process.vm_manager.GetHeapRegionBaseAddress(); | ||
| 54 | CASCADE_RESULT(*heap_addr, | 55 | CASCADE_RESULT(*heap_addr, |
| 55 | process.HeapAllocate(Memory::HEAP_VADDR, heap_size, VMAPermission::ReadWrite)); | 56 | process.HeapAllocate(heap_base, heap_size, VMAPermission::ReadWrite)); |
| 56 | return RESULT_SUCCESS; | 57 | return RESULT_SUCCESS; |
| 57 | } | 58 | } |
| 58 | 59 | ||
| @@ -325,26 +326,27 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id) | |||
| 325 | LOG_TRACE(Kernel_SVC, "called info_id=0x{:X}, info_sub_id=0x{:X}, handle=0x{:08X}", info_id, | 326 | LOG_TRACE(Kernel_SVC, "called info_id=0x{:X}, info_sub_id=0x{:X}, handle=0x{:08X}", info_id, |
| 326 | info_sub_id, handle); | 327 | info_sub_id, handle); |
| 327 | 328 | ||
| 328 | const auto& vm_manager = Core::CurrentProcess()->vm_manager; | 329 | const auto& current_process = Core::CurrentProcess(); |
| 330 | const auto& vm_manager = current_process->vm_manager; | ||
| 329 | 331 | ||
| 330 | switch (static_cast<GetInfoType>(info_id)) { | 332 | switch (static_cast<GetInfoType>(info_id)) { |
| 331 | case GetInfoType::AllowedCpuIdBitmask: | 333 | case GetInfoType::AllowedCpuIdBitmask: |
| 332 | *result = Core::CurrentProcess()->allowed_processor_mask; | 334 | *result = current_process->allowed_processor_mask; |
| 333 | break; | 335 | break; |
| 334 | case GetInfoType::AllowedThreadPrioBitmask: | 336 | case GetInfoType::AllowedThreadPrioBitmask: |
| 335 | *result = Core::CurrentProcess()->allowed_thread_priority_mask; | 337 | *result = current_process->allowed_thread_priority_mask; |
| 336 | break; | 338 | break; |
| 337 | case GetInfoType::MapRegionBaseAddr: | 339 | case GetInfoType::MapRegionBaseAddr: |
| 338 | *result = Memory::MAP_REGION_VADDR; | 340 | *result = vm_manager.GetMapRegionBaseAddress(); |
| 339 | break; | 341 | break; |
| 340 | case GetInfoType::MapRegionSize: | 342 | case GetInfoType::MapRegionSize: |
| 341 | *result = Memory::MAP_REGION_SIZE; | 343 | *result = vm_manager.GetMapRegionSize(); |
| 342 | break; | 344 | break; |
| 343 | case GetInfoType::HeapRegionBaseAddr: | 345 | case GetInfoType::HeapRegionBaseAddr: |
| 344 | *result = Memory::HEAP_VADDR; | 346 | *result = vm_manager.GetHeapRegionBaseAddress(); |
| 345 | break; | 347 | break; |
| 346 | case GetInfoType::HeapRegionSize: | 348 | case GetInfoType::HeapRegionSize: |
| 347 | *result = Memory::HEAP_SIZE; | 349 | *result = vm_manager.GetHeapRegionSize(); |
| 348 | break; | 350 | break; |
| 349 | case GetInfoType::TotalMemoryUsage: | 351 | case GetInfoType::TotalMemoryUsage: |
| 350 | *result = vm_manager.GetTotalMemoryUsage(); | 352 | *result = vm_manager.GetTotalMemoryUsage(); |
| @@ -359,22 +361,35 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id) | |||
| 359 | *result = 0; | 361 | *result = 0; |
| 360 | break; | 362 | break; |
| 361 | case GetInfoType::AddressSpaceBaseAddr: | 363 | case GetInfoType::AddressSpaceBaseAddr: |
| 362 | *result = vm_manager.GetAddressSpaceBaseAddr(); | 364 | *result = vm_manager.GetCodeRegionBaseAddress(); |
| 363 | break; | 365 | break; |
| 364 | case GetInfoType::AddressSpaceSize: | 366 | case GetInfoType::AddressSpaceSize: { |
| 365 | *result = vm_manager.GetAddressSpaceSize(); | 367 | const u64 width = vm_manager.GetAddressSpaceWidth(); |
| 368 | |||
| 369 | switch (width) { | ||
| 370 | case 32: | ||
| 371 | *result = 0xFFE00000; | ||
| 372 | break; | ||
| 373 | case 36: | ||
| 374 | *result = 0xFF8000000; | ||
| 375 | break; | ||
| 376 | case 39: | ||
| 377 | *result = 0x7FF8000000; | ||
| 378 | break; | ||
| 379 | } | ||
| 366 | break; | 380 | break; |
| 381 | } | ||
| 367 | case GetInfoType::NewMapRegionBaseAddr: | 382 | case GetInfoType::NewMapRegionBaseAddr: |
| 368 | *result = Memory::NEW_MAP_REGION_VADDR; | 383 | *result = vm_manager.GetNewMapRegionBaseAddress(); |
| 369 | break; | 384 | break; |
| 370 | case GetInfoType::NewMapRegionSize: | 385 | case GetInfoType::NewMapRegionSize: |
| 371 | *result = Memory::NEW_MAP_REGION_SIZE; | 386 | *result = vm_manager.GetNewMapRegionSize(); |
| 372 | break; | 387 | break; |
| 373 | case GetInfoType::IsVirtualAddressMemoryEnabled: | 388 | case GetInfoType::IsVirtualAddressMemoryEnabled: |
| 374 | *result = Core::CurrentProcess()->is_virtual_address_memory_enabled; | 389 | *result = current_process->is_virtual_address_memory_enabled; |
| 375 | break; | 390 | break; |
| 376 | case GetInfoType::TitleId: | 391 | case GetInfoType::TitleId: |
| 377 | *result = Core::CurrentProcess()->program_id; | 392 | *result = current_process->program_id; |
| 378 | break; | 393 | break; |
| 379 | case GetInfoType::PrivilegedProcessId: | 394 | case GetInfoType::PrivilegedProcessId: |
| 380 | LOG_WARNING(Kernel_SVC, | 395 | LOG_WARNING(Kernel_SVC, |