From 6f50b9bdb0943c350835453e97b02be52ad39bfd Mon Sep 17 00:00:00 2001 From: gdkchan Date: Wed, 3 Jan 2024 20:05:14 -0300 Subject: Add support for PermissionLocked attribute added on firmware 17.0.0 (#6072) * Update MemoryState enum and add new flags * Add support for new PermissionLocked attribute added on firmware 17.0.0 * Format whitespace --- .../HOS/Kernel/Memory/KPageTableBase.cs | 26 ++++++++++++++-------- 1 file changed, 17 insertions(+), 9 deletions(-) (limited to 'src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs') diff --git a/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs b/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs index 2b6d4e4e..b065e9c5 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs @@ -675,7 +675,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory KMemoryPermission.None, MemoryAttribute.Mask, MemoryAttribute.None, - MemoryAttribute.IpcAndDeviceMapped, + MemoryAttribute.IpcAndDeviceMapped | MemoryAttribute.PermissionLocked, out MemoryState state, out _, out _); @@ -687,7 +687,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory state, KMemoryPermission.None, KMemoryPermission.None, - MemoryAttribute.Mask, + MemoryAttribute.Mask & ~MemoryAttribute.PermissionLocked, MemoryAttribute.None); if (success) @@ -913,19 +913,27 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory return Result.Success; } - public Result SetMemoryAttribute( - ulong address, - ulong size, - MemoryAttribute attributeMask, - MemoryAttribute attributeValue) + public Result SetMemoryAttribute(ulong address, ulong size, MemoryAttribute attributeMask, MemoryAttribute attributeValue) { lock (_blockManager) { + MemoryState stateCheckMask = 0; + + if (attributeMask.HasFlag(MemoryAttribute.Uncached)) + { + stateCheckMask = MemoryState.AttributeChangeAllowed; + } + + if (attributeMask.HasFlag(MemoryAttribute.PermissionLocked)) + { + stateCheckMask |= MemoryState.PermissionLockAllowed; + } + if (CheckRange( address, size, - MemoryState.AttributeChangeAllowed, - MemoryState.AttributeChangeAllowed, + stateCheckMask, + stateCheckMask, KMemoryPermission.None, KMemoryPermission.None, MemoryAttribute.BorrowedAndIpcMapped, -- cgit v1.2.3