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