diff --git a/src/core/hle/ipc_helpers.h b/src/core/hle/ipc_helpers.h index e5b296d60..b58e33a69 100644 --- a/src/core/hle/ipc_helpers.h +++ b/src/core/hle/ipc_helpers.h @@ -142,6 +142,13 @@ void RequestBuilder::PushRaw(const T& value) { index += (sizeof(T) + 3) / 4; // round up to word length } +template <> +inline void RequestBuilder::Push(ResultCode value) { + // Result codes are actually 64-bit in the IPC buffer, but only the high part is discarded. + Push(value.raw); + Push(0); +} + template <> inline void RequestBuilder::Push(u8 value) { PushRaw(value); @@ -163,11 +170,6 @@ inline void RequestBuilder::Push(bool value) { Push(static_cast(value)); } -template <> -inline void RequestBuilder::Push(ResultCode value) { - Push(value.raw); -} - template void RequestBuilder::Push(const First& first_value, const Other&... other_values) { Push(first_value); diff --git a/src/core/hle/service/sm/sm.cpp b/src/core/hle/service/sm/sm.cpp index f1d93ea2b..509945136 100644 --- a/src/core/hle/service/sm/sm.cpp +++ b/src/core/hle/service/sm/sm.cpp @@ -107,7 +107,7 @@ void SM::GetService(Kernel::HLERequestContext& ctx) { auto client_port = service_manager->GetServicePort(name); if (client_port.Failed()) { - IPC::RequestBuilder rb = rp.MakeBuilder(1, 0, 0); + IPC::RequestBuilder rb = rp.MakeBuilder(2, 0, 0); rb.Push(client_port.Code()); LOG_ERROR(Service_SM, "called service=%s -> error 0x%08X", name.c_str(), client_port.Code().raw); @@ -120,7 +120,7 @@ void SM::GetService(Kernel::HLERequestContext& ctx) { LOG_DEBUG(Service_SM, "called service=%s -> session=%u", name.c_str(), (*session)->GetObjectId()); IPC::RequestBuilder rb = rp.MakeBuilder(2, 0, 1); - rb.Push(0); + rb.Push(session.Code()); rb.PushMoveObjects(std::move(session).Unwrap()); } }