public long Map(long Src, long Dst, long Size) { bool Success; lock (Blocks) { Success = CheckRange( Src, Size, MemoryState.MapAllowed, MemoryState.MapAllowed, MemoryPermission.Mask, MemoryPermission.ReadAndWrite, MemoryAttribute.Mask, MemoryAttribute.None, MemoryAttribute.IpcAndDeviceMapped, out MemoryState SrcState, out _, out _); Success &= IsUnmapped(Dst, Size); if (Success) { long PagesCount = Size / PageSize; InsertBlock(Src, PagesCount, SrcState, MemoryPermission.None, MemoryAttribute.Borrowed); InsertBlock(Dst, PagesCount, MemoryState.MappedMemory, MemoryPermission.ReadAndWrite); long PA = CpuMemory.GetPhysicalAddress(Src); CpuMemory.Map(Dst, PA, Size); } } return(Success ? 0 : MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm)); }
public long MapProcessCodeMemory(long Dst, long Src, long Size) { lock (Blocks) { long PagesCount = Size / PageSize; bool Success = IsUnmapped(Dst, Size); Success &= CheckRange( Src, Size, MemoryState.Mask, MemoryState.Heap, MemoryPermission.Mask, MemoryPermission.ReadAndWrite, MemoryAttribute.Mask, MemoryAttribute.None, MemoryAttribute.IpcAndDeviceMapped, out _, out _, out _); if (Success) { long PA = CpuMemory.GetPhysicalAddress(Src); InsertBlock(Dst, PagesCount, MemoryState.CodeStatic, MemoryPermission.ReadAndExecute); InsertBlock(Src, PagesCount, MemoryState.Heap, MemoryPermission.None); CpuMemory.Map(Dst, PA, Size); return(0); } } return(MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm)); }
public bool IsRegionModified(AMemory Memory, NvGpuBufferType BufferType, long PA, long Size) { (bool[] Modified, long ModifiedCount) = Memory.IsRegionModified(PA, Size); PA = Memory.GetPhysicalAddress(PA); ClearCachedPagesIfNeeded(); long PageSize = AMemory.PageSize; EnsureResidencyInitialized(PageSize); bool HasResidents = AddResidency(PA, Size); if (!HasResidents && ModifiedCount == 0) { return(false); } long Mask = PageSize - 1; long ResidencyKey = PA; long PAEnd = PA + Size; bool RegMod = false; int Index = 0; while (PA < PAEnd) { long Key = PA & ~AMemory.PageMask; long PAPgEnd = Math.Min((PA + AMemory.PageSize) & ~AMemory.PageMask, PAEnd); bool IsCached = Cache.TryGetValue(Key, out CachedPage Cp); if (IsCached) { CpCount -= Cp.GetTotalCount(); SortedCache.Remove(Cp.Node); } else { Cp = new CachedPage(); Cache.Add(Key, Cp); } if (Modified[Index++] && IsCached) { Cp = new CachedPage(); Cache[Key] = Cp; } Cp.AddResidency(ResidencyKey); Cp.Node = SortedCache.AddLast(Key); RegMod |= Cp.AddRange(PA, PAPgEnd, BufferType); CpCount += Cp.GetTotalCount(); PA = PAPgEnd; } return(RegMod); }