Hi,

I was debugging a problem with our application on Winx64 and tracked
it to some non-volatile registers not being preserved (rdi rsi)
Without finding the actual problem I simple scanned the code for
places referencing the other non-volatile registers and added code for
the missing registers.

I am not sure that all my changes are actually necessary since I am
not sure what some of these methods do and when they are used.

Could someone look at this patch file and let me know which changes,
if any, are not necessary.  (Looking in Zoltan's direction.)

thanks
-bill
Index: mono/mini/exceptions-amd64.c
===================================================================
--- mono/mini/exceptions-amd64.c	(revision 122701)
+++ mono/mini/exceptions-amd64.c	(working copy)
@@ -589,6 +589,10 @@
 			new_ctx->r13 = lmf_addr->r13;
 			new_ctx->r14 = lmf_addr->r14;
 			new_ctx->r15 = lmf_addr->r15;
+#ifdef PLATFORM_WIN32
+			new_ctx->rdi = lmf_addr->rdi;
+			new_ctx->rsi = lmf_addr->rsi;
+#endif
 		}
 		else {
 			offset = omit_fp ? 0 : -1;
@@ -625,6 +629,14 @@
 					case AMD64_RBP:
 						new_ctx->rbp = reg;
 						break;
+#ifdef PLATFORM_WIN32
+					case AMD64_RDI:
+						new_ctx->rdi = reg;
+						break;
+					case AMD64_RSI:
+						new_ctx->rsi = reg;
+						break;
+#endif
 					default:
 						g_assert_not_reached ();
 					}
@@ -692,6 +704,10 @@
 		new_ctx->r13 = (*lmf)->r13;
 		new_ctx->r14 = (*lmf)->r14;
 		new_ctx->r15 = (*lmf)->r15;
+#ifdef PLATFORM_WIN32
+		new_ctx->rdi = (*lmf)->rdi;
+		new_ctx->rsi = (*lmf)->rsi;
+#endif
 
 		*lmf = (gpointer)(((guint64)(*lmf)->previous_lmf) & ~1);
 
Index: mono/mini/mini-amd64.c
===================================================================
--- mono/mini/mini-amd64.c	(revision 122701)
+++ mono/mini/mini-amd64.c	(working copy)
@@ -1031,12 +1031,19 @@
 		regs = g_list_prepend (regs, (gpointer)AMD64_R13);
 		regs = g_list_prepend (regs, (gpointer)AMD64_R14);
 		regs = g_list_prepend (regs, (gpointer)AMD64_R15);
+
+#ifdef PLATFORM_WIN32
+		regs = g_list_prepend (regs, (gpointer)AMD64_RDI);
+		regs = g_list_prepend (regs, (gpointer)AMD64_RSI);
+#endif
  
 		regs = g_list_prepend (regs, (gpointer)AMD64_R10);
 		regs = g_list_prepend (regs, (gpointer)AMD64_R9);
 		regs = g_list_prepend (regs, (gpointer)AMD64_R8);
+#ifndef PLATFORM_WIN32
 		regs = g_list_prepend (regs, (gpointer)AMD64_RDI);
 		regs = g_list_prepend (regs, (gpointer)AMD64_RSI);
+#endif
 		regs = g_list_prepend (regs, (gpointer)AMD64_RDX);
 		regs = g_list_prepend (regs, (gpointer)AMD64_RCX);
 		regs = g_list_prepend (regs, (gpointer)AMD64_RAX);
@@ -1050,6 +1057,10 @@
 		regs = g_list_prepend (regs, (gpointer)AMD64_R13);
 		regs = g_list_prepend (regs, (gpointer)AMD64_R14);
 		regs = g_list_prepend (regs, (gpointer)AMD64_R15);
+#ifdef PLATFORM_WIN32
+		regs = g_list_prepend (regs, (gpointer)AMD64_RDI);
+		regs = g_list_prepend (regs, (gpointer)AMD64_RSI);
+#endif
 	}
 
 	return regs;
@@ -1082,12 +1093,18 @@
 		regs = g_list_prepend (regs, (gpointer)AMD64_R13);
 		regs = g_list_prepend (regs, (gpointer)AMD64_R14);
 		regs = g_list_prepend (regs, (gpointer)AMD64_R15);
+#ifdef PLATFORM_WIN32
+		regs = g_list_prepend (regs, (gpointer)AMD64_RDI);
+		regs = g_list_prepend (regs, (gpointer)AMD64_RSI);
+#endif
 
 		regs = g_list_prepend (regs, (gpointer)AMD64_R10);
 		regs = g_list_prepend (regs, (gpointer)AMD64_R9);
 		regs = g_list_prepend (regs, (gpointer)AMD64_R8);
+#ifndef PLATFORM_WIN32
 		regs = g_list_prepend (regs, (gpointer)AMD64_RDI);
 		regs = g_list_prepend (regs, (gpointer)AMD64_RSI);
+#endif
 		regs = g_list_prepend (regs, (gpointer)AMD64_RDX);
 		regs = g_list_prepend (regs, (gpointer)AMD64_RCX);
 		regs = g_list_prepend (regs, (gpointer)AMD64_RAX);
@@ -4537,6 +4554,10 @@
 		amd64_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, r13), AMD64_R13, 8);
 		amd64_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, r14), AMD64_R14, 8);
 		amd64_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, r15), AMD64_R15, 8);
+#ifdef PLATFORM_WIN32
+		amd64_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, rdi), AMD64_RDI, 8);
+		amd64_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, rsi), AMD64_RSI, 8);
+#endif
 	}
 
 	/* Save callee saved registers */
@@ -4977,6 +4998,14 @@
 		if (cfg->used_int_regs & (1 << AMD64_R15)) {
 			amd64_mov_reg_membase (code, AMD64_R15, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, r15), 8);
 		}
+#ifdef PLATFORM_WIN32
+		if (cfg->used_int_regs & (1 << AMD64_RDI)) {
+			amd64_mov_reg_membase (code, AMD64_RDI, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, rdi), 8);
+		}
+		if (cfg->used_int_regs & (1 << AMD64_RSI)) {
+			amd64_mov_reg_membase (code, AMD64_RSI, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, rsi), 8);
+		}
+#endif
 	} else {
 
 		if (cfg->arch.omit_fp) {
_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to