Author: martin
Date: 2007-10-18 13:48:18 -0400 (Thu, 18 Oct 2007)
New Revision: 87775

Modified:
   branches/martin/debugger-plophos/debugger/backend/Inferior.cs
   branches/martin/debugger-plophos/debugger/backend/SingleSteppingEngine.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-arch.h
   branches/martin/debugger-plophos/debugger/backend/server/x86-ptrace.c
   branches/martin/debugger-plophos/debugger/backend/server/x86_64-arch.c
Log:


Modified: branches/martin/debugger-plophos/debugger/backend/Inferior.cs
===================================================================
--- branches/martin/debugger-plophos/debugger/backend/Inferior.cs       
2007-10-18 17:48:16 UTC (rev 87774)
+++ branches/martin/debugger-plophos/debugger/backend/Inferior.cs       
2007-10-18 17:48:18 UTC (rev 87775)
@@ -154,7 +154,7 @@
                static extern IntPtr mono_debugger_server_create_inferior 
(IntPtr breakpoint_manager);
 
                [DllImport("monodebuggerserver")]
-               static extern ChildEventType 
mono_debugger_server_dispatch_event (IntPtr handle, int status, out long arg, 
out long data1, out long data2);
+               static extern ChildEventType 
mono_debugger_server_dispatch_event (IntPtr handle, int status, out long arg, 
out long data1, out long data2, out int opt_data_size, out IntPtr opt_data);
 
                [DllImport("monodebuggerserver")]
                static extern TargetError mono_debugger_server_get_signal_info 
(IntPtr handle, out IntPtr data);
@@ -219,8 +219,9 @@
                        public readonly long Data1;
                        public readonly long Data2;
 
-                       public ChildEvent (ChildEventType type, long arg,
-                                          long data1, long data2)
+                       public readonly byte[] CallbackData;
+
+                       public ChildEvent (ChildEventType type, long arg, long 
data1, long data2)
                        {
                                this.Type = type;
                                this.Argument = arg;
@@ -228,6 +229,13 @@
                                this.Data2 = data2;
                        }
 
+                       public ChildEvent (ChildEventType type, long arg, long 
data1, long data2,
+                                          byte[] callback_data)
+                               : this (type, arg, data1, data2)
+                       {
+                               this.CallbackData = callback_data;
+                       }
+
                        public override string ToString ()
                        {
                                return String.Format ("ChildEvent 
({0}:{1}:{2:x}:{3:x})",
@@ -619,8 +627,12 @@
                        long arg, data1, data2;
                        ChildEventType message;
 
+                       int opt_data_size;
+                       IntPtr opt_data;
+
                        message = mono_debugger_server_dispatch_event (
-                               server_handle, status, out arg, out data1, out 
data2);
+                               server_handle, status, out arg, out data1, out 
data2,
+                               out opt_data_size, out opt_data);
 
                        switch (message) {
                        case ChildEventType.CHILD_EXITED:
@@ -641,6 +653,14 @@
                                break;
                        }
 
+                       if (opt_data_size > 0) {
+                               byte[] data = new byte [opt_data_size];
+                               Marshal.Copy (opt_data, data, 0, opt_data_size);
+                               g_free (opt_data);
+
+                               return new ChildEvent (message, arg, data1, 
data2, data);
+                       }
+
                        return new ChildEvent (message, arg, data1, data2);
                }
 

Modified: 
branches/martin/debugger-plophos/debugger/backend/SingleSteppingEngine.cs
===================================================================
--- branches/martin/debugger-plophos/debugger/backend/SingleSteppingEngine.cs   
2007-10-18 17:48:16 UTC (rev 87774)
+++ branches/martin/debugger-plophos/debugger/backend/SingleSteppingEngine.cs   
2007-10-18 17:48:18 UTC (rev 87775)
@@ -2944,13 +2944,18 @@
 
                        try {
                                args = null;
-                               return CallbackCompleted (cevent.Data1, 
cevent.Data2);
+                               return CallbackCompleted (cevent);
                        } catch {
                                RestoreStack ();
                                return EventResult.CompletedCallback;
                        }
                }
 
+               protected virtual EventResult CallbackCompleted 
(Inferior.ChildEvent cevent)
+               {
+                       return CallbackCompleted (cevent.Data1, cevent.Data2);
+               }
+
                protected abstract EventResult CallbackCompleted (long data1, 
long data2);
 
                public override bool IsSourceOperation {
@@ -3329,7 +3334,7 @@
                }
        }
 
-       protected delegate void MyTrampolineHandler (TargetAddress address);
+       protected delegate void MyTrampolineHandler (TargetAddress address, 
byte[] data);
 
        protected class OperationTrampoline : Operation
        {
@@ -3380,12 +3385,17 @@
 
                        Console.WriteLine ("NEW OPERATION TRAMPOLINE: {0} {1}", 
CallSite, CallTarget);
 
-                       sse.PushOperation (new OperationDoTrampoline (sse, 
CallSite, CallTarget,
-                               delegate (TargetAddress the_address) {
-                                               this.address = the_address;
-                       }));
+                       sse.PushOperation (new OperationDoTrampoline (
+                               sse, CallSite, CallTarget, callback_completed));
                }
 
+               void callback_completed (TargetAddress address, byte[] data)
+               {
+                       this.address = address;
+
+                       Console.WriteLine ("OPERATION TRAMPOLINE DONE: {0}", 
address);
+               }
+
                protected override EventResult DoProcessEvent 
(Inferior.ChildEvent cevent,
                                                               out 
TargetEventArgs args)
                {
@@ -3537,12 +3547,12 @@
                        this.MyTrampolineHandler = handler;
                }
 
+               byte[] code_buffer;
+               int code_buffer_size;
+               int code_buffer_offset;
+
                protected override void DoExecute ()
                {
-                       byte[] code_buffer = null;
-                       int code_buffer_size = 0;
-                       int code_buffer_offset = 0;
-
                        if 
(sse.process.BreakpointManager.IsAnyBreakpointInMemoryArea (CallSite - 16, 32)) 
{
                                code_buffer = inferior.ReadBuffer (CallSite - 
16, 32);
                                code_buffer_size = 32;
@@ -3550,7 +3560,7 @@
                        }
 
                        TargetBinaryWriter writer = new TargetBinaryWriter (
-                               32 + code_buffer_size, inferior.TargetInfo);
+                               24 + code_buffer_size, inferior.TargetInfo);
                        writer.WriteInt64 (CallSite.Address);
                        writer.WriteInt64 (CallTarget.Address);
                        writer.WriteInt32 (code_buffer_size);
@@ -3563,16 +3573,42 @@
                        inferior.CallMethod (sse.MonoDebuggerInfo.DoTrampoline, 
data, ID);
                }
 
-               protected override EventResult CallbackCompleted (long data1, 
long data2)
+               protected override EventResult CallbackCompleted 
(Inferior.ChildEvent cevent)
                {
-                       Console.WriteLine ("TRAMPOLINE COMPLETED: {0:x} {1:x}", 
data1, data2);
-                       TargetAddress address = new TargetAddress 
(inferior.AddressDomain, data1);
-                       MyTrampolineHandler (address);
+                       Console.WriteLine ("TRAMPOLINE COMPLETED: {0:x} 
{1:x}\n{2}", cevent.Data1,
+                                          cevent.Data2, 
TargetBinaryReader.HexDump (cevent.CallbackData));
+
+                       TargetBinaryReader reader = new TargetBinaryReader (
+                               cevent.CallbackData, inferior.TargetInfo);
+                       byte[] new_code = reader.PeekBuffer (24, 
code_buffer_size);
+
+                       Console.WriteLine ("OLD:\n{0}\n\nNEW:\n{1}",
+                                          TargetBinaryReader.HexDump 
(code_buffer),
+                                          TargetBinaryReader.HexDump 
(new_code));
+
+                       bool modified = false;
+                       for (int i = 0; i < code_buffer_size; i++) {
+                               if (code_buffer [i] != new_code [i]) {
+                                       modified = true;
+                                       break;
+                               }
+                       }
+
+                       Console.WriteLine ("TRAMPOLINE COMPLETED #1: {0:x} 
{1}", cevent.Data1, modified);
+
+                       TargetAddress address = new TargetAddress 
(inferior.AddressDomain, cevent.Data1);
+                       MyTrampolineHandler (address, cevent.CallbackData);
                        RestoreStack ();
                        return EventResult.ResumeOperation;
                }
+
+               protected override EventResult CallbackCompleted (long data1, 
long data2)
+               {
+                       throw new InternalError ();
+               }
        }
 
+#if FIXME
        protected class OperationCompileMethod : OperationCallback
        {
                public readonly TargetAddress Method;
@@ -3599,6 +3635,7 @@
                        return EventResult.ResumeOperation;
                }
        }
+#endif
 
        protected class OperationRuntimeClassInit : OperationCallback
        {

Modified: branches/martin/debugger-plophos/debugger/backend/server/library.c
===================================================================
--- branches/martin/debugger-plophos/debugger/backend/server/library.c  
2007-10-18 17:48:16 UTC (rev 87774)
+++ branches/martin/debugger-plophos/debugger/backend/server/library.c  
2007-10-18 17:48:18 UTC (rev 87775)
@@ -103,9 +103,11 @@
 
 ServerStatusMessageType
 mono_debugger_server_dispatch_event (ServerHandle *handle, guint32 status, 
guint64 *arg,
-                                    guint64 *data1, guint64 *data2)
+                                    guint64 *data1, guint64 *data2, guint32 
*opt_data_size,
+                                    gpointer *opt_data)
 {
-       return (*global_vtable->dispatch_event) (handle, status, arg, data1, 
data2);
+       return (*global_vtable->dispatch_event) (
+               handle, status, arg, data1, data2, opt_data_size, opt_data);
 }
 
 ServerCommandError

Modified: branches/martin/debugger-plophos/debugger/backend/server/server.h
===================================================================
--- branches/martin/debugger-plophos/debugger/backend/server/server.h   
2007-10-18 17:48:16 UTC (rev 87774)
+++ branches/martin/debugger-plophos/debugger/backend/server/server.h   
2007-10-18 17:48:18 UTC (rev 87775)
@@ -131,7 +131,9 @@
                                                       guint32              
status,
                                                       guint64             *arg,
                                                       guint64             
*data1,
-                                                      guint64             
*data2);
+                                                      guint64             
*data2,
+                                                      guint32             
*opt_data_size,
+                                                      gpointer            
*opt_data);
 
        /* Get sizeof (int), sizeof (long) and sizeof (void *) from the target. 
*/
        ServerCommandError    (* get_target_info)     (guint32            
*target_int_size,
@@ -391,7 +393,9 @@
                                           guint32                  status,
                                           guint64                 *arg,
                                           guint64                 *data1,
-                                          guint64                 *data2);
+                                          guint64                 *data2,
+                                          guint32                 
*opt_data_size,
+                                          gpointer                *opt_data);
 
 ServerCommandError
 mono_debugger_server_get_target_info      (guint32            *target_int_size,

Modified: branches/martin/debugger-plophos/debugger/backend/server/x86-arch.h
===================================================================
--- branches/martin/debugger-plophos/debugger/backend/server/x86-arch.h 
2007-10-18 17:48:16 UTC (rev 87774)
+++ branches/martin/debugger-plophos/debugger/backend/server/x86-arch.h 
2007-10-18 17:48:18 UTC (rev 87775)
@@ -29,7 +29,8 @@
 
 static ChildStoppedAction
 x86_arch_child_stopped (ServerHandle *handle, int stopsig,
-                       guint64 *callback_arg, guint64 *retval, guint64 
*retval2);
+                       guint64 *callback_arg, guint64 *retval, guint64 
*retval2,
+                       guint32 *opt_data_size, gpointer *opt_data);
 
 static ServerCommandError
 x86_arch_get_registers (ServerHandle *handle);

Modified: branches/martin/debugger-plophos/debugger/backend/server/x86-ptrace.c
===================================================================
--- branches/martin/debugger-plophos/debugger/backend/server/x86-ptrace.c       
2007-10-18 17:48:16 UTC (rev 87774)
+++ branches/martin/debugger-plophos/debugger/backend/server/x86-ptrace.c       
2007-10-18 17:48:18 UTC (rev 87775)
@@ -160,7 +160,8 @@
 
 static ServerStatusMessageType
 server_ptrace_dispatch_event (ServerHandle *handle, guint32 status, guint64 
*arg,
-                             guint64 *data1, guint64 *data2)
+                             guint64 *data1, guint64 *data2, guint32 
*opt_data_size,
+                             gpointer *opt_data)
 {
        if (status >> 16) {
                switch (status >> 16) {
@@ -228,7 +229,7 @@
                }
 
                action = x86_arch_child_stopped (
-                       handle, stopsig, &callback_arg, &retval, &retval2);
+                       handle, stopsig, &callback_arg, &retval, &retval2, 
opt_data_size, opt_data);
 
                if (action != STOP_ACTION_STOPPED)
                        handle->inferior->last_signal = 0;

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 17:48:16 UTC (rev 87774)
+++ branches/martin/debugger-plophos/debugger/backend/server/x86_64-arch.c      
2007-10-18 17:48:18 UTC (rev 87775)
@@ -36,6 +36,8 @@
        guint64 exc_address;
        int saved_signal;
        guint64 pushed_registers;
+       guint64 data_pointer;
+       guint32 data_size;
        gboolean debug;
 } CallbackData;
 
@@ -159,7 +161,8 @@
 
 ChildStoppedAction
 x86_arch_child_stopped (ServerHandle *handle, int stopsig,
-                       guint64 *callback_arg, guint64 *retval, guint64 
*retval2)
+                       guint64 *callback_arg, guint64 *retval, guint64 
*retval2,
+                       guint32 *opt_data_size, gpointer *opt_data)
 {
        ArchInfo *arch = handle->arch;
        InferiorHandle *inferior = handle->inferior;
@@ -234,6 +237,20 @@
                *callback_arg = cdata->callback_argument;
                *retval = INFERIOR_REG_RAX (arch->current_regs);
 
+               if (cdata->data_pointer) {
+                       *opt_data_size = cdata->data_size;
+                       *opt_data = g_malloc0 (cdata->data_size);
+
+                       if (_server_ptrace_read_memory (
+                                   handle, cdata->data_pointer, 
cdata->data_size, *opt_data))
+                               g_error (G_STRLOC ": Can't read data buffer 
after returning from a call");
+
+                       g_message (G_STRLOC ": %p - %d", *opt_data, 
cdata->data_size);
+               } else {
+                       *opt_data_size = 0;
+                       *opt_data = NULL;
+               }
+
                if (cdata->exc_address &&
                    (server_ptrace_peek_word (handle, cdata->exc_address, 
retval2) != COMMAND_ERROR_NONE))
                        g_error (G_STRLOC ": Can't get exc object");
@@ -856,9 +873,6 @@
        *((guint64 *) (code+104)) = INFERIOR_REG_R15 (arch->current_regs);
        *((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));
@@ -870,6 +884,12 @@
        cdata->pushed_registers = new_rsp + 8;
        handle->inferior->last_signal = 0;
 
+       if (data_size > 0) {
+               memcpy (code+112, data_buffer, data_size);
+               cdata->data_pointer = new_rsp + 112;
+               cdata->data_size = data_size;
+       }
+
        server_ptrace_write_memory (handle, (unsigned long) new_rsp, size, 
code);
        g_free (code);
        if (result != COMMAND_ERROR_NONE)

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

Reply via email to