Changes:
- $Id: patcher.c 3518 2005-10-28 14:47:11Z twisti $
+ $Id: patcher.c 3520 2005-10-28 17:50:55Z twisti $
*/
/* patch the field's offset */
- *((u4 *) ra) |= (s2) (fi->offset & 0x0000ffff);
+#if SIZEOF_VOID_P == 4
+ if (fi->type == TYPE_LNG) {
+# if WORDS_BIGENDIAN == 1
+ /* ATTENTION: order of these instructions depend on M_LLD_INTERN */
+ *((u4 *) (ra + 0 * 4)) |= (s2) ((fi->offset + 0) & 0x0000ffff);
+ *((u4 *) (ra + 1 * 4)) |= (s2) ((fi->offset + 4) & 0x0000ffff);
+# else
+ /* ATTENTION: order of these instructions depend on M_LLD_INTERN */
+ *((u4 *) (ra + 0 * 4)) |= (s2) ((fi->offset + 4) & 0x0000ffff);
+ *((u4 *) (ra + 1 * 4)) |= (s2) ((fi->offset + 0) & 0x0000ffff);
+# endif
+ } else
+#endif
+ *((u4 *) ra) |= (s2) (fi->offset & 0x0000ffff);
/* synchronize instruction cache */
- if (opt_showdisassemble)
- cacheflush(ra - 2 * 4, 3 * 4, ICACHE);
- else
+ if (opt_showdisassemble) {
+#if SIZEOF_VOID_P == 4
+ if (fi->type == TYPE_LNG) {
+ cacheflush(ra - 2 * 4, 4 * 4, ICACHE);
+ } else
+#endif
+ cacheflush(ra - 2 * 4, 3 * 4, ICACHE);
+ } else {
cacheflush(ra, 2 * 4, ICACHE);
+ }
PATCHER_MARK_PATCHED_MONITOREXIT;
*((ptrint *) (pv + disp)) = (ptrint) BUILTIN_new;
+ /* synchronize data cache */
+
+ cacheflush(pv + disp, SIZEOF_VOID_P * 2, DCACHE);
+
PATCHER_MARK_PATCHED_MONITOREXIT;
return true;
*((ptrint *) (pv + disp)) = (ptrint) BUILTIN_newarray;
+ /* synchronize data cache */
+
+ cacheflush(pv + disp, SIZEOF_VOID_P * 2, DCACHE);
+
PATCHER_MARK_PATCHED_MONITOREXIT;
return true;
*((ptrint *) (pv + disp)) = (ptrint) c->vftbl;
+ /* synchronize data cache */
+
+ cacheflush(pv + disp, SIZEOF_VOID_P, DCACHE);
+
PATCHER_MARK_PATCHED_MONITOREXIT;
return true;
*((ptrint *) (pv + (disp - SIZEOF_VOID_P))) =
(ptrint) BUILTIN_arraycheckcast;
+ /* synchronize data cache */
+
+ cacheflush(pv + disp - SIZEOF_VOID_P, SIZEOF_VOID_P * 2, DCACHE);
+
PATCHER_MARK_PATCHED_MONITOREXIT;
return true;
*((ptrint *) (pv + disp)) = (ptrint) BUILTIN_arrayinstanceof;
+ /* synchronize data cache */
+
+ cacheflush(pv + disp, SIZEOF_VOID_P * 2, DCACHE);
+
PATCHER_MARK_PATCHED_MONITOREXIT;
return true;
*((ptrint *) (pv + disp)) = (ptrint) m->stubroutine;
+ /* synchronize data cache */
+
+ cacheflush(pv + disp, SIZEOF_VOID_P, DCACHE);
+
PATCHER_MARK_PATCHED_MONITOREXIT;
return true;
*((s4 *) (pv + disp)) = (s4) c->flags;
+ /* synchronize data cache */
+
+ cacheflush(pv + disp, sizeof(s4), DCACHE);
+
PATCHER_MARK_PATCHED_MONITOREXIT;
return true;
*((ptrint *) (pv + disp)) = (ptrint) c->vftbl;
+ /* synchronize data cache */
+
+ cacheflush(pv + disp, SIZEOF_VOID_P, DCACHE);
+
PATCHER_MARK_PATCHED_MONITOREXIT;
return true;
*((ptrint *) (pv + disp)) = (ptrint) f;
+ /* synchronize data cache */
+
+ cacheflush(pv + disp, SIZEOF_VOID_P, DCACHE);
+
PATCHER_MARK_PATCHED_MONITOREXIT;
return true;