mirror of
				https://git.tardis.systems/mirrors/yuzu
				synced 2025-10-31 02:34:11 +01:00 
			
		
		
		
	kernel: split Io memory state, add PermissionLocked attribute
This commit is contained in:
		
							parent
							
								
									22afa2c7a3
								
							
						
					
					
						commit
						794e6c7a96
					
				| @ -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; | ||||
|     } | ||||
|  | ||||
| @ -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: | ||||
|  | ||||
| @ -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, | ||||
|  | ||||
| @ -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); | ||||
| 
 | ||||
|  | ||||
| @ -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)}; | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user