On 02/23/06 Jonathan S. Chambers wrote:
> I get the following mcs crash when compiling latest from svn on
> FC4 x86_64. I don't see any problems on my x86 machine. Anyone else
> seeing this?
It seems the amd64 port has a bug dealing with negative offsets in the
new interface call sequence.
The attached patch works around the issue, until someone has the time to
fix it. Note this will slow down execution...
lupus
--
-----------------------------------------------------------------
[EMAIL PROTECTED] debian/rules
[EMAIL PROTECTED] Monkeys do it better
Index: mono/mini/mini-amd64.c
===================================================================
--- mono/mini/mini-amd64.c (revision 57168)
+++ mono/mini/mini-amd64.c (working copy)
@@ -4764,7 +4764,7 @@
mono_arch_get_vcall_slot_addr (guint8* code, gpointer *regs)
{
guint32 reg;
- guint32 disp;
+ gint32 disp;
guint8 rex = 0;
/* go to the start of the call instruction
@@ -4783,7 +4783,7 @@
*/
if ((code [0] == 0x41) && (code [1] == 0xff) && (code [2] == 0x15)) {
/* call OFFSET(%rip) */
- disp = *(guint32*)(code + 3);
+ disp = *(gint32*)(code + 3);
return (gpointer*)(code + disp + 7);
}
else if ((code [1] == 0xff) && (amd64_modrm_reg (code [2]) == 0x2) &&
(amd64_modrm_mod (code [2]) == 0x2)) {
@@ -4791,7 +4791,7 @@
if (IS_REX (code [0]))
rex = code [0];
reg = amd64_modrm_rm (code [2]);
- disp = *(guint32*)(code + 3);
+ disp = *(gint32*)(code + 3);
//printf ("B: [%%r%d+0x%x]\n", reg, disp);
}
else if (code [2] == 0xe8) {
@@ -4807,7 +4807,7 @@
if (IS_REX (code [3]))
rex = code [3];
reg = amd64_modrm_rm (code [5]);
- disp = *(guint8*)(code + 6);
+ disp = *(gint8*)(code + 6);
//printf ("B: [%%r%d+0x%x]\n", reg, disp);
}
else if ((code [5] == 0xff) && (amd64_modrm_reg (code [6]) == 0x2) &&
(amd64_modrm_mod (code [6]) == 0x0)) {
Index: mono/mini/tramp-amd64.c
===================================================================
--- mono/mini/tramp-amd64.c (revision 57168)
+++ mono/mini/tramp-amd64.c (working copy)
@@ -64,6 +64,7 @@
void
mono_arch_patch_callsite (guint8 *code, guint8 *addr)
{
+ return;
if (((code [-13] == 0x49) && (code [-12] == 0xbb)) || (code [-5] ==
0xe8)) {
if (code [-5] != 0xe8)
InterlockedExchangePointer ((gpointer*)(code - 11),
addr);
@@ -75,7 +76,7 @@
}
else if ((code [-7] == 0x41) && (code [-6] == 0xff) && (code [-5] ==
0x15)) {
/* call *<OFFSET>(%rip) */
- gpointer *got_entry = (gpointer*)((guint8*)code +
(*(guint32*)(code - 4)));
+ gpointer *got_entry = (gpointer*)((guint8*)code +
(*(gint32*)(code - 4)));
InterlockedExchangePointer (got_entry, addr);
}
}
@@ -85,6 +86,7 @@
{
code -= 3;
+ return;
/*
* A given byte sequence can match more than case here, so we have to be
* really careful about the ordering of the cases. Longer sequences
@@ -142,14 +144,15 @@
{
guint8 rex = 0;
guint32 reg;
- guint32 disp;
+ gint32 disp;
+ return;
if ((code [-3] == 0xff) && (amd64_modrm_reg (code [-2]) == 0x2) &&
(amd64_modrm_mod (code [-2]) == 0x1)) {
/* call *[reg+disp8] */
if (IS_REX (code [-4]))
rex = code [-4];
reg = amd64_modrm_rm (code [-2]);
- disp = *(guint8*)(code - 1);
+ disp = *(gint8*)(code - 1);
//printf ("B: [%%r%d+0x%x]\n", reg, disp);
}
else {
_______________________________________________
Mono-list maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-list