Add PPTC support
This commit is contained in:
parent
1803b9fef9
commit
4478a32114
4 changed files with 44 additions and 33 deletions
|
@ -39,6 +39,7 @@ namespace ARMeilleure.Translation.PTC
|
|||
internal const int PageTablePointerIndex = -1; // Must be a negative value.
|
||||
internal const int JumpPointerIndex = -2; // Must be a negative value.
|
||||
internal const int DynamicPointerIndex = -3; // Must be a negative value.
|
||||
internal const int CountTableIndex = -4; // Must be a negative value.
|
||||
|
||||
private const byte FillingByte = 0x00;
|
||||
private const CompressionLevel SaveCompressionLevel = CompressionLevel.Fastest;
|
||||
|
@ -539,7 +540,7 @@ namespace ARMeilleure.Translation.PTC
|
|||
}
|
||||
}
|
||||
|
||||
internal static void LoadTranslations(ConcurrentDictionary<ulong, TranslatedFunction> funcs, IMemoryManager memory, JumpTable jumpTable)
|
||||
internal static void LoadTranslations(ConcurrentDictionary<ulong, TranslatedFunction> funcs, IMemoryManager memory, JumpTable jumpTable, EntryTable<byte> countTable)
|
||||
{
|
||||
if (AreCarriersEmpty())
|
||||
{
|
||||
|
@ -568,16 +569,23 @@ namespace ARMeilleure.Translation.PTC
|
|||
{
|
||||
byte[] code = ReadCode(index, infoEntry.CodeLength);
|
||||
|
||||
Counter callCounter = null;
|
||||
|
||||
if (infoEntry.RelocEntriesCount != 0)
|
||||
{
|
||||
RelocEntry[] relocEntries = GetRelocEntries(relocsReader, infoEntry.RelocEntriesCount);
|
||||
|
||||
PatchCode(code.AsSpan(), relocEntries, memory.PageTablePointer, jumpTable);
|
||||
if (!PatchCode(code, relocEntries, memory.PageTablePointer, jumpTable, countTable, out callCounter))
|
||||
{
|
||||
SkipUnwindInfo(unwindInfosReader);
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
UnwindInfo unwindInfo = ReadUnwindInfo(unwindInfosReader);
|
||||
|
||||
TranslatedFunction func = FastTranslate(code, infoEntry.GuestSize, unwindInfo, infoEntry.HighCq);
|
||||
TranslatedFunction func = FastTranslate(code, callCounter, infoEntry.GuestSize, unwindInfo, infoEntry.HighCq);
|
||||
|
||||
bool isAddressUnique = funcs.TryAdd(infoEntry.Address, func);
|
||||
|
||||
|
@ -671,8 +679,10 @@ namespace ARMeilleure.Translation.PTC
|
|||
return relocEntries;
|
||||
}
|
||||
|
||||
private static void PatchCode(Span<byte> code, RelocEntry[] relocEntries, IntPtr pageTablePointer, JumpTable jumpTable)
|
||||
private static bool PatchCode(Span<byte> code, RelocEntry[] relocEntries, IntPtr pageTablePointer, JumpTable jumpTable, EntryTable<byte> countTable, out Counter callCounter)
|
||||
{
|
||||
callCounter = null;
|
||||
|
||||
foreach (RelocEntry relocEntry in relocEntries)
|
||||
{
|
||||
ulong imm;
|
||||
|
@ -689,6 +699,16 @@ namespace ARMeilleure.Translation.PTC
|
|||
{
|
||||
imm = (ulong)jumpTable.DynamicPointer.ToInt64();
|
||||
}
|
||||
else if (relocEntry.Index == CountTableIndex)
|
||||
{
|
||||
// If we could not allocate an entry on the count table we dip.
|
||||
if (!Counter.TryCreate(countTable, out Counter counter))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
unsafe { imm = (ulong)Unsafe.AsPointer(ref counter.Value); }
|
||||
}
|
||||
else if (Delegates.TryGetDelegateFuncPtrByIndex(relocEntry.Index, out IntPtr funcPtr))
|
||||
{
|
||||
imm = (ulong)funcPtr.ToInt64();
|
||||
|
@ -700,6 +720,8 @@ namespace ARMeilleure.Translation.PTC
|
|||
|
||||
BinaryPrimitives.WriteUInt64LittleEndian(code.Slice(relocEntry.Position, 8), imm);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private static UnwindInfo ReadUnwindInfo(BinaryReader unwindInfosReader)
|
||||
|
@ -723,7 +745,7 @@ namespace ARMeilleure.Translation.PTC
|
|||
return new UnwindInfo(pushEntries, prologueSize);
|
||||
}
|
||||
|
||||
private static TranslatedFunction FastTranslate(byte[] code, ulong guestSize, UnwindInfo unwindInfo, bool highCq)
|
||||
private static TranslatedFunction FastTranslate(byte[] code, Counter callCounter, ulong guestSize, UnwindInfo unwindInfo, bool highCq)
|
||||
{
|
||||
CompiledFunction cFunc = new CompiledFunction(code, unwindInfo);
|
||||
|
||||
|
@ -731,7 +753,7 @@ namespace ARMeilleure.Translation.PTC
|
|||
|
||||
GuestFunction gFunc = Marshal.GetDelegateForFunctionPointer<GuestFunction>(codePtr);
|
||||
|
||||
TranslatedFunction tFunc = new TranslatedFunction(gFunc, guestSize, highCq);
|
||||
TranslatedFunction tFunc = new TranslatedFunction(gFunc, callCounter, guestSize, highCq);
|
||||
|
||||
return tFunc;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue