Ejemplo n.º 1
0
        // For future use.
        public void RemoveFunctionEntries(ulong guestAddress)
        {
            Targets.TryRemove(guestAddress, out _);
            Dependants.TryRemove(guestAddress, out _);

            if (Owners.TryRemove(guestAddress, out List <int> entries))
            {
                foreach (int entry in entries)
                {
                    if ((entry & DynamicEntryTag) == 0)
                    {
                        IntPtr addr = GetEntryAddressJumpTable(entry);

                        Marshal.WriteInt64(addr, 0, 0L);
                        Marshal.WriteInt64(addr, 8, 0L);

                        Table.FreeEntry(entry);
                    }
                    else
                    {
                        IntPtr addr = GetEntryAddressDynamicTable(entry & ~DynamicEntryTag);

                        for (int j = 0; j < DynamicTableElems; j++)
                        {
                            Marshal.WriteInt64(addr + j * JumpTableStride, 0, 0L);
                            Marshal.WriteInt64(addr + j * JumpTableStride, 8, 0L);
                        }

                        DynTable.FreeEntry(entry & ~DynamicEntryTag);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        public int ReserveDynamicEntry(ulong ownerGuestAddress, bool isJump)
        {
            int entry = DynTable.AllocateEntry();

            ExpandIfNeededDynamicTable(entry);

            // Keep track of ownership for jump table entries.
            List <int> ownerEntries = Owners.GetOrAdd(ownerGuestAddress, (addr) => new List <int>());

            lock (ownerEntries)
            {
                ownerEntries.Add(entry | DynamicEntryTag);
            }

            // Initialize all host function pointers to the indirect call stub.
            IntPtr addr    = GetEntryAddressDynamicTable(entry);
            long   stubPtr = DirectCallStubs.IndirectCallStub(isJump).ToInt64();

            for (int i = 0; i < DynamicTableElems; i++)
            {
                Marshal.WriteInt64(addr, i * JumpTableStride + 8, stubPtr);
            }

            return(entry);
        }
Ejemplo n.º 3
0
        public bool CheckEntryFromAddressDynamicTable(IntPtr entryAddress)
        {
            int entry = Math.DivRem((int)((ulong)entryAddress - (ulong)_dynamicRegion.Pointer), DynamicTableStride, out int rem);

            return(rem == 0 && DynTable.EntryIsValid(entry));
        }
Ejemplo n.º 4
0
        public IntPtr GetEntryAddressDynamicTable(int entry)
        {
            Debug.Assert(DynTable.EntryIsValid(entry));

            return(_dynamicRegion.Pointer + entry * DynamicTableStride);
        }