2008-03-11 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Tue, 11 Mar 2008 19:24:31 +0000 (19:24 -0000)
committerZoltan Varga <vargaz@gmail.com>
Tue, 11 Mar 2008 19:24:31 +0000 (19:24 -0000)
* tramp-amd64.c (mono_arch_create_trampoline_code): Correctly save RBP as well.

svn path=/trunk/mono/; revision=97991

mono/mini/ChangeLog
mono/mini/tramp-amd64.c

index bf368578524adc78d67d0a347e2ee6f39b687fa0..f31a99449c685fbd931b85f899dab5410b8de742 100644 (file)
@@ -1,3 +1,6 @@
+2008-03-11  Zoltan Varga  <vargaz@gmail.com>
+
+       * tramp-amd64.c (mono_arch_create_trampoline_code): Correctly save RBP as well.
 
 Mon Mar 10 11:59:34 CET 2008 Paolo Molaro <lupus@ximian.com>
 
index e8c8f013f958d05c653afd7dc34f322fde516364..3cad47ad4cdc902463c24dc02a5f308717ac08b7 100644 (file)
@@ -191,7 +191,7 @@ guchar*
 mono_arch_create_trampoline_code (MonoTrampolineType tramp_type)
 {
        guint8 *buf, *code, *tramp, *br [2];
-       int i, lmf_offset, offset, res_offset, arg_offset, tramp_offset, saved_regs_offset, saved_fpregs_offset, framesize;
+       int i, lmf_offset, offset, res_offset, arg_offset, tramp_offset, saved_regs_offset, saved_fpregs_offset, rbp_offset, framesize;
        gboolean has_caller;
 
        if (tramp_type == MONO_TRAMPOLINE_JUMP)
@@ -204,8 +204,6 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type)
        framesize = 512 + sizeof (MonoLMF);
        framesize = (framesize + (MONO_ARCH_FRAME_ALIGNMENT - 1)) & ~ (MONO_ARCH_FRAME_ALIGNMENT - 1);
 
-       offset = 0;
-
        if (tramp_type == MONO_TRAMPOLINE_GENERIC_CLASS_INIT) {
                static int byte_offset = -1;
                static guint8 bitmask;
@@ -243,6 +241,9 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type)
        amd64_mov_reg_reg (code, AMD64_RBP, AMD64_RSP, 8);
        amd64_alu_reg_imm (code, X86_SUB, AMD64_RSP, framesize);
 
+       offset = 0;
+       rbp_offset = - offset;
+
        offset += 8;
        tramp_offset = - offset;
 
@@ -266,8 +267,15 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type)
 
        offset += AMD64_NREG * 8;
        saved_regs_offset = - offset;
-       for (i = 0; i < AMD64_NREG; ++i)
-               amd64_mov_membase_reg (code, AMD64_RBP, saved_regs_offset + (i * 8), i, 8);
+       for (i = 0; i < AMD64_NREG; ++i) {
+               if (i == AMD64_RBP) {
+                       /* RAX is already saved */
+                       amd64_mov_reg_membase (code, AMD64_RAX, AMD64_RBP, rbp_offset, 8);
+                       amd64_mov_membase_reg (code, AMD64_RBP, saved_regs_offset + (i * 8), AMD64_RAX, 8);
+               } else {
+                       amd64_mov_membase_reg (code, AMD64_RBP, saved_regs_offset + (i * 8), i, 8);
+               }
+       }
        offset += 8 * 8;
        saved_fpregs_offset = - offset;
        for (i = 0; i < 8; ++i)