aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Cpu/MemoryManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Cpu/MemoryManager.cs')
-rw-r--r--Ryujinx.Cpu/MemoryManager.cs13
1 files changed, 8 insertions, 5 deletions
diff --git a/Ryujinx.Cpu/MemoryManager.cs b/Ryujinx.Cpu/MemoryManager.cs
index cef20126..8c8bd3a4 100644
--- a/Ryujinx.Cpu/MemoryManager.cs
+++ b/Ryujinx.Cpu/MemoryManager.cs
@@ -21,6 +21,8 @@ namespace Ryujinx.Cpu
private const int PteSize = 8;
+ private const int PointerTagBit = 62;
+
private readonly InvalidAccessHandler _invalidAccessHandler;
/// <summary>
@@ -556,11 +558,12 @@ namespace Ryujinx.Cpu
// Protection is inverted on software pages, since the default value is 0.
protection = (~protection) & MemoryPermission.ReadAndWrite;
- long tag = (long)protection << 48;
- if (tag > 0)
+ long tag = protection switch
{
- tag |= long.MinValue; // If any protection is present, the whole pte is negative.
- }
+ MemoryPermission.None => 0L,
+ MemoryPermission.Read => 2L << PointerTagBit,
+ _ => 3L << PointerTagBit
+ };
ulong endVa = (va + size + PageMask) & ~(ulong)PageMask;
long invTagMask = ~(0xffffL << 48);
@@ -628,7 +631,7 @@ namespace Ryujinx.Cpu
// tracking using host guard pages in future, but also supporting platforms where this is not possible.
// Write tag includes read protection, since we don't have any read actions that aren't performed before write too.
- long tag = (write ? 3L : 1L) << 48;
+ long tag = (write ? 3L : 2L) << PointerTagBit;
ulong endVa = (va + size + PageMask) & ~(ulong)PageMask;