diff options
| author | 2018-01-23 22:33:30 -0500 | |
|---|---|---|
| committer | 2018-01-24 22:24:20 -0500 | |
| commit | 714a57611397abecf95cdfbe8295ece64e66b3b7 (patch) | |
| tree | da70a95761bff5e988c7a8c47e5d0a74a144a424 /src | |
| parent | time: Stub GetSystemClockContext function. (diff) | |
| download | yuzu-714a57611397abecf95cdfbe8295ece64e66b3b7.tar.gz yuzu-714a57611397abecf95cdfbe8295ece64e66b3b7.tar.xz yuzu-714a57611397abecf95cdfbe8295ece64e66b3b7.zip | |
ResponseBuilder: Use a bit field for customizing instead of always_move_handles.
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/ipc_helpers.h | 27 | ||||
| -rw-r--r-- | src/core/hle/service/sm/controller.cpp | 2 | ||||
| -rw-r--r-- | 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 { | |||
| 58 | public: | 58 | public: |
| 59 | ResponseBuilder(u32* command_buffer) : RequestHelperBase(command_buffer) {} | 59 | ResponseBuilder(u32* command_buffer) : RequestHelperBase(command_buffer) {} |
| 60 | 60 | ||
| 61 | u32 normal_params_size; | 61 | u32 normal_params_size{}; |
| 62 | u32 num_handles_to_copy; | 62 | u32 num_handles_to_copy{}; |
| 63 | u32 num_objects_to_move; ///< Domain objects or move handles, context dependent | 63 | u32 num_objects_to_move{}; ///< Domain objects or move handles, context dependent |
| 64 | std::ptrdiff_t datapayload_index; | 64 | std::ptrdiff_t datapayload_index{}; |
| 65 | |||
| 66 | /// Flags used for customizing the behavior of ResponseBuilder | ||
| 67 | enum class Flags : u32 { | ||
| 68 | None = 0, | ||
| 69 | /// Uses move handles to move objects in the response, even when in a domain. This is | ||
| 70 | /// required when PushMoveObjects is used. | ||
| 71 | AlwaysMoveHandles = 1, | ||
| 72 | }; | ||
| 65 | 73 | ||
| 66 | ResponseBuilder(Kernel::HLERequestContext& context, u32 normal_params_size, | 74 | ResponseBuilder(Kernel::HLERequestContext& context, u32 normal_params_size, |
| 67 | u32 num_handles_to_copy = 0, u32 num_objects_to_move = 0, | 75 | u32 num_handles_to_copy = 0, u32 num_objects_to_move = 0, |
| 68 | bool always_move_handles = false) | 76 | Flags flags = Flags::None) |
| 69 | 77 | ||
| 70 | : RequestHelperBase(context), normal_params_size(normal_params_size), | 78 | : RequestHelperBase(context), normal_params_size(normal_params_size), |
| 71 | num_handles_to_copy(num_handles_to_copy), num_objects_to_move(num_objects_to_move) { | 79 | num_handles_to_copy(num_handles_to_copy), num_objects_to_move(num_objects_to_move) { |
| @@ -82,7 +90,8 @@ public: | |||
| 82 | 90 | ||
| 83 | u32 num_handles_to_move{}; | 91 | u32 num_handles_to_move{}; |
| 84 | u32 num_domain_objects{}; | 92 | u32 num_domain_objects{}; |
| 85 | 93 | const bool always_move_handles{ | |
| 94 | (static_cast<u32>(flags) & static_cast<u32>(Flags::AlwaysMoveHandles)) != 0}; | ||
| 86 | if (!context.Session()->IsDomain() || always_move_handles) { | 95 | if (!context.Session()->IsDomain() || always_move_handles) { |
| 87 | num_handles_to_move = num_objects_to_move; | 96 | num_handles_to_move = num_objects_to_move; |
| 88 | } else { | 97 | } else { |
| @@ -255,9 +264,9 @@ public: | |||
| 255 | } | 264 | } |
| 256 | 265 | ||
| 257 | ResponseBuilder MakeBuilder(u32 normal_params_size, u32 num_handles_to_copy, | 266 | ResponseBuilder MakeBuilder(u32 normal_params_size, u32 num_handles_to_copy, |
| 258 | u32 num_handles_to_move, bool always_move_handles = false) { | 267 | u32 num_handles_to_move, |
| 259 | return {*context, normal_params_size, num_handles_to_copy, num_handles_to_move, | 268 | ResponseBuilder::Flags flags = ResponseBuilder::Flags::None) { |
| 260 | always_move_handles}; | 269 | return {*context, normal_params_size, num_handles_to_copy, num_handles_to_move, flags}; |
| 261 | } | 270 | } |
| 262 | 271 | ||
| 263 | template <typename T> | 272 | template <typename T> |
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) { | |||
| 21 | } | 21 | } |
| 22 | 22 | ||
| 23 | void Controller::DuplicateSession(Kernel::HLERequestContext& ctx) { | 23 | void Controller::DuplicateSession(Kernel::HLERequestContext& ctx) { |
| 24 | IPC::ResponseBuilder rb{ctx, 2, 0, 1, true}; | 24 | IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles}; |
| 25 | rb.Push(RESULT_SUCCESS); | 25 | rb.Push(RESULT_SUCCESS); |
| 26 | rb.PushMoveObjects(ctx.Session()); | 26 | rb.PushMoveObjects(ctx.Session()); |
| 27 | 27 | ||
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) { | |||
| 112 | if (session.Succeeded()) { | 112 | if (session.Succeeded()) { |
| 113 | LOG_DEBUG(Service_SM, "called service=%s -> session=%u", name.c_str(), | 113 | LOG_DEBUG(Service_SM, "called service=%s -> session=%u", name.c_str(), |
| 114 | (*session)->GetObjectId()); | 114 | (*session)->GetObjectId()); |
| 115 | IPC::ResponseBuilder rb = rp.MakeBuilder(2, 0, 1, true); | 115 | IPC::ResponseBuilder rb = |
| 116 | rp.MakeBuilder(2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles); | ||
| 116 | rb.Push(session.Code()); | 117 | rb.Push(session.Code()); |
| 117 | rb.PushMoveObjects(std::move(session).Unwrap()); | 118 | rb.PushMoveObjects(std::move(session).Unwrap()); |
| 118 | } | 119 | } |