internal void PopFrame(UIntPtr *framePointer, UIntPtr calleeSaveMask, bool framePointerOmitted, bool hasTransitionRecord) { UIntPtr *calleeSaveStart; if (framePointerOmitted) { calleeSaveStart = framePointer - 1; } else { VTable.Assert((calleeSaveMask & 0x100) == 0, "EBP should not be callee saved"); calleeSaveStart = framePointer; EBP.PopFrameReg(ref calleeSaveStart); } if (hasTransitionRecord) { calleeSaveStart -= sizeof(CallStack.TransitionRecord) / sizeof(UIntPtr); } // Note: the order in which these appear is important! if ((calleeSaveMask & 0x1) != 0) { EBX.PopFrameReg(ref calleeSaveStart); } if ((calleeSaveMask & 0x80) != 0) { EBP.PopFrameReg(ref calleeSaveStart); } if ((calleeSaveMask & 0x4) != 0) { ESI.PopFrameReg(ref calleeSaveStart); } if ((calleeSaveMask & 0x2) != 0) { EDI.PopFrameReg(ref calleeSaveStart); } if ((calleeSaveMask & 0x8) != 0) { R12.PopFrameReg(ref calleeSaveStart); } if ((calleeSaveMask & 0x10) != 0) { R13.PopFrameReg(ref calleeSaveStart); } if ((calleeSaveMask & 0x20) != 0) { R14.PopFrameReg(ref calleeSaveStart); } if ((calleeSaveMask & 0x40) != 0) { R15.PopFrameReg(ref calleeSaveStart); } }
internal void ClearCalleeSaves() { EBX.ClearCalleeReg(); ESI.ClearCalleeReg(); EDI.ClearCalleeReg(); EBP.ClearCalleeReg(); R12.ClearCalleeReg(); R13.ClearCalleeReg(); R14.ClearCalleeReg(); R15.ClearCalleeReg(); }
void SetCalleeSaves(CalleeSaveRegistersX64 *calleeSaveRegisters) { EBX.SetCalleeReg(&calleeSaveRegisters->EBX); EDI.SetCalleeReg(&calleeSaveRegisters->EDI); ESI.SetCalleeReg(&calleeSaveRegisters->ESI); EBP.SetCalleeReg(&calleeSaveRegisters->EBP); R12.SetCalleeReg(&calleeSaveRegisters->R12); R13.SetCalleeReg(&calleeSaveRegisters->R13); R14.SetCalleeReg(&calleeSaveRegisters->R14); R15.SetCalleeReg(&calleeSaveRegisters->R15); }
internal void SetCalleeSaves(SpillContext *context) { EBX.SetCalleeReg(&context->bx); EDI.SetCalleeReg(&context->di); ESI.SetCalleeReg(&context->si); EBP.SetCalleeReg(&context->bp); R12.SetCalleeReg(&context->r12); R13.SetCalleeReg(&context->r13); R14.SetCalleeReg(&context->r14); R15.SetCalleeReg(&context->r15); }
internal void ScanLiveRegs(UIntPtr mask, NonNullReferenceVisitor referenceVisitor) { EDI.ScanLiveReg((mask >> 2) & 0x3, referenceVisitor); ESI.ScanLiveReg((mask >> 4) & 0x3, referenceVisitor); EBX.ScanLiveReg((mask >> 0) & 0x3, referenceVisitor); R12.ScanLiveReg((mask >> 6) & 0x3, referenceVisitor); R13.ScanLiveReg((mask >> 8) & 0x3, referenceVisitor); R14.ScanLiveReg((mask >> 10) & 0x3, referenceVisitor); R15.ScanLiveReg((mask >> 12) & 0x3, referenceVisitor); EBP.ScanLiveReg((mask >> 14) & 0x3, referenceVisitor); }
internal void ClearFrame(UIntPtr calleeSaveMask, bool framePointerOmitted) { if (!framePointerOmitted) { VTable.Assert((calleeSaveMask & 0x100) == 0, "EBP should not be callee saved"); EBP.ClearFrameReg(); } if ((calleeSaveMask & 0x1) != 0) { EBX.ClearFrameReg(); } if ((calleeSaveMask & 0x80) != 0) { EBP.ClearFrameReg(); } if ((calleeSaveMask & 0x4) != 0) { ESI.ClearFrameReg(); } if ((calleeSaveMask & 0x2) != 0) { EDI.ClearFrameReg(); } if ((calleeSaveMask & 0x8) != 0) { R12.ClearFrameReg(); } if ((calleeSaveMask & 0x10) != 0) { R13.ClearFrameReg(); } if ((calleeSaveMask & 0x20) != 0) { R14.ClearFrameReg(); } if ((calleeSaveMask & 0x40) != 0) { R15.ClearFrameReg(); } }
// Example: // // rax=000007f7d5e4e000 rbx=0000000000000000 rcx=0000000000000000 // rdx=000007fcac628f98 rsi=0000000000000000 rdi=0000000000000000 // rip=000007fcac571e00 rsp=0000000b9879fb78 rbp=0000000000000000 // r8=0000000000000000 r9=000007fcac628f98 r10=0000000000000000 // r11=0000000000000000 r12=0000000000000000 r13=0000000000000000 // r14=0000000000000000 r15=0000000000000000 // iopl=0 nv up ei pl zr na po nc // cs=0033 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000246 // ntdll!DbgBreakPoint: // public override ColorString ToColorString() { if (null == m_colorString) { ConsoleColor color; ColorString cs = new ColorString("rax="); color = GetColorForDiffAgainstBaseline("rax"); cs.Append(Rax.GetColorizedValueString(color)); cs.Append(" rbx="); color = GetColorForDiffAgainstBaseline("rbx"); cs.Append(Rbx.GetColorizedValueString(color)); cs.Append(" rcx="); color = GetColorForDiffAgainstBaseline("rcx"); cs.Append(Rcx.GetColorizedValueString(color)); cs.AppendLine(); cs.Append("rdx="); color = GetColorForDiffAgainstBaseline("rdx"); cs.Append(Rdx.GetColorizedValueString(color)); cs.Append(" rsi="); color = GetColorForDiffAgainstBaseline("rsi"); cs.Append(Rsi.GetColorizedValueString(color)); cs.Append(" rdi="); color = GetColorForDiffAgainstBaseline("rdi"); cs.Append(Rdi.GetColorizedValueString(color)); cs.AppendLine(); cs.Append("rip="); color = GetColorForDiffAgainstBaseline("rip"); cs.Append(Rip.GetColorizedValueString(color)); cs.Append(" rsp="); color = GetColorForDiffAgainstBaseline("rsp"); cs.Append(Rsp.GetColorizedValueString(color)); cs.Append(" rbp="); color = GetColorForDiffAgainstBaseline("rbp"); cs.Append(Rbp.GetColorizedValueString(color)); cs.AppendLine(); cs.Append(" r8="); color = GetColorForDiffAgainstBaseline("r8"); cs.Append(R8.GetColorizedValueString(color)); cs.Append(" r9="); color = GetColorForDiffAgainstBaseline("r9"); cs.Append(R9.GetColorizedValueString(color)); cs.Append(" r10="); color = GetColorForDiffAgainstBaseline("r10"); cs.Append(R10.GetColorizedValueString(color)); cs.AppendLine(); cs.Append("r11="); color = GetColorForDiffAgainstBaseline("r11"); cs.Append(R11.GetColorizedValueString(color)); cs.Append(" r12="); color = GetColorForDiffAgainstBaseline("r12"); cs.Append(R12.GetColorizedValueString(color)); cs.Append(" r13="); color = GetColorForDiffAgainstBaseline("r13"); cs.Append(R13.GetColorizedValueString(color)); cs.AppendLine(); cs.Append("r14="); color = GetColorForDiffAgainstBaseline("r14"); cs.Append(R14.GetColorizedValueString(color)); cs.Append(" r15="); color = GetColorForDiffAgainstBaseline("r15"); cs.Append(R15.GetColorizedValueString(color)); cs.AppendLine(); cs.Append("iopl="); color = GetColorForDiffAgainstBaseline("iopl"); cs.AppendPushPopFg(color, ((ulong)Iopl.Value).ToString("x")); // TODO: cs.AppendLine(" TBD: flags"); cs.Append("cs="); color = GetColorForDiffAgainstBaseline("cs"); cs.AppendPushPopFg(color, ((ushort)Cs.Value).ToString("x4")); cs.Append(" ss="); color = GetColorForDiffAgainstBaseline("ss"); cs.AppendPushPopFg(color, ((ushort)Ss.Value).ToString("x4")); cs.Append(" ds="); color = GetColorForDiffAgainstBaseline("ds"); cs.AppendPushPopFg(color, ((ushort)Ds.Value).ToString("x4")); cs.Append(" es="); color = GetColorForDiffAgainstBaseline("es"); cs.AppendPushPopFg(color, ((ushort)Es.Value).ToString("x4")); cs.Append(" fs="); color = GetColorForDiffAgainstBaseline("fs"); cs.AppendPushPopFg(color, ((ushort)Fs.Value).ToString("x4")); cs.Append(" gs="); color = GetColorForDiffAgainstBaseline("gs"); cs.AppendPushPopFg(color, ((ushort)Gs.Value).ToString("x4")); cs.Append(" efl="); color = GetColorForDiffAgainstBaseline("efl"); cs.Append(Efl.GetColorizedValueString(color)); cs.AppendLine(); cs.Append(DbgProvider.ColorizeSymbol(StackFrame.SymbolName)); if (0 != StackFrame.Displacement) { cs.Append("+0x"); cs.Append(StackFrame.Displacement.ToString("x")); } cs.AppendLine(":"); cs.Append(Disasm(Rip.ValueAsPointer)); m_colorString = cs; } return(m_colorString); } // end ToString()