// 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); } } } }
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); }
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)); }
public IntPtr GetEntryAddressDynamicTable(int entry) { Debug.Assert(DynTable.EntryIsValid(entry)); return(_dynamicRegion.Pointer + entry * DynamicTableStride); }