summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/svc.cpp
diff options
context:
space:
mode:
authorGravatar ameerj2021-02-12 19:05:24 -0500
committerGravatar ameerj2021-02-12 19:05:24 -0500
commitec9b6641b12aa04ae3d7782b0423037dbc1400ac (patch)
treefc563f28673dfe851cfaf665951423e0ad759025 /src/core/hle/kernel/svc.cpp
parentkernel: KScopedReservation implementation (diff)
downloadyuzu-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.cpp21
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
138enum class ResourceLimitValueType { 138enum class ResourceLimitValueType {
139 CurrentValue, 139 CurrentValue,
140 LimitValue, 140 LimitValue,
141 PeakValue,
141}; 142};
142 143
143ResultVal<s64> RetrieveResourceLimitValue(Core::System& system, Handle resource_limit, 144ResultVal<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.