* Removed all Id tags.
[cacao.git] / src / vm / jit / powerpc64 / patcher.c
index d568517df443feddca90a7f708ee281b124e5338..b14fa4268a20b424d1e5c4d9994f82c60770428d 100644 (file)
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: patcher.c 7892 2007-05-10 12:50:45Z tbfg $
-
 */
 
 
 #include "config.h"
 
 #include <assert.h>
+#include <stdint.h>
 
 #include "vm/types.h"
 
@@ -174,7 +173,7 @@ bool patcher_get_putstatic(u1 *sp)
 
        /* patch the field value's address */
 
-       *((ptrint *) (pv + disp)) = (ptrint) &(fi->value);
+       *((intptr_t *) (pv + disp)) = (intptr_t) fi->value;
 
        /* synchronize data cache */
 
@@ -818,11 +817,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 +834,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 +928,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 +945,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 +977,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 +994,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;