summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/kernel/k_memory_block.h39
-rw-r--r--src/core/hle/kernel/k_page_table.cpp147
-rw-r--r--src/core/hle/kernel/k_page_table.h19
-rw-r--r--src/core/hle/kernel/svc_types.h1
-rw-r--r--src/core/hle/service/nvnflinger/fb_share_buffer_manager.cpp2
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};
110DECLARE_ENUM_FLAG_OPERATORS(KMemoryState); 117DECLARE_ENUM_FLAG_OPERATORS(KMemoryState);
111 118
112static_assert(static_cast<u32>(KMemoryState::Free) == 0x00000000); 119static_assert(static_cast<u32>(KMemoryState::Free) == 0x00000000);
113static_assert(static_cast<u32>(KMemoryState::Io) == 0x00182001); 120static_assert(static_cast<u32>(KMemoryState::IoMemory) == 0x00182001);
121static_assert(static_cast<u32>(KMemoryState::IoRegister) == 0x00180001);
114static_assert(static_cast<u32>(KMemoryState::Static) == 0x00042002); 122static_assert(static_cast<u32>(KMemoryState::Static) == 0x00042002);
115static_assert(static_cast<u32>(KMemoryState::Code) == 0x04DC7E03); 123static_assert(static_cast<u32>(KMemoryState::Code) == 0x04DC7E03);
116static_assert(static_cast<u32>(KMemoryState::CodeData) == 0x07FEBD04); 124static_assert(static_cast<u32>(KMemoryState::CodeData) == 0x0FFEBD04);
117static_assert(static_cast<u32>(KMemoryState::Normal) == 0x077EBD05); 125static_assert(static_cast<u32>(KMemoryState::Normal) == 0x077EBD05);
118static_assert(static_cast<u32>(KMemoryState::Shared) == 0x04402006); 126static_assert(static_cast<u32>(KMemoryState::Shared) == 0x04402006);
119 127
120static_assert(static_cast<u32>(KMemoryState::AliasCode) == 0x04DD7E08); 128static_assert(static_cast<u32>(KMemoryState::AliasCode) == 0x04DD7E08);
121static_assert(static_cast<u32>(KMemoryState::AliasCodeData) == 0x07FFBD09); 129static_assert(static_cast<u32>(KMemoryState::AliasCodeData) == 0x0FFFBD09);
122static_assert(static_cast<u32>(KMemoryState::Ipc) == 0x045C3C0A); 130static_assert(static_cast<u32>(KMemoryState::Ipc) == 0x045C3C0A);
123static_assert(static_cast<u32>(KMemoryState::Stack) == 0x045C3C0B); 131static_assert(static_cast<u32>(KMemoryState::Stack) == 0x045C3C0B);
124static_assert(static_cast<u32>(KMemoryState::ThreadLocal) == 0x0400200C); 132static_assert(static_cast<u32>(KMemoryState::ThreadLocal) == 0x0400000C);
125static_assert(static_cast<u32>(KMemoryState::Transfered) == 0x055C3C0D); 133static_assert(static_cast<u32>(KMemoryState::Transfered) == 0x055C3C0D);
126static_assert(static_cast<u32>(KMemoryState::SharedTransfered) == 0x045C380E); 134static_assert(static_cast<u32>(KMemoryState::SharedTransfered) == 0x045C380E);
127static_assert(static_cast<u32>(KMemoryState::SharedCode) == 0x0440380F); 135static_assert(static_cast<u32>(KMemoryState::SharedCode) == 0x0440380F);
128static_assert(static_cast<u32>(KMemoryState::Inaccessible) == 0x00000010); 136static_assert(static_cast<u32>(KMemoryState::Inaccessible) == 0x00000010);
129static_assert(static_cast<u32>(KMemoryState::NonSecureIpc) == 0x045C3811); 137static_assert(static_cast<u32>(KMemoryState::NonSecureIpc) == 0x045C3811);
130static_assert(static_cast<u32>(KMemoryState::NonDeviceIpc) == 0x044C2812); 138static_assert(static_cast<u32>(KMemoryState::NonDeviceIpc) == 0x044C2812);
131static_assert(static_cast<u32>(KMemoryState::Kernel) == 0x00002013); 139static_assert(static_cast<u32>(KMemoryState::Kernel) == 0x00000013);
132static_assert(static_cast<u32>(KMemoryState::GeneratedCode) == 0x04402214); 140static_assert(static_cast<u32>(KMemoryState::GeneratedCode) == 0x04402214);
133static_assert(static_cast<u32>(KMemoryState::CodeOut) == 0x04402015); 141static_assert(static_cast<u32>(KMemoryState::CodeOut) == 0x04402015);
134static_assert(static_cast<u32>(KMemoryState::Coverage) == 0x00002016); 142static_assert(static_cast<u32>(KMemoryState::Coverage) == 0x00002016);
135static_assert(static_cast<u32>(KMemoryState::Insecure) == 0x05583817); 143static_assert(static_cast<u32>(KMemoryState::Insecure) == 0x055C3817);
136 144
137enum class KMemoryPermission : u8 { 145enum 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
3109KProcessAddress KPageTable::GetRegionAddress(KMemoryState state) const { 3108KProcessAddress 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
3145size_t KPageTable::GetRegionSize(KMemoryState state) const { 3144size_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
3181bool KPageTable::CanContain(KProcessAddress addr, size_t size, KMemoryState state) const { 3180bool 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
165protected: 178protected:
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};
50DECLARE_ENUM_FLAG_OPERATORS(MemoryAttribute); 51DECLARE_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