summaryrefslogtreecommitdiff
path: root/src/core/hle/svc.cpp
diff options
context:
space:
mode:
authorGravatar Subv2015-05-12 15:25:15 -0500
committerGravatar Subv2015-05-14 22:50:13 -0500
commitd3634d4bf4b1cbd8cc4fe6f22178054803b41e23 (patch)
tree2fa606ebac3e2e77e65e1196878a5f5345acfacf /src/core/hle/svc.cpp
parentMerge pull request #762 from yuriks/memmap (diff)
downloadyuzu-d3634d4bf4b1cbd8cc4fe6f22178054803b41e23.tar.gz
yuzu-d3634d4bf4b1cbd8cc4fe6f22178054803b41e23.tar.xz
yuzu-d3634d4bf4b1cbd8cc4fe6f22178054803b41e23.zip
Core/ResourceLimits: Implemented the basic structure of ResourceLimits.
Implemented svcs GetResourceLimit, GetResourceLimitCurrentValues and GetResourceLimitLimitValues. Note that the resource limits do not currently keep track of used objects, since we have no way to distinguish between an object created by the application, and an object created by some HLE module once we're inside Kernel::T::Create.
Diffstat (limited to 'src/core/hle/svc.cpp')
-rw-r--r--src/core/hle/svc.cpp49
1 files changed, 38 insertions, 11 deletions
diff --git a/src/core/hle/svc.cpp b/src/core/hle/svc.cpp
index 9bf886256..654ee2bf6 100644
--- a/src/core/hle/svc.cpp
+++ b/src/core/hle/svc.cpp
@@ -17,6 +17,7 @@
17#include "core/hle/kernel/event.h" 17#include "core/hle/kernel/event.h"
18#include "core/hle/kernel/mutex.h" 18#include "core/hle/kernel/mutex.h"
19#include "core/hle/kernel/process.h" 19#include "core/hle/kernel/process.h"
20#include "core/hle/kernel/resource_limit.h"
20#include "core/hle/kernel/semaphore.h" 21#include "core/hle/kernel/semaphore.h"
21#include "core/hle/kernel/shared_memory.h" 22#include "core/hle/kernel/shared_memory.h"
22#include "core/hle/kernel/thread.h" 23#include "core/hle/kernel/thread.h"
@@ -301,21 +302,47 @@ static void OutputDebugString(const char* string) {
301} 302}
302 303
303/// Get resource limit 304/// Get resource limit
304static ResultCode GetResourceLimit(Handle* resource_limit, Handle process) { 305static ResultCode GetResourceLimit(Handle* resource_limit, Handle process_handle) {
305 // With regards to proceess values: 306 LOG_TRACE(Kernel_SVC, "called process=0x%08X", process_handle);
306 // 0xFFFF8001 is a handle alias for the current KProcess, and 0xFFFF8000 is a handle alias for 307
307 // the current KThread. 308 SharedPtr<Kernel::Process> process = Kernel::g_handle_table.Get<Kernel::Process>(process_handle);
308 *resource_limit = 0xDEADBEEF; 309 if (process == nullptr)
309 LOG_ERROR(Kernel_SVC, "(UNIMPLEMENTED) called process=0x%08X", process); 310 return ERR_INVALID_HANDLE;
311
312 CASCADE_RESULT(*resource_limit, Kernel::g_handle_table.Create(process->resource_limit));
313
310 return RESULT_SUCCESS; 314 return RESULT_SUCCESS;
311} 315}
312 316
313/// Get resource limit current values 317/// Get resource limit current values
314static ResultCode GetResourceLimitCurrentValues(s64* values, Handle resource_limit, void* names, 318static ResultCode GetResourceLimitCurrentValues(s64* values, Handle resource_limit_handle, u32* names,
319 s32 name_count) {
320 LOG_TRACE(Kernel_SVC, "called resource_limit=%08X, names=%p, name_count=%d",
321 resource_limit_handle, names, name_count);
322
323 SharedPtr<Kernel::ResourceLimit> resource_limit = Kernel::g_handle_table.Get<Kernel::ResourceLimit>(resource_limit_handle);
324 if (resource_limit == nullptr)
325 return ERR_INVALID_HANDLE;
326
327 for (unsigned int i = 0; i < name_count; ++i)
328 values[i] = resource_limit->GetCurrentResourceValue(names[i]);
329
330 return RESULT_SUCCESS;
331}
332
333/// Get resource limit max values
334static ResultCode GetResourceLimitLimitValues(s64* values, Handle resource_limit_handle, u32* names,
315 s32 name_count) { 335 s32 name_count) {
316 LOG_ERROR(Kernel_SVC, "(UNIMPLEMENTED) called resource_limit=%08X, names=%p, name_count=%d", 336 LOG_TRACE(Kernel_SVC, "called resource_limit=%08X, names=%p, name_count=%d",
317 resource_limit, names, name_count); 337 resource_limit_handle, names, name_count);
318 values[0] = 0; // Normmatt: Set used memory to 0 for now 338
339 SharedPtr<Kernel::ResourceLimit> resource_limit = Kernel::g_handle_table.Get<Kernel::ResourceLimit>(resource_limit_handle);
340 if (resource_limit == nullptr)
341 return ERR_INVALID_HANDLE;
342
343 for (unsigned int i = 0; i < name_count; ++i)
344 values[i] = resource_limit->GetMaxResourceValue(names[i]);
345
319 return RESULT_SUCCESS; 346 return RESULT_SUCCESS;
320} 347}
321 348
@@ -707,7 +734,7 @@ static const FunctionDef SVC_Table[] = {
707 {0x36, HLE::Wrap<GetProcessIdOfThread>, "GetProcessIdOfThread"}, 734 {0x36, HLE::Wrap<GetProcessIdOfThread>, "GetProcessIdOfThread"},
708 {0x37, HLE::Wrap<GetThreadId>, "GetThreadId"}, 735 {0x37, HLE::Wrap<GetThreadId>, "GetThreadId"},
709 {0x38, HLE::Wrap<GetResourceLimit>, "GetResourceLimit"}, 736 {0x38, HLE::Wrap<GetResourceLimit>, "GetResourceLimit"},
710 {0x39, nullptr, "GetResourceLimitLimitValues"}, 737 {0x39, HLE::Wrap<GetResourceLimitLimitValues>, "GetResourceLimitLimitValues"},
711 {0x3A, HLE::Wrap<GetResourceLimitCurrentValues>, "GetResourceLimitCurrentValues"}, 738 {0x3A, HLE::Wrap<GetResourceLimitCurrentValues>, "GetResourceLimitCurrentValues"},
712 {0x3B, nullptr, "GetThreadContext"}, 739 {0x3B, nullptr, "GetThreadContext"},
713 {0x3C, nullptr, "Break"}, 740 {0x3C, nullptr, "Break"},