Author: martin
Date: 2005-11-28 12:04:36 -0500 (Mon, 28 Nov 2005)
New Revision: 53563

Modified:
   trunk/debugger/ChangeLog
   trunk/debugger/backends/server/i386-arch.c
Log:
2005-11-28  Martin Baulig  <[EMAIL PROTECTED]>

        * backends/server/i386-arch.c: Make i386 support work again.



Modified: trunk/debugger/ChangeLog
===================================================================
--- trunk/debugger/ChangeLog    2005-11-28 16:54:13 UTC (rev 53562)
+++ trunk/debugger/ChangeLog    2005-11-28 17:04:36 UTC (rev 53563)
@@ -1,3 +1,7 @@
+2005-11-28  Martin Baulig  <[EMAIL PROTECTED]>
+
+       * backends/server/i386-arch.c: Make i386 support work again.
+
 2005-11-11  Martin Baulig  <[EMAIL PROTECTED]>
 
        * languages/native/NativeEnumObject.cs: Removed.

Modified: trunk/debugger/backends/server/i386-arch.c
===================================================================
--- trunk/debugger/backends/server/i386-arch.c  2005-11-28 16:54:13 UTC (rev 
53562)
+++ trunk/debugger/backends/server/i386-arch.c  2005-11-28 17:04:36 UTC (rev 
53563)
@@ -226,7 +226,57 @@
 server_ptrace_call_method_2 (ServerHandle *handle, guint64 method_address,
                             guint64 method_argument, guint64 callback_argument)
 {
-       return COMMAND_ERROR_NOT_IMPLEMENTED;
+       ServerCommandError result = COMMAND_ERROR_NONE;
+       ArchInfo *arch = handle->arch;
+       RuntimeInvokeData *rdata;
+       long new_esp;
+
+       int size = 57;
+       guint8 *code = g_malloc0 (size);
+
+       if (arch->saved_regs)
+               return COMMAND_ERROR_RECURSIVE_CALL;
+
+       new_esp = INFERIOR_REG_ESP (arch->current_regs) - size;
+
+       *((guint32 *) code) = new_esp + size - 1;
+       *((guint64 *) (code+4)) = new_esp + 20;
+       *((guint64 *) (code+12)) = method_argument;
+       *((guint32 *) (code+20)) = INFERIOR_REG_EAX (arch->current_regs);
+       *((guint32 *) (code+24)) = INFERIOR_REG_EBX (arch->current_regs);
+       *((guint32 *) (code+28)) = INFERIOR_REG_ECX (arch->current_regs);
+       *((guint32 *) (code+32)) = INFERIOR_REG_EDX (arch->current_regs);
+       *((guint32 *) (code+36)) = INFERIOR_REG_EBP (arch->current_regs);
+       *((guint32 *) (code+40)) = INFERIOR_REG_ESP (arch->current_regs);
+       *((guint32 *) (code+44)) = INFERIOR_REG_ESI (arch->current_regs);
+       *((guint32 *) (code+48)) = INFERIOR_REG_EDI (arch->current_regs);
+       *((guint32 *) (code+52)) = INFERIOR_REG_EIP (arch->current_regs);
+       *((guint8 *) (code+56)) = 0xcc;
+
+       rdata = g_new0 (RuntimeInvokeData, 1);
+       rdata->saved_regs = g_memdup (&arch->current_regs, sizeof 
(arch->current_regs));
+       rdata->saved_fpregs = g_memdup (&arch->current_fpregs, sizeof 
(arch->current_fpregs));
+       rdata->call_address = new_esp + size;
+       rdata->exc_address = 0;
+       rdata->callback_argument = callback_argument;
+       rdata->saved_signal = handle->inferior->last_signal;
+       handle->inferior->last_signal = 0;
+
+       server_ptrace_write_memory (handle, (unsigned long) new_esp, size, 
code);
+       g_free (code);
+       if (result != COMMAND_ERROR_NONE)
+               return result;
+
+       INFERIOR_REG_EIP (arch->current_regs) = method_address;
+       INFERIOR_REG_ESP (arch->current_regs) = new_esp;
+
+       g_ptr_array_add (arch->rti_stack, rdata);
+
+       result = _server_ptrace_set_registers (handle->inferior, 
&arch->current_regs);
+       if (result != COMMAND_ERROR_NONE)
+               return result;
+
+       return server_ptrace_continue (handle);
 }
 
 static ServerCommandError
@@ -418,7 +468,8 @@
                *callback_arg = rdata->callback_argument;
                *retval = (guint32) INFERIOR_REG_EAX (arch->current_regs);
 
-               if (server_ptrace_peek_word (handle, rdata->exc_address, 
&exc_object) != COMMAND_ERROR_NONE)
+               if (rdata->exc_address &&
+                   (server_ptrace_peek_word (handle, rdata->exc_address, 
&exc_object) != COMMAND_ERROR_NONE))
                        g_error (G_STRLOC ": Can't get exc object");
 
                *retval2 = (guint32) exc_object;
@@ -433,7 +484,7 @@
                if (rdata->debug) {
                        *retval = 0;
                        g_free (rdata);
-                       return STOP_ACTION_BREAKPOINT_HIT;
+                       return STOP_ACTION_CALLBACK_COMPLETED;
                }
 
                g_free (rdata);
@@ -478,7 +529,6 @@
        arch->saved_signal = 0;
        arch->call_address = 0;
        arch->callback_argument = 0;
-       arch->saved_signal = 0;
 
        x86_arch_get_registers (handle);
 
@@ -807,5 +857,25 @@
 static ServerCommandError
 server_ptrace_abort_invoke (ServerHandle *handle)
 {
-       return COMMAND_ERROR_NOT_IMPLEMENTED;
+       RuntimeInvokeData *rdata;
+
+       rdata = get_runtime_invoke_data (handle->arch);
+       if (!rdata)
+               return COMMAND_ERROR_UNKNOWN_ERROR;
+
+       if (_server_ptrace_set_registers (handle->inferior, rdata->saved_regs) 
!= COMMAND_ERROR_NONE)
+               g_error (G_STRLOC ": Can't restore registers after returning 
from a call");
+
+       if (_server_ptrace_set_fp_registers (handle->inferior, 
rdata->saved_fpregs) != COMMAND_ERROR_NONE)
+               g_error (G_STRLOC ": Can't restore FP registers after returning 
from a call");
+
+       handle->inferior->last_signal = rdata->saved_signal;
+       g_free (rdata->saved_regs);
+       g_free (rdata->saved_fpregs);
+       g_ptr_array_remove (handle->arch->rti_stack, rdata);
+
+       x86_arch_get_registers (handle);
+       g_free (rdata);
+
+       return COMMAND_ERROR_NONE;
 }

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

Reply via email to