|
@@ -2,6 +2,7 @@
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
|
|
|
|
#include "core/hle/kernel/k_handle_table.h"
|
|
#include "core/hle/kernel/k_handle_table.h"
|
|
|
|
|
+#include "core/hle/kernel/k_process.h"
|
|
|
|
|
|
|
|
namespace Kernel {
|
|
namespace Kernel {
|
|
|
|
|
|
|
@@ -82,6 +83,22 @@ Result KHandleTable::Add(Handle* out_handle, KAutoObject* obj) {
|
|
|
R_SUCCEED();
|
|
R_SUCCEED();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+KScopedAutoObject<KAutoObject> KHandleTable::GetObjectForIpc(Handle handle,
|
|
|
|
|
+ KThread* cur_thread) const {
|
|
|
|
|
+ // Handle pseudo-handles.
|
|
|
|
|
+ ASSERT(cur_thread != nullptr);
|
|
|
|
|
+ if (handle == Svc::PseudoHandle::CurrentProcess) {
|
|
|
|
|
+ auto* const cur_process = cur_thread->GetOwnerProcess();
|
|
|
|
|
+ ASSERT(cur_process != nullptr);
|
|
|
|
|
+ return cur_process;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (handle == Svc::PseudoHandle::CurrentThread) {
|
|
|
|
|
+ return cur_thread;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return GetObjectForIpcWithoutPseudoHandle(handle);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
Result KHandleTable::Reserve(Handle* out_handle) {
|
|
Result KHandleTable::Reserve(Handle* out_handle) {
|
|
|
KScopedDisableDispatch dd{m_kernel};
|
|
KScopedDisableDispatch dd{m_kernel};
|
|
|
KScopedSpinLock lk(m_lock);
|
|
KScopedSpinLock lk(m_lock);
|