diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2018-08-15 15:59:51 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-08-15 15:59:51 -0300 |
| commit | c393cdf8e3775bc95850e4d8c8e4c446b286d3b4 (patch) | |
| tree | 25035a244741d2daf3f7d6be8b23153ff061ea15 /ChocolArm64/Memory/AMemoryMgr.cs | |
| parent | 76d95dee05e3c51c18e1799f54cc407e0f633b4e (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.cs | 258 |
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 |
