From 714a57611397abecf95cdfbe8295ece64e66b3b7 Mon Sep 17 00:00:00 2001 From: bunnei Date: Tue, 23 Jan 2018 22:33:30 -0500 Subject: [PATCH] ResponseBuilder: Use a bit field for customizing instead of always_move_handles. --- src/core/hle/ipc_helpers.h | 27 +++++++++++++++++--------- src/core/hle/service/sm/controller.cpp | 2 +- src/core/hle/service/sm/sm.cpp | 3 ++- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/core/hle/ipc_helpers.h b/src/core/hle/ipc_helpers.h index 8a7fa25c8..6066d8a18 100644 --- a/src/core/hle/ipc_helpers.h +++ b/src/core/hle/ipc_helpers.h @@ -58,14 +58,22 @@ class ResponseBuilder : public RequestHelperBase { public: ResponseBuilder(u32* command_buffer) : RequestHelperBase(command_buffer) {} - u32 normal_params_size; - u32 num_handles_to_copy; - u32 num_objects_to_move; ///< Domain objects or move handles, context dependent - std::ptrdiff_t datapayload_index; + u32 normal_params_size{}; + u32 num_handles_to_copy{}; + u32 num_objects_to_move{}; ///< Domain objects or move handles, context dependent + std::ptrdiff_t datapayload_index{}; + + /// Flags used for customizing the behavior of ResponseBuilder + enum class Flags : u32 { + None = 0, + /// Uses move handles to move objects in the response, even when in a domain. This is + /// required when PushMoveObjects is used. + AlwaysMoveHandles = 1, + }; ResponseBuilder(Kernel::HLERequestContext& context, u32 normal_params_size, u32 num_handles_to_copy = 0, u32 num_objects_to_move = 0, - bool always_move_handles = false) + Flags flags = Flags::None) : RequestHelperBase(context), normal_params_size(normal_params_size), num_handles_to_copy(num_handles_to_copy), num_objects_to_move(num_objects_to_move) { @@ -82,7 +90,8 @@ public: u32 num_handles_to_move{}; u32 num_domain_objects{}; - + const bool always_move_handles{ + (static_cast(flags) & static_cast(Flags::AlwaysMoveHandles)) != 0}; if (!context.Session()->IsDomain() || always_move_handles) { num_handles_to_move = num_objects_to_move; } else { @@ -255,9 +264,9 @@ public: } ResponseBuilder MakeBuilder(u32 normal_params_size, u32 num_handles_to_copy, - u32 num_handles_to_move, bool always_move_handles = false) { - return {*context, normal_params_size, num_handles_to_copy, num_handles_to_move, - always_move_handles}; + u32 num_handles_to_move, + ResponseBuilder::Flags flags = ResponseBuilder::Flags::None) { + return {*context, normal_params_size, num_handles_to_copy, num_handles_to_move, flags}; } template diff --git a/src/core/hle/service/sm/controller.cpp b/src/core/hle/service/sm/controller.cpp index 79700b7b2..a81ff9f49 100644 --- a/src/core/hle/service/sm/controller.cpp +++ b/src/core/hle/service/sm/controller.cpp @@ -21,7 +21,7 @@ void Controller::ConvertSessionToDomain(Kernel::HLERequestContext& ctx) { } void Controller::DuplicateSession(Kernel::HLERequestContext& ctx) { - IPC::ResponseBuilder rb{ctx, 2, 0, 1, true}; + IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles}; rb.Push(RESULT_SUCCESS); rb.PushMoveObjects(ctx.Session()); diff --git a/src/core/hle/service/sm/sm.cpp b/src/core/hle/service/sm/sm.cpp index eeee4a029..73aa013e3 100644 --- a/src/core/hle/service/sm/sm.cpp +++ b/src/core/hle/service/sm/sm.cpp @@ -112,7 +112,8 @@ void SM::GetService(Kernel::HLERequestContext& ctx) { if (session.Succeeded()) { LOG_DEBUG(Service_SM, "called service=%s -> session=%u", name.c_str(), (*session)->GetObjectId()); - IPC::ResponseBuilder rb = rp.MakeBuilder(2, 0, 1, true); + IPC::ResponseBuilder rb = + rp.MakeBuilder(2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles); rb.Push(session.Code()); rb.PushMoveObjects(std::move(session).Unwrap()); }