diff options
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 42 | ||||
| -rw-r--r-- | src/core/hle/kernel/vm_manager.cpp | 12 | ||||
| -rw-r--r-- | src/core/hle/kernel/vm_manager.h | 15 |
3 files changed, 41 insertions, 28 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 0bc407098..e0f5e3f39 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -325,26 +325,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, | 325 | LOG_TRACE(Kernel_SVC, "called info_id=0x{:X}, info_sub_id=0x{:X}, handle=0x{:08X}", info_id, |
| 326 | info_sub_id, handle); | 326 | info_sub_id, handle); |
| 327 | 327 | ||
| 328 | const auto& vm_manager = Core::CurrentProcess()->vm_manager; | 328 | const auto& current_process = Core::CurrentProcess(); |
| 329 | const auto& vm_manager = current_process->vm_manager; | ||
| 329 | 330 | ||
| 330 | switch (static_cast<GetInfoType>(info_id)) { | 331 | switch (static_cast<GetInfoType>(info_id)) { |
| 331 | case GetInfoType::AllowedCpuIdBitmask: | 332 | case GetInfoType::AllowedCpuIdBitmask: |
| 332 | *result = Core::CurrentProcess()->allowed_processor_mask; | 333 | *result = current_process->allowed_processor_mask; |
| 333 | break; | 334 | break; |
| 334 | case GetInfoType::AllowedThreadPrioBitmask: | 335 | case GetInfoType::AllowedThreadPrioBitmask: |
| 335 | *result = Core::CurrentProcess()->allowed_thread_priority_mask; | 336 | *result = current_process->allowed_thread_priority_mask; |
| 336 | break; | 337 | break; |
| 337 | case GetInfoType::MapRegionBaseAddr: | 338 | case GetInfoType::MapRegionBaseAddr: |
| 338 | *result = Memory::MAP_REGION_VADDR; | 339 | *result = vm_manager.GetMapRegionBaseAddress(); |
| 339 | break; | 340 | break; |
| 340 | case GetInfoType::MapRegionSize: | 341 | case GetInfoType::MapRegionSize: |
| 341 | *result = Memory::MAP_REGION_SIZE; | 342 | *result = vm_manager.GetMapRegionSize(); |
| 342 | break; | 343 | break; |
| 343 | case GetInfoType::HeapRegionBaseAddr: | 344 | case GetInfoType::HeapRegionBaseAddr: |
| 344 | *result = Memory::HEAP_VADDR; | 345 | *result = vm_manager.GetHeapRegionBaseAddress(); |
| 345 | break; | 346 | break; |
| 346 | case GetInfoType::HeapRegionSize: | 347 | case GetInfoType::HeapRegionSize: |
| 347 | *result = Memory::HEAP_SIZE; | 348 | *result = vm_manager.GetHeapRegionSize(); |
| 348 | break; | 349 | break; |
| 349 | case GetInfoType::TotalMemoryUsage: | 350 | case GetInfoType::TotalMemoryUsage: |
| 350 | *result = vm_manager.GetTotalMemoryUsage(); | 351 | *result = vm_manager.GetTotalMemoryUsage(); |
| @@ -359,22 +360,35 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id) | |||
| 359 | *result = 0; | 360 | *result = 0; |
| 360 | break; | 361 | break; |
| 361 | case GetInfoType::AddressSpaceBaseAddr: | 362 | case GetInfoType::AddressSpaceBaseAddr: |
| 362 | *result = vm_manager.GetAddressSpaceBaseAddr(); | 363 | *result = vm_manager.GetCodeRegionBaseAddress(); |
| 363 | break; | 364 | break; |
| 364 | case GetInfoType::AddressSpaceSize: | 365 | case GetInfoType::AddressSpaceSize: { |
| 365 | *result = vm_manager.GetAddressSpaceSize(); | 366 | const u64 width = vm_manager.GetAddressSpaceWidth(); |
| 367 | |||
| 368 | switch (width) { | ||
| 369 | case 32: | ||
| 370 | *result = 0xFFE00000; | ||
| 371 | break; | ||
| 372 | case 36: | ||
| 373 | *result = 0xFF8000000; | ||
| 374 | break; | ||
| 375 | case 39: | ||
| 376 | *result = 0x7FF8000000; | ||
| 377 | break; | ||
| 378 | } | ||
| 366 | break; | 379 | break; |
| 380 | } | ||
| 367 | case GetInfoType::NewMapRegionBaseAddr: | 381 | case GetInfoType::NewMapRegionBaseAddr: |
| 368 | *result = Memory::NEW_MAP_REGION_VADDR; | 382 | *result = vm_manager.GetNewMapRegionBaseAddress(); |
| 369 | break; | 383 | break; |
| 370 | case GetInfoType::NewMapRegionSize: | 384 | case GetInfoType::NewMapRegionSize: |
| 371 | *result = Memory::NEW_MAP_REGION_SIZE; | 385 | *result = vm_manager.GetNewMapRegionSize(); |
| 372 | break; | 386 | break; |
| 373 | case GetInfoType::IsVirtualAddressMemoryEnabled: | 387 | case GetInfoType::IsVirtualAddressMemoryEnabled: |
| 374 | *result = Core::CurrentProcess()->is_virtual_address_memory_enabled; | 388 | *result = current_process->is_virtual_address_memory_enabled; |
| 375 | break; | 389 | break; |
| 376 | case GetInfoType::TitleId: | 390 | case GetInfoType::TitleId: |
| 377 | *result = Core::CurrentProcess()->program_id; | 391 | *result = current_process->program_id; |
| 378 | break; | 392 | break; |
| 379 | case GetInfoType::PrivilegedProcessId: | 393 | case GetInfoType::PrivilegedProcessId: |
| 380 | LOG_WARNING(Kernel_SVC, | 394 | LOG_WARNING(Kernel_SVC, |
diff --git a/src/core/hle/kernel/vm_manager.cpp b/src/core/hle/kernel/vm_manager.cpp index 20d06f000..e412309fd 100644 --- a/src/core/hle/kernel/vm_manager.cpp +++ b/src/core/hle/kernel/vm_manager.cpp | |||
| @@ -474,14 +474,16 @@ u64 VMManager::GetTotalHeapUsage() const { | |||
| 474 | return 0x0; | 474 | return 0x0; |
| 475 | } | 475 | } |
| 476 | 476 | ||
| 477 | VAddr VMManager::GetAddressSpaceBaseAddr() const { | 477 | VAddr VMManager::GetAddressSpaceBaseAddress() const { |
| 478 | LOG_WARNING(Kernel, "(STUBBED) called"); | 478 | return address_space_base; |
| 479 | return 0x8000000; | 479 | } |
| 480 | |||
| 481 | VAddr VMManager::GetAddressSpaceEndAddress() const { | ||
| 482 | return address_space_end; | ||
| 480 | } | 483 | } |
| 481 | 484 | ||
| 482 | u64 VMManager::GetAddressSpaceSize() const { | 485 | u64 VMManager::GetAddressSpaceSize() const { |
| 483 | LOG_WARNING(Kernel, "(STUBBED) called"); | 486 | return address_space_end - address_space_base; |
| 484 | return MAX_ADDRESS; | ||
| 485 | } | 487 | } |
| 486 | 488 | ||
| 487 | u64 VMManager::GetAddressSpaceWidth() const { | 489 | u64 VMManager::GetAddressSpaceWidth() const { |
diff --git a/src/core/hle/kernel/vm_manager.h b/src/core/hle/kernel/vm_manager.h index 581bf3d00..015559a64 100644 --- a/src/core/hle/kernel/vm_manager.h +++ b/src/core/hle/kernel/vm_manager.h | |||
| @@ -115,12 +115,6 @@ struct VirtualMemoryArea { | |||
| 115 | class VMManager final { | 115 | class VMManager final { |
| 116 | public: | 116 | public: |
| 117 | /** | 117 | /** |
| 118 | * The maximum amount of address space managed by the kernel. | ||
| 119 | * @todo This was selected arbitrarily, and should be verified for Switch OS. | ||
| 120 | */ | ||
| 121 | static constexpr VAddr MAX_ADDRESS{0x1000000000ULL}; | ||
| 122 | |||
| 123 | /** | ||
| 124 | * A map covering the entirety of the managed address space, keyed by the `base` field of each | 118 | * A map covering the entirety of the managed address space, keyed by the `base` field of each |
| 125 | * VMA. It must always be modified by splitting or merging VMAs, so that the invariant | 119 | * VMA. It must always be modified by splitting or merging VMAs, so that the invariant |
| 126 | * `elem.base + elem.size == next.base` is preserved, and mergeable regions must always be | 120 | * `elem.base + elem.size == next.base` is preserved, and mergeable regions must always be |
| @@ -199,10 +193,13 @@ public: | |||
| 199 | /// Gets the total heap usage, used by svcGetInfo | 193 | /// Gets the total heap usage, used by svcGetInfo |
| 200 | u64 GetTotalHeapUsage() const; | 194 | u64 GetTotalHeapUsage() const; |
| 201 | 195 | ||
| 202 | /// Gets the address space base address, used by svcGetInfo | 196 | /// Gets the address space base address |
| 203 | VAddr GetAddressSpaceBaseAddr() const; | 197 | VAddr GetAddressSpaceBaseAddress() const; |
| 198 | |||
| 199 | /// Gets the address space end address | ||
| 200 | VAddr GetAddressSpaceEndAddress() const; | ||
| 204 | 201 | ||
| 205 | /// Gets the total address space address size, used by svcGetInfo | 202 | /// Gets the total address space address size in bytes |
| 206 | u64 GetAddressSpaceSize() const; | 203 | u64 GetAddressSpaceSize() const; |
| 207 | 204 | ||
| 208 | /// Gets the address space width in bits. | 205 | /// Gets the address space width in bits. |