projects
/
cacao.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merged revisions 7797-7917 via svnmerge from
[cacao.git]
/
src
/
vm
/
jit
/
powerpc64
/
patcher.c
diff --git
a/src/vm/jit/powerpc64/patcher.c
b/src/vm/jit/powerpc64/patcher.c
index 831c076d0e49b19f7b5419ee2656aab9ccf5a12b..dce048b35ecb01f911b233ce35151a49a43bee92 100644
(file)
--- a/
src/vm/jit/powerpc64/patcher.c
+++ b/
src/vm/jit/powerpc64/patcher.c
@@
-22,7
+22,7
@@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: patcher.c 7
694 2007-04-12 15:35:13
Z tbfg $
+ $Id: patcher.c 7
909 2007-05-15 10:32:16
Z tbfg $
*/
*/
@@
-666,7
+666,7
@@
bool patcher_checkcast_interface(u1 *sp)
*((s4 *)(ra + 5*4)) |= (disp & 0x0000ffff);
/* sync instruction cache */
*((s4 *)(ra + 5*4)) |= (disp & 0x0000ffff);
/* sync instruction cache */
- md_icacheflush(ra,
5
*4);
+ md_icacheflush(ra,
6
*4);
return true;
}
return true;
}
@@
-818,11
+818,14
@@
bool patcher_resolve_classref_to_classinfo(u1 *sp)
{
constant_classref *cr;
s4 disp;
{
constant_classref *cr;
s4 disp;
- u1 *pv;
+ u1 *pv, *ra;
+ u4 mcode;
classinfo *c;
/* get stuff from the stack */
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));
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;
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;
/* 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;
{
constant_classref *cr;
s4 disp;
- u1 *pv;
+ u1 *pv, *ra;
+ u4 mcode;
classinfo *c;
/* get stuff from the stack */
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));
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;
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;
/* 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;
{
constant_classref *cr;
s4 disp;
- u1 *pv;
+ u1 *pv, *ra;
+ u4 mcode;
classinfo *c;
/* get stuff from the stack */
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));
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;
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;
/* patch class flags */
*((s4 *) (pv + disp)) = (s4) c->flags;