diff --git a/stratosphere/libstratosphere/include/stratosphere.hpp b/stratosphere/libstratosphere/include/stratosphere.hpp index 041d72741..503f6f7f1 100644 --- a/stratosphere/libstratosphere/include/stratosphere.hpp +++ b/stratosphere/libstratosphere/include/stratosphere.hpp @@ -16,22 +16,17 @@ #pragma once -#include "stratosphere/ipc_templating.hpp" +#include "stratosphere/version_check.hpp" +#include "stratosphere/scope_guard.hpp" -#include "stratosphere/iwaitable.hpp" -#include "stratosphere/iserviceobject.hpp" -#include "stratosphere/iserver.hpp" -#include "stratosphere/ipcsession.hpp" -#include "stratosphere/servicesession.hpp" -#include "stratosphere/serviceserver.hpp" -#include "stratosphere/managedportserver.hpp" -#include "stratosphere/existingportserver.hpp" - -#include "stratosphere/ievent.hpp" -#include "stratosphere/systemevent.hpp" #include "stratosphere/hossynch.hpp" +#include "stratosphere/iwaitable.hpp" +#include "stratosphere/event.hpp" -#include "stratosphere/waitablemanager.hpp" -#include "stratosphere/multithreadedwaitablemanager.hpp" +#include "stratosphere/waitable_manager.hpp" -#include "stratosphere/version_check.hpp" \ No newline at end of file +#include "stratosphere/ipc.hpp" + +#include "stratosphere/mitm.hpp" + +#include "stratosphere/services.hpp" \ No newline at end of file diff --git a/stratosphere/libstratosphere/include/stratosphere/domainowner.hpp b/stratosphere/libstratosphere/include/stratosphere/domainowner.hpp deleted file mode 100644 index 74500eb63..000000000 --- a/stratosphere/libstratosphere/include/stratosphere/domainowner.hpp +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2018 Atmosphère-NX - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#pragma once -#include -#include -#include -#include - -#include "iserviceobject.hpp" - -#define DOMAIN_ID_MAX 0x1000 - -class IServiceObject; - -class DomainOwner { - private: - std::array, DOMAIN_ID_MAX> domain_objects; - public: - /* Shared ptrs should auto delete here. */ - virtual ~DomainOwner() = default; - - std::shared_ptr get_domain_object(unsigned int i) { - if (i < DOMAIN_ID_MAX) { - return domain_objects[i]; - } - return nullptr; - } - - Result reserve_object(std::shared_ptr object, unsigned int *out_i) { - auto object_it = std::find(domain_objects.begin() + 4, domain_objects.end(), nullptr); - if (object_it == domain_objects.end()) { - return 0x1900B; - } - - *out_i = std::distance(domain_objects.begin(), object_it); - *object_it = object; - object->set_owner(this); - return 0; - } - - Result set_object(std::shared_ptr object, unsigned int i) { - if (domain_objects[i] == nullptr) { - domain_objects[i] = object; - object->set_owner(this); - return 0; - } - return 0x1900B; - } - - unsigned int get_object_id(std::shared_ptr object) { - auto object_it = std::find(domain_objects.begin(), domain_objects.end(), object); - return std::distance(domain_objects.begin(), object_it); - } - - void delete_object(unsigned int i) { - domain_objects[i].reset(); - } - - void delete_object(std::shared_ptr object) { - auto object_it = std::find(domain_objects.begin(), domain_objects.end(), object); - if (object_it != domain_objects.end()) { - object_it->reset(); - } - } -}; diff --git a/stratosphere/libstratosphere/include/stratosphere/event.hpp b/stratosphere/libstratosphere/include/stratosphere/event.hpp new file mode 100644 index 000000000..ba726d557 --- /dev/null +++ b/stratosphere/libstratosphere/include/stratosphere/event.hpp @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2018 Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once +#include +#include +#include + +#include "iwaitable.hpp" + +class IEvent : public IWaitable { + public: + /* Information members. */ + Handle r_h; + Handle w_h; + bool autoclear; + public: + IEvent(bool a = false) : r_h(INVALID_HANDLE), w_h(INVALID_HANDLE), autoclear(a) { } + IEvent(Handle r, bool a = false) : r_h(r), w_h(INVALID_HANDLE), autoclear(a) { } + IEvent(Handle r, Handle w, bool a = false) : r_h(r), w_h(w), autoclear(a) { } + + ~IEvent() { + if (r_h != INVALID_HANDLE) { + svcCloseHandle(r_h); + } + if (w_h != INVALID_HANDLE) { + svcCloseHandle(w_h); + } + } + + /* Make it non-copyable */ + IEvent() = delete; + IEvent(const IEvent &) = delete; + IEvent& operator=(const IEvent&) = delete; + + + bool IsAutoClear() { + return this->autoclear; + } + + void Clear() { + std::scoped_lock lock(this->sig_lock); + this->is_signaled = false; + if (this->r_h != INVALID_HANDLE) { + svcResetSignal(this->r_h); + } + } + + void Signal() { + std::scoped_lock lock(this->sig_lock); + + if (this->w_h == INVALID_HANDLE && this->r_h != INVALID_HANDLE) { + /* We can't signal an event if we only have a read handle. */ + std::abort(); + } + + if (this->w_h == INVALID_HANDLE && this->is_signaled) { + return; + } + + this->is_signaled = true; + + if (this->w_h != INVALID_HANDLE) { + svcSignalEvent(this->w_h); + } else { + this->NotifyManagerSignaled(); + } + } + + virtual Result HandleSignaled(u64 timeout) = 0; + + /* IWaitable */ + virtual Handle GetHandle() override { + return this->r_h; + } +}; + +template +class HosEvent : public IEvent { + private: + F callback; + public: + HosEvent(F f, bool a = false) : IEvent(a), callback(std::move(f)) { } + HosEvent(Handle r, F f, bool a = false) : IEvent(r, a), callback(std::move(f)) { } + HosEvent(Handle r, Handle w, F f, bool a = false) : IEvent(r, w, a), callback(std::move(f)) { } + + virtual Result HandleSignaled(u64 timeout) override { + if (this->IsAutoClear()) { + this->Clear(); + } + return this->callback(timeout); + } +}; + +template +static IEvent *CreateHosEvent(F f, bool autoclear = false) { + return new HosEvent(INVALID_HANDLE, INVALID_HANDLE, std::move(f), autoclear); +} + +template +static IEvent *CreateSystemEvent(F f, bool autoclear = false) { + + Handle w_h, r_h; + if (R_FAILED(svcCreateEvent(&w_h, &r_h))) { + std::abort(); + } + + return new HosEvent(r_h, w_h, std::move(f), autoclear); +} + +template +static IEvent *CreateWriteOnlySystemEvent() { + return CreateSystemEvent([](u64 timeout) { std::abort(); return 0; }, a); +} diff --git a/stratosphere/libstratosphere/include/stratosphere/firmware_version.hpp b/stratosphere/libstratosphere/include/stratosphere/firmware_version.hpp new file mode 100644 index 000000000..312c68c67 --- /dev/null +++ b/stratosphere/libstratosphere/include/stratosphere/firmware_version.hpp @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018 Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +enum FirmwareVersion : u32 { + FirmwareVersion_Min = 0, + FirmwareVersion_100 = FirmwareVersion_Min, + FirmwareVersion_200 = 1, + FirmwareVersion_300 = 2, + FirmwareVersion_400 = 3, + FirmwareVersion_500 = 4, + FirmwareVersion_600 = 5, + FirmwareVersion_Current = FirmwareVersion_600, + FirmwareVersion_Max = 32, +}; + +static inline FirmwareVersion GetRuntimeFirmwareVersion() { + FirmwareVersion fw = FirmwareVersion_Min; + if (kernelAbove200()) { + fw = FirmwareVersion_200; + } + if (kernelAbove300()) { + fw = FirmwareVersion_300; + } + if (kernelAbove400()) { + fw = FirmwareVersion_400; + } + if (kernelAbove500()) { + fw = FirmwareVersion_500; + } + if (kernelAbove600()) { + fw = FirmwareVersion_600; + } + return fw; +} diff --git a/stratosphere/libstratosphere/include/stratosphere/hossynch.hpp b/stratosphere/libstratosphere/include/stratosphere/hossynch.hpp index b923a4ec1..73ca16d76 100644 --- a/stratosphere/libstratosphere/include/stratosphere/hossynch.hpp +++ b/stratosphere/libstratosphere/include/stratosphere/hossynch.hpp @@ -16,6 +16,7 @@ #pragma once #include +#include class HosMutex { private: @@ -40,6 +41,18 @@ class HosMutex { return mutexTryLock(GetMutex()); } + void Lock() { + lock(); + } + + void Unlock() { + unlock(); + } + + bool TryLock() { + return try_lock(); + } + friend class HosCondVar; }; @@ -65,6 +78,18 @@ class HosRecursiveMutex { bool try_lock() { return rmutexTryLock(GetMutex()); } + + void Lock() { + lock(); + } + + void Unlock() { + unlock(); + } + + bool TryLock() { + return try_lock(); + } }; class HosCondVar { diff --git a/stratosphere/libstratosphere/include/stratosphere/ievent.hpp b/stratosphere/libstratosphere/include/stratosphere/ievent.hpp deleted file mode 100644 index d1c93ef63..000000000 --- a/stratosphere/libstratosphere/include/stratosphere/ievent.hpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2018 Atmosphère-NX - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#pragma once -#include -#include -#include - -#include "iwaitable.hpp" - -typedef Result (*EventCallback)(void *arg, Handle *handles, size_t num_handles, u64 timeout); - -class IEvent : public IWaitable { - protected: - std::vector handles; - EventCallback callback; - void *arg; - - public: - IEvent(Handle wait_h, void *a, EventCallback callback) { - if (wait_h) { - this->handles.push_back(wait_h); - } - this->arg = a; - this->callback = callback; - } - - ~IEvent() { - std::for_each(handles.begin(), handles.end(), svcCloseHandle); - } - - virtual Result signal_event() = 0; - - /* IWaitable */ - virtual Handle get_handle() { - if (handles.size() > 0) { - return this->handles[0]; - } - return 0; - } - - - virtual void handle_deferred() { - /* TODO: Panic, because we can never defer an event. */ - } - - virtual Result handle_signaled(u64 timeout) { - return this->callback(this->arg, this->handles.data(), this->handles.size(), timeout); - } - - static Result PanicCallback(void *arg, Handle *handles, size_t num_handles, u64 timeout) { - /* TODO: Panic. */ - return 0xCAFE; - } -}; diff --git a/stratosphere/libstratosphere/include/stratosphere/ipc.hpp b/stratosphere/libstratosphere/include/stratosphere/ipc.hpp new file mode 100644 index 000000000..e035fda52 --- /dev/null +++ b/stratosphere/libstratosphere/include/stratosphere/ipc.hpp @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2018 Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include "ipc/ipc_service_object.hpp" +#include "ipc/ipc_serialization.hpp" + +#include "ipc/ipc_service_session.hpp" \ No newline at end of file diff --git a/stratosphere/libstratosphere/include/stratosphere/ipc/ipc_buffers.hpp b/stratosphere/libstratosphere/include/stratosphere/ipc/ipc_buffers.hpp new file mode 100644 index 000000000..6bf2f71c0 --- /dev/null +++ b/stratosphere/libstratosphere/include/stratosphere/ipc/ipc_buffers.hpp @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2018 Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once +#include +#include + +enum class IpcBufferType { + InBuffer, + OutBuffer, + InPointer, + OutPointer, +}; + +/* Base for In/Out Buffers. */ +struct IpcBufferBase {}; + +struct InOutBufferBase : public IpcBufferBase {}; + +/* Represents an A descriptor. */ +struct InBufferBase : public InOutBufferBase {}; + +template +struct InBuffer : public InBufferBase { + T *buffer; + size_t num_elements; + BufferType type; + static const BufferType expected_type = e_t; + + /* Convenience. */ + T& operator[](size_t i) const { + return buffer[i]; + } + + InBuffer(void *b, size_t n, BufferType t) : buffer((T *)b), num_elements(n/sizeof(T)), type(t) { } +}; + +/* Represents a B descriptor. */ +struct OutBufferBase : public InOutBufferBase {}; + +template +struct OutBuffer : OutBufferBase { + T *buffer; + size_t num_elements; + BufferType type; + static const BufferType expected_type = e_t; + + /* Convenience. */ + T& operator[](size_t i) const { + return buffer[i]; + } + + OutBuffer(void *b, size_t n, BufferType t) : buffer((T *)b), num_elements(n/sizeof(T)), type(t) { } +}; + +/* Represents an X descriptor. */ +struct InPointerBase : public IpcBufferBase {}; + +template +struct InPointer : public InPointerBase { + T *pointer; + size_t num_elements; + + /* Convenience. */ + T& operator[](size_t i) const { + return pointer[i]; + } + + InPointer(void *p, size_t n) : pointer((T *)p), num_elements(n/sizeof(T)) { } +}; + +/* Represents a C descriptor. */ +struct OutPointerWithServerSizeBase : public IpcBufferBase {}; + +template +struct OutPointerWithServerSize : public OutPointerWithServerSizeBase { + T *pointer; + static const size_t num_elements = N; + static const size_t element_size = sizeof(T); + + /* Convenience. */ + T& operator[](size_t i) const { + return pointer[i]; + } + + OutPointerWithServerSize(void *p) : pointer((T *)p) { } + OutPointerWithServerSize(void *p, size_t n) : pointer((T *)p) { } +}; + +struct OutPointerWithClientSizeBase : public IpcBufferBase {}; + +/* Represents a C descriptor with size in raw data. */ +template +struct OutPointerWithClientSize : public OutPointerWithClientSizeBase { + T *pointer; + size_t num_elements; + + /* Convenience. */ + T& operator[](size_t i) const { + return pointer[i]; + } + + OutPointerWithClientSize(void *p, size_t n) : pointer((T *)p), num_elements(n/sizeof(T)) { } +}; diff --git a/stratosphere/libstratosphere/include/stratosphere/ipc/ipc_domain_object.hpp b/stratosphere/libstratosphere/include/stratosphere/ipc/ipc_domain_object.hpp new file mode 100644 index 000000000..1394fc095 --- /dev/null +++ b/stratosphere/libstratosphere/include/stratosphere/ipc/ipc_domain_object.hpp @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2018 Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once +#include +#include +#include +#include + +#include "ipc_service_object.hpp" + +class IDomainObject; + +class DomainManager { + public: + virtual std::shared_ptr AllocateDomain() = 0; + virtual void FreeDomain(IDomainObject *domain) = 0; + virtual Result ReserveObject(IDomainObject *domain, u32 *out_object_id) = 0; + virtual Result ReserveSpecificObject(IDomainObject *domain, u32 object_id) = 0; + virtual void SetObject(IDomainObject *domain, u32 object_id, ServiceObjectHolder&& holder) = 0; + virtual ServiceObjectHolder *GetObject(IDomainObject *domain, u32 object_id) = 0; + virtual Result FreeObject(IDomainObject *domain, u32 object_id) = 0; + virtual Result ForceFreeObject(u32 object_id) = 0; +}; + +class IDomainObject : public IServiceObject { + private: + DomainManager *manager; + public: + IDomainObject(DomainManager *m) : manager(m) {} + + virtual ~IDomainObject() override { + this->manager->FreeDomain(this); + } + + DomainManager *GetManager() { + return this->manager; + } + + ServiceObjectHolder *GetObject(u32 object_id) { + return this->manager->GetObject(this, object_id); + } + + Result ReserveObject(u32 *out_object_id) { + return this->manager->ReserveObject(this, out_object_id); + } + + Result ReserveSpecificObject(u32 object_id) { + return this->manager->ReserveSpecificObject(this, object_id); + } + + void SetObject(u32 object_id, ServiceObjectHolder&& holder) { + this->manager->SetObject(this, object_id, std::move(holder)); + } + + Result FreeObject(u32 object_id) { + return this->manager->FreeObject(this, object_id); + } + + Result ForceFreeObject(u32 object_id) { + return this->manager->ForceFreeObject(object_id); + } + + public: + DEFINE_SERVICE_DISPATCH_TABLE { + /* IDomainObject has no callable functions. */ + }; +}; + +static constexpr bool IsDomainObject(ServiceObjectHolder &holder) { + return holder.GetServiceId() == ServiceObjectId(); +} + +static constexpr bool IsDomainObject(ServiceObjectHolder *holder) { + return holder->GetServiceId() == ServiceObjectId(); +} + +/* Out for service impl. */ +template +class Out> : public OutSessionTag { + static_assert(std::is_base_of_v, "OutSessions must be shared_ptr!"); + + template + friend class Out; + + private: + std::shared_ptr *srv; + IDomainObject *domain = nullptr; + u32 *object_id = nullptr; + public: + Out>(std::shared_ptr *s, IDomainObject *dm, u32 *o) : srv(reinterpret_cast *>(s)), domain(dm), object_id(o) { } + + ServiceObjectHolder GetHolder() { + std::shared_ptr clone = *srv; + return ServiceObjectHolder(std::move(clone)); + } + + bool IsDomain() { + return domain != nullptr; + } + + u32 GetObjectId() { + return *object_id; + } + + void ChangeObjectId(u32 o) { + domain->ForceFreeObject(*object_id); + domain->ReserveSpecificObject(o); + *object_id = o; + } + + void SetValue(std::shared_ptr &&s) { + *this->srv = std::move(s); + } +}; diff --git a/stratosphere/libstratosphere/include/stratosphere/ipc/ipc_out.hpp b/stratosphere/libstratosphere/include/stratosphere/ipc/ipc_out.hpp new file mode 100644 index 000000000..fbd186d28 --- /dev/null +++ b/stratosphere/libstratosphere/include/stratosphere/ipc/ipc_out.hpp @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018 Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once +#include +#include + +/* Declare false allowed struct. */ +template +struct AllowedOut : std::false_type {}; + +struct OutDataTag{}; +struct OutHandleTag{}; +struct OutSessionTag{}; + +/* Define out struct, so that we can get errors on enable_if */ +template +class Out { + static_assert(std::is_pod::value && !std::is_pod::value, "Invalid IPC Out Type!"); +}; + +template +class Out::value || AllowedOut::value>::type> : public OutDataTag { +private: + T *obj; +public: + Out(T *o) : obj(o) { } + + void SetValue(const T& t) { + *obj = t; + } + + const T& GetValue() { + return *obj; + } + + T *GetPointer() { + return obj; + } + + /* Convenience operators. */ + T& operator*() { + return *obj; + } + + T* operator->() { + return obj; + } +}; + +template +class Out { + static_assert(std::is_pod::value && !std::is_pod::value, "Invalid IPC Out Type (Raw Pointer)!"); +}; + +template +struct OutHelper; + +template +struct OutHelper> { + using type = T; +}; \ No newline at end of file diff --git a/stratosphere/libstratosphere/include/stratosphere/managedportserver.hpp b/stratosphere/libstratosphere/include/stratosphere/ipc/ipc_response_context.hpp similarity index 52% rename from stratosphere/libstratosphere/include/stratosphere/managedportserver.hpp rename to stratosphere/libstratosphere/include/stratosphere/ipc/ipc_response_context.hpp index f61545f74..4e2ed8345 100644 --- a/stratosphere/libstratosphere/include/stratosphere/managedportserver.hpp +++ b/stratosphere/libstratosphere/include/stratosphere/ipc/ipc_response_context.hpp @@ -16,18 +16,29 @@ #pragma once #include -#include "iserver.hpp" -template -class ManagedPortServer : public IServer { - public: - ManagedPortServer(const char *service_name, unsigned int max_s, bool s_d = false) : IServer(service_name, max_s, s_d) { - if (R_FAILED(svcManageNamedPort(&this->port_handle, service_name, this->max_sessions))) { - /* TODO: panic */ - } - } - - ISession *get_new_session(Handle session_h) override { - return new ServiceSession(this, session_h, 0); - } +#include "ipc_service_object.hpp" +#include "ipc_domain_object.hpp" + +#include "ipc_special.hpp" + +#include "ipc_session_manager_base.hpp" + +struct IpcResponseContext { + /* Request/Reply data. */ + IpcParsedCommand request; + IpcCommand reply; + u8 out_data[0x100]; + std::shared_ptr *out_objs[8]; + Handle out_object_server_handles[8]; + IpcHandle out_handles[8]; + u32 out_object_ids[8]; + IpcCommandType cmd_type; + u64 cmd_id; + Result rc; + /* Context. */ + SessionManagerBase *manager; + ServiceObjectHolder *obj_holder; + unsigned char *pb; + size_t pb_size; }; \ No newline at end of file diff --git a/stratosphere/libstratosphere/include/stratosphere/ipc/ipc_serialization.hpp b/stratosphere/libstratosphere/include/stratosphere/ipc/ipc_serialization.hpp new file mode 100644 index 000000000..93c894af3 --- /dev/null +++ b/stratosphere/libstratosphere/include/stratosphere/ipc/ipc_serialization.hpp @@ -0,0 +1,629 @@ +/* + * Copyright (c) 2018 Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once +#include +#include +#include +#include +#include "../../boost/callable_traits.hpp" +#include +#include + +#include "ipc_out.hpp" +#include "ipc_buffers.hpp" +#include "ipc_special.hpp" + +#include "ipc_domain_object.hpp" + +#include "ipc_response_context.hpp" + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-but-set-variable" + +template +struct PopFront; + +template +struct PopFront> { + using type = std::tuple; +}; + +template struct WhichType; + +template +struct TypeList{}; + +template +constexpr auto Concatenate(TypeList, TypeList) { + return TypeList{}; +} + +template