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

Reply via email to