Merged revisions 7797-7917 via svnmerge from
[cacao.git] / src / vm / jit / powerpc64 / patcher.c
index 831c076d0e49b19f7b5419ee2656aab9ccf5a12b..dce048b35ecb01f911b233ce35151a49a43bee92 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: patcher.c 7694 2007-04-12 15:35:13Z tbfg $
+   $Id: patcher.c 7909 2007-05-15 10:32:16Z tbfg $
 
 */
 
@@ -666,7 +666,7 @@ bool patcher_checkcast_interface(u1 *sp)
        *((s4 *)(ra + 5*4)) |= (disp & 0x0000ffff);
 
        /* sync instruction cache */
-       md_icacheflush(ra, 5*4);
+       md_icacheflush(ra, 6*4);
 
        return true;
 }
@@ -818,11 +818,14 @@ bool patcher_resolve_classref_to_classinfo(u1 *sp)
 {
        constant_classref *cr;
        s4                 disp;
-       u1                *pv;
+       u1                *pv, *ra;
+       u4         mcode;
        classinfo         *c;
 
        /* get stuff from the stack */
 
+       ra    = (u1 *)                *((ptrint *) (sp + 5 * 8));
+       mcode =                       *((u4 *)     (sp + 3 * 8));
        cr   = (constant_classref *) *((ptrint *) (sp + 2 * 8));
        disp =                       *((s4 *)     (sp + 1 * 8));
        pv   = (u1 *)                *((ptrint *) (sp + 0 * 8));
@@ -832,6 +835,14 @@ bool patcher_resolve_classref_to_classinfo(u1 *sp)
        if (!(c = resolve_classref_eager(cr)))
                return false;
 
+       /* patch back original code */
+
+       *((u4 *) ra) = mcode;
+
+       /* synchronize instruction cache */
+
+       md_icacheflush(ra, 4);
+
        /* patch the classinfo pointer */
 
        *((ptrint *) (pv + disp)) = (ptrint) c;
@@ -918,11 +929,14 @@ bool patcher_resolve_classref_to_vftbl(u1 *sp)
 {
        constant_classref *cr;
        s4                 disp;
-       u1                *pv;
+       u1                *pv, *ra;
+       u4         mcode;
        classinfo         *c;
 
        /* get stuff from the stack */
 
+       ra    = (u1 *)               *((ptrint *) (sp + 5 * 8));
+       mcode =                       *((u4 *)     (sp + 3 * 8));
        cr   = (constant_classref *) *((ptrint *) (sp + 2 * 8));
        disp =                       *((s4 *)     (sp + 1 * 8));
        pv   = (u1 *)                *((ptrint *) (sp + 0 * 8));
@@ -932,6 +946,14 @@ bool patcher_resolve_classref_to_vftbl(u1 *sp)
        if (!(c = resolve_classref_eager(cr)))
                return false;
 
+       /* patch back original code */
+
+       *((u4 *) ra) = mcode;
+
+       /* synchronize instruction cache */
+
+       md_icacheflush(ra, 4);
+
        /* patch super class' vftbl */
 
        *((ptrint *) (pv + disp)) = (ptrint) c->vftbl;
@@ -956,11 +978,14 @@ bool patcher_resolve_classref_to_flags(u1 *sp)
 {
        constant_classref *cr;
        s4                 disp;
-       u1                *pv;
+       u1                *pv, *ra;
+       u4         mcode;
        classinfo         *c;
 
        /* get stuff from the stack */
 
+       ra    = (u1 *)               *((ptrint *) (sp + 5 * 8));
+       mcode =                       *((u4 *)     (sp + 3 * 8));
        cr   = (constant_classref *) *((ptrint *) (sp + 2 * 8));
        disp =                       *((s4 *)     (sp + 1 * 8));
        pv   = (u1 *)                *((ptrint *) (sp + 0 * 8));
@@ -970,6 +995,14 @@ bool patcher_resolve_classref_to_flags(u1 *sp)
        if (!(c = resolve_classref_eager(cr)))
                return false;
 
+       /* patch back original code */
+
+       *((u4 *) ra) = mcode;
+
+       /* synchronize instruction cache */
+
+       md_icacheflush(ra, 4);
+
        /* patch class flags */
 
        *((s4 *) (pv + disp)) = (s4) c->flags;