summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel
diff options
context:
space:
mode:
authorGravatar Lioncash2018-12-02 02:00:11 -0500
committerGravatar Lioncash2018-12-02 03:41:49 -0500
commit7fe27de26e341651a47f540e3ae0be46ed9ec974 (patch)
tree5657b2824c89590e4cccd2908b997eac8f0d53cd /src/core/hle/kernel
parentsvc: Reorganize svcGetInfo, handle more error cases for existing implemented ... (diff)
downloadyuzu-7fe27de26e341651a47f540e3ae0be46ed9ec974.tar.gz
yuzu-7fe27de26e341651a47f540e3ae0be46ed9ec974.tar.xz
yuzu-7fe27de26e341651a47f540e3ae0be46ed9ec974.zip
svc: Use the current process' handle table for retrieving the process instance to act upon
The kernel uses the handle table of the current process to retrieve the process that should be used to retrieve certain information. To someone not familiar with the kernel, this might raise the question of "Ok, sounds nice, but doesn't this make it impossible to retrieve information about the current process?". No, it doesn't, because HandleTable instances in the kernel have the notion of a "pseudo-handle", where certain values allow the kernel to lookup objects outside of a given handle table. Currently, there's only a pseudo-handle for the current process (0xFFFF8001) and a pseudo-handle for the current thread (0xFFFF8000), so to retrieve the current process, one would just pass 0xFFFF8001 into svcGetInfo. The lookup itself in the handle table would be something like: template <typename T> T* Lookup(Handle handle) { if (handle == PSEUDO_HANDLE_CURRENT_PROCESS) { return CurrentProcess(); } if (handle == PSUEDO_HANDLE_CURRENT_THREAD) { return CurrentThread(); } return static_cast<T*>(&objects[handle]); } which, as is shown, allows accessing the current process or current thread, even if those two objects aren't actually within the HandleTable instance.
Diffstat (limited to 'src/core/hle/kernel')
-rw-r--r--src/core/hle/kernel/svc.cpp3
1 files changed, 2 insertions, 1 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index 2a7477247..aafd16800 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -705,7 +705,8 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id)
705 return ERR_INVALID_ENUM_VALUE; 705 return ERR_INVALID_ENUM_VALUE;
706 } 706 }
707 707
708 const auto* process = Core::CurrentProcess(); 708 const auto& current_process_handle_table = Core::CurrentProcess()->GetHandleTable();
709 const auto process = current_process_handle_table.Get<Process>(static_cast<Handle>(handle));
709 if (!process) { 710 if (!process) {
710 return ERR_INVALID_HANDLE; 711 return ERR_INVALID_HANDLE;
711 } 712 }