X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fx86_64%2Fpatcher.c;h=81cc09e0e8bbc78583471327af0d14c9203634c0;hb=67da78971605bb8a2953a9f6d5a7862857049538;hp=49a5d3f6abbd04cd355f7c5a0afe10453bf648fb;hpb=5fd66d7079226750d364952b1b305d97e38f808b;p=cacao.git diff --git a/src/vm/jit/x86_64/patcher.c b/src/vm/jit/x86_64/patcher.c index 49a5d3f6a..81cc09e0e 100644 --- a/src/vm/jit/x86_64/patcher.c +++ b/src/vm/jit/x86_64/patcher.c @@ -1,6 +1,6 @@ /* src/vm/jit/x86_64/patcher.c - x86_64 code patching functions - Copyright (C) 1996-2005, 2006, 2007, 2008 + Copyright (C) 1996-2005, 2006, 2007, 2008, 2009 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -32,17 +32,17 @@ #include "vm/jit/x86_64/codegen.h" #include "vm/jit/x86_64/md.h" -#include "mm/memory.h" +#include "mm/memory.hpp" -#include "native/native.h" +#include "native/native.hpp" #include "vm/jit/builtin.hpp" -#include "vm/class.h" +#include "vm/class.hpp" #include "vm/field.hpp" -#include "vm/initialize.h" +#include "vm/initialize.hpp" #include "vm/options.h" #include "vm/references.h" -#include "vm/resolve.h" +#include "vm/resolve.hpp" #include "vm/jit/patcher-common.hpp" @@ -59,6 +59,21 @@ void patcher_patch_code(patchref_t *pr) md_icacheflush((void*) pr->mpc, PATCHER_CALL_SIZE); } +/** + * Check if the trap instruction at the given PC is valid. + * + * @param pc Program counter. + * + * @return true if valid, false otherwise. + */ +bool patcher_is_valid_trap_instruction_at(void* pc) +{ + uint16_t mcode = *((uint16_t*) pc); + + // Check for the undefined instruction we use. + return (mcode == 0x0b0f); +} + /* patcher_resolve_classref_to_classinfo *************************************** @@ -161,6 +176,8 @@ bool patcher_resolve_classref_to_flags(patchref_t *pr) if (c == NULL) return false; + ra += PATCHER_CALL_SIZE; + // Patch class flags. /* *datap = c->flags; */ *((int32_t*) (ra + 2)) = c->flags; @@ -190,6 +207,7 @@ bool patcher_get_putstatic(patchref_t *pr) { unresolved_field* uf = (unresolved_field*) pr->ref; uintptr_t* datap = (uintptr_t*) pr->datap; + uint8_t* ra = (uint8_t*) pr->mpc; // Resolve the field. fieldinfo* fi = resolve_field_eager(uf); @@ -197,6 +215,8 @@ bool patcher_get_putstatic(patchref_t *pr) if (fi == NULL) return false; + ra += PATCHER_CALL_SIZE; + // Check if the field's class is initialized/ if (!(fi->clazz->state & CLASS_INITIALIZED)) if (!initialize_class(fi->clazz)) @@ -235,6 +255,8 @@ bool patcher_get_putfield(patchref_t *pr) if (fi == NULL) return false; + pc += PATCHER_CALL_SIZE; + // Patch the field's offset: we check for the field type, because // the instructions have different lengths. if (IS_INT_LNG_TYPE(fi->type)) { @@ -282,6 +304,8 @@ bool patcher_putfieldconst(patchref_t *pr) if (fi == NULL) return false; + pc += PATCHER_CALL_SIZE; + // Patch the field's offset. if (IS_2_WORD_TYPE(fi->type) || IS_ADR_TYPE(fi->type)) { // Handle special case when the base register is %r12. @@ -364,6 +388,8 @@ bool patcher_invokevirtual(patchref_t *pr) if (m == NULL) return false; + pc += PATCHER_CALL_SIZE; + // Patch vftbl index. *((int32_t*) (pc + 3 + 3)) = (int32_t) (OFFSET(vftbl_t, table[0]) + sizeof(methodptr) * m->vftblindex); @@ -400,6 +426,8 @@ bool patcher_invokeinterface(patchref_t *pr) if (m == NULL) return false; + pc += PATCHER_CALL_SIZE; + // Patch interfacetable index. *((int32_t*) (pc + 3 + 3)) = (int32_t) (OFFSET(vftbl_t, interfacetable[0]) - sizeof(methodptr) * m->clazz->index); @@ -440,6 +468,8 @@ bool patcher_checkcast_interface(patchref_t *pr) if (c == NULL) return false; + pc += PATCHER_CALL_SIZE; + // Patch super class index. *((int32_t*) (pc + 7 + 3)) = c->index; @@ -478,6 +508,8 @@ bool patcher_instanceof_interface(patchref_t *pr) if (c == NULL) return false; + pc += PATCHER_CALL_SIZE; + // Patch super class index. *((int32_t*) (pc + 7 + 3)) = c->index;