From: Stefan Ring Date: Mon, 6 Jul 2009 15:16:20 +0000 (+0200) Subject: i386 / x86_64: Align patcher trap instruction. X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=cacao.git;a=commitdiff_plain;h=d972621e13e95b7ac0160902af800f2a745ae7c0 i386 / x86_64: Align patcher trap instruction. * src/vm/jit/i386/emit.c: Added emit_patcher_alignment. * src/vm/jit/x86_64/emit.c: Likewise. * src/vm/jit/i386/md-trap.h: Added emit_patcher_alignment, defined ALIGN_PATCHER_TRAP. * src/vm/jit/x86_64/md-trap.h: Likewise. * src/vm/jit/patcher-common.cpp (patcher_add_patch_ref): Use emit_patcher_alignment if requested. --- diff --git a/src/vm/jit/i386/emit.c b/src/vm/jit/i386/emit.c index dfc62a78b..cfddc22a7 100644 --- a/src/vm/jit/i386/emit.c +++ b/src/vm/jit/i386/emit.c @@ -537,6 +537,19 @@ void emit_trap_countdown(codegendata *cd, s4 *counter) M_ALD_MEM(REG_METHODPTR, TRAP_COUNTDOWN); } +/* emit_patcher_alignment ****************************************************** + + Emit NOP to ensure placement at an even address. + +*******************************************************************************/ + +void emit_patcher_alignment(codegendata *cd) +{ + if ((uintptr_t) cd->mcodeptr & 1) + M_NOP; +} + + /* emit_trap ******************************************************************* Emit a trap instruction and return the original machine code. diff --git a/src/vm/jit/i386/md-trap.h b/src/vm/jit/i386/md-trap.h index 6cf2bbf20..d8bfecbe3 100644 --- a/src/vm/jit/i386/md-trap.h +++ b/src/vm/jit/i386/md-trap.h @@ -80,6 +80,13 @@ enum { (xpc) = (void*) (((uintptr_t) (ra)) - 2); \ } while(0) +/** + * Align traps so they don't cross cache line boundaries. + */ + +#define ALIGN_PATCHER_TRAP + +void emit_patcher_alignment(codegendata *cd); #endif /* _MD_TRAP_H */ diff --git a/src/vm/jit/patcher-common.cpp b/src/vm/jit/patcher-common.cpp index 8d3e6dcef..c96f14808 100644 --- a/src/vm/jit/patcher-common.cpp +++ b/src/vm/jit/patcher-common.cpp @@ -34,6 +34,7 @@ #include "codegen.h" /* for PATCHER_NOPS */ #include "md.h" +#include "trap.hpp" #include "mm/memory.hpp" @@ -175,6 +176,11 @@ void patcher_add_patch_ref(jitdata *jd, functionptr patcher, void* ref, s4 disp) code = jd->code; patchmpc = cd->mcodeptr - cd->mcodebase; +#if defined(ALIGN_PATCHER_TRAP) + emit_patcher_alignment(cd); + patchmpc = cd->mcodeptr - cd->mcodebase; +#endif + #if !defined(NDEBUG) if (patcher_list_find(code, (void*) (intptr_t) patchmpc) != NULL) vm_abort("patcher_add_patch_ref: different patchers at same position."); diff --git a/src/vm/jit/x86_64/emit.c b/src/vm/jit/x86_64/emit.c index 79cd94dd6..398d7d058 100644 --- a/src/vm/jit/x86_64/emit.c +++ b/src/vm/jit/x86_64/emit.c @@ -424,6 +424,19 @@ void emit_trap_compiler(codegendata *cd) } +/* emit_patcher_alignment ****************************************************** + + Emit NOP to ensure placement at an even address. + +*******************************************************************************/ + +void emit_patcher_alignment(codegendata *cd) +{ + if ((uintptr_t) cd->mcodeptr & 1) + M_NOP; +} + + /* emit_trap ******************************************************************* Emit a trap instruction and return the original machine code. diff --git a/src/vm/jit/x86_64/md-trap.h b/src/vm/jit/x86_64/md-trap.h index 8b09e3c6e..c8d538332 100644 --- a/src/vm/jit/x86_64/md-trap.h +++ b/src/vm/jit/x86_64/md-trap.h @@ -81,6 +81,14 @@ enum { } while(0) +/** + * Align traps so they don't cross cache line boundaries. + */ + +#define ALIGN_PATCHER_TRAP + +void emit_patcher_alignment(codegendata *cd); + #endif /* _MD_TRAP_H */