From fcc7ce49d9c2378fe5e83a77822adad5c1289d1b Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Sat, 6 Nov 2021 20:05:32 -0700 Subject: [PATCH] sm/tipc: ensure technical-correctness of sins (no page cost) --- .../tipc/tipc_deferral_manager.hpp | 28 ++++++++++++------- stratosphere/sm/source/sm_user_service.hpp | 2 +- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/libraries/libstratosphere/include/stratosphere/tipc/tipc_deferral_manager.hpp b/libraries/libstratosphere/include/stratosphere/tipc/tipc_deferral_manager.hpp index dc70f8a72..573497068 100644 --- a/libraries/libstratosphere/include/stratosphere/tipc/tipc_deferral_manager.hpp +++ b/libraries/libstratosphere/include/stratosphere/tipc/tipc_deferral_manager.hpp @@ -96,14 +96,14 @@ namespace ams::tipc { }; static_assert(std::is_standard_layout::value); - template - class DeferrableBase : public DeferrableBaseImpl { + template + class DeferrableBaseImplWithBuffer : public DeferrableBaseImpl { private: - static constexpr size_t MessageBufferRequiredSize = Interface::MaximumRequestSize; + static constexpr size_t MessageBufferRequiredSize = _MessageBufferRequiredSize; private: u8 m_message_buffer[MessageBufferRequiredSize]; public: - DeferrableBase(); + DeferrableBaseImplWithBuffer(); private: static consteval size_t GetMessageBufferOffset(); }; @@ -112,17 +112,25 @@ namespace ams::tipc { return AMS_OFFSETOF(DeferrableBaseImpl, m_message_buffer_base); } - template - consteval size_t DeferrableBase::GetMessageBufferOffset() { - return AMS_OFFSETOF(DeferrableBase, m_message_buffer); + template + consteval size_t DeferrableBaseImplWithBuffer<_MessageBufferRequiredSize>::GetMessageBufferOffset() { + return AMS_OFFSETOF(DeferrableBaseImplWithBuffer<_MessageBufferRequiredSize>, m_message_buffer); } - template - ALWAYS_INLINE DeferrableBase::DeferrableBase() : DeferrableBaseImpl(MessageBufferRequiredSize) { + template + ALWAYS_INLINE DeferrableBaseImplWithBuffer<_MessageBufferRequiredSize>::DeferrableBaseImplWithBuffer() : DeferrableBaseImpl(MessageBufferRequiredSize) { static_assert(GetMessageBufferOffsetBase() == GetMessageBufferOffset()); - static_assert(sizeof(DeferrableBase) >= sizeof(DeferrableBaseImpl) + MessageBufferRequiredSize); + static_assert(sizeof(DeferrableBaseImplWithBuffer<_MessageBufferRequiredSize>) >= sizeof(DeferrableBaseImpl) + MessageBufferRequiredSize); } + template + class DeferrableBase : public DeferrableBaseImplWithBuffer { + private: + using BaseImpl = DeferrableBaseImplWithBuffer; + public: + using BaseImpl::BaseImpl; + }; + template concept IsDeferrable = std::derived_from; diff --git a/stratosphere/sm/source/sm_user_service.hpp b/stratosphere/sm/source/sm_user_service.hpp index 5d615b5b5..df457c71b 100644 --- a/stratosphere/sm/source/sm_user_service.hpp +++ b/stratosphere/sm/source/sm_user_service.hpp @@ -20,7 +20,7 @@ namespace ams::sm { /* Service definition. */ - class UserService : public tipc::DeferrableBase { + class UserService : public tipc::DeferrableBase { private: os::ProcessId m_process_id; bool m_initialized;