aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.HLE/HOS/Kernel
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2023-11-07 13:24:10 -0300
committerGitHub <noreply@github.com>2023-11-07 13:24:10 -0300
commit815819767c5794624e3e7bc2bebcabe8ea4de0f6 (patch)
treea57b27ee8d43f243e7085dfbba16a388d13f9432 /src/Ryujinx.HLE/HOS/Kernel
parent623604c39186901fd64c8e04e9aa959d5c825529 (diff)
Force all exclusive memory accesses to be ordered on AppleHv (#5898)
* Implement reprotect method on virtual memory manager (currently stubbed) * Force all exclusive memory accesses to be ordered on AppleHv * Format whitespace * Fix test build * Fix comment copy/paste * Fix wrong bit for isLoad * Update src/Ryujinx.Cpu/AppleHv/HvMemoryManager.cs Co-authored-by: riperiperi <rhy3756547@hotmail.com> --------- Co-authored-by: riperiperi <rhy3756547@hotmail.com>
Diffstat (limited to 'src/Ryujinx.HLE/HOS/Kernel')
-rw-r--r--src/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryPermission.cs46
-rw-r--r--src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTable.cs10
-rw-r--r--src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs6
-rw-r--r--src/Ryujinx.HLE/HOS/Kernel/Memory/MemoryPermission.cs20
4 files changed, 55 insertions, 27 deletions
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryPermission.cs b/src/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryPermission.cs
new file mode 100644
index 00000000..32734574
--- /dev/null
+++ b/src/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryPermission.cs
@@ -0,0 +1,46 @@
+using Ryujinx.Memory;
+using System;
+
+namespace Ryujinx.HLE.HOS.Kernel.Memory
+{
+ [Flags]
+ enum KMemoryPermission : uint
+ {
+ None = 0,
+ UserMask = Read | Write | Execute,
+ Mask = uint.MaxValue,
+
+ Read = 1 << 0,
+ Write = 1 << 1,
+ Execute = 1 << 2,
+ DontCare = 1 << 28,
+
+ ReadAndWrite = Read | Write,
+ ReadAndExecute = Read | Execute,
+ }
+
+ static class KMemoryPermissionExtensions
+ {
+ public static MemoryPermission Convert(this KMemoryPermission permission)
+ {
+ MemoryPermission output = MemoryPermission.None;
+
+ if (permission.HasFlag(KMemoryPermission.Read))
+ {
+ output = MemoryPermission.Read;
+ }
+
+ if (permission.HasFlag(KMemoryPermission.Write))
+ {
+ output |= MemoryPermission.Write;
+ }
+
+ if (permission.HasFlag(KMemoryPermission.Execute))
+ {
+ output |= MemoryPermission.Execute;
+ }
+
+ return output;
+ }
+ }
+}
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTable.cs b/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTable.cs
index dcfc8f4f..4cd3e6fd 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTable.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTable.cs
@@ -203,15 +203,17 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
/// <inheritdoc/>
protected override Result Reprotect(ulong address, ulong pagesCount, KMemoryPermission permission)
{
- // TODO.
+ _cpuMemory.Reprotect(address, pagesCount * PageSize, permission.Convert());
+
return Result.Success;
}
/// <inheritdoc/>
- protected override Result ReprotectWithAttributes(ulong address, ulong pagesCount, KMemoryPermission permission)
+ protected override Result ReprotectAndFlush(ulong address, ulong pagesCount, KMemoryPermission permission)
{
- // TODO.
- return Result.Success;
+ // TODO: Flush JIT cache.
+
+ return Reprotect(address, pagesCount, permission);
}
/// <inheritdoc/>
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs b/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs
index 2b00f802..2b6d4e4e 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs
@@ -1255,7 +1255,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
if ((oldPermission & KMemoryPermission.Execute) != 0)
{
- result = ReprotectWithAttributes(address, pagesCount, permission);
+ result = ReprotectAndFlush(address, pagesCount, permission);
}
else
{
@@ -3036,13 +3036,13 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
protected abstract Result Reprotect(ulong address, ulong pagesCount, KMemoryPermission permission);
/// <summary>
- /// Changes the permissions of a given virtual memory region.
+ /// Changes the permissions of a given virtual memory region, while also flushing the cache.
/// </summary>
/// <param name="address">Virtual address of the region to have the permission changes</param>
/// <param name="pagesCount">Number of pages to have their permissions changed</param>
/// <param name="permission">New permission</param>
/// <returns>Result of the permission change operation</returns>
- protected abstract Result ReprotectWithAttributes(ulong address, ulong pagesCount, KMemoryPermission permission);
+ protected abstract Result ReprotectAndFlush(ulong address, ulong pagesCount, KMemoryPermission permission);
/// <summary>
/// Alerts the memory tracking that a given region has been read from or written to.
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Memory/MemoryPermission.cs b/src/Ryujinx.HLE/HOS/Kernel/Memory/MemoryPermission.cs
deleted file mode 100644
index 068cdbb8..00000000
--- a/src/Ryujinx.HLE/HOS/Kernel/Memory/MemoryPermission.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-using System;
-
-namespace Ryujinx.HLE.HOS.Kernel.Memory
-{
- [Flags]
- enum KMemoryPermission : uint
- {
- None = 0,
- UserMask = Read | Write | Execute,
- Mask = uint.MaxValue,
-
- Read = 1 << 0,
- Write = 1 << 1,
- Execute = 1 << 2,
- DontCare = 1 << 28,
-
- ReadAndWrite = Read | Write,
- ReadAndExecute = Read | Execute,
- }
-}