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