From e28b25d34fa7ea8ce80429d9dfac6a90ad9e5ad8 Mon Sep 17 00:00:00 2001 From: Guennadi Liakhovetski Date: Mon, 8 Jun 2009 23:25:32 +0200 Subject: [PATCH] Flush instruction caches only after inserting code. Signed-off-by: Guennadi Liakhovetski --- src/class.c | 12 +++++++----- src/interp/engine/interp_jem.c | 3 +++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/class.c b/src/class.c index 7d0f234..84a78ab 100644 --- a/src/class.c +++ b/src/class.c @@ -396,11 +396,6 @@ Class *defineClass(char *classname, char *data, int offset, int len, Object *cla method->code = (char *)ptr; /* Cache line align */ methods_size += (code_length + 31) & ~31; - -#include -#include - /* Clean the data cache, flush the instruction cache */ - syscall(__NR_cacheflush, CACHE_IFLUSH, method->code, code_length); #endif ptr += code_length; @@ -567,9 +562,14 @@ Class *defineClass(char *classname, char *data, int offset, int len, Object *cla return NULL; #ifdef JEM +#include +#include + char *jem_mbs = mmap(0, (methods_size + 4095) & ~4095, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_SHARED | MAP_ANONYMOUS, 0, 0); + char *jem_mb_start = jem_mbs; + for (i = 0; i < classblock->methods_count; i++) { MethodBlock *mb = &classblock->methods[i]; memcpy(jem_mbs, mb->code, mb->code_size); @@ -577,6 +577,8 @@ Class *defineClass(char *classname, char *data, int offset, int len, Object *cla /* Cache line align */ jem_mbs += (mb->code_size + 31) & ~31; } + /* Clean the data cache, flush the instruction cache */ + syscall(__NR_cacheflush, CACHE_IFLUSH, jem_mb_start, (methods_size + 4095) & ~4095); #endif classblock->state = CLASS_LOADED; diff --git a/src/interp/engine/interp_jem.c b/src/interp/engine/interp_jem.c index ee3094d..0ebbee4 100644 --- a/src/interp/engine/interp_jem.c +++ b/src/interp/engine/interp_jem.c @@ -41,6 +41,8 @@ #include #include +#include + #include "arch/avr32_jem.h" #include "interp_jem.h" @@ -97,6 +99,7 @@ static void jem_opcode_rewrite(uint32_t new_opcode, char *pc, int argc, ...) for (i = 1; i <= argc; i++) pc[i] = (char)va_arg(vargs, int); va_end(vargs); + syscall(__NR_cacheflush, CACHE_IFLUSH, (int)pc & ~31, 32); } #define min(x, y) ({ typeof(x) _x = (x); typeof(y) _y = (y); _x > _y ? _y : _x; }) -- 2.11.4.GIT