Author: martin
Date: 2007-01-17 12:26:28 -0500 (Wed, 17 Jan 2007)
New Revision: 71217
Modified:
trunk/debugger/ChangeLog
trunk/debugger/backend/arch/Architecture.cs
trunk/debugger/backend/arch/Architecture_I386.cs
trunk/debugger/backend/arch/Architecture_X86_64.cs
Log:
2007-01-17 Martin Baulig <[EMAIL PROTECTED]>
* backend/arch/Architecture.cs
(Architecture.GetLMF): New internal method.
Modified: trunk/debugger/ChangeLog
===================================================================
--- trunk/debugger/ChangeLog 2007-01-17 17:25:50 UTC (rev 71216)
+++ trunk/debugger/ChangeLog 2007-01-17 17:26:28 UTC (rev 71217)
@@ -1,5 +1,10 @@
2007-01-17 Martin Baulig <[EMAIL PROTECTED]>
+ * backend/arch/Architecture.cs
+ (Architecture.GetLMF): New internal method.
+
+2007-01-17 Martin Baulig <[EMAIL PROTECTED]>
+
* classes/Thread.cs
(Thread.LMFAddress): New internal property.
Modified: trunk/debugger/backend/arch/Architecture.cs
===================================================================
--- trunk/debugger/backend/arch/Architecture.cs 2007-01-17 17:25:50 UTC (rev
71216)
+++ trunk/debugger/backend/arch/Architecture.cs 2007-01-17 17:26:28 UTC (rev
71217)
@@ -128,6 +128,8 @@
internal abstract Registers CopyRegisters (Registers regs);
+ internal abstract StackFrame GetLMF (Thread thread);
+
internal abstract StackFrame UnwindStack (StackFrame last_frame,
TargetMemoryAccess
memory,
byte[] code, int
offset);
Modified: trunk/debugger/backend/arch/Architecture_I386.cs
===================================================================
--- trunk/debugger/backend/arch/Architecture_I386.cs 2007-01-17 17:25:50 UTC
(rev 71216)
+++ trunk/debugger/backend/arch/Architecture_I386.cs 2007-01-17 17:26:28 UTC
(rev 71217)
@@ -385,7 +385,7 @@
Registers regs = new Registers (old_regs);
TargetAddress ebp = new TargetAddress (
- AddressDomain, old_regs [(int)
I386Register.EBP].Value);
+ AddressDomain, old_regs [(int)
I386Register.EBP].GetValue ());
int addr_size = TargetAddressSize;
TargetAddress new_ebp = memory.ReadAddress (ebp);
@@ -714,5 +714,37 @@
return CreateFrame (thread, address, stack_pointer,
frame_pointer, regs);
}
+
+ internal override StackFrame GetLMF (Thread thread)
+ {
+ TargetAddress lmf = thread.ReadAddress
(thread.LMFAddress);
+
+ TargetBinaryReader reader = thread.ReadMemory (lmf,
32).GetReader ();
+ Console.WriteLine ("GET LMF: {0} {1} {2} {3}", thread,
thread.LMFAddress,
+ lmf, reader.HexDump ());
+
+ reader.Position = 12;
+
+ TargetAddress ebx = reader.ReadTargetAddress ();
+ TargetAddress edi = reader.ReadTargetAddress ();
+ TargetAddress esi = reader.ReadTargetAddress ();
+ TargetAddress ebp = reader.ReadTargetAddress ();
+
+ Registers regs = new Registers (this);
+ regs [(int) I386Register.EBX].SetValue (lmf + 12, ebx);
+ regs [(int) I386Register.EDI].SetValue (lmf + 16, edi);
+ regs [(int) I386Register.ESI].SetValue (lmf + 20, esi);
+ regs [(int) I386Register.EBP].SetValue (lmf + 24, ebp);
+
+ TargetAddress new_eip = thread.ReadAddress (ebp + 4);
+ regs [(int) I386Register.EIP].SetValue (ebp + 4,
new_eip);
+
+ TargetAddress new_esp = ebp + 8;
+ regs [(int) I386Register.ESP].SetValue (ebp, new_esp);
+
+ ebp -= 4;
+
+ return CreateFrame (thread, new_eip, new_esp, ebp,
regs);
+ }
}
}
Modified: trunk/debugger/backend/arch/Architecture_X86_64.cs
===================================================================
--- trunk/debugger/backend/arch/Architecture_X86_64.cs 2007-01-17 17:25:50 UTC
(rev 71216)
+++ trunk/debugger/backend/arch/Architecture_X86_64.cs 2007-01-17 17:26:28 UTC
(rev 71217)
@@ -796,5 +796,39 @@
return CreateFrame (thread, address, stack_pointer,
frame_pointer, regs);
}
+
+
+ internal override StackFrame GetLMF (Thread thread)
+ {
+ TargetAddress lmf = thread.ReadAddress
(thread.LMFAddress);
+
+ TargetBinaryReader reader = thread.ReadMemory (lmf,
88).GetReader ();
+
+ reader.Position = 32;
+
+ TargetAddress rbx = reader.ReadTargetAddress ();
+ TargetAddress rbp = reader.ReadTargetAddress ();
+ TargetAddress rsp = reader.ReadTargetAddress ();
+ TargetAddress r12 = reader.ReadTargetAddress ();
+ TargetAddress r13 = reader.ReadTargetAddress ();
+ TargetAddress r14 = reader.ReadTargetAddress ();
+ TargetAddress r15 = reader.ReadTargetAddress ();
+
+ Registers regs = new Registers (this);
+ regs [(int) X86_64_Register.RBX].SetValue (lmf + 32,
rbx);
+ regs [(int) X86_64_Register.RBP].SetValue (lmf + 40,
rbp);
+ regs [(int) X86_64_Register.RSP].SetValue (lmf + 48,
rsp);
+ regs [(int) X86_64_Register.R12].SetValue (lmf + 56,
r12);
+ regs [(int) X86_64_Register.R13].SetValue (lmf + 64,
r13);
+ regs [(int) X86_64_Register.R14].SetValue (lmf + 72,
r14);
+ regs [(int) X86_64_Register.R15].SetValue (lmf + 80,
r15);
+
+ TargetAddress new_rip = thread.ReadAddress (rbp + 8);
+ regs [(int) X86_64_Register.RIP].SetValue (rbp + 8,
new_rip);
+
+ rbp -= 8;
+
+ return CreateFrame (thread, new_rip, rsp, rbp, regs);
+ }
}
}
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches