diff options
| author | 2021-12-29 20:30:12 -0800 | |
|---|---|---|
| committer | 2021-12-29 20:30:12 -0800 | |
| commit | 5e5827190374946cc906da3a5d2aa586a9721ba0 (patch) | |
| tree | 201c75203b27a63f9706c1d3297c70f9d1b9ef2c /src/core/hle/kernel/svc.cpp | |
| parent | Merge pull request #7618 from goldenx86/patch-4 (diff) | |
| parent | core: hle: kernel: Updated implementation of svcSetHeapSize. (diff) | |
| download | yuzu-5e5827190374946cc906da3a5d2aa586a9721ba0.tar.gz yuzu-5e5827190374946cc906da3a5d2aa586a9721ba0.tar.xz yuzu-5e5827190374946cc906da3a5d2aa586a9721ba0.zip | |
Merge pull request #7635 from bunnei/set-heap-size
core: hle: kernel: Updated implementation of svcSetHeapSize.
Diffstat (limited to 'src/core/hle/kernel/svc.cpp')
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 23 |
1 files changed, 7 insertions, 16 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 68cb47211..63e2dff19 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -135,24 +135,15 @@ enum class ResourceLimitValueType { | |||
| 135 | } // Anonymous namespace | 135 | } // Anonymous namespace |
| 136 | 136 | ||
| 137 | /// Set the process heap to a given Size. It can both extend and shrink the heap. | 137 | /// Set the process heap to a given Size. It can both extend and shrink the heap. |
| 138 | static ResultCode SetHeapSize(Core::System& system, VAddr* heap_addr, u64 heap_size) { | 138 | static ResultCode SetHeapSize(Core::System& system, VAddr* out_address, u64 size) { |
| 139 | LOG_TRACE(Kernel_SVC, "called, heap_size=0x{:X}", heap_size); | 139 | LOG_TRACE(Kernel_SVC, "called, heap_size=0x{:X}", size); |
| 140 | 140 | ||
| 141 | // Size must be a multiple of 0x200000 (2MB) and be equal to or less than 8GB. | 141 | // Validate size. |
| 142 | if ((heap_size % 0x200000) != 0) { | 142 | R_UNLESS(Common::IsAligned(size, HeapSizeAlignment), ResultInvalidSize); |
| 143 | LOG_ERROR(Kernel_SVC, "The heap size is not a multiple of 2MB, heap_size=0x{:016X}", | 143 | R_UNLESS(size < MainMemorySizeMax, ResultInvalidSize); |
| 144 | heap_size); | ||
| 145 | return ResultInvalidSize; | ||
| 146 | } | ||
| 147 | |||
| 148 | if (heap_size >= 0x200000000) { | ||
| 149 | LOG_ERROR(Kernel_SVC, "The heap size is not less than 8GB, heap_size=0x{:016X}", heap_size); | ||
| 150 | return ResultInvalidSize; | ||
| 151 | } | ||
| 152 | |||
| 153 | auto& page_table{system.Kernel().CurrentProcess()->PageTable()}; | ||
| 154 | 144 | ||
| 155 | CASCADE_RESULT(*heap_addr, page_table.SetHeapSize(heap_size)); | 145 | // Set the heap size. |
| 146 | R_TRY(system.Kernel().CurrentProcess()->PageTable().SetHeapSize(out_address, size)); | ||
| 156 | 147 | ||
| 157 | return ResultSuccess; | 148 | return ResultSuccess; |
| 158 | } | 149 | } |