X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fmips%2Fpatcher.c;h=703ee87695d84a25916d608eb541315712b6d1aa;hb=9f859ad50d3d5d98c185d40b86b2179bc4dc9aeb;hp=dfe1cc22544917a6c0a043a8a39d2c74dbe83cce;hpb=ebe6b659cf9abe10450094e974c90e63c54a441c;p=cacao.git diff --git a/src/vm/jit/mips/patcher.c b/src/vm/jit/mips/patcher.c index dfe1cc225..703ee8769 100644 --- a/src/vm/jit/mips/patcher.c +++ b/src/vm/jit/mips/patcher.c @@ -22,14 +22,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - $Id: patcher.c 7596 2007-03-28 21:05:53Z twisti $ - */ #include "config.h" #include +#include #include "vm/types.h" @@ -45,7 +44,7 @@ #include "vm/jit/asmpart.h" #include "vm/jit/md.h" -#include "vm/jit/patcher.h" +#include "vm/jit/patcher-common.h" #include "vmcore/class.h" #include "vmcore/field.h" @@ -54,97 +53,64 @@ #include "vmcore/references.h" -/* patcher_wrapper ************************************************************* +#define PATCH_BACK_ORIGINAL_MCODE \ + *((u4 *) pr->mpc) = (u4) pr->mcode; \ + md_icacheflush((u1 *) pr->mpc, PATCHER_CALL_SIZE); + - Wrapper for all patchers. It also creates the stackframe info - structure. +/* patcher_initialize_class **************************************************** - If the return value of the patcher function is false, it gets the - exception object, clears the exception pointer and returns the - exception. + Initalizes a given classinfo pointer. This function does not patch + any data. *******************************************************************************/ -java_objectheader *patcher_wrapper(u1 *sp, u1 *pv, u1 *ra) +bool patcher_initialize_class(patchref_t *pr) { - stackframeinfo sfi; - u1 *xpc; - java_objectheader *o; - u4 mcode[5]; - functionptr f; - bool result; - java_objectheader *e; - - /* define the patcher function */ - - bool (*patcher_function)(u1 *); - - assert(pv != NULL); + classinfo *c; /* get stuff from the stack */ - xpc = (u1 *) *((ptrint *) (sp + 7 * 8)); - o = (java_objectheader *) *((ptrint *) (sp + 6 * 8)); - f = (functionptr) *((ptrint *) (sp + 0 * 8)); - - /* store PV into the patcher function position */ - - *((ptrint *) (sp + 0 * 8)) = (ptrint) pv; - - /* cast the passed function to a patcher function */ + c = (classinfo *) pr->ref; - patcher_function = (bool (*)(u1 *)) (ptrint) f; - - /* enter a monitor on the patching position */ - - PATCHER_MONITORENTER; - - /* create the stackframeinfo */ - - stacktrace_create_extern_stackframeinfo(&sfi, pv, sp + 8 * 8, ra, xpc); - - /* call the proper patcher function */ - - result = (patcher_function)(sp); - - /* remove the stackframeinfo */ + /* check if the class is initialized */ - stacktrace_remove_stackframeinfo(&sfi); + if (!(c->state & CLASS_INITIALIZED)) + if (!initialize_class(c)) + return false; - /* check for return value and exit accordingly */ + PATCH_BACK_ORIGINAL_MCODE; - if (result == false) { - e = exceptions_get_and_clear_exception(); + return true; +} - PATCHER_MONITOREXIT; - return e; - } +/* patcher_resolve_class ***************************************************** - /* patch back original code */ + Initalizes a given classinfo pointer. This function does not patch + any data. - mcode[0] = *((u4 *) (sp + 3 * 8 + 0)); - mcode[1] = *((u4 *) (sp + 3 * 8 + 4)); +*******************************************************************************/ - mcode[2] = *((u4 *) (sp + 4 * 8 + 0)); - mcode[3] = *((u4 *) (sp + 4 * 8 + 4)); - mcode[4] = *((u4 *) (sp + 5 * 8 + 0)); +#ifdef ENABLE_VERIFIER +bool patcher_resolve_class(patchref_t *pr) +{ + unresolved_class *uc; - *((u4 *) (xpc + 0 * 4)) = mcode[0]; - *((u4 *) (xpc + 1 * 4)) = mcode[1]; + /* get stuff from the stack */ - *((u4 *) (xpc + 2 * 4)) = mcode[2]; - *((u4 *) (xpc + 3 * 4)) = mcode[3]; - *((u4 *) (xpc + 4 * 4)) = mcode[4]; + uc = (unresolved_class *) pr->ref; - /* synchronize instruction cache */ + /* resolve the class and check subtype constraints */ - md_icacheflush(xpc, PATCHER_CALL_SIZE); + if (!resolve_class_eager_no_access_check(uc)) + return false; - PATCHER_MARK_PATCHED_MONITOREXIT; + PATCH_BACK_ORIGINAL_MCODE; - return NULL; + return true; } +#endif /* ENABLE_VERIFIER */ /* patcher_get_putstatic ******************************************************* @@ -157,18 +123,16 @@ java_objectheader *patcher_wrapper(u1 *sp, u1 *pv, u1 *ra) *******************************************************************************/ -bool patcher_get_putstatic(u1 *sp) +bool patcher_get_putstatic(patchref_t *pr) { unresolved_field *uf; - s4 disp; - u1 *pv; + u1 *datap; fieldinfo *fi; /* get stuff from the stack */ - uf = (unresolved_field *) *((ptrint *) (sp + 2 * 8)); - disp = *((s4 *) (sp + 1 * 8)); - pv = (u1 *) *((ptrint *) (sp + 0 * 8)); + uf = (unresolved_field *) pr->ref; + datap = (u1 *) pr->datap; /* get the fieldinfo */ @@ -181,13 +145,15 @@ bool patcher_get_putstatic(u1 *sp) if (!initialize_class(fi->class)) return false; + PATCH_BACK_ORIGINAL_MCODE; + /* patch the field value's address */ - *((ptrint *) (pv + disp)) = (ptrint) &(fi->value); + *((intptr_t *) datap) = (intptr_t) fi->value; /* synchronize data cache */ - md_dcacheflush(pv + disp, SIZEOF_VOID_P); + md_dcacheflush(datap, SIZEOF_VOID_P); return true; } @@ -202,7 +168,7 @@ bool patcher_get_putstatic(u1 *sp) *******************************************************************************/ -bool patcher_get_putfield(u1 *sp) +bool patcher_get_putfield(patchref_t *pr) { u1 *ra; unresolved_field *uf; @@ -210,185 +176,222 @@ bool patcher_get_putfield(u1 *sp) /* get stuff from the stack */ - ra = (u1 *) *((ptrint *) (sp + 7 * 8)); - uf = (unresolved_field *) *((ptrint *) (sp + 2 * 8)); + ra = (u1 *) pr->mpc; + uf = (unresolved_field *) pr->ref; /* get the fieldinfo */ if (!(fi = resolve_field_eager(uf))) return false; + PATCH_BACK_ORIGINAL_MCODE; + /* if we show disassembly, we have to skip the nop's */ - if (opt_shownops) { + if (opt_shownops) ra = ra + PATCHER_CALL_SIZE; #if SIZEOF_VOID_P == 4 - if (IS_LNG_TYPE(fi->type)) { + if (IS_LNG_TYPE(fi->type)) { # 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); + /* 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); + /* 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 + } + else #endif - *((u4 *) (ra + 0 * 4)) |= (s2) (fi->offset & 0x0000ffff); + *((u4 *) (ra + 0 * 4)) |= (s2) (fi->offset & 0x0000ffff); - /* synchronize instruction cache */ + /* synchronize instruction cache */ - md_icacheflush(ra, 2 * 4); - } - else { -#if SIZEOF_VOID_P == 4 - if (IS_LNG_TYPE(fi->type)) { -# if WORDS_BIGENDIAN == 1 - /* ATTENTION: order of these instructions depend on M_LLD_INTERN */ - *((u4 *) (sp + 3 * 8 + 0)) |= (s2) ((fi->offset + 0) & 0x0000ffff); - *((u4 *) (sp + 3 * 8 + 4)) |= (s2) ((fi->offset + 4) & 0x0000ffff); -# else - /* ATTENTION: order of these instructions depend on M_LLD_INTERN */ - *((u4 *) (sp + 3 * 8 + 0)) |= (s2) ((fi->offset + 4) & 0x0000ffff); - *((u4 *) (sp + 3 * 8 + 4)) |= (s2) ((fi->offset + 0) & 0x0000ffff); -# endif - } - else -#endif - *((u4 *) (sp + 3 * 8 + 0)) |= (s2) (fi->offset & 0x0000ffff); - } + md_icacheflush(ra, 2 * 4); return true; } -/* patcher_aconst ************************************************************** +/* patcher_resolve_classref_to_classinfo *************************************** - Machine code: + ACONST: dfc4ff98 ld a0,-104(s8) + MULTIANEWARRAY: + + + dfc5ff90 ld a1,-112(s8) + 03a03025 move a2,sp + dfd9ff88 ld t9,-120(s8) + 0320f809 jalr t9 + 00000000 nop + + ARRAYCHECKCAST: + + + dfc5ffc0 ld a1,-64(s8) + dfd9ffb8 ld t9,-72(s8) + 0320f809 jalr t9 + 00000000 nop + *******************************************************************************/ -bool patcher_aconst(u1 *sp) +bool patcher_resolve_classref_to_classinfo(patchref_t *pr) { constant_classref *cr; - s4 disp; - u1 *pv; + u1 *datap; classinfo *c; /* get stuff from the stack */ - cr = (constant_classref *) *((ptrint *) (sp + 2 * 8)); - disp = *((s4 *) (sp + 1 * 8)); - pv = (u1 *) *((ptrint *) (sp + 0 * 8)); + cr = (constant_classref *) pr->ref; + datap = (u1 *) pr->datap; /* get the classinfo */ if (!(c = resolve_classref_eager(cr))) return false; + PATCH_BACK_ORIGINAL_MCODE; + /* patch the classinfo pointer */ - *((ptrint *) (pv + disp)) = (ptrint) c; + *((intptr_t *) datap) = (intptr_t) c; /* synchronize data cache */ - md_dcacheflush(pv + disp, SIZEOF_VOID_P); + md_dcacheflush(datap, SIZEOF_VOID_P); return true; } -/* patcher_builtin_multianewarray ********************************************** +/* patcher_resolve_classref_to_vftbl ******************************************* - Machine code: + CHECKCAST (class): + INSTANCEOF (class): - dfc5ff90 ld a1,-112(s8) - 03a03025 move a2,sp - dfd9ff88 ld t9,-120(s8) - 0320f809 jalr t9 - 00000000 nop + dd030000 ld v1,0(a4) + dfd9ff18 ld t9,-232(s8) *******************************************************************************/ -bool patcher_builtin_multianewarray(u1 *sp) +bool patcher_resolve_classref_to_vftbl(patchref_t *pr) { constant_classref *cr; - s4 disp; - u1 *pv; + u1 *datap; classinfo *c; /* get stuff from the stack */ - cr = (constant_classref *) *((ptrint *) (sp + 2 * 8)); - disp = *((s4 *) (sp + 1 * 8)); - pv = (u1 *) *((ptrint *) (sp + 0 * 8)); + cr = (constant_classref *) pr->ref; + datap = (u1 *) pr->datap; - /* get the classinfo */ + /* get the fieldinfo */ if (!(c = resolve_classref_eager(cr))) return false; - /* patch the classinfo pointer */ + PATCH_BACK_ORIGINAL_MCODE; - *((ptrint *) (pv + disp)) = (ptrint) c; + /* patch super class' vftbl */ + + *((intptr_t *) datap) = (intptr_t) c->vftbl; /* synchronize data cache */ - md_dcacheflush(pv + disp, SIZEOF_VOID_P); + md_dcacheflush(datap, SIZEOF_VOID_P); return true; } -/* patcher_builtin_arraycheckcast ********************************************** +/* patcher_resolve_classref_to_flags ******************************************* - Machine code: + CHECKCAST/INSTANCEOF: - dfc5ffc0 ld a1,-64(s8) - dfd9ffb8 ld t9,-72(s8) - 0320f809 jalr t9 + 8fc3ff24 lw v1,-220(s8) + 30630200 andi v1,v1,512 + 1060000d beq v1,zero,0x000000001051824c 00000000 nop *******************************************************************************/ -bool patcher_builtin_arraycheckcast(u1 *sp) +bool patcher_resolve_classref_to_flags(patchref_t *pr) { constant_classref *cr; - s4 disp; - u1 *pv; + u1 *datap; classinfo *c; /* get stuff from the stack */ - cr = (constant_classref *) *((ptrint *) (sp + 2 * 8)); - disp = *((s4 *) (sp + 1 * 8)); - pv = (u1 *) *((ptrint *) (sp + 0 * 8)); + cr = (constant_classref *) pr->ref; + datap = (u1 *) pr->datap; - /* get the classinfo */ + /* get the fieldinfo */ if (!(c = resolve_classref_eager(cr))) return false; - /* patch the classinfo pointer */ + PATCH_BACK_ORIGINAL_MCODE; - *((ptrint *) (pv + disp)) = (ptrint) c; + /* patch class flags */ + + *((int32_t *) datap) = (int32_t) c->flags; /* synchronize data cache */ - md_dcacheflush(pv + disp, SIZEOF_VOID_P); + md_dcacheflush(datap, sizeof(int32_t)); return true; } +/* patcher_resolve_native ****************************************************** + + XXX + +*******************************************************************************/ + +#if !defined(WITH_STATIC_CLASSPATH) +bool patcher_resolve_native_function(patchref_t *pr) +{ + methodinfo *m; + u1 *datap; + functionptr f; + + /* get stuff from the stack */ + + m = (methodinfo *) pr->ref; + datap = (u1 *) pr->datap; + + /* resolve native function */ + + if (!(f = native_resolve_function(m))) + return false; + + PATCH_BACK_ORIGINAL_MCODE; + + /* patch native function pointer */ + + *((ptrint *) datap) = (ptrint) f; + + /* synchronize data cache */ + + md_dcacheflush(datap, SIZEOF_VOID_P); + + return true; +} +#endif /* !defined(WITH_STATIC_CLASSPATH) */ + + /* patcher_invokestatic_special ************************************************ Machine code: @@ -400,31 +403,31 @@ bool patcher_builtin_arraycheckcast(u1 *sp) ******************************************************************************/ -bool patcher_invokestatic_special(u1 *sp) +bool patcher_invokestatic_special(patchref_t *pr) { unresolved_method *um; - s4 disp; - u1 *pv; + u1 *datap; methodinfo *m; /* get stuff from the stack */ - um = (unresolved_method *) *((ptrint *) (sp + 2 * 8)); - disp = *((s4 *) (sp + 1 * 8)); - pv = (u1 *) *((ptrint *) (sp + 0 * 8)); + um = (unresolved_method *) pr->ref; + datap = (u1 *) pr->datap; /* get the fieldinfo */ if (!(m = resolve_method_eager(um))) return false; + PATCH_BACK_ORIGINAL_MCODE; + /* patch stubroutine */ - *((ptrint *) (pv + disp)) = (ptrint) m->stubroutine; + *((ptrint *) datap) = (ptrint) m->stubroutine; /* synchronize data cache */ - md_dcacheflush(pv + disp, SIZEOF_VOID_P); + md_dcacheflush(datap, SIZEOF_VOID_P); return true; } @@ -442,7 +445,7 @@ bool patcher_invokestatic_special(u1 *sp) *******************************************************************************/ -bool patcher_invokevirtual(u1 *sp) +bool patcher_invokevirtual(patchref_t *pr) { u1 *ra; unresolved_method *um; @@ -450,36 +453,30 @@ bool patcher_invokevirtual(u1 *sp) /* get stuff from the stack */ - ra = (u1 *) *((ptrint *) (sp + 7 * 8)); - um = (unresolved_method *) *((ptrint *) (sp + 2 * 8)); + ra = (u1 *) pr->mpc; + um = (unresolved_method *) pr->ref; /* get the fieldinfo */ if (!(m = resolve_method_eager(um))) return false; + PATCH_BACK_ORIGINAL_MCODE; + /* if we show disassembly, we have to skip the nop's */ - if (opt_shownops) { + if (opt_shownops) ra = ra + PATCHER_CALL_SIZE; - /* patch vftbl index */ - - *((s4 *) (ra + 1 * 4)) |= - (s4) ((OFFSET(vftbl_t, table[0]) + - sizeof(methodptr) * m->vftblindex) & 0x0000ffff); + /* patch vftbl index */ - /* synchronize instruction cache */ + *((s4 *) (ra + 1 * 4)) |= + (s4) ((OFFSET(vftbl_t, table[0]) + + sizeof(methodptr) * m->vftblindex) & 0x0000ffff); - md_icacheflush(ra + 1 * 4, 1 * 4); - } - else { - /* patch vftbl index */ + /* synchronize instruction cache */ - *((s4 *) (sp + 3 * 8 + 4)) |= - (s4) ((OFFSET(vftbl_t, table[0]) + - sizeof(methodptr) * m->vftblindex) & 0x0000ffff); - } + md_icacheflush(ra + 1 * 4, 1 * 4); return true; } @@ -498,7 +495,7 @@ bool patcher_invokevirtual(u1 *sp) *******************************************************************************/ -bool patcher_invokeinterface(u1 *sp) +bool patcher_invokeinterface(patchref_t *pr) { u1 *ra; unresolved_method *um; @@ -506,88 +503,35 @@ bool patcher_invokeinterface(u1 *sp) /* get stuff from the stack */ - ra = (u1 *) *((ptrint *) (sp + 7 * 8)); - um = (unresolved_method *) *((ptrint *) (sp + 2 * 8)); + ra = (u1 *) pr->mpc; + um = (unresolved_method *) pr->ref; /* get the fieldinfo */ if (!(m = resolve_method_eager(um))) return false; + PATCH_BACK_ORIGINAL_MCODE; + /* if we show disassembly, we have to skip the nop's */ - if (opt_shownops) { + if (opt_shownops) ra = ra + PATCHER_CALL_SIZE; - /* patch interfacetable index */ + /* patch interfacetable index */ - *((s4 *) (ra + 1 * 4)) |= - (s4) ((OFFSET(vftbl_t, interfacetable[0]) - - sizeof(methodptr*) * m->class->index) & 0x0000ffff); + *((s4 *) (ra + 1 * 4)) |= + (s4) ((OFFSET(vftbl_t, interfacetable[0]) - + sizeof(methodptr*) * m->class->index) & 0x0000ffff); - /* patch method offset */ + /* patch method offset */ - *((s4 *) (ra + 2 * 4)) |= - (s4) ((sizeof(methodptr) * (m - m->class->methods)) & 0x0000ffff); + *((s4 *) (ra + 2 * 4)) |= + (s4) ((sizeof(methodptr) * (m - m->class->methods)) & 0x0000ffff); - /* synchronize instruction cache */ - - md_icacheflush(ra + 1 * 4, 2 * 4); - } - else { - /* patch interfacetable index */ - - *((s4 *) (sp + 3 * 8 + 4)) |= - (s4) ((OFFSET(vftbl_t, interfacetable[0]) - - sizeof(methodptr*) * m->class->index) & 0x0000ffff); - - /* patch method offset */ - - *((s4 *) (sp + 4 * 8 + 0)) |= - (s4) ((sizeof(methodptr) * (m - m->class->methods)) & 0x0000ffff); - } - - return true; -} - - -/* patcher_checkcast_instanceof_flags ****************************************** - - Machine code: - - - 8fc3ff24 lw v1,-220(s8) - 30630200 andi v1,v1,512 - 1060000d beq v1,zero,0x000000001051824c - 00000000 nop - -*******************************************************************************/ - -bool patcher_checkcast_instanceof_flags(u1 *sp) -{ - constant_classref *cr; - s4 disp; - u1 *pv; - classinfo *c; - - /* get stuff from the stack */ - - cr = (constant_classref *) *((ptrint *) (sp + 2 * 8)); - disp = *((s4 *) (sp + 1 * 8)); - pv = (u1 *) *((ptrint *) (sp + 0 * 8)); - - /* get the fieldinfo */ - - if (!(c = resolve_classref_eager(cr))) - return false; - - /* patch class flags */ - - *((s4 *) (pv + disp)) = (s4) c->flags; - - /* synchronize data cache */ + /* synchronize instruction cache */ - md_dcacheflush(pv + disp, sizeof(s4)); + md_icacheflush(ra + 1 * 4, 2 * 4); return true; } @@ -607,7 +551,7 @@ bool patcher_checkcast_instanceof_flags(u1 *sp) *******************************************************************************/ -bool patcher_checkcast_interface(u1 *sp) +bool patcher_checkcast_interface(patchref_t *pr) { u1 *ra; constant_classref *cr; @@ -615,46 +559,33 @@ bool patcher_checkcast_interface(u1 *sp) /* get stuff from the stack */ - ra = (u1 *) *((ptrint *) (sp + 7 * 8)); - cr = (constant_classref *) *((ptrint *) (sp + 2 * 8)); + ra = (u1 *) pr->mpc; + cr = (constant_classref *) pr->ref; /* get the fieldinfo */ if (!(c = resolve_classref_eager(cr))) return false; + PATCH_BACK_ORIGINAL_MCODE; + /* if we show disassembly, we have to skip the nop's */ - if (opt_shownops) { + if (opt_shownops) ra = ra + PATCHER_CALL_SIZE; - /* patch super class index */ - - *((s4 *) (ra + 2 * 4)) |= (s4) (-(c->index) & 0x0000ffff); - /* *((s4 *) (ra + 5 * 4)) |= (s4) ((OFFSET(vftbl_t, interfacetable[0]) - */ - /* c->index * sizeof(methodptr*)) & 0x0000ffff); */ - *((s4 *) (ra + 6 * 4)) |= - (s4) ((OFFSET(vftbl_t, interfacetable[0]) - - c->index * sizeof(methodptr*)) & 0x0000ffff); - - /* synchronize instruction cache */ - - md_icacheflush(ra + 2 * 4, 5 * 4); - } - else { - /* patch super class index */ + /* patch super class index */ - *((s4 *) (sp + 2 * 4)) |= (s4) (-(c->index) & 0x0000ffff); - /* *((s4 *) (ra + 5 * 4)) |= (s4) ((OFFSET(vftbl_t, interfacetable[0]) - */ - /* c->index * sizeof(methodptr*)) & 0x0000ffff); */ - *((s4 *) (ra + 6 * 4)) |= - (s4) ((OFFSET(vftbl_t, interfacetable[0]) - - c->index * sizeof(methodptr*)) & 0x0000ffff); + *((s4 *) (ra + 2 * 4)) |= (s4) (-(c->index) & 0x0000ffff); + /* *((s4 *) (ra + 5 * 4)) |= (s4) ((OFFSET(vftbl_t, interfacetable[0]) - */ + /* c->index * sizeof(methodptr*)) & 0x0000ffff); */ + *((s4 *) (ra + 6 * 4)) |= + (s4) ((OFFSET(vftbl_t, interfacetable[0]) - + c->index * sizeof(methodptr*)) & 0x0000ffff); - /* synchronize instruction cache */ + /* synchronize instruction cache */ - md_icacheflush(ra + 6 * 4, 1 * 4); - } + md_icacheflush(ra + 2 * 4, 5 * 4); return true; } @@ -674,7 +605,7 @@ bool patcher_checkcast_interface(u1 *sp) *******************************************************************************/ -bool patcher_instanceof_interface(u1 *sp) +bool patcher_instanceof_interface(patchref_t *pr) { u1 *ra; constant_classref *cr; @@ -682,174 +613,34 @@ bool patcher_instanceof_interface(u1 *sp) /* get stuff from the stack */ - ra = (u1 *) *((ptrint *) (sp + 7 * 8)); - cr = (constant_classref *) *((ptrint *) (sp + 2 * 8)); + ra = (u1 *) pr->mpc; + cr = (constant_classref *) pr->ref; /* get the fieldinfo */ if (!(c = resolve_classref_eager(cr))) return false; + PATCH_BACK_ORIGINAL_MCODE; + /* if we show disassembly, we have to skip the nop's */ - if (opt_shownops) { + if (opt_shownops) ra = ra + PATCHER_CALL_SIZE; - /* patch super class index */ - - *((s4 *) (ra + 2 * 4)) |= (s4) (-(c->index) & 0x0000ffff); - *((s4 *) (ra + 5 * 4)) |= - (s4) ((OFFSET(vftbl_t, interfacetable[0]) - - c->index * sizeof(methodptr*)) & 0x0000ffff); - - /* synchronize instruction cache */ - - md_icacheflush(ra + 2 * 4, 4 * 4); - } - else { - /* patch super class index */ - - *((s4 *) (sp + 4 * 8 + 0)) |= (s4) (-(c->index) & 0x0000ffff); - *((s4 *) (ra + 5 * 4)) |= - (s4) ((OFFSET(vftbl_t, interfacetable[0]) - - c->index * sizeof(methodptr*)) & 0x0000ffff); - - /* synchronize instruction cache */ + /* patch super class index */ - md_icacheflush(ra + 5 * 4, 1 * 4); - } - - return true; -} - - -/* patcher_checkcast_instanceof_class ****************************************** - - Machine code: - - - dd030000 ld v1,0(a4) - dfd9ff18 ld t9,-232(s8) - -*******************************************************************************/ - -bool patcher_checkcast_instanceof_class(u1 *sp) -{ - constant_classref *cr; - s4 disp; - u1 *pv; - classinfo *c; - - /* get stuff from the stack */ - - cr = (constant_classref *) *((ptrint *) (sp + 2 * 8)); - disp = *((s4 *) (sp + 1 * 8)); - pv = (u1 *) *((ptrint *) (sp + 0 * 8)); - - /* get the fieldinfo */ - - if (!(c = resolve_classref_eager(cr))) - return false; - - /* patch super class' vftbl */ - - *((ptrint *) (pv + disp)) = (ptrint) c->vftbl; - - /* synchronize data cache */ - - md_dcacheflush(pv + disp, SIZEOF_VOID_P); - - return true; -} + *((s4 *) (ra + 2 * 4)) |= (s4) (-(c->index) & 0x0000ffff); + *((s4 *) (ra + 5 * 4)) |= + (s4) ((OFFSET(vftbl_t, interfacetable[0]) - + c->index * sizeof(methodptr*)) & 0x0000ffff); + /* synchronize instruction cache */ -/* patcher_clinit ************************************************************** - - No special machine code. - -*******************************************************************************/ - -bool patcher_clinit(u1 *sp) -{ - classinfo *c; - - /* get stuff from the stack */ - - c = (classinfo *) *((ptrint *) (sp + 2 * 8)); - - /* check if the class is initialized */ - - if (!(c->state & CLASS_INITIALIZED)) - if (!initialize_class(c)) - return false; - - return true; -} - - -/* patcher_athrow_areturn ****************************************************** - - Machine code: - - - -*******************************************************************************/ - -#ifdef ENABLE_VERIFIER -bool patcher_athrow_areturn(u1 *sp) -{ - unresolved_class *uc; - - /* get stuff from the stack */ - - uc = (unresolved_class *) *((ptrint *) (sp + 2 * 8)); - - /* resolve the class and check subtype constraints */ - - if (!resolve_class_eager_no_access_check(uc)) - return false; - - return true; -} -#endif /* ENABLE_VERIFIER */ - - -/* patcher_resolve_native ****************************************************** - - XXX - -*******************************************************************************/ - -#if !defined(WITH_STATIC_CLASSPATH) -bool patcher_resolve_native(u1 *sp) -{ - methodinfo *m; - s4 disp; - u1 *pv; - functionptr f; - - /* get stuff from the stack */ - - m = (methodinfo *) *((ptrint *) (sp + 2 * 8)); - disp = *((s4 *) (sp + 1 * 8)); - pv = (u1 *) *((ptrint *) (sp + 0 * 8)); - - /* resolve native function */ - - if (!(f = native_resolve_function(m))) - return false; - - /* patch native function pointer */ - - *((ptrint *) (pv + disp)) = (ptrint) f; - - /* synchronize data cache */ - - md_dcacheflush(pv + disp, SIZEOF_VOID_P); + md_icacheflush(ra + 2 * 4, 4 * 4); return true; } -#endif /* !defined(WITH_STATIC_CLASSPATH) */ /*