diff options
| author | 2021-02-12 19:05:24 -0500 | |
|---|---|---|
| committer | 2021-02-12 19:05:24 -0500 | |
| commit | ec9b6641b12aa04ae3d7782b0423037dbc1400ac (patch) | |
| tree | fc563f28673dfe851cfaf665951423e0ad759025 /src/core/hle/kernel/svc.cpp | |
| parent | kernel: KScopedReservation implementation (diff) | |
| download | yuzu-ec9b6641b12aa04ae3d7782b0423037dbc1400ac.tar.gz yuzu-ec9b6641b12aa04ae3d7782b0423037dbc1400ac.tar.xz yuzu-ec9b6641b12aa04ae3d7782b0423037dbc1400ac.zip | |
kernel: More accurately reserve and release resources
Diffstat (limited to 'src/core/hle/kernel/svc.cpp')
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 1d377ffe6..31d899e06 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -138,6 +138,7 @@ ResultCode MapUnmapMemorySanityChecks(const Memory::PageTable& manager, VAddr ds | |||
| 138 | enum class ResourceLimitValueType { | 138 | enum class ResourceLimitValueType { |
| 139 | CurrentValue, | 139 | CurrentValue, |
| 140 | LimitValue, | 140 | LimitValue, |
| 141 | PeakValue, | ||
| 141 | }; | 142 | }; |
| 142 | 143 | ||
| 143 | ResultVal<s64> RetrieveResourceLimitValue(Core::System& system, Handle resource_limit, | 144 | ResultVal<s64> RetrieveResourceLimitValue(Core::System& system, Handle resource_limit, |
| @@ -160,11 +161,17 @@ ResultVal<s64> RetrieveResourceLimitValue(Core::System& system, Handle resource_ | |||
| 160 | return ResultInvalidHandle; | 161 | return ResultInvalidHandle; |
| 161 | } | 162 | } |
| 162 | 163 | ||
| 163 | if (value_type == ResourceLimitValueType::CurrentValue) { | 164 | switch (value_type) { |
| 165 | case ResourceLimitValueType::CurrentValue: | ||
| 164 | return MakeResult(resource_limit_object->GetCurrentValue(type)); | 166 | return MakeResult(resource_limit_object->GetCurrentValue(type)); |
| 167 | case ResourceLimitValueType::LimitValue: | ||
| 168 | return MakeResult(resource_limit_object->GetLimitValue(type)); | ||
| 169 | case ResourceLimitValueType::PeakValue: | ||
| 170 | return MakeResult(resource_limit_object->GetPeakValue(type)); | ||
| 171 | default: | ||
| 172 | LOG_ERROR(Kernel_SVC, "Invalid resource value_type: '{}'", value_type); | ||
| 173 | return ResultInvalidEnumValue; | ||
| 165 | } | 174 | } |
| 166 | |||
| 167 | return MakeResult(resource_limit_object->GetLimitValue(type)); | ||
| 168 | } | 175 | } |
| 169 | } // Anonymous namespace | 176 | } // Anonymous namespace |
| 170 | 177 | ||
| @@ -314,8 +321,6 @@ static ResultCode ConnectToNamedPort(Core::System& system, Handle* out_handle, | |||
| 314 | return ResultNotFound; | 321 | return ResultNotFound; |
| 315 | } | 322 | } |
| 316 | 323 | ||
| 317 | ASSERT(kernel.CurrentProcess()->GetResourceLimit()->Reserve(LimitableResource::Sessions, 1)); | ||
| 318 | |||
| 319 | auto client_port = it->second; | 324 | auto client_port = it->second; |
| 320 | 325 | ||
| 321 | std::shared_ptr<ClientSession> client_session; | 326 | std::shared_ptr<ClientSession> client_session; |
| @@ -1522,7 +1527,7 @@ static ResultCode CreateThread(Core::System& system, Handle* out_handle, VAddr e | |||
| 1522 | system.CoreTiming().GetGlobalTimeNs().count() + 100000000); | 1527 | system.CoreTiming().GetGlobalTimeNs().count() + 100000000); |
| 1523 | if (!thread_reservation.Succeeded()) { | 1528 | if (!thread_reservation.Succeeded()) { |
| 1524 | LOG_ERROR(Kernel_SVC, "Could not reserve a new thread"); | 1529 | LOG_ERROR(Kernel_SVC, "Could not reserve a new thread"); |
| 1525 | return ERR_RESOURCE_LIMIT_EXCEEDED; | 1530 | return ResultResourceLimitedExceeded; |
| 1526 | } | 1531 | } |
| 1527 | 1532 | ||
| 1528 | std::shared_ptr<KThread> thread; | 1533 | std::shared_ptr<KThread> thread; |
| @@ -1896,7 +1901,7 @@ static ResultCode CreateTransferMemory(Core::System& system, Handle* handle, VAd | |||
| 1896 | LimitableResource::TransferMemory); | 1901 | LimitableResource::TransferMemory); |
| 1897 | if (!trmem_reservation.Succeeded()) { | 1902 | if (!trmem_reservation.Succeeded()) { |
| 1898 | LOG_ERROR(Kernel_SVC, "Could not reserve a new transfer memory"); | 1903 | LOG_ERROR(Kernel_SVC, "Could not reserve a new transfer memory"); |
| 1899 | return ERR_RESOURCE_LIMIT_EXCEEDED; | 1904 | return ResultResourceLimitedExceeded; |
| 1900 | } | 1905 | } |
| 1901 | auto transfer_mem_handle = TransferMemory::Create(kernel, system.Memory(), addr, size, perms); | 1906 | auto transfer_mem_handle = TransferMemory::Create(kernel, system.Memory(), addr, size, perms); |
| 1902 | 1907 | ||
| @@ -2026,7 +2031,7 @@ static ResultCode SignalEvent(Core::System& system, Handle event_handle) { | |||
| 2026 | LimitableResource::Events); | 2031 | LimitableResource::Events); |
| 2027 | if (!event_reservation.Succeeded()) { | 2032 | if (!event_reservation.Succeeded()) { |
| 2028 | LOG_ERROR(Kernel, "Could not reserve a new event"); | 2033 | LOG_ERROR(Kernel, "Could not reserve a new event"); |
| 2029 | return ERR_RESOURCE_LIMIT_EXCEEDED; | 2034 | return ResultResourceLimitedExceeded; |
| 2030 | } | 2035 | } |
| 2031 | 2036 | ||
| 2032 | // Get the writable event. | 2037 | // Get the writable event. |