diff options
Diffstat (limited to 'src')
| -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 { | |||
| 36 | FlagCanChangeAttribute = (1 << 24), | 36 | FlagCanChangeAttribute = (1 << 24), |
| 37 | FlagCanCodeMemory = (1 << 25), | 37 | FlagCanCodeMemory = (1 << 25), |
| 38 | FlagLinearMapped = (1 << 26), | 38 | FlagLinearMapped = (1 << 26), |
| 39 | FlagCanPermissionLock = (1 << 27), | ||
| 39 | 40 | ||
| 40 | FlagsData = FlagCanReprotect | FlagCanUseIpc | FlagCanUseNonDeviceIpc | FlagCanUseNonSecureIpc | | 41 | FlagsData = FlagCanReprotect | FlagCanUseIpc | FlagCanUseNonDeviceIpc | FlagCanUseNonSecureIpc | |
| 41 | FlagMapped | FlagCanAlias | FlagCanTransfer | FlagCanQueryPhysical | | 42 | FlagMapped | FlagCanAlias | FlagCanTransfer | FlagCanQueryPhysical | |
| @@ -50,12 +51,16 @@ enum class KMemoryState : u32 { | |||
| 50 | FlagLinearMapped, | 51 | FlagLinearMapped, |
| 51 | 52 | ||
| 52 | Free = static_cast<u32>(Svc::MemoryState::Free), | 53 | Free = static_cast<u32>(Svc::MemoryState::Free), |
| 53 | Io = static_cast<u32>(Svc::MemoryState::Io) | FlagMapped | FlagCanDeviceMap | | 54 | |
| 54 | FlagCanAlignedDeviceMap, | 55 | IoMemory = static_cast<u32>(Svc::MemoryState::Io) | FlagMapped | FlagCanDeviceMap | |
| 56 | FlagCanAlignedDeviceMap, | ||
| 57 | IoRegister = | ||
| 58 | static_cast<u32>(Svc::MemoryState::Io) | FlagCanDeviceMap | FlagCanAlignedDeviceMap, | ||
| 59 | |||
| 55 | Static = static_cast<u32>(Svc::MemoryState::Static) | FlagMapped | FlagCanQueryPhysical, | 60 | Static = static_cast<u32>(Svc::MemoryState::Static) | FlagMapped | FlagCanQueryPhysical, |
| 56 | Code = static_cast<u32>(Svc::MemoryState::Code) | FlagsCode | FlagCanMapProcess, | 61 | Code = static_cast<u32>(Svc::MemoryState::Code) | FlagsCode | FlagCanMapProcess, |
| 57 | CodeData = static_cast<u32>(Svc::MemoryState::CodeData) | FlagsData | FlagCanMapProcess | | 62 | CodeData = static_cast<u32>(Svc::MemoryState::CodeData) | FlagsData | FlagCanMapProcess | |
| 58 | FlagCanCodeMemory, | 63 | FlagCanCodeMemory | FlagCanPermissionLock, |
| 59 | Normal = static_cast<u32>(Svc::MemoryState::Normal) | FlagsData | FlagCanCodeMemory, | 64 | Normal = static_cast<u32>(Svc::MemoryState::Normal) | FlagsData | FlagCanCodeMemory, |
| 60 | Shared = static_cast<u32>(Svc::MemoryState::Shared) | FlagMapped | FlagReferenceCounted | | 65 | Shared = static_cast<u32>(Svc::MemoryState::Shared) | FlagMapped | FlagReferenceCounted | |
| 61 | FlagLinearMapped, | 66 | FlagLinearMapped, |
| @@ -65,7 +70,8 @@ enum class KMemoryState : u32 { | |||
| 65 | AliasCode = static_cast<u32>(Svc::MemoryState::AliasCode) | FlagsCode | FlagCanMapProcess | | 70 | AliasCode = static_cast<u32>(Svc::MemoryState::AliasCode) | FlagsCode | FlagCanMapProcess | |
| 66 | FlagCanCodeAlias, | 71 | FlagCanCodeAlias, |
| 67 | AliasCodeData = static_cast<u32>(Svc::MemoryState::AliasCodeData) | FlagsData | | 72 | AliasCodeData = static_cast<u32>(Svc::MemoryState::AliasCodeData) | FlagsData | |
| 68 | FlagCanMapProcess | FlagCanCodeAlias | FlagCanCodeMemory, | 73 | FlagCanMapProcess | FlagCanCodeAlias | FlagCanCodeMemory | |
| 74 | FlagCanPermissionLock, | ||
| 69 | 75 | ||
| 70 | Ipc = static_cast<u32>(Svc::MemoryState::Ipc) | FlagsMisc | FlagCanAlignedDeviceMap | | 76 | Ipc = static_cast<u32>(Svc::MemoryState::Ipc) | FlagsMisc | FlagCanAlignedDeviceMap | |
| 71 | FlagCanUseIpc | FlagCanUseNonSecureIpc | FlagCanUseNonDeviceIpc, | 77 | FlagCanUseIpc | FlagCanUseNonSecureIpc | FlagCanUseNonDeviceIpc, |
| @@ -73,7 +79,7 @@ enum class KMemoryState : u32 { | |||
| 73 | Stack = static_cast<u32>(Svc::MemoryState::Stack) | FlagsMisc | FlagCanAlignedDeviceMap | | 79 | Stack = static_cast<u32>(Svc::MemoryState::Stack) | FlagsMisc | FlagCanAlignedDeviceMap | |
| 74 | FlagCanUseIpc | FlagCanUseNonSecureIpc | FlagCanUseNonDeviceIpc, | 80 | FlagCanUseIpc | FlagCanUseNonSecureIpc | FlagCanUseNonDeviceIpc, |
| 75 | 81 | ||
| 76 | ThreadLocal = static_cast<u32>(Svc::MemoryState::ThreadLocal) | FlagMapped | FlagLinearMapped, | 82 | ThreadLocal = static_cast<u32>(Svc::MemoryState::ThreadLocal) | FlagLinearMapped, |
| 77 | 83 | ||
| 78 | Transfered = static_cast<u32>(Svc::MemoryState::Transfered) | FlagsMisc | | 84 | Transfered = static_cast<u32>(Svc::MemoryState::Transfered) | FlagsMisc | |
| 79 | FlagCanAlignedDeviceMap | FlagCanChangeAttribute | FlagCanUseIpc | | 85 | FlagCanAlignedDeviceMap | FlagCanChangeAttribute | FlagCanUseIpc | |
| @@ -94,7 +100,7 @@ enum class KMemoryState : u32 { | |||
| 94 | NonDeviceIpc = | 100 | NonDeviceIpc = |
| 95 | static_cast<u32>(Svc::MemoryState::NonDeviceIpc) | FlagsMisc | FlagCanUseNonDeviceIpc, | 101 | static_cast<u32>(Svc::MemoryState::NonDeviceIpc) | FlagsMisc | FlagCanUseNonDeviceIpc, |
| 96 | 102 | ||
| 97 | Kernel = static_cast<u32>(Svc::MemoryState::Kernel) | FlagMapped, | 103 | Kernel = static_cast<u32>(Svc::MemoryState::Kernel), |
| 98 | 104 | ||
| 99 | GeneratedCode = static_cast<u32>(Svc::MemoryState::GeneratedCode) | FlagMapped | | 105 | GeneratedCode = static_cast<u32>(Svc::MemoryState::GeneratedCode) | FlagMapped | |
| 100 | FlagReferenceCounted | FlagCanDebug | FlagLinearMapped, | 106 | FlagReferenceCounted | FlagCanDebug | FlagLinearMapped, |
| @@ -105,34 +111,36 @@ enum class KMemoryState : u32 { | |||
| 105 | 111 | ||
| 106 | Insecure = static_cast<u32>(Svc::MemoryState::Insecure) | FlagMapped | FlagReferenceCounted | | 112 | Insecure = static_cast<u32>(Svc::MemoryState::Insecure) | FlagMapped | FlagReferenceCounted | |
| 107 | FlagLinearMapped | FlagCanChangeAttribute | FlagCanDeviceMap | | 113 | FlagLinearMapped | FlagCanChangeAttribute | FlagCanDeviceMap | |
| 108 | FlagCanAlignedDeviceMap | FlagCanUseNonSecureIpc | FlagCanUseNonDeviceIpc, | 114 | FlagCanAlignedDeviceMap | FlagCanQueryPhysical | FlagCanUseNonSecureIpc | |
| 115 | FlagCanUseNonDeviceIpc, | ||
| 109 | }; | 116 | }; |
| 110 | DECLARE_ENUM_FLAG_OPERATORS(KMemoryState); | 117 | DECLARE_ENUM_FLAG_OPERATORS(KMemoryState); |
| 111 | 118 | ||
| 112 | static_assert(static_cast<u32>(KMemoryState::Free) == 0x00000000); | 119 | static_assert(static_cast<u32>(KMemoryState::Free) == 0x00000000); |
| 113 | static_assert(static_cast<u32>(KMemoryState::Io) == 0x00182001); | 120 | static_assert(static_cast<u32>(KMemoryState::IoMemory) == 0x00182001); |
| 121 | static_assert(static_cast<u32>(KMemoryState::IoRegister) == 0x00180001); | ||
| 114 | static_assert(static_cast<u32>(KMemoryState::Static) == 0x00042002); | 122 | static_assert(static_cast<u32>(KMemoryState::Static) == 0x00042002); |
| 115 | static_assert(static_cast<u32>(KMemoryState::Code) == 0x04DC7E03); | 123 | static_assert(static_cast<u32>(KMemoryState::Code) == 0x04DC7E03); |
| 116 | static_assert(static_cast<u32>(KMemoryState::CodeData) == 0x07FEBD04); | 124 | static_assert(static_cast<u32>(KMemoryState::CodeData) == 0x0FFEBD04); |
| 117 | static_assert(static_cast<u32>(KMemoryState::Normal) == 0x077EBD05); | 125 | static_assert(static_cast<u32>(KMemoryState::Normal) == 0x077EBD05); |
| 118 | static_assert(static_cast<u32>(KMemoryState::Shared) == 0x04402006); | 126 | static_assert(static_cast<u32>(KMemoryState::Shared) == 0x04402006); |
| 119 | 127 | ||
| 120 | static_assert(static_cast<u32>(KMemoryState::AliasCode) == 0x04DD7E08); | 128 | static_assert(static_cast<u32>(KMemoryState::AliasCode) == 0x04DD7E08); |
| 121 | static_assert(static_cast<u32>(KMemoryState::AliasCodeData) == 0x07FFBD09); | 129 | static_assert(static_cast<u32>(KMemoryState::AliasCodeData) == 0x0FFFBD09); |
| 122 | static_assert(static_cast<u32>(KMemoryState::Ipc) == 0x045C3C0A); | 130 | static_assert(static_cast<u32>(KMemoryState::Ipc) == 0x045C3C0A); |
| 123 | static_assert(static_cast<u32>(KMemoryState::Stack) == 0x045C3C0B); | 131 | static_assert(static_cast<u32>(KMemoryState::Stack) == 0x045C3C0B); |
| 124 | static_assert(static_cast<u32>(KMemoryState::ThreadLocal) == 0x0400200C); | 132 | static_assert(static_cast<u32>(KMemoryState::ThreadLocal) == 0x0400000C); |
| 125 | static_assert(static_cast<u32>(KMemoryState::Transfered) == 0x055C3C0D); | 133 | static_assert(static_cast<u32>(KMemoryState::Transfered) == 0x055C3C0D); |
| 126 | static_assert(static_cast<u32>(KMemoryState::SharedTransfered) == 0x045C380E); | 134 | static_assert(static_cast<u32>(KMemoryState::SharedTransfered) == 0x045C380E); |
| 127 | static_assert(static_cast<u32>(KMemoryState::SharedCode) == 0x0440380F); | 135 | static_assert(static_cast<u32>(KMemoryState::SharedCode) == 0x0440380F); |
| 128 | static_assert(static_cast<u32>(KMemoryState::Inaccessible) == 0x00000010); | 136 | static_assert(static_cast<u32>(KMemoryState::Inaccessible) == 0x00000010); |
| 129 | static_assert(static_cast<u32>(KMemoryState::NonSecureIpc) == 0x045C3811); | 137 | static_assert(static_cast<u32>(KMemoryState::NonSecureIpc) == 0x045C3811); |
| 130 | static_assert(static_cast<u32>(KMemoryState::NonDeviceIpc) == 0x044C2812); | 138 | static_assert(static_cast<u32>(KMemoryState::NonDeviceIpc) == 0x044C2812); |
| 131 | static_assert(static_cast<u32>(KMemoryState::Kernel) == 0x00002013); | 139 | static_assert(static_cast<u32>(KMemoryState::Kernel) == 0x00000013); |
| 132 | static_assert(static_cast<u32>(KMemoryState::GeneratedCode) == 0x04402214); | 140 | static_assert(static_cast<u32>(KMemoryState::GeneratedCode) == 0x04402214); |
| 133 | static_assert(static_cast<u32>(KMemoryState::CodeOut) == 0x04402015); | 141 | static_assert(static_cast<u32>(KMemoryState::CodeOut) == 0x04402015); |
| 134 | static_assert(static_cast<u32>(KMemoryState::Coverage) == 0x00002016); | 142 | static_assert(static_cast<u32>(KMemoryState::Coverage) == 0x00002016); |
| 135 | static_assert(static_cast<u32>(KMemoryState::Insecure) == 0x05583817); | 143 | static_assert(static_cast<u32>(KMemoryState::Insecure) == 0x055C3817); |
| 136 | 144 | ||
| 137 | enum class KMemoryPermission : u8 { | 145 | enum class KMemoryPermission : u8 { |
| 138 | None = 0, | 146 | None = 0, |
| @@ -182,6 +190,7 @@ enum class KMemoryAttribute : u8 { | |||
| 182 | IpcLocked = static_cast<u8>(Svc::MemoryAttribute::IpcLocked), | 190 | IpcLocked = static_cast<u8>(Svc::MemoryAttribute::IpcLocked), |
| 183 | DeviceShared = static_cast<u8>(Svc::MemoryAttribute::DeviceShared), | 191 | DeviceShared = static_cast<u8>(Svc::MemoryAttribute::DeviceShared), |
| 184 | Uncached = static_cast<u8>(Svc::MemoryAttribute::Uncached), | 192 | Uncached = static_cast<u8>(Svc::MemoryAttribute::Uncached), |
| 193 | PermissionLocked = static_cast<u8>(Svc::MemoryAttribute::PermissionLocked), | ||
| 185 | 194 | ||
| 186 | SetMask = Uncached, | 195 | SetMask = Uncached, |
| 187 | }; | 196 | }; |
| @@ -261,6 +270,10 @@ struct KMemoryInfo { | |||
| 261 | return m_state; | 270 | return m_state; |
| 262 | } | 271 | } |
| 263 | 272 | ||
| 273 | constexpr Svc::MemoryState GetSvcState() const { | ||
| 274 | return static_cast<Svc::MemoryState>(m_state & KMemoryState::Mask); | ||
| 275 | } | ||
| 276 | |||
| 264 | constexpr KMemoryPermission GetPermission() const { | 277 | constexpr KMemoryPermission GetPermission() const { |
| 265 | return m_permission; | 278 | return m_permission; |
| 266 | } | 279 | } |
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, | |||
| 2379 | KScopedPageTableUpdater updater(this); | 2379 | KScopedPageTableUpdater updater(this); |
| 2380 | 2380 | ||
| 2381 | // Perform mapping operation. | 2381 | // Perform mapping operation. |
| 2382 | const KPageProperties properties = {perm, state == KMemoryState::Io, false, | 2382 | const KPageProperties properties = {perm, false, false, DisableMergeAttribute::DisableHead}; |
| 2383 | DisableMergeAttribute::DisableHead}; | ||
| 2384 | R_TRY(this->MapPageGroupImpl(updater.GetPageList(), addr, pg, properties, false)); | 2383 | R_TRY(this->MapPageGroupImpl(updater.GetPageList(), addr, pg, properties, false)); |
| 2385 | 2384 | ||
| 2386 | // Update the blocks. | 2385 | // Update the blocks. |
| @@ -2422,8 +2421,7 @@ Result KPageTable::MapPageGroup(KProcessAddress addr, const KPageGroup& pg, KMem | |||
| 2422 | KScopedPageTableUpdater updater(this); | 2421 | KScopedPageTableUpdater updater(this); |
| 2423 | 2422 | ||
| 2424 | // Perform mapping operation. | 2423 | // Perform mapping operation. |
| 2425 | const KPageProperties properties = {perm, state == KMemoryState::Io, false, | 2424 | const KPageProperties properties = {perm, false, false, DisableMergeAttribute::DisableHead}; |
| 2426 | DisableMergeAttribute::DisableHead}; | ||
| 2427 | R_TRY(this->MapPageGroupImpl(updater.GetPageList(), addr, pg, properties, false)); | 2425 | R_TRY(this->MapPageGroupImpl(updater.GetPageList(), addr, pg, properties, false)); |
| 2428 | 2426 | ||
| 2429 | // Update the blocks. | 2427 | // Update the blocks. |
| @@ -2863,7 +2861,8 @@ Result KPageTable::LockForMapDeviceAddressSpace(bool* out_is_io, KProcessAddress | |||
| 2863 | &KMemoryBlock::ShareToDevice, KMemoryPermission::None); | 2861 | &KMemoryBlock::ShareToDevice, KMemoryPermission::None); |
| 2864 | 2862 | ||
| 2865 | // Set whether the locked memory was io. | 2863 | // Set whether the locked memory was io. |
| 2866 | *out_is_io = old_state == KMemoryState::Io; | 2864 | *out_is_io = |
| 2865 | static_cast<Svc::MemoryState>(old_state & KMemoryState::Mask) == Svc::MemoryState::Io; | ||
| 2867 | 2866 | ||
| 2868 | R_SUCCEED(); | 2867 | R_SUCCEED(); |
| 2869 | } | 2868 | } |
| @@ -3106,79 +3105,79 @@ void KPageTable::FinalizeUpdate(PageLinkedList* page_list) { | |||
| 3106 | } | 3105 | } |
| 3107 | } | 3106 | } |
| 3108 | 3107 | ||
| 3109 | KProcessAddress KPageTable::GetRegionAddress(KMemoryState state) const { | 3108 | KProcessAddress KPageTable::GetRegionAddress(Svc::MemoryState state) const { |
| 3110 | switch (state) { | 3109 | switch (state) { |
| 3111 | case KMemoryState::Free: | 3110 | case Svc::MemoryState::Free: |
| 3112 | case KMemoryState::Kernel: | 3111 | case Svc::MemoryState::Kernel: |
| 3113 | return m_address_space_start; | 3112 | return m_address_space_start; |
| 3114 | case KMemoryState::Normal: | 3113 | case Svc::MemoryState::Normal: |
| 3115 | return m_heap_region_start; | 3114 | return m_heap_region_start; |
| 3116 | case KMemoryState::Ipc: | 3115 | case Svc::MemoryState::Ipc: |
| 3117 | case KMemoryState::NonSecureIpc: | 3116 | case Svc::MemoryState::NonSecureIpc: |
| 3118 | case KMemoryState::NonDeviceIpc: | 3117 | case Svc::MemoryState::NonDeviceIpc: |
| 3119 | return m_alias_region_start; | 3118 | return m_alias_region_start; |
| 3120 | case KMemoryState::Stack: | 3119 | case Svc::MemoryState::Stack: |
| 3121 | return m_stack_region_start; | 3120 | return m_stack_region_start; |
| 3122 | case KMemoryState::Static: | 3121 | case Svc::MemoryState::Static: |
| 3123 | case KMemoryState::ThreadLocal: | 3122 | case Svc::MemoryState::ThreadLocal: |
| 3124 | return m_kernel_map_region_start; | 3123 | return m_kernel_map_region_start; |
| 3125 | case KMemoryState::Io: | 3124 | case Svc::MemoryState::Io: |
| 3126 | case KMemoryState::Shared: | 3125 | case Svc::MemoryState::Shared: |
| 3127 | case KMemoryState::AliasCode: | 3126 | case Svc::MemoryState::AliasCode: |
| 3128 | case KMemoryState::AliasCodeData: | 3127 | case Svc::MemoryState::AliasCodeData: |
| 3129 | case KMemoryState::Transfered: | 3128 | case Svc::MemoryState::Transfered: |
| 3130 | case KMemoryState::SharedTransfered: | 3129 | case Svc::MemoryState::SharedTransfered: |
| 3131 | case KMemoryState::SharedCode: | 3130 | case Svc::MemoryState::SharedCode: |
| 3132 | case KMemoryState::GeneratedCode: | 3131 | case Svc::MemoryState::GeneratedCode: |
| 3133 | case KMemoryState::CodeOut: | 3132 | case Svc::MemoryState::CodeOut: |
| 3134 | case KMemoryState::Coverage: | 3133 | case Svc::MemoryState::Coverage: |
| 3135 | case KMemoryState::Insecure: | 3134 | case Svc::MemoryState::Insecure: |
| 3136 | return m_alias_code_region_start; | 3135 | return m_alias_code_region_start; |
| 3137 | case KMemoryState::Code: | 3136 | case Svc::MemoryState::Code: |
| 3138 | case KMemoryState::CodeData: | 3137 | case Svc::MemoryState::CodeData: |
| 3139 | return m_code_region_start; | 3138 | return m_code_region_start; |
| 3140 | default: | 3139 | default: |
| 3141 | UNREACHABLE(); | 3140 | UNREACHABLE(); |
| 3142 | } | 3141 | } |
| 3143 | } | 3142 | } |
| 3144 | 3143 | ||
| 3145 | size_t KPageTable::GetRegionSize(KMemoryState state) const { | 3144 | size_t KPageTable::GetRegionSize(Svc::MemoryState state) const { |
| 3146 | switch (state) { | 3145 | switch (state) { |
| 3147 | case KMemoryState::Free: | 3146 | case Svc::MemoryState::Free: |
| 3148 | case KMemoryState::Kernel: | 3147 | case Svc::MemoryState::Kernel: |
| 3149 | return m_address_space_end - m_address_space_start; | 3148 | return m_address_space_end - m_address_space_start; |
| 3150 | case KMemoryState::Normal: | 3149 | case Svc::MemoryState::Normal: |
| 3151 | return m_heap_region_end - m_heap_region_start; | 3150 | return m_heap_region_end - m_heap_region_start; |
| 3152 | case KMemoryState::Ipc: | 3151 | case Svc::MemoryState::Ipc: |
| 3153 | case KMemoryState::NonSecureIpc: | 3152 | case Svc::MemoryState::NonSecureIpc: |
| 3154 | case KMemoryState::NonDeviceIpc: | 3153 | case Svc::MemoryState::NonDeviceIpc: |
| 3155 | return m_alias_region_end - m_alias_region_start; | 3154 | return m_alias_region_end - m_alias_region_start; |
| 3156 | case KMemoryState::Stack: | 3155 | case Svc::MemoryState::Stack: |
| 3157 | return m_stack_region_end - m_stack_region_start; | 3156 | return m_stack_region_end - m_stack_region_start; |
| 3158 | case KMemoryState::Static: | 3157 | case Svc::MemoryState::Static: |
| 3159 | case KMemoryState::ThreadLocal: | 3158 | case Svc::MemoryState::ThreadLocal: |
| 3160 | return m_kernel_map_region_end - m_kernel_map_region_start; | 3159 | return m_kernel_map_region_end - m_kernel_map_region_start; |
| 3161 | case KMemoryState::Io: | 3160 | case Svc::MemoryState::Io: |
| 3162 | case KMemoryState::Shared: | 3161 | case Svc::MemoryState::Shared: |
| 3163 | case KMemoryState::AliasCode: | 3162 | case Svc::MemoryState::AliasCode: |
| 3164 | case KMemoryState::AliasCodeData: | 3163 | case Svc::MemoryState::AliasCodeData: |
| 3165 | case KMemoryState::Transfered: | 3164 | case Svc::MemoryState::Transfered: |
| 3166 | case KMemoryState::SharedTransfered: | 3165 | case Svc::MemoryState::SharedTransfered: |
| 3167 | case KMemoryState::SharedCode: | 3166 | case Svc::MemoryState::SharedCode: |
| 3168 | case KMemoryState::GeneratedCode: | 3167 | case Svc::MemoryState::GeneratedCode: |
| 3169 | case KMemoryState::CodeOut: | 3168 | case Svc::MemoryState::CodeOut: |
| 3170 | case KMemoryState::Coverage: | 3169 | case Svc::MemoryState::Coverage: |
| 3171 | case KMemoryState::Insecure: | 3170 | case Svc::MemoryState::Insecure: |
| 3172 | return m_alias_code_region_end - m_alias_code_region_start; | 3171 | return m_alias_code_region_end - m_alias_code_region_start; |
| 3173 | case KMemoryState::Code: | 3172 | case Svc::MemoryState::Code: |
| 3174 | case KMemoryState::CodeData: | 3173 | case Svc::MemoryState::CodeData: |
| 3175 | return m_code_region_end - m_code_region_start; | 3174 | return m_code_region_end - m_code_region_start; |
| 3176 | default: | 3175 | default: |
| 3177 | UNREACHABLE(); | 3176 | UNREACHABLE(); |
| 3178 | } | 3177 | } |
| 3179 | } | 3178 | } |
| 3180 | 3179 | ||
| 3181 | bool KPageTable::CanContain(KProcessAddress addr, size_t size, KMemoryState state) const { | 3180 | bool KPageTable::CanContain(KProcessAddress addr, size_t size, Svc::MemoryState state) const { |
| 3182 | const KProcessAddress end = addr + size; | 3181 | const KProcessAddress end = addr + size; |
| 3183 | const KProcessAddress last = end - 1; | 3182 | const KProcessAddress last = end - 1; |
| 3184 | 3183 | ||
| @@ -3192,32 +3191,32 @@ bool KPageTable::CanContain(KProcessAddress addr, size_t size, KMemoryState stat | |||
| 3192 | const bool is_in_alias = !(end <= m_alias_region_start || m_alias_region_end <= addr || | 3191 | const bool is_in_alias = !(end <= m_alias_region_start || m_alias_region_end <= addr || |
| 3193 | m_alias_region_start == m_alias_region_end); | 3192 | m_alias_region_start == m_alias_region_end); |
| 3194 | switch (state) { | 3193 | switch (state) { |
| 3195 | case KMemoryState::Free: | 3194 | case Svc::MemoryState::Free: |
| 3196 | case KMemoryState::Kernel: | 3195 | case Svc::MemoryState::Kernel: |
| 3197 | return is_in_region; | 3196 | return is_in_region; |
| 3198 | case KMemoryState::Io: | 3197 | case Svc::MemoryState::Io: |
| 3199 | case KMemoryState::Static: | 3198 | case Svc::MemoryState::Static: |
| 3200 | case KMemoryState::Code: | 3199 | case Svc::MemoryState::Code: |
| 3201 | case KMemoryState::CodeData: | 3200 | case Svc::MemoryState::CodeData: |
| 3202 | case KMemoryState::Shared: | 3201 | case Svc::MemoryState::Shared: |
| 3203 | case KMemoryState::AliasCode: | 3202 | case Svc::MemoryState::AliasCode: |
| 3204 | case KMemoryState::AliasCodeData: | 3203 | case Svc::MemoryState::AliasCodeData: |
| 3205 | case KMemoryState::Stack: | 3204 | case Svc::MemoryState::Stack: |
| 3206 | case KMemoryState::ThreadLocal: | 3205 | case Svc::MemoryState::ThreadLocal: |
| 3207 | case KMemoryState::Transfered: | 3206 | case Svc::MemoryState::Transfered: |
| 3208 | case KMemoryState::SharedTransfered: | 3207 | case Svc::MemoryState::SharedTransfered: |
| 3209 | case KMemoryState::SharedCode: | 3208 | case Svc::MemoryState::SharedCode: |
| 3210 | case KMemoryState::GeneratedCode: | 3209 | case Svc::MemoryState::GeneratedCode: |
| 3211 | case KMemoryState::CodeOut: | 3210 | case Svc::MemoryState::CodeOut: |
| 3212 | case KMemoryState::Coverage: | 3211 | case Svc::MemoryState::Coverage: |
| 3213 | case KMemoryState::Insecure: | 3212 | case Svc::MemoryState::Insecure: |
| 3214 | return is_in_region && !is_in_heap && !is_in_alias; | 3213 | return is_in_region && !is_in_heap && !is_in_alias; |
| 3215 | case KMemoryState::Normal: | 3214 | case Svc::MemoryState::Normal: |
| 3216 | ASSERT(is_in_heap); | 3215 | ASSERT(is_in_heap); |
| 3217 | return is_in_region && !is_in_alias; | 3216 | return is_in_region && !is_in_alias; |
| 3218 | case KMemoryState::Ipc: | 3217 | case Svc::MemoryState::Ipc: |
| 3219 | case KMemoryState::NonSecureIpc: | 3218 | case Svc::MemoryState::NonSecureIpc: |
| 3220 | case KMemoryState::NonDeviceIpc: | 3219 | case Svc::MemoryState::NonDeviceIpc: |
| 3221 | ASSERT(is_in_alias); | 3220 | ASSERT(is_in_alias); |
| 3222 | return is_in_region && !is_in_heap; | 3221 | return is_in_region && !is_in_heap; |
| 3223 | default: | 3222 | 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: | |||
| 126 | return m_block_info_manager; | 126 | return m_block_info_manager; |
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | bool CanContain(KProcessAddress addr, size_t size, KMemoryState state) const; | ||
| 130 | |||
| 131 | Result MapPages(KProcessAddress* out_addr, size_t num_pages, size_t alignment, | 129 | Result MapPages(KProcessAddress* out_addr, size_t num_pages, size_t alignment, |
| 132 | KPhysicalAddress phys_addr, KProcessAddress region_start, | 130 | KPhysicalAddress phys_addr, KProcessAddress region_start, |
| 133 | size_t region_num_pages, KMemoryState state, KMemoryPermission perm) { | 131 | size_t region_num_pages, KMemoryState state, KMemoryPermission perm) { |
| @@ -162,6 +160,21 @@ public: | |||
| 162 | void RemapPageGroup(PageLinkedList* page_list, KProcessAddress address, size_t size, | 160 | void RemapPageGroup(PageLinkedList* page_list, KProcessAddress address, size_t size, |
| 163 | const KPageGroup& pg); | 161 | const KPageGroup& pg); |
| 164 | 162 | ||
| 163 | KProcessAddress GetRegionAddress(Svc::MemoryState state) const; | ||
| 164 | size_t GetRegionSize(Svc::MemoryState state) const; | ||
| 165 | bool CanContain(KProcessAddress addr, size_t size, Svc::MemoryState state) const; | ||
| 166 | |||
| 167 | KProcessAddress GetRegionAddress(KMemoryState state) const { | ||
| 168 | return this->GetRegionAddress(static_cast<Svc::MemoryState>(state & KMemoryState::Mask)); | ||
| 169 | } | ||
| 170 | size_t GetRegionSize(KMemoryState state) const { | ||
| 171 | return this->GetRegionSize(static_cast<Svc::MemoryState>(state & KMemoryState::Mask)); | ||
| 172 | } | ||
| 173 | bool CanContain(KProcessAddress addr, size_t size, KMemoryState state) const { | ||
| 174 | return this->CanContain(addr, size, | ||
| 175 | static_cast<Svc::MemoryState>(state & KMemoryState::Mask)); | ||
| 176 | } | ||
| 177 | |||
| 165 | protected: | 178 | protected: |
| 166 | struct PageLinkedList { | 179 | struct PageLinkedList { |
| 167 | private: | 180 | private: |
| @@ -228,8 +241,6 @@ private: | |||
| 228 | Result Operate(KProcessAddress addr, size_t num_pages, KMemoryPermission perm, | 241 | Result Operate(KProcessAddress addr, size_t num_pages, KMemoryPermission perm, |
| 229 | OperationType operation, KPhysicalAddress map_addr = 0); | 242 | OperationType operation, KPhysicalAddress map_addr = 0); |
| 230 | void FinalizeUpdate(PageLinkedList* page_list); | 243 | void FinalizeUpdate(PageLinkedList* page_list); |
| 231 | KProcessAddress GetRegionAddress(KMemoryState state) const; | ||
| 232 | size_t GetRegionSize(KMemoryState state) const; | ||
| 233 | 244 | ||
| 234 | KProcessAddress FindFreeArea(KProcessAddress region_start, size_t region_num_pages, | 245 | KProcessAddress FindFreeArea(KProcessAddress region_start, size_t region_num_pages, |
| 235 | size_t num_pages, size_t alignment, size_t offset, | 246 | 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 { | |||
| 46 | IpcLocked = (1 << 1), | 46 | IpcLocked = (1 << 1), |
| 47 | DeviceShared = (1 << 2), | 47 | DeviceShared = (1 << 2), |
| 48 | Uncached = (1 << 3), | 48 | Uncached = (1 << 3), |
| 49 | PermissionLocked = (1 << 4), | ||
| 49 | }; | 50 | }; |
| 50 | DECLARE_ENUM_FLAG_OPERATORS(MemoryAttribute); | 51 | DECLARE_ENUM_FLAG_OPERATORS(MemoryAttribute); |
| 51 | 52 | ||
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, | |||
| 46 | // Get bounds of where mapping is possible. | 46 | // Get bounds of where mapping is possible. |
| 47 | const VAddr alias_code_begin = GetInteger(page_table.GetAliasCodeRegionStart()); | 47 | const VAddr alias_code_begin = GetInteger(page_table.GetAliasCodeRegionStart()); |
| 48 | const VAddr alias_code_size = page_table.GetAliasCodeRegionSize() / YUZU_PAGESIZE; | 48 | const VAddr alias_code_size = page_table.GetAliasCodeRegionSize() / YUZU_PAGESIZE; |
| 49 | const auto state = Kernel::KMemoryState::Io; | 49 | const auto state = Kernel::KMemoryState::IoMemory; |
| 50 | const auto perm = Kernel::KMemoryPermission::UserReadWrite; | 50 | const auto perm = Kernel::KMemoryPermission::UserReadWrite; |
| 51 | std::mt19937_64 rng{process->GetRandomEntropy(0)}; | 51 | std::mt19937_64 rng{process->GetRandomEntropy(0)}; |
| 52 | 52 | ||