aboutsummaryrefslogtreecommitdiff
path: root/ChocolArm64/Memory/AMemoryMgr.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-08-15 15:59:51 -0300
committerGitHub <noreply@github.com>2018-08-15 15:59:51 -0300
commitc393cdf8e3775bc95850e4d8c8e4c446b286d3b4 (patch)
tree25035a244741d2daf3f7d6be8b23153ff061ea15 /ChocolArm64/Memory/AMemoryMgr.cs
parent76d95dee05e3c51c18e1799f54cc407e0f633b4e (diff)
More flexible memory manager (#307)
* Keep track mapped buffers with fixed offsets * Started rewriting the memory manager * Initial support for MapPhysicalMemory and UnmapPhysicalMemory, other tweaks * MapPhysicalMemory/UnmapPhysicalMemory support, other tweaks * Rebased * Optimize the map/unmap physical memory svcs * Integrate shared font support * Fix address space reserve alignment * Some fixes related to gpu memory mapping * Some cleanup * Only try uploading const buffers that are really used * Check if memory region is contiguous * Rebased * Add missing count increment on IsRegionModified * Check for reads/writes outside of the address space, optimize translation with a tail call
Diffstat (limited to 'ChocolArm64/Memory/AMemoryMgr.cs')
-rw-r--r--ChocolArm64/Memory/AMemoryMgr.cs258
1 files changed, 0 insertions, 258 deletions
diff --git a/ChocolArm64/Memory/AMemoryMgr.cs b/ChocolArm64/Memory/AMemoryMgr.cs
deleted file mode 100644
index 8a165b07..00000000
--- a/ChocolArm64/Memory/AMemoryMgr.cs
+++ /dev/null
@@ -1,258 +0,0 @@
-using System;
-
-namespace ChocolArm64.Memory
-{
- public class AMemoryMgr
- {
- public const long RamSize = 4L * 1024 * 1024 * 1024;
- public const long AddrSize = RamSize;
-
- private const int PTLvl0Bits = 10;
- private const int PTLvl1Bits = 10;
- private const int PTPageBits = 12;
-
- private const int PTLvl0Size = 1 << PTLvl0Bits;
- private const int PTLvl1Size = 1 << PTLvl1Bits;
- public const int PageSize = 1 << PTPageBits;
-
- private const int PTLvl0Mask = PTLvl0Size - 1;
- private const int PTLvl1Mask = PTLvl1Size - 1;
- public const int PageMask = PageSize - 1;
-
- private const int PTLvl0Bit = PTPageBits + PTLvl1Bits;
- private const int PTLvl1Bit = PTPageBits;
-
- private enum PTMap
- {
- Unmapped,
- Mapped
- }
-
- private struct PTEntry
- {
- public PTMap Map;
- public AMemoryPerm Perm;
-
- public int Type;
- public int Attr;
-
- public PTEntry(PTMap Map, AMemoryPerm Perm, int Type, int Attr)
- {
- this.Map = Map;
- this.Perm = Perm;
- this.Type = Type;
- this.Attr = Attr;
- }
- }
-
- private PTEntry[][] PageTable;
-
- public AMemoryMgr()
- {
- PageTable = new PTEntry[PTLvl0Size][];
- }
-
- public void Map(long Position, long Size, int Type, AMemoryPerm Perm)
- {
- SetPTEntry(Position, Size, new PTEntry(PTMap.Mapped, Perm, Type, 0));
- }
-
- public void Unmap(long Position, long Size)
- {
- SetPTEntry(Position, Size, new PTEntry(PTMap.Unmapped, 0, 0, 0));
- }
-
- public void Unmap(long Position, long Size, int Type)
- {
- SetPTEntry(Position, Size, Type, new PTEntry(PTMap.Unmapped, 0, 0, 0));
- }
-
- public void Reprotect(long Position, long Size, AMemoryPerm Perm)
- {
- Position = AMemoryHelper.PageRoundDown(Position);
-
- Size = AMemoryHelper.PageRoundUp(Size);
-
- long PagesCount = Size / PageSize;
-
- while (PagesCount-- > 0)
- {
- PTEntry Entry = GetPTEntry(Position);
-
- Entry.Perm = Perm;
-
- SetPTEntry(Position, Entry);
-
- Position += PageSize;
- }
- }
-
- public AMemoryMapInfo GetMapInfo(long Position)
- {
- if (!IsValidPosition(Position))
- {
- return null;
- }
-
- Position = AMemoryHelper.PageRoundDown(Position);
-
- PTEntry BaseEntry = GetPTEntry(Position);
-
- bool IsSameSegment(long Pos)
- {
- if (!IsValidPosition(Pos))
- {
- return false;
- }
-
- PTEntry Entry = GetPTEntry(Pos);
-
- return Entry.Map == BaseEntry.Map &&
- Entry.Perm == BaseEntry.Perm &&
- Entry.Type == BaseEntry.Type &&
- Entry.Attr == BaseEntry.Attr;
- }
-
- long Start = Position;
- long End = Position + PageSize;
-
- while (Start > 0 && IsSameSegment(Start - PageSize))
- {
- Start -= PageSize;
- }
-
- while (End < AddrSize && IsSameSegment(End))
- {
- End += PageSize;
- }
-
- long Size = End - Start;
-
- return new AMemoryMapInfo(
- Start,
- Size,
- BaseEntry.Type,
- BaseEntry.Attr,
- BaseEntry.Perm);
- }
-
- public void ClearAttrBit(long Position, long Size, int Bit)
- {
- while (Size > 0)
- {
- PTEntry Entry = GetPTEntry(Position);
-
- Entry.Attr &= ~(1 << Bit);
-
- SetPTEntry(Position, Entry);
-
- Position += PageSize;
- Size -= PageSize;
- }
- }
-
- public void SetAttrBit(long Position, long Size, int Bit)
- {
- while (Size > 0)
- {
- PTEntry Entry = GetPTEntry(Position);
-
- Entry.Attr |= (1 << Bit);
-
- SetPTEntry(Position, Entry);
-
- Position += PageSize;
- Size -= PageSize;
- }
- }
-
- public bool HasPermission(long Position, AMemoryPerm Perm)
- {
- return GetPTEntry(Position).Perm.HasFlag(Perm);
- }
-
- public bool IsValidPosition(long Position)
- {
- if (Position >> PTLvl0Bits + PTLvl1Bits + PTPageBits != 0)
- {
- return false;
- }
-
- return true;
- }
-
- public bool IsMapped(long Position)
- {
- if (Position >> PTLvl0Bits + PTLvl1Bits + PTPageBits != 0)
- {
- return false;
- }
-
- long L0 = (Position >> PTLvl0Bit) & PTLvl0Mask;
- long L1 = (Position >> PTLvl1Bit) & PTLvl1Mask;
-
- if (PageTable[L0] == null)
- {
- return false;
- }
-
- return PageTable[L0][L1].Map != PTMap.Unmapped;
- }
-
- private PTEntry GetPTEntry(long Position)
- {
- long L0 = (Position >> PTLvl0Bit) & PTLvl0Mask;
- long L1 = (Position >> PTLvl1Bit) & PTLvl1Mask;
-
- if (PageTable[L0] == null)
- {
- return default(PTEntry);
- }
-
- return PageTable[L0][L1];
- }
-
- private void SetPTEntry(long Position, long Size, PTEntry Entry)
- {
- while (Size > 0)
- {
- SetPTEntry(Position, Entry);
-
- Position += PageSize;
- Size -= PageSize;
- }
- }
-
- private void SetPTEntry(long Position, long Size, int Type, PTEntry Entry)
- {
- while (Size > 0)
- {
- if (GetPTEntry(Position).Type == Type)
- {
- SetPTEntry(Position, Entry);
- }
-
- Position += PageSize;
- Size -= PageSize;
- }
- }
-
- private void SetPTEntry(long Position, PTEntry Entry)
- {
- if (!IsValidPosition(Position))
- {
- throw new ArgumentOutOfRangeException(nameof(Position));
- }
-
- long L0 = (Position >> PTLvl0Bit) & PTLvl0Mask;
- long L1 = (Position >> PTLvl1Bit) & PTLvl1Mask;
-
- if (PageTable[L0] == null)
- {
- PageTable[L0] = new PTEntry[PTLvl1Size];
- }
-
- PageTable[L0][L1] = Entry;
- }
- }
-} \ No newline at end of file