Author: martin
Date: 2007-10-18 12:18:28 -0400 (Thu, 18 Oct 2007)
New Revision: 87764

Modified:
   branches/martin/debugger-plophos/debugger/backend/Inferior.cs
   branches/martin/debugger-plophos/debugger/backend/MonoThreadManager.cs
   branches/martin/debugger-plophos/debugger/backend/SingleSteppingEngine.cs
   branches/martin/debugger-plophos/debugger/backend/ThreadServant.cs
   branches/martin/debugger-plophos/debugger/backend/arch/Architecture_X86_64.cs
   branches/martin/debugger-plophos/debugger/backend/arch/CoreFile.cs
   branches/martin/debugger-plophos/debugger/backend/server/library.c
   branches/martin/debugger-plophos/debugger/backend/server/server.h
   branches/martin/debugger-plophos/debugger/backend/server/x86_64-arch.c
Log:
Backup copy.

Modified: branches/martin/debugger-plophos/debugger/backend/Inferior.cs
===================================================================
--- branches/martin/debugger-plophos/debugger/backend/Inferior.cs       
2007-10-18 16:18:10 UTC (rev 87763)
+++ branches/martin/debugger-plophos/debugger/backend/Inferior.cs       
2007-10-18 16:18:28 UTC (rev 87764)
@@ -106,7 +106,7 @@
                static extern TargetError mono_debugger_server_call_method_1 
(IntPtr handle, long method_address, long method_argument, long data_argument, 
string string_argument, long callback_argument);
 
                [DllImport("monodebuggerserver")]
-               static extern TargetError mono_debugger_server_call_method_2 
(IntPtr handle, long method_address, long method_argument, long 
callback_argument);
+               static extern TargetError mono_debugger_server_call_method_2 
(IntPtr handle, long method_address, int data_size, IntPtr data, long 
callback_argument);
 
                [DllImport("monodebuggerserver")]
                static extern TargetError mono_debugger_server_mark_rti_frame 
(IntPtr handle);
@@ -341,17 +341,30 @@
                        }
                }
 
-               public void CallMethod (TargetAddress method, long arg1, long 
callback_arg)
+               public void CallMethod (TargetAddress method, byte[] data, long 
callback_arg)
                {
                        check_disposed ();
 
                        TargetState old_state = change_target_state 
(TargetState.Running);
+
+                       IntPtr data_ptr = IntPtr.Zero;
+                       int data_size = data != null ? data.Length : 0;
+
                        try {
+                               if (data != null) {
+                                       data_ptr = Marshal.AllocHGlobal 
(data_size);
+                                       Marshal.Copy (data, 0, data_ptr, 
data_size);
+                               }
+
                                check_error (mono_debugger_server_call_method_2 
(
-                                       server_handle, method.Address, arg1, 
callback_arg));
+                                       server_handle, method.Address,
+                                       data_size, data_ptr, callback_arg));
                        } catch {
                                change_target_state (old_state);
                                throw;
+                       } finally {
+                               if (data_ptr != IntPtr.Zero)
+                                       Marshal.FreeHGlobal (data_ptr);
                        }
                }
 

Modified: branches/martin/debugger-plophos/debugger/backend/MonoThreadManager.cs
===================================================================
--- branches/martin/debugger-plophos/debugger/backend/MonoThreadManager.cs      
2007-10-18 16:18:10 UTC (rev 87763)
+++ branches/martin/debugger-plophos/debugger/backend/MonoThreadManager.cs      
2007-10-18 16:18:28 UTC (rev 87764)
@@ -307,6 +307,7 @@
                public readonly TargetAddress GetLMFAddress;
                public readonly TargetAddress DebuggerVersion;
                public readonly TargetAddress ThreadTable;
+               public readonly TargetAddress DoTrampoline;
 
                public readonly MonoMetadataInfo MonoMetadataInfo;
 
@@ -368,6 +369,8 @@
                        DebuggerVersion           = reader.ReadAddress ();
                        ThreadTable               = reader.ReadAddress ();
 
+                       DoTrampoline              = reader.ReadAddress ();
+
                        MonoMetadataInfo = new MonoMetadataInfo (memory, 
metadata_info);
 
                        Report.Debug (DebugFlags.JitSymtab, this);

Modified: 
branches/martin/debugger-plophos/debugger/backend/SingleSteppingEngine.cs
===================================================================
--- branches/martin/debugger-plophos/debugger/backend/SingleSteppingEngine.cs   
2007-10-18 16:18:10 UTC (rev 87763)
+++ branches/martin/debugger-plophos/debugger/backend/SingleSteppingEngine.cs   
2007-10-18 16:18:28 UTC (rev 87764)
@@ -1195,7 +1195,8 @@
                }
 
                protected bool CheckTrampoline (CallTargetType type, 
TargetAddress call_site,
-                                               TargetAddress call_target, 
TrampolineHandler handler)
+                                               TargetAddress call_target, int 
insn_size,
+                                               TrampolineHandler handler)
                {
                        if (!Architecture.IsTrampoline (type))
                                return false;
@@ -1216,7 +1217,8 @@
                                        do_continue (call_target);
                                return true;
                        } else if (type == CallTargetType.MonoTrampoline) {
-                               PushOperation (new OperationTrampoline (this, 
call_target, handler));
+                               PushOperation (new OperationTrampoline (
+                                       this, call_site + insn_size, 
call_target, handler));
                                return true;
                        }
 
@@ -1568,12 +1570,6 @@
                        return StartOperation (new OperationCallMethod (this, 
method, arg1, arg2));
                }
 
-               public override CommandResult CallMethod (TargetAddress method, 
TargetAddress argument)
-               {
-                       return StartOperation (new OperationCallMethod (
-                               this, method, argument.Address));
-               }
-
                public override CommandResult Return (bool run_finally)
                {
                        return (CommandResult) SendCommand (delegate {
@@ -2396,7 +2392,8 @@
                        CallTargetType type = 
inferior.Architecture.GetCallTarget (
                                inferior, inferior.CurrentFrame, out target, 
out insn_size);
                        if (Architecture.IsTrampoline (type)) {
-                               sse.PushOperation (new OperationTrampoline 
(sse, target, null));
+                               sse.PushOperation (new OperationTrampoline (
+                                       sse, inferior.CurrentFrame + insn_size, 
target, null));
                                return true;
                        }
 
@@ -2676,6 +2673,7 @@
                        }
 
                        if ((sse.current_method != null) && 
(sse.current_method.HasMethodBounds) &&
+                           !target.IsNull &&
                            (target >= sse.current_method.MethodStartAddress) &&
                            (target < sse.current_method.MethodEndAddress)) {
                                /* Intra-method call (we stay outside the 
prologue/epilogue code, so this also
@@ -2692,7 +2690,7 @@
                                return false;
                        }
 
-                       if (sse.CheckTrampoline (type, current_frame, target, 
TrampolineHandler))
+                       if (sse.CheckTrampoline (type, current_frame, target, 
insn_size, TrampolineHandler))
                                return false;
 
                        /*
@@ -3299,22 +3297,9 @@
                        this.Argument2 = arg2;
                }
 
-               public OperationCallMethod (SingleSteppingEngine sse,
-                                           TargetAddress method, long argument)
-                       : base (sse)
-               {
-                       this.Type = CallMethodType.Long;
-                       this.Method = method;
-                       this.Argument1 = argument;
-               }
-
                protected override void DoExecute ()
                {
                        switch (Type) {
-                       case CallMethodType.Long:
-                               inferior.CallMethod (Method, Argument1, ID);
-                               break;
-
                        case CallMethodType.LongLong:
                                inferior.CallMethod (Method, Argument1, 
Argument2, ID);
                                break;
@@ -3348,6 +3333,9 @@
 
        protected class OperationTrampoline : Operation
        {
+               public readonly TargetAddress CallSite;
+               public readonly TargetAddress CallTarget;
+
                public readonly TargetAddress Method;
                public readonly TrampolineHandler TrampolineHandler;
 
@@ -3363,13 +3351,39 @@
                        this.TrampolineHandler = handler;
                }
 
+               public OperationTrampoline (SingleSteppingEngine sse, 
TargetAddress call_site,
+                                           TargetAddress call_target, 
TrampolineHandler handler)
+                       : base (sse, null)
+               {
+                       this.CallSite = call_site;
+                       this.CallTarget = call_target;
+                       this.Method = call_target;
+
+                       this.TrampolineHandler = handler;
+               }
+
                public override bool IsSourceOperation {
                        get { return true; }
                }
 
                protected override void DoExecute ()
                {
-                       sse.PushOperation (new OperationRuntimeClassInit (sse, 
Method));
+                       Console.WriteLine ("OPERATION TRAMPOLINE: {0} {1} {2}",
+                                          CallSite, CallTarget, Method);
+
+#if FIXME
+                       if (!Method.IsNull) {
+                               sse.PushOperation (new 
OperationRuntimeClassInit (sse, Method));
+                               return;
+                       }
+#endif
+
+                       Console.WriteLine ("NEW OPERATION TRAMPOLINE: {0} {1}", 
CallSite, CallTarget);
+
+                       sse.PushOperation (new OperationDoTrampoline (sse, 
CallSite, CallTarget,
+                               delegate (TargetAddress the_address) {
+                                               this.address = the_address;
+                       }));
                }
 
                protected override EventResult DoProcessEvent 
(Inferior.ChildEvent cevent,
@@ -3386,15 +3400,6 @@
                        if (completed)
                                return EventResult.ResumeOperation;
 
-                       if (!compiled) {
-                               compiled = true;
-                               sse.PushOperation (new OperationCompileMethod 
(sse, Method,
-                                       delegate (TargetAddress the_address) {
-                                               this.address = the_address;
-                               }));
-                               return EventResult.Running;
-                       }
-
                        completed = true;
 
                        if (TrampolineHandler != null) {
@@ -3517,6 +3522,42 @@
                }
        }
 
+       protected class OperationDoTrampoline : OperationCallback
+       {
+               public readonly TargetAddress CallSite;
+               public readonly TargetAddress CallTarget;
+               public readonly MyTrampolineHandler MyTrampolineHandler;
+
+               public OperationDoTrampoline (SingleSteppingEngine sse, 
TargetAddress call_site,
+                                             TargetAddress call_target, 
MyTrampolineHandler handler)
+                       : base (sse)
+               {
+                       this.CallSite = call_site;
+                       this.CallTarget = call_target;
+                       this.MyTrampolineHandler = handler;
+               }
+
+               protected override void DoExecute ()
+               {
+                       TargetBinaryWriter writer = new TargetBinaryWriter (16, 
inferior.TargetInfo);
+                       writer.WriteInt64 (CallSite.Address);
+                       writer.WriteInt64 (CallTarget.Address);
+
+                       byte[] data = writer.Contents;
+
+                       inferior.CallMethod (sse.MonoDebuggerInfo.DoTrampoline, 
data, ID);
+               }
+
+               protected override EventResult CallbackCompleted (long data1, 
long data2)
+               {
+                       Console.WriteLine ("TRAMPOLINE COMPLETED: {0:x} {1:x}", 
data1, data2);
+                       TargetAddress address = new TargetAddress 
(inferior.AddressDomain, data1);
+                       MyTrampolineHandler (address);
+                       RestoreStack ();
+                       return EventResult.ResumeOperation;
+               }
+       }
+
        protected class OperationCompileMethod : OperationCallback
        {
                public readonly TargetAddress Method;
@@ -3656,7 +3697,7 @@
                        TargetAddress target;
                        CallTargetType type = 
inferior.Architecture.GetCallTarget (
                                inferior, current_frame, out target, out 
insn_size);
-                       if (sse.CheckTrampoline (type, current_frame, target, 
TrampolineHandler))
+                       if (sse.CheckTrampoline (type, current_frame, target, 
insn_size, TrampolineHandler))
                                return false;
 
                        sse.do_step_native ();
@@ -3690,7 +3731,7 @@
 
                protected override void DoExecute ()
                {
-                       inferior.CallMethod (sse.MonoDebuggerInfo.RunFinally, 
0, ID);
+                       inferior.CallMethod (sse.MonoDebuggerInfo.RunFinally, 
null, ID);
                }
 
                protected override EventResult CallbackCompleted (long data1, 
long data2)
@@ -3715,7 +3756,7 @@
 
                protected override void DoExecute ()
                {
-                       inferior.CallMethod (sse.MonoDebuggerInfo.RunFinally, 
0, ID);
+                       inferior.CallMethod (sse.MonoDebuggerInfo.RunFinally, 
null, ID);
                }
 
                protected override EventResult CallbackCompleted (long data1, 
long data2)
@@ -3728,7 +3769,7 @@
                        }
 
                        inferior.SetRegisters (parent_frame.Registers);
-                       inferior.CallMethod (sse.MonoDebuggerInfo.RunFinally, 
0, ID);
+                       inferior.CallMethod (sse.MonoDebuggerInfo.RunFinally, 
null, ID);
                        return EventResult.Running;
                }
        }
@@ -3772,7 +3813,6 @@
        [Serializable]
        internal enum CallMethodType
        {
-               Long,
                LongLong,
                LongString
        }

Modified: branches/martin/debugger-plophos/debugger/backend/ThreadServant.cs
===================================================================
--- branches/martin/debugger-plophos/debugger/backend/ThreadServant.cs  
2007-10-18 16:18:10 UTC (rev 87763)
+++ branches/martin/debugger-plophos/debugger/backend/ThreadServant.cs  
2007-10-18 16:18:28 UTC (rev 87764)
@@ -214,8 +214,6 @@
                public abstract CommandResult CallMethod (TargetAddress method, 
long arg1,
                                                          long arg2, string 
string_arg);
 
-               public abstract CommandResult CallMethod (TargetAddress method, 
TargetAddress arg);
-
                public abstract CommandResult Return (bool run_finally);
 
                public abstract CommandResult AbortInvocation ();

Modified: 
branches/martin/debugger-plophos/debugger/backend/arch/Architecture_X86_64.cs
===================================================================
--- 
branches/martin/debugger-plophos/debugger/backend/arch/Architecture_X86_64.cs   
    2007-10-18 16:18:10 UTC (rev 87763)
+++ 
branches/martin/debugger-plophos/debugger/backend/arch/Architecture_X86_64.cs   
    2007-10-18 16:18:28 UTC (rev 87764)
@@ -271,12 +271,18 @@
                                           call_site, call_target, reg, disp, 
vtable_addr,
                                           method);
 
+                       trampoline = TargetAddress.Null;
+                       return false;
+
                        MonoMetadataInfo metadata = 
process.MonoLanguage.MonoMetadataInfo;
 
                        if ((method == MONO_FAKE_VTABLE_METHOD) && (disp <= 0))
                                method = MONO_FAKE_IMT_METHOD;
 
                        if (method == MONO_FAKE_VTABLE_METHOD) {
+                               trampoline = new TargetAddress 
(memory.TargetInfo.AddressDomain, method);
+                               return true;
+
                                disp -= metadata.MonoVTableVTableOffset;
                                if ((disp < 0) || ((disp % 
memory.TargetInfo.TargetAddressSize)) != 0)
                                        throw new InternalError ();
@@ -298,6 +304,7 @@
                                Console.WriteLine ("FAKE VTABLE METHOD #3: {0} 
{1} {2}",
                                                   vtable, disp, trampoline);
 
+                               trampoline = TargetAddress.Null;
                                return true;
                        }
 
@@ -319,6 +326,14 @@
                                                             TargetAddress 
call_target,
                                                             out TargetAddress 
trampoline)
                {
+                       Console.WriteLine ("DO GET MONO TRAMPOLINE: {0} {1}", 
call_site,
+                                          call_target);
+
+                       if (call_target.IsNull) {
+                               trampoline = TargetAddress.Null;
+                               return false;
+                       }
+
                        TargetBinaryReader reader = memory.ReadMemory 
(call_target, 14).GetReader ();
                        byte opcode = reader.ReadByte ();
                        if (opcode != 0xe8) {
@@ -327,6 +342,7 @@
                        }
 
                        TargetAddress call = call_target + reader.ReadInt32 () 
+ 5;
+                       Console.WriteLine ("DO GET MONO TRAMPoliNE #1: {0}", 
call);
                        if (!process.MonoLanguage.IsTrampolineAddress (call)) {
                                trampoline = TargetAddress.Null;
                                return false;
@@ -338,6 +354,8 @@
                        else
                                method = reader.ReadInt64 ();
 
+                       Console.WriteLine ("DO GET MONO TRAMPOLINE #2: {0:x}", 
method);
+
                        trampoline = new TargetAddress 
(memory.TargetInfo.AddressDomain, method);
                        return true;
                }

Modified: branches/martin/debugger-plophos/debugger/backend/arch/CoreFile.cs
===================================================================
--- branches/martin/debugger-plophos/debugger/backend/arch/CoreFile.cs  
2007-10-18 16:18:10 UTC (rev 87763)
+++ branches/martin/debugger-plophos/debugger/backend/arch/CoreFile.cs  
2007-10-18 16:18:28 UTC (rev 87764)
@@ -594,12 +594,6 @@
                                throw new InvalidOperationException ();
                        }
 
-                       public override CommandResult CallMethod (TargetAddress 
method,
-                                                                 TargetAddress 
arg)
-                       {
-                               throw new InvalidOperationException ();
-                       }
-
                        public override CommandResult Return (bool run_finally)
                        {
                                throw new InvalidOperationException ();

Modified: branches/martin/debugger-plophos/debugger/backend/server/library.c
===================================================================
--- branches/martin/debugger-plophos/debugger/backend/server/library.c  
2007-10-18 16:18:10 UTC (rev 87763)
+++ branches/martin/debugger-plophos/debugger/backend/server/library.c  
2007-10-18 16:18:28 UTC (rev 87764)
@@ -219,13 +219,14 @@
 
 ServerCommandError
 mono_debugger_server_call_method_2 (ServerHandle *handle, guint64 
method_address,
-                                   guint64 method_argument, guint64 
callback_argument)
+                                   guint32 data_size, gconstpointer 
data_buffer,
+                                   guint64 callback_argument)
 {
        if (!global_vtable->call_method_2)
                return COMMAND_ERROR_NOT_IMPLEMENTED;
 
        return (* global_vtable->call_method_2) (
-               handle, method_address, method_argument, callback_argument);
+               handle, method_address, data_size, data_buffer, 
callback_argument);
 }
 
 ServerCommandError

Modified: branches/martin/debugger-plophos/debugger/backend/server/server.h
===================================================================
--- branches/martin/debugger-plophos/debugger/backend/server/server.h   
2007-10-18 16:18:10 UTC (rev 87763)
+++ branches/martin/debugger-plophos/debugger/backend/server/server.h   
2007-10-18 16:18:28 UTC (rev 87764)
@@ -216,7 +216,8 @@
 
        ServerCommandError    (* call_method_2)       (ServerHandle     *handle,
                                                       guint64           method,
-                                                      guint64           
method_argument,
+                                                      guint32           
data_size,
+                                                      gconstpointer     
data_buffer,
                                                       guint64           
callback_argument);
 
        ServerCommandError    (* call_method_invoke)  (ServerHandle     *handle,
@@ -450,7 +451,8 @@
 ServerCommandError
 mono_debugger_server_call_method_2        (ServerHandle       *handle,
                                           guint64             method_address,
-                                          guint64             method_argument,
+                                          guint32             data_size,
+                                          gconstpointer       data_buffer,
                                           guint64             
callback_argument);
 
 ServerCommandError

Modified: branches/martin/debugger-plophos/debugger/backend/server/x86_64-arch.c
===================================================================
--- branches/martin/debugger-plophos/debugger/backend/server/x86_64-arch.c      
2007-10-18 16:18:10 UTC (rev 87763)
+++ branches/martin/debugger-plophos/debugger/backend/server/x86_64-arch.c      
2007-10-18 16:18:28 UTC (rev 87764)
@@ -797,14 +797,15 @@
 
 static ServerCommandError
 server_ptrace_call_method_2 (ServerHandle *handle, guint64 method_address,
-                            guint64 method_argument, guint64 callback_argument)
+                            guint32 data_size, gconstpointer data_buffer,
+                            guint64 callback_argument)
 {
        ServerCommandError result = COMMAND_ERROR_NONE;
        ArchInfo *arch = handle->arch;
        CallbackData *cdata;
        long new_rsp;
 
-       int size = 116;
+       int size = 120 + data_size;
        guint8 *code = g_malloc0 (size);
 
        new_rsp = INFERIOR_REG_RSP (arch->current_regs) - AMD64_RED_ZONE_SIZE - 
size - 16;
@@ -824,8 +825,11 @@
        *((guint64 *) (code+88)) = INFERIOR_REG_R13 (arch->current_regs);
        *((guint64 *) (code+96)) = INFERIOR_REG_R14 (arch->current_regs);
        *((guint64 *) (code+104)) = INFERIOR_REG_R15 (arch->current_regs);
-       *((guint8 *) (code+112)) = 0xcc;
+       *((guint8 *) (code+data_size+116)) = 0xcc;
 
+       if (data_size > 0)
+               memcpy (code+112, data_buffer, data_size);
+
        cdata = g_new0 (CallbackData, 1);
        memcpy (&cdata->saved_regs, &arch->current_regs, sizeof 
(arch->current_regs));
        memcpy (&cdata->saved_fpregs, &arch->current_fpregs, sizeof 
(arch->current_fpregs));
@@ -843,7 +847,7 @@
 
        INFERIOR_REG_RIP (arch->current_regs) = method_address;
        INFERIOR_REG_RDI (arch->current_regs) = new_rsp + 8;
-       INFERIOR_REG_RSI (arch->current_regs) = method_argument;
+       INFERIOR_REG_RSI (arch->current_regs) = new_rsp + 112;
        INFERIOR_REG_RSP (arch->current_regs) = new_rsp;
 
        g_ptr_array_add (arch->callback_stack, cdata);

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to