summaryrefslogtreecommitdiffstats
path: root/src/core/hle/ipc_helpers.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/ipc_helpers.h')
-rw-r--r--src/core/hle/ipc_helpers.h47
1 files changed, 15 insertions, 32 deletions
diff --git a/src/core/hle/ipc_helpers.h b/src/core/hle/ipc_helpers.h
index 497f35d23..61bda3786 100644
--- a/src/core/hle/ipc_helpers.h
+++ b/src/core/hle/ipc_helpers.h
@@ -80,16 +80,12 @@ public:
memset(cmdbuf, 0, sizeof(u32) * IPC::COMMAND_BUFFER_LENGTH);
- ctx.ClearIncomingObjects();
-
IPC::CommandHeader header{};
// The entire size of the raw data section in u32 units, including the 16 bytes of mandatory
// padding.
- u32 raw_data_size = ctx.IsTipc()
- ? normal_params_size - 1
- : sizeof(IPC::DataPayloadHeader) / 4 + 4 + normal_params_size;
-
+ u32 raw_data_size = ctx.write_size =
+ ctx.IsTipc() ? normal_params_size - 1 : normal_params_size;
u32 num_handles_to_move{};
u32 num_domain_objects{};
const bool always_move_handles{
@@ -101,16 +97,20 @@ public:
}
if (ctx.Session()->IsDomain()) {
- raw_data_size += static_cast<u32>(sizeof(DomainMessageHeader) / 4 + num_domain_objects);
+ raw_data_size +=
+ static_cast<u32>(sizeof(DomainMessageHeader) / sizeof(u32) + num_domain_objects);
+ ctx.write_size += num_domain_objects;
}
if (ctx.IsTipc()) {
header.type.Assign(ctx.GetCommandType());
+ } else {
+ raw_data_size += static_cast<u32>(sizeof(IPC::DataPayloadHeader) / sizeof(u32) + 4 +
+ normal_params_size);
}
- ctx.data_size = static_cast<u32>(raw_data_size);
- header.data_size.Assign(static_cast<u32>(raw_data_size));
- if (num_handles_to_copy != 0 || num_handles_to_move != 0) {
+ header.data_size.Assign(raw_data_size);
+ if (num_handles_to_copy || num_handles_to_move) {
header.enable_handle_descriptor.Assign(1);
}
PushRaw(header);
@@ -143,7 +143,8 @@ public:
data_payload_index = index;
ctx.data_payload_offset = index;
- ctx.domain_offset = index + raw_data_size / 4;
+ ctx.write_size += index;
+ ctx.domain_offset = static_cast<u32>(index + raw_data_size / sizeof(u32));
}
template <class T>
@@ -151,8 +152,8 @@ public:
if (context->Session()->IsDomain()) {
context->AddDomainObject(std::move(iface));
} else {
- // kernel.CurrentProcess()->GetResourceLimit()->Reserve(
- // Kernel::LimitableResource::Sessions, 1);
+ kernel.CurrentProcess()->GetResourceLimit()->Reserve(
+ Kernel::LimitableResource::Sessions, 1);
auto* session = Kernel::KSession::Create(kernel);
session->Initialize(nullptr, iface->GetServiceName());
@@ -167,24 +168,6 @@ public:
PushIpcInterface<T>(std::make_shared<T>(std::forward<Args>(args)...));
}
- void ValidateHeader() {
- const std::size_t num_domain_objects = context->NumDomainObjects();
- const std::size_t num_move_objects = context->NumMoveObjects();
- ASSERT_MSG(!num_domain_objects || !num_move_objects,
- "cannot move normal handles and domain objects");
- ASSERT_MSG((index - data_payload_index) == normal_params_size,
- "normal_params_size value is incorrect");
- ASSERT_MSG((num_domain_objects + num_move_objects) == num_objects_to_move,
- "num_objects_to_move value is incorrect");
- ASSERT_MSG(context->NumCopyObjects() == num_handles_to_copy,
- "num_handles_to_copy value is incorrect");
- }
-
- // Validate on destruction, as there shouldn't be any case where we don't want it
- ~ResponseBuilder() {
- ValidateHeader();
- }
-
void PushImpl(s8 value);
void PushImpl(s16 value);
void PushImpl(s32 value);
@@ -404,7 +387,7 @@ public:
std::shared_ptr<T> PopIpcInterface() {
ASSERT(context->Session()->IsDomain());
ASSERT(context->GetDomainMessageHeader().input_object_count > 0);
- return context->GetDomainRequestHandler<T>(Pop<u32>() - 1);
+ return context->GetDomainHandler<T>(Pop<u32>() - 1);
}
};