[hle] remove redundant data on Request/Response builders

Signed-off-by: lizzie <lizzie@eden-emu.dev>
This commit is contained in:
lizzie 2026-03-25 00:15:45 +00:00
parent d1ceeeca22
commit 52f0d51053
28 changed files with 162 additions and 228 deletions

View file

@ -729,7 +729,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface(ensure_token_id); rb.PushIpcInterface(ctx, ensure_token_id);
} }
void LoadIdTokenCacheDeprecated(HLERequestContext& ctx) { void LoadIdTokenCacheDeprecated(HLERequestContext& ctx) {
@ -921,7 +921,7 @@ void Module::Interface::GetProfile(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IProfile>(system, user_id, *profile_manager); rb.PushIpcInterface<IProfile>(ctx, system, user_id, *profile_manager);
} }
void Module::Interface::IsUserRegistrationRequestPermitted(HLERequestContext& ctx) { void Module::Interface::IsUserRegistrationRequestPermitted(HLERequestContext& ctx) {
@ -993,7 +993,7 @@ void Module::Interface::GetBaasAccountManagerForApplication(HLERequestContext& c
LOG_DEBUG(Service_ACC, "called"); LOG_DEBUG(Service_ACC, "called");
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IManagerForApplication>(system, profile_manager); rb.PushIpcInterface<IManagerForApplication>(ctx, system, profile_manager);
} }
void Module::Interface::IsUserAccountSwitchLocked(HLERequestContext& ctx) { void Module::Interface::IsUserAccountSwitchLocked(HLERequestContext& ctx) {
@ -1089,7 +1089,7 @@ void Module::Interface::GetProfileEditor(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IProfileEditor>(system, user_id, *profile_manager); rb.PushIpcInterface<IProfileEditor>(ctx, system, user_id, *profile_manager);
} }
void Module::Interface::GetBaasAccountAdministrator(HLERequestContext &ctx) { void Module::Interface::GetBaasAccountAdministrator(HLERequestContext &ctx) {
@ -1100,7 +1100,7 @@ void Module::Interface::GetBaasAccountAdministrator(HLERequestContext &ctx) {
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IAdministrator>(system, uuid); rb.PushIpcInterface<IAdministrator>(ctx, system, uuid);
} }
void Module::Interface::ListQualifiedUsers(HLERequestContext& ctx) { void Module::Interface::ListQualifiedUsers(HLERequestContext& ctx) {
@ -1143,7 +1143,7 @@ void Module::Interface::GetBaasAccountManagerForSystemService(HLERequestContext&
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IManagerForSystemService>(system, uuid); rb.PushIpcInterface<IManagerForSystemService>(ctx, system, uuid);
} }
void Module::Interface::StoreSaveDataThumbnailSystem(HLERequestContext& ctx) { void Module::Interface::StoreSaveDataThumbnailSystem(HLERequestContext& ctx) {

View file

@ -32,7 +32,7 @@ void IAsyncContext::GetSystemEvent(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2, 1}; IPC::ResponseBuilder rb{ctx, 2, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushCopyObjects(completion_event->GetReadableEvent()); rb.PushCopyObjects(ctx, completion_event->GetReadableEvent());
} }
void IAsyncContext::Cancel(HLERequestContext& ctx) { void IAsyncContext::Cancel(HLERequestContext& ctx) {

View file

@ -82,7 +82,7 @@ void APM::OpenSession(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<ISession>(system, controller); rb.PushIpcInterface<ISession>(ctx, system, controller);
} }
void APM::GetPerformanceMode(HLERequestContext& ctx) { void APM::GetPerformanceMode(HLERequestContext& ctx) {
@ -125,7 +125,7 @@ void APM_Sys::GetPerformanceEvent(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<ISession>(system, controller); rb.PushIpcInterface<ISession>(ctx, system, controller);
} }
void APM_Sys::SetCpuBoostMode(HLERequestContext& ctx) { void APM_Sys::SetCpuBoostMode(HLERequestContext& ctx) {

View file

@ -45,7 +45,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IRequest>(system); rb.PushIpcInterface<IRequest>(ctx, system);
} }
}; };

View file

@ -184,7 +184,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 1}; IPC::ResponseBuilder rb{ctx, 2, 1};
rb.Push(readable_event.Signal()); rb.Push(readable_event.Signal());
rb.PushCopyObjects(readable_event); rb.PushCopyObjects(ctx, readable_event);
} }
void Cancel(HLERequestContext& ctx) { void Cancel(HLERequestContext& ctx) {
@ -400,7 +400,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 1}; IPC::ResponseBuilder rb{ctx, 2, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushCopyObjects(notification_event->GetReadableEvent()); rb.PushCopyObjects(ctx, notification_event->GetReadableEvent());
} }
void Clear(HLERequestContext& ctx) { void Clear(HLERequestContext& ctx) {
@ -476,7 +476,7 @@ private:
void Module::Interface::CreateFriendService(HLERequestContext& ctx) { void Module::Interface::CreateFriendService(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IFriendService>(system); rb.PushIpcInterface<IFriendService>(ctx, system);
LOG_DEBUG(Service_Friend, "called"); LOG_DEBUG(Service_Friend, "called");
} }
@ -488,12 +488,12 @@ void Module::Interface::CreateNotificationService(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<INotificationService>(system, uuid); rb.PushIpcInterface<INotificationService>(ctx, system, uuid);
} }
Module::Interface::Interface(std::shared_ptr<Module> module_, Core::System& system_, Module::Interface::Interface(std::shared_ptr<Module> module_, Core::System& system_, const char* name)
const char* name) : ServiceFramework{system_, name}, module{std::move(module_)}
: ServiceFramework{system_, name}, module{std::move(module_)} {} {}
Module::Interface::~Interface() = default; Module::Interface::~Interface() = default;

View file

@ -279,7 +279,7 @@ void ARP_W::AcquireRegistrar(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface(registrar); rb.PushIpcInterface(ctx, registrar);
} }
void ARP_W::UnregisterApplicationInstance(HLERequestContext& ctx) { void ARP_W::UnregisterApplicationInstance(HLERequestContext& ctx) {

View file

@ -28,7 +28,7 @@ void BGTC_T::OpenTaskService(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<ITaskService>(system); rb.PushIpcInterface<ITaskService>(ctx, system);
} }
ITaskService::ITaskService(Core::System& system_) : ServiceFramework{system_, "ITaskService"} { ITaskService::ITaskService(Core::System& system_) : ServiceFramework{system_, "ITaskService"} {

View file

@ -56,7 +56,7 @@ ECTX_AW::~ECTX_AW() = default;
void ECTX_AW::CreateContextRegistrar(HLERequestContext& ctx) { void ECTX_AW::CreateContextRegistrar(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IContextRegistrar>(std::make_shared<IContextRegistrar>(system)); rb.PushIpcInterface<IContextRegistrar>(ctx, system);
} }
} // namespace Service::Glue } // namespace Service::Glue

View file

@ -728,7 +728,7 @@ void IHidSystemServer::AcquireConnectionTriggerTimeoutEvent(HLERequestContext& c
IPC::ResponseBuilder rb{ctx, 2, 1}; IPC::ResponseBuilder rb{ctx, 2, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushCopyObjects(acquire_device_registered_event->GetReadableEvent()); rb.PushCopyObjects(ctx, acquire_device_registered_event->GetReadableEvent());
} }
void IHidSystemServer::AcquireDeviceRegisteredEventForControllerSupport(HLERequestContext& ctx) { void IHidSystemServer::AcquireDeviceRegisteredEventForControllerSupport(HLERequestContext& ctx) {
@ -736,7 +736,7 @@ void IHidSystemServer::AcquireDeviceRegisteredEventForControllerSupport(HLEReque
IPC::ResponseBuilder rb{ctx, 2, 1}; IPC::ResponseBuilder rb{ctx, 2, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushCopyObjects(acquire_device_registered_event->GetReadableEvent()); rb.PushCopyObjects(ctx, acquire_device_registered_event->GetReadableEvent());
} }
void IHidSystemServer::GetRegisteredDevices(HLERequestContext& ctx) { void IHidSystemServer::GetRegisteredDevices(HLERequestContext& ctx) {
@ -761,7 +761,7 @@ void IHidSystemServer::AcquireUniquePadConnectionEventHandle(HLERequestContext&
LOG_WARNING(Service_HID, "(STUBBED) called"); LOG_WARNING(Service_HID, "(STUBBED) called");
IPC::ResponseBuilder rb{ctx, 2, 1}; IPC::ResponseBuilder rb{ctx, 2, 1};
rb.PushCopyObjects(unique_pad_connection_event->GetReadableEvent()); rb.PushCopyObjects(ctx, unique_pad_connection_event->GetReadableEvent());
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
} }
@ -778,7 +778,7 @@ void IHidSystemServer::AcquireJoyDetachOnBluetoothOffEventHandle(HLERequestConte
IPC::ResponseBuilder rb{ctx, 2, 1}; IPC::ResponseBuilder rb{ctx, 2, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushCopyObjects(joy_detach_event->GetReadableEvent()); rb.PushCopyObjects(ctx, joy_detach_event->GetReadableEvent());
} }
void IHidSystemServer::IsUsbFullKeyControllerEnabled(HLERequestContext& ctx) { void IHidSystemServer::IsUsbFullKeyControllerEnabled(HLERequestContext& ctx) {

View file

@ -27,7 +27,7 @@ class Memory;
} }
namespace IPC { namespace IPC {
class ResponseBuilder; struct ResponseBuilder;
} }
namespace Service { namespace Service {
@ -390,7 +390,7 @@ public:
} }
private: private:
friend class IPC::ResponseBuilder; friend struct IPC::ResponseBuilder;
void ParseCommandBuffer(u32_le* src_cmdbuf, bool incoming); void ParseCommandBuffer(u32_le* src_cmdbuf, bool incoming);

View file

@ -24,45 +24,7 @@ namespace IPC {
constexpr Result ResultSessionClosed{ErrorModule::HIPC, 301}; constexpr Result ResultSessionClosed{ErrorModule::HIPC, 301};
class RequestHelperBase { struct ResponseBuilder {
protected:
Service::HLERequestContext* context = nullptr;
u32* cmdbuf;
u32 index = 0;
public:
explicit RequestHelperBase(u32* command_buffer) : cmdbuf(command_buffer) {}
explicit RequestHelperBase(Service::HLERequestContext& ctx)
: context(&ctx), cmdbuf(ctx.CommandBuffer()) {}
void Skip(u32 size_in_words, bool set_to_null) {
if (set_to_null) {
memset(cmdbuf + index, 0, size_in_words * sizeof(u32));
}
index += size_in_words;
}
/**
* Aligns the current position forward to a 16-byte boundary, padding with zeros.
*/
void AlignWithPadding() {
if (index & 3) {
Skip(static_cast<u32>(4 - (index & 3)), true);
}
}
u32 GetCurrentOffset() const {
return index;
}
void SetCurrentOffset(u32 offset) {
index = offset;
}
};
class ResponseBuilder : public RequestHelperBase {
public:
/// Flags used for customizing the behavior of ResponseBuilder /// Flags used for customizing the behavior of ResponseBuilder
enum class Flags : u32 { enum class Flags : u32 {
None = 0, None = 0,
@ -71,14 +33,13 @@ public:
AlwaysMoveHandles = 1, AlwaysMoveHandles = 1,
}; };
explicit ResponseBuilder(Service::HLERequestContext& ctx, u32 normal_params_size_, inline explicit ResponseBuilder(Service::HLERequestContext& ctx, u32 normal_params_size_, u32 num_handles_to_copy_ = 0, u32 num_objects_to_move_ = 0, Flags flags = Flags::None)
u32 num_handles_to_copy_ = 0, u32 num_objects_to_move_ = 0, : cmdbuf(ctx.CommandBuffer())
Flags flags = Flags::None) , normal_params_size(normal_params_size_)
: RequestHelperBase(ctx), normal_params_size(normal_params_size_), , num_handles_to_copy(num_handles_to_copy_)
num_handles_to_copy(num_handles_to_copy_), , num_objects_to_move(num_objects_to_move_)
num_objects_to_move(num_objects_to_move_), kernel{ctx.kernel} { {
std::memset(cmdbuf, 0, sizeof(u32) * IPC::COMMAND_BUFFER_LENGTH);
memset(cmdbuf, 0, sizeof(u32) * IPC::COMMAND_BUFFER_LENGTH);
IPC::CommandHeader header{}; IPC::CommandHeader header{};
auto const mgr = ctx.GetManager().get(); auto const mgr = ctx.GetManager().get();
@ -117,9 +78,7 @@ public:
handle_descriptor_header.num_handles_to_copy.Assign(num_handles_to_copy_); handle_descriptor_header.num_handles_to_copy.Assign(num_handles_to_copy_);
handle_descriptor_header.num_handles_to_move.Assign(num_handles_to_move); handle_descriptor_header.num_handles_to_move.Assign(num_handles_to_move);
PushRaw(handle_descriptor_header); PushRaw(handle_descriptor_header);
ctx.handles_offset = index; ctx.handles_offset = index;
Skip(num_handles_to_copy + num_handles_to_move, true); Skip(num_handles_to_copy + num_handles_to_move, true);
} }
@ -131,7 +90,6 @@ public:
domain_header.num_objects = num_domain_objects; domain_header.num_objects = num_domain_objects;
PushRaw(domain_header); PushRaw(domain_header);
} }
IPC::DataPayloadHeader data_payload_header{}; IPC::DataPayloadHeader data_payload_header{};
data_payload_header.magic = Common::MakeMagic('S', 'F', 'C', 'O'); data_payload_header.magic = Common::MakeMagic('S', 'F', 'C', 'O');
PushRaw(data_payload_header); PushRaw(data_payload_header);
@ -141,35 +99,39 @@ public:
ctx.data_payload_offset = index; ctx.data_payload_offset = index;
ctx.write_size += index; ctx.write_size += index;
ctx.domain_offset = static_cast<u32>(index + raw_data_size / sizeof(u32)); ctx.domain_offset = u32(index + raw_data_size / sizeof(u32));
} }
template <class T> inline void Skip(u32 size_in_words, bool set_to_null) {
void PushIpcInterface(std::shared_ptr<T> iface) { if (set_to_null) std::memset(cmdbuf + index, 0, size_in_words * sizeof(u32));
auto manager{context->GetManager()}; index += size_in_words;
}
/// @brief Aligns the current position forward to a 16-byte boundary, padding with zeros.
inline void AlignWithPadding() { if (index & 3) Skip(u32(4 - (index & 3)), true); }
inline u32 GetCurrentOffset() const { return index; }
inline void SetCurrentOffset(u32 offset) { index = offset; }
template <class T> inline void PushIpcInterface(Service::HLERequestContext& ctx, std::shared_ptr<T> iface) {
auto manager = ctx.GetManager();
if (manager->IsDomain()) { if (manager->IsDomain()) {
context->AddDomainObject(std::move(iface)); ctx.AddDomainObject(std::move(iface));
} else { } else {
ASSERT(Kernel::GetCurrentProcess(kernel).GetResourceLimit()->Reserve( ASSERT(Kernel::GetCurrentProcess(ctx.kernel).GetResourceLimit()->Reserve(Kernel::LimitableResource::SessionCountMax, 1));
Kernel::LimitableResource::SessionCountMax, 1));
auto* session = Kernel::KSession::Create(kernel); auto* session = Kernel::KSession::Create(ctx.kernel);
session->Initialize(nullptr, 0); session->Initialize(nullptr, 0);
Kernel::KSession::Register(kernel, session); Kernel::KSession::Register(ctx.kernel, session);
auto next_manager = std::make_shared<Service::SessionRequestManager>( auto next_manager = std::make_shared<Service::SessionRequestManager>(ctx.kernel, manager->GetServerManager());
kernel, manager->GetServerManager());
next_manager->SetSessionHandler(iface); next_manager->SetSessionHandler(iface);
manager->GetServerManager().RegisterSession(&session->GetServerSession(), next_manager); manager->GetServerManager().RegisterSession(&session->GetServerSession(), next_manager);
context->AddMoveObject(&session->GetClientSession()); ctx.AddMoveObject(&session->GetClientSession());
} }
} }
template <class T, class... Args> template <class T, class... Args> inline void PushIpcInterface(Service::HLERequestContext& ctx, Args&&... args) {
void PushIpcInterface(Args&&... args) { PushIpcInterface<T>(ctx, std::make_shared<T>(std::forward<Args>(args)...));
PushIpcInterface<T>(std::make_shared<T>(std::forward<Args>(args)...));
} }
void PushImpl(s8 value); void PushImpl(s8 value);
@ -185,59 +147,38 @@ public:
void PushImpl(bool value); void PushImpl(bool value);
void PushImpl(Result value); void PushImpl(Result value);
template <typename T> template <typename T> inline void Push(T value) {
void Push(T value) {
return PushImpl(value); return PushImpl(value);
} }
template <typename First, typename... Other> template <typename First, typename... Other>
void Push(const First& first_value, const Other&... other_values); void Push(const First& first_value, const Other&... other_values);
/** /// @brief Helper function for pushing strongly-typed enumeration values.
* Helper function for pushing strongly-typed enumeration values. /// @tparam Enum The enumeration type to be pushed
* /// @param value The value to push.
* @tparam Enum The enumeration type to be pushed /// @note The underlying size of the enumeration type is the size of the data that gets pushed.
* /// e.g. "enum class SomeEnum : u16" will push a u16-sized amount of data.
* @param value The value to push. template <typename Enum> inline void PushEnum(Enum value) {
*
* @note The underlying size of the enumeration type is the size of the
* data that gets pushed. e.g. "enum class SomeEnum : u16" will
* push a u16-sized amount of data.
*/
template <typename Enum>
void PushEnum(Enum value) {
static_assert(std::is_enum_v<Enum>, "T must be an enum type within a PushEnum call."); static_assert(std::is_enum_v<Enum>, "T must be an enum type within a PushEnum call.");
static_assert(!std::is_convertible_v<Enum, int>, static_assert(!std::is_convertible_v<Enum, int>, "enum type in PushEnum must be a strongly typed enum.");
"enum type in PushEnum must be a strongly typed enum.");
Push(static_cast<std::underlying_type_t<Enum>>(value)); Push(static_cast<std::underlying_type_t<Enum>>(value));
} }
/** /// @brief Copies the content of the given trivially copyable class to the buffer as a normal param
* @brief Copies the content of the given trivially copyable class to the buffer as a normal /// @note: The input class must be correctly packed/padded to fit hardware layout.
* param template <typename T> void PushRaw(const T& value);
* @note: The input class must be correctly packed/padded to fit hardware layout. template <typename... O> void PushMoveObjects(Service::HLERequestContext& ctx, O*... pointers);
*/ template <typename... O> void PushMoveObjects(Service::HLERequestContext& ctx, O&... pointers);
template <typename T> template <typename... O> void PushCopyObjects(Service::HLERequestContext& ctx, O*... pointers);
void PushRaw(const T& value); template <typename... O> void PushCopyObjects(Service::HLERequestContext& ctx, O&... pointers);
template <typename... O> u32* cmdbuf;
void PushMoveObjects(O*... pointers); u32 index = 0;
template <typename... O>
void PushMoveObjects(O&... pointers);
template <typename... O>
void PushCopyObjects(O*... pointers);
template <typename... O>
void PushCopyObjects(O&... pointers);
private:
u32 normal_params_size{}; u32 normal_params_size{};
u32 num_handles_to_copy{}; u32 num_handles_to_copy{};
u32 num_objects_to_move{}; ///< Domain objects or move handles, context dependent u32 num_objects_to_move{}; ///< Domain objects or move handles, context dependent
u32 data_payload_index{}; u32 data_payload_index{};
Kernel::KernelCore& kernel;
}; };
/// Push /// /// Push ///
@ -252,8 +193,7 @@ inline void ResponseBuilder::PushImpl(u32 value) {
template <typename T> template <typename T>
void ResponseBuilder::PushRaw(const T& value) { void ResponseBuilder::PushRaw(const T& value) {
static_assert(std::is_trivially_copyable_v<T>, static_assert(std::is_trivially_copyable_v<T>, "It's undefined behavior to use memcpy with non-trivially copyable objects");
"It's undefined behavior to use memcpy with non-trivially copyable objects");
std::memcpy(cmdbuf + index, &value, sizeof(T)); std::memcpy(cmdbuf + index, &value, sizeof(T));
index += (sizeof(T) + 3) / 4; // round up to word length index += (sizeof(T) + 3) / 4; // round up to word length
} }
@ -273,8 +213,8 @@ inline void ResponseBuilder::PushImpl(s16 value) {
} }
inline void ResponseBuilder::PushImpl(s64 value) { inline void ResponseBuilder::PushImpl(s64 value) {
PushImpl(static_cast<u32>(value)); PushImpl(u32(value));
PushImpl(static_cast<u32>(value >> 32)); PushImpl(u32(value >> 32));
} }
inline void ResponseBuilder::PushImpl(u8 value) { inline void ResponseBuilder::PushImpl(u8 value) {
@ -286,8 +226,8 @@ inline void ResponseBuilder::PushImpl(u16 value) {
} }
inline void ResponseBuilder::PushImpl(u64 value) { inline void ResponseBuilder::PushImpl(u64 value) {
PushImpl(static_cast<u32>(value)); PushImpl(u32(value));
PushImpl(static_cast<u32>(value >> 32)); PushImpl(u32(value >> 32));
} }
inline void ResponseBuilder::PushImpl(float value) { inline void ResponseBuilder::PushImpl(float value) {
@ -313,90 +253,88 @@ void ResponseBuilder::Push(const First& first_value, const Other&... other_value
} }
template <typename... O> template <typename... O>
inline void ResponseBuilder::PushCopyObjects(O*... pointers) { inline void ResponseBuilder::PushCopyObjects(Service::HLERequestContext& ctx, O*... pointers) {
auto objects = {pointers...}; auto objects = {pointers...};
for (auto& object : objects) { for (auto& object : objects) {
context->AddCopyObject(object); ctx.AddCopyObject(object);
} }
} }
template <typename... O> template <typename... O>
inline void ResponseBuilder::PushCopyObjects(O&... pointers) { inline void ResponseBuilder::PushCopyObjects(Service::HLERequestContext& ctx, O&... pointers) {
auto objects = {&pointers...}; auto objects = {&pointers...};
for (auto& object : objects) { for (auto& object : objects) {
context->AddCopyObject(object); ctx.AddCopyObject(object);
} }
} }
template <typename... O> template <typename... O>
inline void ResponseBuilder::PushMoveObjects(O*... pointers) { inline void ResponseBuilder::PushMoveObjects(Service::HLERequestContext& ctx, O*... pointers) {
auto objects = {pointers...}; auto objects = {pointers...};
for (auto& object : objects) { for (auto& object : objects) {
context->AddMoveObject(object); ctx.AddMoveObject(object);
} }
} }
template <typename... O> template <typename... O>
inline void ResponseBuilder::PushMoveObjects(O&... pointers) { inline void ResponseBuilder::PushMoveObjects(Service::HLERequestContext& ctx, O&... pointers) {
auto objects = {&pointers...}; auto objects = {&pointers...};
for (auto& object : objects) { for (auto& object : objects) {
context->AddMoveObject(object); ctx.AddMoveObject(object);
} }
} }
class RequestParser : public RequestHelperBase { struct RequestParser {
public: inline explicit RequestParser(u32* command_buffer) : cmdbuf(command_buffer) {}
explicit RequestParser(u32* command_buffer) : RequestHelperBase(command_buffer) {} inline explicit RequestParser(Service::HLERequestContext& ctx)
: cmdbuf(ctx.CommandBuffer())
explicit RequestParser(Service::HLERequestContext& ctx) : RequestHelperBase(ctx) { {
// TIPC does not have data payload offset // TIPC does not have data payload offset
if (!ctx.IsTipc()) { if (!ctx.IsTipc()) {
ASSERT_MSG(ctx.GetDataPayloadOffset(), "context is incomplete"); ASSERT_MSG(ctx.GetDataPayloadOffset(), "context is incomplete");
Skip(ctx.GetDataPayloadOffset(), false); Skip(ctx.GetDataPayloadOffset(), false);
} }
// Skip the u64 command id, it's already stored in the context // Skip the u64 command id, it's already stored in the context
static constexpr u32 CommandIdSize = 2; static constexpr u32 CommandIdSize = 2;
Skip(CommandIdSize, false); Skip(CommandIdSize, false);
} }
template <typename T> inline void Skip(u32 size_in_words, bool set_to_null) {
T Pop(); if (set_to_null) std::memset(cmdbuf + index, 0, size_in_words * sizeof(u32));
index += size_in_words;
}
/// @brief Aligns the current position forward to a 16-byte boundary, padding with zeros.
inline void AlignWithPadding() { if (index & 3) Skip(u32(4 - (index & 3)), true); }
inline u32 GetCurrentOffset() const { return index; }
inline void SetCurrentOffset(u32 offset) { index = offset; }
template <typename T> template <typename T> T Pop();
void Pop(T& value); template <typename T> void Pop(T& value);
template <typename First, typename... Other> void Pop(First& first_value, Other&... other_values);
template <typename First, typename... Other>
void Pop(First& first_value, Other&... other_values);
template <typename T> template <typename T>
T PopEnum() { T PopEnum() {
static_assert(std::is_enum_v<T>, "T must be an enum type within a PopEnum call."); static_assert(std::is_enum_v<T>, "T must be an enum type within a PopEnum call.");
static_assert(!std::is_convertible_v<T, int>, static_assert(!std::is_convertible_v<T, int>, "enum type in PopEnum must be a strongly typed enum.");
"enum type in PopEnum must be a strongly typed enum."); return T(Pop<std::underlying_type_t<T>>());
return static_cast<T>(Pop<std::underlying_type_t<T>>());
} }
/** /// @brief Reads the next normal parameters as a struct, by copying it
* @brief Reads the next normal parameters as a struct, by copying it /// @note: The output class must be correctly packed/padded to fit hardware layout.
* @note: The output class must be correctly packed/padded to fit hardware layout. template <typename T> void PopRaw(T& value);
*/
template <typename T>
void PopRaw(T& value);
/** /// @brief Reads the next normal parameters as a struct, by copying it into a new value
* @brief Reads the next normal parameters as a struct, by copying it into a new value /// @note: The output class must be correctly packed/padded to fit hardware layout.
* @note: The output class must be correctly packed/padded to fit hardware layout. template <typename T> T PopRaw();
*/
template <typename T>
T PopRaw();
template <class T> template <class T> [[nodiscard]] std::weak_ptr<T> PopIpcInterface(Service::HLERequestContext& ctx) {
std::weak_ptr<T> PopIpcInterface() { ASSERT(ctx.GetManager()->IsDomain());
ASSERT(context->GetManager()->IsDomain()); ASSERT(ctx.GetDomainMessageHeader().input_object_count > 0);
ASSERT(context->GetDomainMessageHeader().input_object_count > 0); return ctx.GetDomainHandler<T>(Pop<u32>() - 1);
return context->GetDomainHandler<T>(Pop<u32>() - 1);
} }
u32* cmdbuf;
u32 index = 0;
}; };
/// Pop /// /// Pop ///
@ -408,7 +346,7 @@ inline u32 RequestParser::Pop() {
template <> template <>
inline s32 RequestParser::Pop() { inline s32 RequestParser::Pop() {
return static_cast<s32>(Pop<u32>()); return s32(Pop<u32>());
} }
// Ignore the -Wclass-memaccess warning on memcpy for non-trivially default constructible objects. // Ignore the -Wclass-memaccess warning on memcpy for non-trivially default constructible objects.
@ -418,8 +356,7 @@ inline s32 RequestParser::Pop() {
#endif #endif
template <typename T> template <typename T>
void RequestParser::PopRaw(T& value) { void RequestParser::PopRaw(T& value) {
static_assert(std::is_trivially_copyable_v<T>, static_assert(std::is_trivially_copyable_v<T>, "It's undefined behavior to use memcpy with non-trivially copyable objects");
"It's undefined behavior to use memcpy with non-trivially copyable objects");
std::memcpy(&value, cmdbuf + index, sizeof(T)); std::memcpy(&value, cmdbuf + index, sizeof(T));
index += (sizeof(T) + 3) / 4; // round up to word length index += (sizeof(T) + 3) / 4; // round up to word length
} }

View file

@ -353,7 +353,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<ILogger>(system); rb.PushIpcInterface<ILogger>(ctx, system);
} }
}; };

View file

@ -151,7 +151,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IAm>(system); rb.PushIpcInterface<IAm>(ctx, system);
} }
}; };
@ -173,7 +173,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<MFIUser>(system); rb.PushIpcInterface<MFIUser>(ctx, system);
} }
}; };
@ -195,7 +195,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IUser>(system); rb.PushIpcInterface<IUser>(ctx, system);
} }
}; };
@ -217,7 +217,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<ISystem>(system); rb.PushIpcInterface<ISystem>(ctx, system);
} }
}; };

View file

@ -143,7 +143,7 @@ void NfcInterface::AttachAvailabilityChangeEvent(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2, 1}; IPC::ResponseBuilder rb{ctx, 2, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushCopyObjects(GetManager()->AttachAvailabilityChangeEvent()); rb.PushCopyObjects(ctx, GetManager()->AttachAvailabilityChangeEvent());
} }
void NfcInterface::StartDetection(HLERequestContext& ctx) { void NfcInterface::StartDetection(HLERequestContext& ctx) {
@ -203,7 +203,7 @@ void NfcInterface::AttachActivateEvent(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2, 1}; IPC::ResponseBuilder rb{ctx, 2, 1};
rb.Push(result); rb.Push(result);
rb.PushCopyObjects(out_event); rb.PushCopyObjects(ctx, out_event);
} }
void NfcInterface::AttachDeactivateEvent(HLERequestContext& ctx) { void NfcInterface::AttachDeactivateEvent(HLERequestContext& ctx) {
@ -217,7 +217,7 @@ void NfcInterface::AttachDeactivateEvent(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2, 1}; IPC::ResponseBuilder rb{ctx, 2, 1};
rb.Push(result); rb.Push(result);
rb.PushCopyObjects(out_event); rb.PushCopyObjects(ctx, out_event);
} }
void NfcInterface::SetNfcEnabled(HLERequestContext& ctx) { void NfcInterface::SetNfcEnabled(HLERequestContext& ctx) {

View file

@ -157,7 +157,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IUser>(system); rb.PushIpcInterface<IUser>(ctx, system);
} }
}; };
@ -179,7 +179,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<ISystem>(system); rb.PushIpcInterface<ISystem>(ctx, system);
} }
}; };
@ -201,7 +201,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IDebug>(system); rb.PushIpcInterface<IDebug>(ctx, system);
} }
}; };

View file

@ -297,7 +297,7 @@ private:
void GetSystemEventReadableHandle(HLERequestContext& ctx) { void GetSystemEventReadableHandle(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2, 2}; IPC::ResponseBuilder rb{ctx, 2, 2};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushCopyObjects(evt_scan_complete->GetReadableEvent(), rb.PushCopyObjects(ctx, evt_scan_complete->GetReadableEvent(),
evt_processing->GetReadableEvent()); evt_processing->GetReadableEvent());
} }
@ -457,7 +457,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 2}; IPC::ResponseBuilder rb{ctx, 2, 2};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushCopyObjects(event1->GetReadableEvent(), event2->GetReadableEvent()); rb.PushCopyObjects(ctx, event1->GetReadableEvent(), event2->GetReadableEvent());
} }
void Cancel(HLERequestContext& ctx) { void Cancel(HLERequestContext& ctx) {
@ -533,7 +533,7 @@ void IGeneralService::CreateScanRequest(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IScanRequest>(system); rb.PushIpcInterface<IScanRequest>(ctx, system);
} }
void IGeneralService::CreateRequest(HLERequestContext& ctx) { void IGeneralService::CreateRequest(HLERequestContext& ctx) {
@ -542,7 +542,7 @@ void IGeneralService::CreateRequest(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IRequest>(system); rb.PushIpcInterface<IRequest>(ctx, system);
} }
void IGeneralService::GetCurrentNetworkProfile(HLERequestContext& ctx) { void IGeneralService::GetCurrentNetworkProfile(HLERequestContext& ctx) {
@ -721,7 +721,7 @@ void IGeneralService::GetNetworkProfile(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2}; IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<INetworkProfile>(system); rb.PushIpcInterface<INetworkProfile>(ctx, system);
} }
void IGeneralService::SetNetworkProfile(HLERequestContext& ctx) { void IGeneralService::SetNetworkProfile(HLERequestContext& ctx) {
@ -874,7 +874,7 @@ void IGeneralService::CreateTemporaryNetworkProfile(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 6, 0, 1}; IPC::ResponseBuilder rb{ctx, 6, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<INetworkProfile>(system); rb.PushIpcInterface<INetworkProfile>(ctx, system);
rb.PushRaw<u128>(uuid); rb.PushRaw<u128>(uuid);
} }
@ -1129,7 +1129,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IGeneralService>(system); rb.PushIpcInterface<IGeneralService>(ctx, system);
} }
void CreateGeneralService(HLERequestContext& ctx) { void CreateGeneralService(HLERequestContext& ctx) {
@ -1137,7 +1137,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IGeneralService>(system); rb.PushIpcInterface<IGeneralService>(ctx, system);
} }
}; };

View file

@ -53,7 +53,7 @@ private:
LOG_WARNING(Service_NIM, "(STUBBED) called"); LOG_WARNING(Service_NIM, "(STUBBED) called");
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IShopServiceAsync>(system); rb.PushIpcInterface<IShopServiceAsync>(ctx, system);
} }
}; };
@ -75,7 +75,7 @@ private:
LOG_WARNING(Service_NIM, "(STUBBED) called"); LOG_WARNING(Service_NIM, "(STUBBED) called");
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IShopServiceAccessor>(system); rb.PushIpcInterface<IShopServiceAccessor>(ctx, system);
} }
}; };
@ -336,7 +336,7 @@ private:
LOG_DEBUG(Service_NIM, "(STUBBED) called"); LOG_DEBUG(Service_NIM, "(STUBBED) called");
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IShopServiceAccessServer>(system); rb.PushIpcInterface<IShopServiceAccessServer>(ctx, system);
} }
void IsLargeResourceAvailable(HLERequestContext& ctx) { void IsLargeResourceAvailable(HLERequestContext& ctx) {
@ -356,7 +356,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IShopServiceAccessServer>(system); rb.PushIpcInterface<IShopServiceAccessServer>(ctx, system);
} }
}; };
@ -439,7 +439,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 1}; IPC::ResponseBuilder rb{ctx, 2, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushCopyObjects(finished_event->GetReadableEvent()); rb.PushCopyObjects(ctx, finished_event->GetReadableEvent());
} }
void GetResult(HLERequestContext& ctx) { void GetResult(HLERequestContext& ctx) {
@ -500,7 +500,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IEnsureNetworkClockAvailabilityService>(system); rb.PushIpcInterface<IEnsureNetworkClockAvailabilityService>(ctx, system);
} }
// TODO(ogniK): Do we need these? // TODO(ogniK): Do we need these?

View file

@ -359,8 +359,8 @@ void IReadOnlyApplicationControlDataInterface::ListApplicationTitle(HLERequestCo
IPC::ResponseBuilder rb{ctx, 2, 1, 1}; IPC::ResponseBuilder rb{ctx, 2, 1, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushCopyObjects(async_value->ReadableEvent()); rb.PushCopyObjects(ctx, async_value->ReadableEvent());
rb.PushIpcInterface(std::move(async_value)); rb.PushIpcInterface(ctx, std::move(async_value));
} }
Result IReadOnlyApplicationControlDataInterface::GetApplicationControlData3( Result IReadOnlyApplicationControlDataInterface::GetApplicationControlData3(

View file

@ -199,7 +199,7 @@ void NVDRV::QueryEvent(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 3, 1}; IPC::ResponseBuilder rb{ctx, 3, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
auto& readable_event = event->GetReadableEvent(); auto& readable_event = event->GetReadableEvent();
rb.PushCopyObjects(readable_event); rb.PushCopyObjects(ctx, readable_event);
rb.PushEnum(NvResult::Success); rb.PushEnum(NvResult::Success);
} else { } else {
LOG_ERROR(Service_NVDRV, "Invalid event request!"); LOG_ERROR(Service_NVDRV, "Invalid event request!");

View file

@ -124,7 +124,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IClkrstSession>(system, device_code); rb.PushIpcInterface<IClkrstSession>(ctx, system, device_code);
} }
}; };

View file

@ -162,7 +162,7 @@ private:
IPC::ResponseBuilder rb{ctx, 10, 1}; IPC::ResponseBuilder rb{ctx, 10, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushCopyObjects(*process); rb.PushCopyObjects(ctx, *process);
rb.PushRaw(program_location); rb.PushRaw(program_location);
rb.PushRaw(override_status); rb.PushRaw(override_status);
} }

View file

@ -142,7 +142,7 @@ void IAlarmService::CreateWakeupAlarm(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<ISteadyClockAlarm>(system, m_alarms, AlarmType::WakeupAlarm); rb.PushIpcInterface<ISteadyClockAlarm>(ctx, system, m_alarms, AlarmType::WakeupAlarm);
} }
void IAlarmService::CreateBackgroundTaskAlarm(HLERequestContext& ctx) { void IAlarmService::CreateBackgroundTaskAlarm(HLERequestContext& ctx) {
@ -150,7 +150,7 @@ void IAlarmService::CreateBackgroundTaskAlarm(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<ISteadyClockAlarm>(system, m_alarms, AlarmType::BackgroundTaskAlarm); rb.PushIpcInterface<ISteadyClockAlarm>(ctx, system, m_alarms, AlarmType::BackgroundTaskAlarm);
} }
ISteadyClockAlarm::ISteadyClockAlarm(Core::System& system_, Alarms& alarms, AlarmType type) ISteadyClockAlarm::ISteadyClockAlarm(Core::System& system_, Alarms& alarms, AlarmType type)
@ -174,7 +174,7 @@ void ISteadyClockAlarm::GetAlarmEvent(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2, 1}; IPC::ResponseBuilder rb{ctx, 2, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushCopyObjects(m_alarm.GetEventHandle()); rb.PushCopyObjects(ctx, m_alarm.GetEventHandle());
} }
void ISteadyClockAlarm::Enable(HLERequestContext& ctx) { void ISteadyClockAlarm::Enable(HLERequestContext& ctx) {

View file

@ -65,7 +65,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 1}; IPC::ResponseBuilder rb{ctx, 2, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushCopyObjects(state_change_event->GetReadableEvent()); rb.PushCopyObjects(ctx, state_change_event->GetReadableEvent());
} }
void UnbindStateChangeEvent(HLERequestContext& ctx) { void UnbindStateChangeEvent(HLERequestContext& ctx) {
@ -184,7 +184,7 @@ void PSM::OpenSession(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IPsmSession>(system); rb.PushIpcInterface<IPsmSession>(ctx, system);
} }
} // namespace Service::PTM } // namespace Service::PTM

View file

@ -82,7 +82,7 @@ void TS::OpenSession(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<ISession>(system); rb.PushIpcInterface<ISession>(ctx, system);
} }
} // namespace Service::PTM } // namespace Service::PTM

View file

@ -136,7 +136,7 @@ void SM::GetServiceCmif(HLERequestContext& ctx) {
if (result == ResultSuccess) { if (result == ResultSuccess) {
IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles}; IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles};
rb.Push(result); rb.Push(result);
rb.PushMoveObjects(client_session); rb.PushMoveObjects(ctx, client_session);
} else { } else {
IPC::ResponseBuilder rb{ctx, 2}; IPC::ResponseBuilder rb{ctx, 2};
rb.Push(result); rb.Push(result);
@ -153,7 +153,7 @@ void SM::GetServiceTipc(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles}; IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles};
rb.Push(result); rb.Push(result);
rb.PushMoveObjects(result == ResultSuccess ? client_session : nullptr); rb.PushMoveObjects(ctx, result == ResultSuccess ? client_session : nullptr);
} }
static std::string PopServiceName(IPC::RequestParser& rp) { static std::string PopServiceName(IPC::RequestParser& rp) {
@ -226,8 +226,7 @@ void SM::RegisterServiceImpl(HLERequestContext& ctx, std::string name, u32 max_s
max_session_count, is_light); max_session_count, is_light);
Kernel::KServerPort* server_port{}; Kernel::KServerPort* server_port{};
if (const auto result = service_manager.RegisterService(std::addressof(server_port), name, if (const auto result = service_manager.RegisterService(std::addressof(server_port), name, max_session_count, nullptr);
max_session_count, nullptr);
result.IsError()) { result.IsError()) {
LOG_ERROR(Service_SM, "failed to register service with error_code={:08X}", result.raw); LOG_ERROR(Service_SM, "failed to register service with error_code={:08X}", result.raw);
IPC::ResponseBuilder rb{ctx, 2}; IPC::ResponseBuilder rb{ctx, 2};
@ -237,7 +236,7 @@ void SM::RegisterServiceImpl(HLERequestContext& ctx, std::string name, u32 max_s
IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles}; IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushMoveObjects(server_port); rb.PushMoveObjects(ctx, server_port);
} }
void SM::UnregisterService(HLERequestContext& ctx) { void SM::UnregisterService(HLERequestContext& ctx) {

View file

@ -61,7 +61,7 @@ void Controller::CloneCurrentObject(HLERequestContext& ctx) {
// We succeeded. // We succeeded.
IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles}; IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushMoveObjects(session->GetClientSession()); rb.PushMoveObjects(ctx, session->GetClientSession());
} }
void Controller::CloneCurrentObjectEx(HLERequestContext& ctx) { void Controller::CloneCurrentObjectEx(HLERequestContext& ctx) {

View file

@ -546,8 +546,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(res); rb.Push(res);
if (res == ResultSuccess) { if (res == ResultSuccess) {
rb.PushIpcInterface<ISslConnection>(system, ssl_version, shared_data, rb.PushIpcInterface<ISslConnection>(ctx, system, ssl_version, shared_data, std::move(backend));
std::move(backend));
} }
} }
@ -627,12 +626,11 @@ private:
IPC::RequestParser rp{ctx}; IPC::RequestParser rp{ctx};
const auto parameters = rp.PopRaw<Parameters>(); const auto parameters = rp.PopRaw<Parameters>();
LOG_WARNING(Service_SSL, "(STUBBED) called, api_version={}, pid_placeholder={}", LOG_WARNING(Service_SSL, "(STUBBED) called, api_version={}, pid_placeholder={}", parameters.ssl_version.api_version, parameters.pid_placeholder);
parameters.ssl_version.api_version, parameters.pid_placeholder);
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<ISslContext>(system, parameters.ssl_version); rb.PushIpcInterface<ISslContext>(ctx, system, parameters.ssl_version);
} }
void SetInterfaceVersion(HLERequestContext& ctx) { void SetInterfaceVersion(HLERequestContext& ctx) {

View file

@ -155,7 +155,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IPdSession>(system); rb.PushIpcInterface<IPdSession>(ctx, system);
} }
}; };
@ -199,7 +199,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
rb.PushIpcInterface<IPdCradleSession>(system); rb.PushIpcInterface<IPdCradleSession>(ctx, system);
} }
}; };