summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2018-01-23 22:33:30 -0500
committerGravatar bunnei2018-01-24 22:24:20 -0500
commit714a57611397abecf95cdfbe8295ece64e66b3b7 (patch)
treeda70a95761bff5e988c7a8c47e5d0a74a144a424 /src
parenttime: Stub GetSystemClockContext function. (diff)
downloadyuzu-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.h27
-rw-r--r--src/core/hle/service/sm/controller.cpp2
-rw-r--r--src/core/hle/service/sm/sm.cpp3
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 {
58public: 58public:
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
23void Controller::DuplicateSession(Kernel::HLERequestContext& ctx) { 23void 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 }