|
|
@ -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);
|
|
|
|