コード例 #1
0
        /// <summary>
        /// Create a new region handle. The handle is registered with the given tracking object,
        /// and will be notified of any changes to the specified region.
        /// </summary>
        /// <param name="tracking">Tracking object for the target memory block</param>
        /// <param name="address">Virtual address of the region to track</param>
        /// <param name="size">Size of the region to track</param>
        internal RegionHandle(MemoryTracking tracking, ulong address, ulong size)
        {
            Address    = address;
            Size       = size;
            EndAddress = address + size;

            _tracking = tracking;
            _regions  = tracking.GetVirtualRegionsForHandle(address, size);
            foreach (var region in _regions)
            {
                region.Handles.Add(this);
            }
        }
コード例 #2
0
        internal SmartMultiRegionHandle(MemoryTracking tracking, ulong address, ulong size, ulong granularity)
        {
            // For this multi-region handle, the handle list starts empty.
            // As regions are queried, they are added to the _handles array at their start index.
            // When a region being added overlaps another, the existing region is split.
            // A query can therefore scan multiple regions, though with no overlaps they can cover a large area.

            _tracking    = tracking;
            _handles     = new RegionHandle[size / granularity];
            _granularity = granularity;

            _address = address;
            _size    = size;
        }
コード例 #3
0
        internal MultiRegionHandle(MemoryTracking tracking, ulong address, ulong size, ulong granularity)
        {
            _handles    = new RegionHandle[size / granularity];
            Granularity = granularity;

            for (int i = 0; i < _handles.Length; i++)
            {
                RegionHandle handle = tracking.BeginTracking(address + (ulong)i * granularity, granularity);
                handle.Parent = this;
                _handles[i]   = handle;
            }

            Address = address;
            Size    = size;
        }
コード例 #4
0
ファイル: VirtualRegion.cs プロジェクト: yunnypuff/Ryujinx
 public VirtualRegion(MemoryTracking tracking, ulong address, ulong size, MemoryPermission lastPermission = MemoryPermission.Invalid) : base(address, size)
 {
     _lastPermission = lastPermission;
     _tracking       = tracking;
 }
コード例 #5
0
ファイル: PhysicalRegion.cs プロジェクト: yuyaokeng/Ryujinx
 public PhysicalRegion(MemoryTracking tracking, ulong address, ulong size) : base(address, size)
 {
     Tracking   = tracking;
     Protection = MemoryPermission.ReadAndWrite;
 }
コード例 #6
0
ファイル: VirtualRegion.cs プロジェクト: xiaomuwing/Ryujinx
        public VirtualRegion(MemoryTracking tracking, ulong address, ulong size) : base(address, size)
        {
            _tracking = tracking;

            UpdatePhysicalChildren();
        }
コード例 #7
0
        internal MultiRegionHandle(MemoryTracking tracking, ulong address, ulong size, IEnumerable <IRegionHandle> handles, ulong granularity)
        {
            _handles    = new RegionHandle[size / granularity];
            Granularity = granularity;

            int i = 0;

            if (handles != null)
            {
                // Inherit from the handles we were given. Any gaps must be filled with new handles,
                // and old handles larger than our granularity must copy their state onto new granular handles and dispose.
                // It is assumed that the provided handles do not overlap, in order, are on page boundaries,
                // and don't extend past the requested range.

                foreach (RegionHandle handle in handles)
                {
                    int startIndex = (int)((handle.Address - address) / granularity);

                    // Fill any gap left before this handle.
                    while (i < startIndex)
                    {
                        RegionHandle fillHandle = tracking.BeginTracking(address + (ulong)i * granularity, granularity);
                        fillHandle.Parent = this;
                        _handles[i++]     = fillHandle;
                    }

                    if (handle.Size == granularity)
                    {
                        handle.Parent = this;
                        _handles[i++] = handle;
                    }
                    else
                    {
                        int endIndex = (int)((handle.EndAddress - address) / granularity);

                        while (i < endIndex)
                        {
                            RegionHandle splitHandle = tracking.BeginTracking(address + (ulong)i * granularity, granularity);
                            splitHandle.Parent = this;

                            splitHandle.Reprotect(handle.Dirty);

                            RegionSignal signal = handle.PreAction;
                            if (signal != null)
                            {
                                splitHandle.RegisterAction(signal);
                            }

                            _handles[i++] = splitHandle;
                        }

                        handle.Dispose();
                    }
                }
            }

            // Fill any remaining space with new handles.
            while (i < _handles.Length)
            {
                RegionHandle handle = tracking.BeginTracking(address + (ulong)i * granularity, granularity);
                handle.Parent = this;
                _handles[i++] = handle;
            }

            Address = address;
            Size    = size;
        }
コード例 #8
0
 public VirtualRegion(MemoryTracking tracking, ulong address, ulong size) : base(address, size)
 {
     _tracking = tracking;
 }