2007-10-07 Andreia Gaita <avidigal@novell.com>
[mono.git] / mono / mini / tramp-s390.c
index a61c2590fdb42bfe97b3903f88e62b832f3c856c..59f1403513262bce43ba8739c3cfce5bfebe7f76 100644 (file)
@@ -48,7 +48,6 @@
 #include <mono/metadata/marshal.h>
 #include <mono/metadata/tabledefs.h>
 #include <mono/arch/s390/s390-codegen.h>
-#include <mono/metadata/mono-debug-debugger.h>
 
 #include "mini.h"
 #include "mini-s390.h"
@@ -148,7 +147,6 @@ s390_magic_trampoline (MonoMethod *method, guchar *code, char *sp)
        int reg;
        guchar* base;
        unsigned short opcode;
-       char *fname;
        MonoJitInfo *codeJi, 
                    *addrJi;
 
@@ -161,45 +159,45 @@ s390_magic_trampoline (MonoMethod *method, guchar *code, char *sp)
                /* The top bit needs to be ignored on S/390 */
                code = (guchar*)((guint32)code & 0x7fffffff);
 
-               fname  = mono_method_full_name (method, TRUE);
                codeJi = mono_jit_info_table_find (mono_domain_get(), code);
                addrJi = mono_jit_info_table_find (mono_domain_get(), addr);
                if (mono_method_same_domain (codeJi, addrJi)) {
 
                        opcode = *((unsigned short *) (code - 6));
                        switch (opcode) {
-                               case 0x5810 :
-                                       /* This is a bras r14,r1 instruction */
-                                       code    -= 4;
-                                       reg      = *code >> 4;
-                                       displace = *((short *)code) & 0x0fff;
-                                       if (reg > 5) 
-                                               base = *((guchar **) (sp + S390_REG_SAVE_OFFSET+
-                                                                      sizeof(int)*(reg-6)));
-                                       else
-                                               base = *((guchar **) (sp + CREATE_GR_OFFSET+
-                                                                      sizeof(int)*(reg-2)));
-
-                                       if ((method->klass->valuetype) && 
-                                           (!mono_aot_is_got_entry(code, base))) 
-                                               addr = get_unbox_trampoline(method, addr);
-
-                                       code = base + displace;
-                                       if (mono_domain_owns_vtable_slot(mono_domain_get(), 
-                                                                        code))
-                                               s390_patch(code, addr);
-                                       break;
-                               case 0xc0e5 :
-                                       /* This is the 'brasl' instruction */
-                                       code    -= 4;
-                                       displace = ((gint32) addr - (gint32) (code - 2)) / 2;
-                                       if (mono_method_same_domain (codeJi, addrJi)) {
-                                               s390_patch (code, displace);
-                                               mono_arch_flush_icache (code, 4);
-                                       }
-                                       break;
-                               default :
-                                       g_error("Unable to patch instruction prior to %p",code);
+                       case 0x5810 :
+                               /* This is a bras r14,r1 instruction */
+                               code    -= 4;
+                               reg      = *code >> 4;
+                               displace = *((short *)code) & 0x0fff;
+                               if (reg > 5) 
+                                       base = *((guchar **) (sp + S390_REG_SAVE_OFFSET+
+                                                              sizeof(int)*(reg-6)));
+                               else
+                                       base = *((guchar **) ((sp - CREATE_STACK_SIZE) + 
+                                                              CREATE_GR_OFFSET +
+                                                              sizeof(int)*(reg-2)));
+
+                               if ((method->klass->valuetype) && 
+                                   (!mono_aot_is_got_entry(code, base))) 
+                                       addr = get_unbox_trampoline(method, addr);
+
+                               code = base + displace;
+                               if (mono_domain_owns_vtable_slot(mono_domain_get(), 
+                                                                code))
+                                       s390_patch(code, (guint32) addr);
+                               break;
+                       case 0xc0e5 :
+                               /* This is the 'brasl' instruction */
+                               code    -= 4;
+                               displace = ((gint32) addr - (gint32) (code - 2)) / 2;
+                               if (mono_method_same_domain (codeJi, addrJi)) {
+                                       s390_patch (code, displace);
+                                       mono_arch_flush_icache (code, 4);
+                               }
+                               break;
+                       default :
+                               g_error("Unable to patch instruction prior to %p",code);
                        }
                }
        }
@@ -373,6 +371,7 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type)
                
                /* Arg 3: stack pointer */
                s390_lr   (buf, s390_r4, STK_BASE);
+               s390_ahi  (buf, s390_r4, CREATE_STACK_SIZE);
                
                /* Calculate call address and call
                's390_magic_trampoline'. Return value will be in r2 */
@@ -610,14 +609,12 @@ mono_arch_create_class_init_trampoline (MonoVTable *vtable)
 /*------------------------------------------------------------------*/
 
 gpointer
-mono_debugger_create_notification_function (gpointer *notification_address)
+mono_debugger_create_notification_function (void)
 {
        guint8 *ptr, *buf;
 
        ptr = buf = mono_global_codeman_reserve (16);
        s390_break (buf);
-       if (notification_address)
-               *notification_address = buf;
        s390_br (buf, s390_r14);
 
        return ptr;