diff options
| -rw-r--r-- | src/core/hle/kernel/k_memory_block.h | 39 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_page_table.cpp | 147 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_page_table.h | 19 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc_types.h | 1 | ||||
| -rw-r--r-- | src/core/hle/service/nvnflinger/fb_share_buffer_manager.cpp | 2 | 
5 files changed, 116 insertions, 92 deletions
| diff --git a/src/core/hle/kernel/k_memory_block.h b/src/core/hle/kernel/k_memory_block.h index 41a29da24..8437cb659 100644 --- a/src/core/hle/kernel/k_memory_block.h +++ b/src/core/hle/kernel/k_memory_block.h @@ -36,6 +36,7 @@ enum class KMemoryState : u32 {      FlagCanChangeAttribute = (1 << 24),      FlagCanCodeMemory = (1 << 25),      FlagLinearMapped = (1 << 26), +    FlagCanPermissionLock = (1 << 27),      FlagsData = FlagCanReprotect | FlagCanUseIpc | FlagCanUseNonDeviceIpc | FlagCanUseNonSecureIpc |                  FlagMapped | FlagCanAlias | FlagCanTransfer | FlagCanQueryPhysical | @@ -50,12 +51,16 @@ enum class KMemoryState : u32 {                  FlagLinearMapped,      Free = static_cast<u32>(Svc::MemoryState::Free), -    Io = static_cast<u32>(Svc::MemoryState::Io) | FlagMapped | FlagCanDeviceMap | -         FlagCanAlignedDeviceMap, + +    IoMemory = static_cast<u32>(Svc::MemoryState::Io) | FlagMapped | FlagCanDeviceMap | +               FlagCanAlignedDeviceMap, +    IoRegister = +        static_cast<u32>(Svc::MemoryState::Io) | FlagCanDeviceMap | FlagCanAlignedDeviceMap, +      Static = static_cast<u32>(Svc::MemoryState::Static) | FlagMapped | FlagCanQueryPhysical,      Code = static_cast<u32>(Svc::MemoryState::Code) | FlagsCode | FlagCanMapProcess,      CodeData = static_cast<u32>(Svc::MemoryState::CodeData) | FlagsData | FlagCanMapProcess | -               FlagCanCodeMemory, +               FlagCanCodeMemory | FlagCanPermissionLock,      Normal = static_cast<u32>(Svc::MemoryState::Normal) | FlagsData | FlagCanCodeMemory,      Shared = static_cast<u32>(Svc::MemoryState::Shared) | FlagMapped | FlagReferenceCounted |               FlagLinearMapped, @@ -65,7 +70,8 @@ enum class KMemoryState : u32 {      AliasCode = static_cast<u32>(Svc::MemoryState::AliasCode) | FlagsCode | FlagCanMapProcess |                  FlagCanCodeAlias,      AliasCodeData = static_cast<u32>(Svc::MemoryState::AliasCodeData) | FlagsData | -                    FlagCanMapProcess | FlagCanCodeAlias | FlagCanCodeMemory, +                    FlagCanMapProcess | FlagCanCodeAlias | FlagCanCodeMemory | +                    FlagCanPermissionLock,      Ipc = static_cast<u32>(Svc::MemoryState::Ipc) | FlagsMisc | FlagCanAlignedDeviceMap |            FlagCanUseIpc | FlagCanUseNonSecureIpc | FlagCanUseNonDeviceIpc, @@ -73,7 +79,7 @@ enum class KMemoryState : u32 {      Stack = static_cast<u32>(Svc::MemoryState::Stack) | FlagsMisc | FlagCanAlignedDeviceMap |              FlagCanUseIpc | FlagCanUseNonSecureIpc | FlagCanUseNonDeviceIpc, -    ThreadLocal = static_cast<u32>(Svc::MemoryState::ThreadLocal) | FlagMapped | FlagLinearMapped, +    ThreadLocal = static_cast<u32>(Svc::MemoryState::ThreadLocal) | FlagLinearMapped,      Transfered = static_cast<u32>(Svc::MemoryState::Transfered) | FlagsMisc |                   FlagCanAlignedDeviceMap | FlagCanChangeAttribute | FlagCanUseIpc | @@ -94,7 +100,7 @@ enum class KMemoryState : u32 {      NonDeviceIpc =          static_cast<u32>(Svc::MemoryState::NonDeviceIpc) | FlagsMisc | FlagCanUseNonDeviceIpc, -    Kernel = static_cast<u32>(Svc::MemoryState::Kernel) | FlagMapped, +    Kernel = static_cast<u32>(Svc::MemoryState::Kernel),      GeneratedCode = static_cast<u32>(Svc::MemoryState::GeneratedCode) | FlagMapped |                      FlagReferenceCounted | FlagCanDebug | FlagLinearMapped, @@ -105,34 +111,36 @@ enum class KMemoryState : u32 {      Insecure = static_cast<u32>(Svc::MemoryState::Insecure) | FlagMapped | FlagReferenceCounted |                 FlagLinearMapped | FlagCanChangeAttribute | FlagCanDeviceMap | -               FlagCanAlignedDeviceMap | FlagCanUseNonSecureIpc | FlagCanUseNonDeviceIpc, +               FlagCanAlignedDeviceMap | FlagCanQueryPhysical | FlagCanUseNonSecureIpc | +               FlagCanUseNonDeviceIpc,  };  DECLARE_ENUM_FLAG_OPERATORS(KMemoryState);  static_assert(static_cast<u32>(KMemoryState::Free) == 0x00000000); -static_assert(static_cast<u32>(KMemoryState::Io) == 0x00182001); +static_assert(static_cast<u32>(KMemoryState::IoMemory) == 0x00182001); +static_assert(static_cast<u32>(KMemoryState::IoRegister) == 0x00180001);  static_assert(static_cast<u32>(KMemoryState::Static) == 0x00042002);  static_assert(static_cast<u32>(KMemoryState::Code) == 0x04DC7E03); -static_assert(static_cast<u32>(KMemoryState::CodeData) == 0x07FEBD04); +static_assert(static_cast<u32>(KMemoryState::CodeData) == 0x0FFEBD04);  static_assert(static_cast<u32>(KMemoryState::Normal) == 0x077EBD05);  static_assert(static_cast<u32>(KMemoryState::Shared) == 0x04402006);  static_assert(static_cast<u32>(KMemoryState::AliasCode) == 0x04DD7E08); -static_assert(static_cast<u32>(KMemoryState::AliasCodeData) == 0x07FFBD09); +static_assert(static_cast<u32>(KMemoryState::AliasCodeData) == 0x0FFFBD09);  static_assert(static_cast<u32>(KMemoryState::Ipc) == 0x045C3C0A);  static_assert(static_cast<u32>(KMemoryState::Stack) == 0x045C3C0B); -static_assert(static_cast<u32>(KMemoryState::ThreadLocal) == 0x0400200C); +static_assert(static_cast<u32>(KMemoryState::ThreadLocal) == 0x0400000C);  static_assert(static_cast<u32>(KMemoryState::Transfered) == 0x055C3C0D);  static_assert(static_cast<u32>(KMemoryState::SharedTransfered) == 0x045C380E);  static_assert(static_cast<u32>(KMemoryState::SharedCode) == 0x0440380F);  static_assert(static_cast<u32>(KMemoryState::Inaccessible) == 0x00000010);  static_assert(static_cast<u32>(KMemoryState::NonSecureIpc) == 0x045C3811);  static_assert(static_cast<u32>(KMemoryState::NonDeviceIpc) == 0x044C2812); -static_assert(static_cast<u32>(KMemoryState::Kernel) == 0x00002013); +static_assert(static_cast<u32>(KMemoryState::Kernel) == 0x00000013);  static_assert(static_cast<u32>(KMemoryState::GeneratedCode) == 0x04402214);  static_assert(static_cast<u32>(KMemoryState::CodeOut) == 0x04402015);  static_assert(static_cast<u32>(KMemoryState::Coverage) == 0x00002016); -static_assert(static_cast<u32>(KMemoryState::Insecure) == 0x05583817); +static_assert(static_cast<u32>(KMemoryState::Insecure) == 0x055C3817);  enum class KMemoryPermission : u8 {      None = 0, @@ -182,6 +190,7 @@ enum class KMemoryAttribute : u8 {      IpcLocked = static_cast<u8>(Svc::MemoryAttribute::IpcLocked),      DeviceShared = static_cast<u8>(Svc::MemoryAttribute::DeviceShared),      Uncached = static_cast<u8>(Svc::MemoryAttribute::Uncached), +    PermissionLocked = static_cast<u8>(Svc::MemoryAttribute::PermissionLocked),      SetMask = Uncached,  }; @@ -261,6 +270,10 @@ struct KMemoryInfo {          return m_state;      } +    constexpr Svc::MemoryState GetSvcState() const { +        return static_cast<Svc::MemoryState>(m_state & KMemoryState::Mask); +    } +      constexpr KMemoryPermission GetPermission() const {          return m_permission;      } diff --git a/src/core/hle/kernel/k_page_table.cpp b/src/core/hle/kernel/k_page_table.cpp index 0b0cef984..4d564a04f 100644 --- a/src/core/hle/kernel/k_page_table.cpp +++ b/src/core/hle/kernel/k_page_table.cpp @@ -2379,8 +2379,7 @@ Result KPageTable::MapPageGroup(KProcessAddress* out_addr, const KPageGroup& pg,      KScopedPageTableUpdater updater(this);      // Perform mapping operation. -    const KPageProperties properties = {perm, state == KMemoryState::Io, false, -                                        DisableMergeAttribute::DisableHead}; +    const KPageProperties properties = {perm, false, false, DisableMergeAttribute::DisableHead};      R_TRY(this->MapPageGroupImpl(updater.GetPageList(), addr, pg, properties, false));      // Update the blocks. @@ -2422,8 +2421,7 @@ Result KPageTable::MapPageGroup(KProcessAddress addr, const KPageGroup& pg, KMem      KScopedPageTableUpdater updater(this);      // Perform mapping operation. -    const KPageProperties properties = {perm, state == KMemoryState::Io, false, -                                        DisableMergeAttribute::DisableHead}; +    const KPageProperties properties = {perm, false, false, DisableMergeAttribute::DisableHead};      R_TRY(this->MapPageGroupImpl(updater.GetPageList(), addr, pg, properties, false));      // Update the blocks. @@ -2863,7 +2861,8 @@ Result KPageTable::LockForMapDeviceAddressSpace(bool* out_is_io, KProcessAddress                                        &KMemoryBlock::ShareToDevice, KMemoryPermission::None);      // Set whether the locked memory was io. -    *out_is_io = old_state == KMemoryState::Io; +    *out_is_io = +        static_cast<Svc::MemoryState>(old_state & KMemoryState::Mask) == Svc::MemoryState::Io;      R_SUCCEED();  } @@ -3106,79 +3105,79 @@ void KPageTable::FinalizeUpdate(PageLinkedList* page_list) {      }  } -KProcessAddress KPageTable::GetRegionAddress(KMemoryState state) const { +KProcessAddress KPageTable::GetRegionAddress(Svc::MemoryState state) const {      switch (state) { -    case KMemoryState::Free: -    case KMemoryState::Kernel: +    case Svc::MemoryState::Free: +    case Svc::MemoryState::Kernel:          return m_address_space_start; -    case KMemoryState::Normal: +    case Svc::MemoryState::Normal:          return m_heap_region_start; -    case KMemoryState::Ipc: -    case KMemoryState::NonSecureIpc: -    case KMemoryState::NonDeviceIpc: +    case Svc::MemoryState::Ipc: +    case Svc::MemoryState::NonSecureIpc: +    case Svc::MemoryState::NonDeviceIpc:          return m_alias_region_start; -    case KMemoryState::Stack: +    case Svc::MemoryState::Stack:          return m_stack_region_start; -    case KMemoryState::Static: -    case KMemoryState::ThreadLocal: +    case Svc::MemoryState::Static: +    case Svc::MemoryState::ThreadLocal:          return m_kernel_map_region_start; -    case KMemoryState::Io: -    case KMemoryState::Shared: -    case KMemoryState::AliasCode: -    case KMemoryState::AliasCodeData: -    case KMemoryState::Transfered: -    case KMemoryState::SharedTransfered: -    case KMemoryState::SharedCode: -    case KMemoryState::GeneratedCode: -    case KMemoryState::CodeOut: -    case KMemoryState::Coverage: -    case KMemoryState::Insecure: +    case Svc::MemoryState::Io: +    case Svc::MemoryState::Shared: +    case Svc::MemoryState::AliasCode: +    case Svc::MemoryState::AliasCodeData: +    case Svc::MemoryState::Transfered: +    case Svc::MemoryState::SharedTransfered: +    case Svc::MemoryState::SharedCode: +    case Svc::MemoryState::GeneratedCode: +    case Svc::MemoryState::CodeOut: +    case Svc::MemoryState::Coverage: +    case Svc::MemoryState::Insecure:          return m_alias_code_region_start; -    case KMemoryState::Code: -    case KMemoryState::CodeData: +    case Svc::MemoryState::Code: +    case Svc::MemoryState::CodeData:          return m_code_region_start;      default:          UNREACHABLE();      }  } -size_t KPageTable::GetRegionSize(KMemoryState state) const { +size_t KPageTable::GetRegionSize(Svc::MemoryState state) const {      switch (state) { -    case KMemoryState::Free: -    case KMemoryState::Kernel: +    case Svc::MemoryState::Free: +    case Svc::MemoryState::Kernel:          return m_address_space_end - m_address_space_start; -    case KMemoryState::Normal: +    case Svc::MemoryState::Normal:          return m_heap_region_end - m_heap_region_start; -    case KMemoryState::Ipc: -    case KMemoryState::NonSecureIpc: -    case KMemoryState::NonDeviceIpc: +    case Svc::MemoryState::Ipc: +    case Svc::MemoryState::NonSecureIpc: +    case Svc::MemoryState::NonDeviceIpc:          return m_alias_region_end - m_alias_region_start; -    case KMemoryState::Stack: +    case Svc::MemoryState::Stack:          return m_stack_region_end - m_stack_region_start; -    case KMemoryState::Static: -    case KMemoryState::ThreadLocal: +    case Svc::MemoryState::Static: +    case Svc::MemoryState::ThreadLocal:          return m_kernel_map_region_end - m_kernel_map_region_start; -    case KMemoryState::Io: -    case KMemoryState::Shared: -    case KMemoryState::AliasCode: -    case KMemoryState::AliasCodeData: -    case KMemoryState::Transfered: -    case KMemoryState::SharedTransfered: -    case KMemoryState::SharedCode: -    case KMemoryState::GeneratedCode: -    case KMemoryState::CodeOut: -    case KMemoryState::Coverage: -    case KMemoryState::Insecure: +    case Svc::MemoryState::Io: +    case Svc::MemoryState::Shared: +    case Svc::MemoryState::AliasCode: +    case Svc::MemoryState::AliasCodeData: +    case Svc::MemoryState::Transfered: +    case Svc::MemoryState::SharedTransfered: +    case Svc::MemoryState::SharedCode: +    case Svc::MemoryState::GeneratedCode: +    case Svc::MemoryState::CodeOut: +    case Svc::MemoryState::Coverage: +    case Svc::MemoryState::Insecure:          return m_alias_code_region_end - m_alias_code_region_start; -    case KMemoryState::Code: -    case KMemoryState::CodeData: +    case Svc::MemoryState::Code: +    case Svc::MemoryState::CodeData:          return m_code_region_end - m_code_region_start;      default:          UNREACHABLE();      }  } -bool KPageTable::CanContain(KProcessAddress addr, size_t size, KMemoryState state) const { +bool KPageTable::CanContain(KProcessAddress addr, size_t size, Svc::MemoryState state) const {      const KProcessAddress end = addr + size;      const KProcessAddress last = end - 1; @@ -3192,32 +3191,32 @@ bool KPageTable::CanContain(KProcessAddress addr, size_t size, KMemoryState stat      const bool is_in_alias = !(end <= m_alias_region_start || m_alias_region_end <= addr ||                                 m_alias_region_start == m_alias_region_end);      switch (state) { -    case KMemoryState::Free: -    case KMemoryState::Kernel: +    case Svc::MemoryState::Free: +    case Svc::MemoryState::Kernel:          return is_in_region; -    case KMemoryState::Io: -    case KMemoryState::Static: -    case KMemoryState::Code: -    case KMemoryState::CodeData: -    case KMemoryState::Shared: -    case KMemoryState::AliasCode: -    case KMemoryState::AliasCodeData: -    case KMemoryState::Stack: -    case KMemoryState::ThreadLocal: -    case KMemoryState::Transfered: -    case KMemoryState::SharedTransfered: -    case KMemoryState::SharedCode: -    case KMemoryState::GeneratedCode: -    case KMemoryState::CodeOut: -    case KMemoryState::Coverage: -    case KMemoryState::Insecure: +    case Svc::MemoryState::Io: +    case Svc::MemoryState::Static: +    case Svc::MemoryState::Code: +    case Svc::MemoryState::CodeData: +    case Svc::MemoryState::Shared: +    case Svc::MemoryState::AliasCode: +    case Svc::MemoryState::AliasCodeData: +    case Svc::MemoryState::Stack: +    case Svc::MemoryState::ThreadLocal: +    case Svc::MemoryState::Transfered: +    case Svc::MemoryState::SharedTransfered: +    case Svc::MemoryState::SharedCode: +    case Svc::MemoryState::GeneratedCode: +    case Svc::MemoryState::CodeOut: +    case Svc::MemoryState::Coverage: +    case Svc::MemoryState::Insecure:          return is_in_region && !is_in_heap && !is_in_alias; -    case KMemoryState::Normal: +    case Svc::MemoryState::Normal:          ASSERT(is_in_heap);          return is_in_region && !is_in_alias; -    case KMemoryState::Ipc: -    case KMemoryState::NonSecureIpc: -    case KMemoryState::NonDeviceIpc: +    case Svc::MemoryState::Ipc: +    case Svc::MemoryState::NonSecureIpc: +    case Svc::MemoryState::NonDeviceIpc:          ASSERT(is_in_alias);          return is_in_region && !is_in_heap;      default: diff --git a/src/core/hle/kernel/k_page_table.h b/src/core/hle/kernel/k_page_table.h index 7da675f27..af12582d9 100644 --- a/src/core/hle/kernel/k_page_table.h +++ b/src/core/hle/kernel/k_page_table.h @@ -126,8 +126,6 @@ public:          return m_block_info_manager;      } -    bool CanContain(KProcessAddress addr, size_t size, KMemoryState state) const; -      Result MapPages(KProcessAddress* out_addr, size_t num_pages, size_t alignment,                      KPhysicalAddress phys_addr, KProcessAddress region_start,                      size_t region_num_pages, KMemoryState state, KMemoryPermission perm) { @@ -162,6 +160,21 @@ public:      void RemapPageGroup(PageLinkedList* page_list, KProcessAddress address, size_t size,                          const KPageGroup& pg); +    KProcessAddress GetRegionAddress(Svc::MemoryState state) const; +    size_t GetRegionSize(Svc::MemoryState state) const; +    bool CanContain(KProcessAddress addr, size_t size, Svc::MemoryState state) const; + +    KProcessAddress GetRegionAddress(KMemoryState state) const { +        return this->GetRegionAddress(static_cast<Svc::MemoryState>(state & KMemoryState::Mask)); +    } +    size_t GetRegionSize(KMemoryState state) const { +        return this->GetRegionSize(static_cast<Svc::MemoryState>(state & KMemoryState::Mask)); +    } +    bool CanContain(KProcessAddress addr, size_t size, KMemoryState state) const { +        return this->CanContain(addr, size, +                                static_cast<Svc::MemoryState>(state & KMemoryState::Mask)); +    } +  protected:      struct PageLinkedList {      private: @@ -228,8 +241,6 @@ private:      Result Operate(KProcessAddress addr, size_t num_pages, KMemoryPermission perm,                     OperationType operation, KPhysicalAddress map_addr = 0);      void FinalizeUpdate(PageLinkedList* page_list); -    KProcessAddress GetRegionAddress(KMemoryState state) const; -    size_t GetRegionSize(KMemoryState state) const;      KProcessAddress FindFreeArea(KProcessAddress region_start, size_t region_num_pages,                                   size_t num_pages, size_t alignment, size_t offset, diff --git a/src/core/hle/kernel/svc_types.h b/src/core/hle/kernel/svc_types.h index 7f380ca4f..251e6013c 100644 --- a/src/core/hle/kernel/svc_types.h +++ b/src/core/hle/kernel/svc_types.h @@ -46,6 +46,7 @@ enum class MemoryAttribute : u32 {      IpcLocked = (1 << 1),      DeviceShared = (1 << 2),      Uncached = (1 << 3), +    PermissionLocked = (1 << 4),  };  DECLARE_ENUM_FLAG_OPERATORS(MemoryAttribute); diff --git a/src/core/hle/service/nvnflinger/fb_share_buffer_manager.cpp b/src/core/hle/service/nvnflinger/fb_share_buffer_manager.cpp index 469a53244..2e29bc848 100644 --- a/src/core/hle/service/nvnflinger/fb_share_buffer_manager.cpp +++ b/src/core/hle/service/nvnflinger/fb_share_buffer_manager.cpp @@ -46,7 +46,7 @@ Result AllocateIoForProcessAddressSpace(Common::ProcessAddress* out_map_address,      // Get bounds of where mapping is possible.      const VAddr alias_code_begin = GetInteger(page_table.GetAliasCodeRegionStart());      const VAddr alias_code_size = page_table.GetAliasCodeRegionSize() / YUZU_PAGESIZE; -    const auto state = Kernel::KMemoryState::Io; +    const auto state = Kernel::KMemoryState::IoMemory;      const auto perm = Kernel::KMemoryPermission::UserReadWrite;      std::mt19937_64 rng{process->GetRandomEntropy(0)}; | 
