From nobody Mon Sep 17 00:00:00 2001 From: Ilya Berezhniuk Date: Thu, 14 Feb 2008 05:38:43 +0300 Subject: [PATCH] native_modules are adopted for using in PORT --- make/vm/port.xml | 4 + vm/port/include/native_modules.h | 43 +++++++++++-- vm/port/src/modules/linux/native_modules_os.c | 66 ++++++++++++-------- vm/port/src/modules/native_modules.c | 31 ++++++--- vm/port/src/modules/win/native_modules_os.c | 17 +++-- vm/vmcore/src/init/vm_properties.cpp | 6 +- vm/vmcore/src/ncai/ncai_modules.cpp | 6 +- vm/vmcore/src/stack/stack_dump.cpp | 18 +++-- .../src/util/em64t/base/native_stack_em64t.cpp | 4 + vm/vmcore/src/util/ia32/base/native_stack_ia32.cpp | 4 + vm/vmcore/src/util/native_stack.cpp | 6 +- 11 files changed, 129 insertions(+), 76 deletions(-) f34f6ea1760dae8fda20a5c6d06ba682e894a351 diff --git a/make/vm/port.xml b/make/vm/port.xml index 17afd7a..8998b75 100644 --- a/make/vm/port.xml +++ b/make/vm/port.xml @@ -50,6 +50,10 @@ + + + + diff --git a/vm/port/include/native_modules.h b/vm/port/include/native_modules.h index 53d3f3c..2b382f0 100644 --- a/vm/port/include/native_modules.h +++ b/vm/port/include/native_modules.h @@ -22,11 +22,10 @@ #ifndef _NATIVE_MODULES_H_ #define _NATIVE_MODULES_H_ +#include #include +#include "open/types.h" -#ifdef __cplusplus -extern "C" { -#endif typedef enum { SEGMENT_TYPE_UNKNOWN, @@ -50,10 +49,40 @@ struct native_module_t { }; -bool get_all_native_modules(native_module_t**, int*); -void dump_native_modules(native_module_t* modules, FILE *out); -void clear_native_modules(native_module_t**); -native_module_t* find_native_module(native_module_t* modules, void* code_ptr); +#ifdef __cplusplus +extern "C" { +#endif + + +/** +* Returns the list of modules loaded to the current process. +* Module includes one or more segments of type native_segment_t. +* @param list_ptr - an address of modules list pointer to fill +* @param count_ptr - count of modules in the returned list +* @return TRUE if OK; FALSE if error occured. +*/ +Boolean port_get_all_modules(native_module_t** list_ptr, int* count_ptr); + +/** +* Dumps the list of modules loaded to the current process.. +* @param modules - pointer to the list of modules to dump. +* @param out - stream for printing the dump. +*/ +void port_dump_modules(native_module_t* modules, FILE *out); + +/** +* Clears the list of modules passed, writes NULL to the poiner. +* @param modules - pointer to the list of modules to clear. +*/ +void port_clear_modules(native_module_t** list_ptr); + +/** +* Searches for the specific address in the list of modules. +* @param modules - pointer to the list of modules to inspect. +* @param code_ptr - the address to look for. +* @return native_module_t pointer if OK; otherwise, NULL. +*/ +native_module_t* port_find_module(native_module_t* modules, void* code_ptr); #ifdef __cplusplus diff --git a/vm/port/src/modules/linux/native_modules_os.c b/vm/port/src/modules/linux/native_modules_os.c index cd7c880..391ccd5 100644 --- a/vm/port/src/modules/linux/native_modules_os.c +++ b/vm/port/src/modules/linux/native_modules_os.c @@ -19,11 +19,11 @@ * @version $Revision: 1.1.2.1 $ */ +#include #include #include #include #include -#include "platform_lowlevel.h" #include "open/types.h" #include "port_malloc.h" #include "native_modules.h" @@ -36,8 +36,8 @@ struct _raw_module { void* start; void* end; - bool acc_r; - bool acc_x; + Boolean acc_r; + Boolean acc_x; char* name; raw_module* next; }; @@ -49,10 +49,12 @@ native_module_t* native_fill_module(raw_ void native_clear_raw_list(raw_module* list) { + raw_module* cur; + if (list->name) STD_FREE(list->name); - raw_module* cur = list->next; + cur = list->next; while (cur) { @@ -88,6 +90,8 @@ raw_module* native_add_raw_segment(raw_m native_module_t* native_fill_module(raw_module* rawModule, size_t count) { + size_t i; + native_module_t* module = (native_module_t*)STD_MALLOC(sizeof(native_module_t) + sizeof(native_segment_t)*(count - 1)); @@ -99,7 +103,7 @@ native_module_t* native_fill_module(raw_ rawModule->name = NULL; module->next = NULL; - for (size_t i = 0; i < count; i++) + for (i = 0; i < count; i++) { if (rawModule->acc_x) module->segments[i].type = SEGMENT_TYPE_CODE; @@ -119,28 +123,34 @@ native_module_t* native_fill_module(raw_ return module; } -bool get_all_native_modules(native_module_t** list_ptr, int* count_ptr) +Boolean port_get_all_modules(native_module_t** list_ptr, int* count_ptr) { - char buf[_MAX_PATH]; + char buf[PATH_MAX]; + pid_t pid; + FILE* file; + + POINTER_SIZE_INT start, end; + char acc_r, acc_x; + char filename[PATH_MAX]; + raw_module module; // First raw module + raw_module* lastseg = &module; // Address of last filled segment + size_t segment_count; + int module_count; + native_module_t** cur_next_ptr; if (list_ptr == NULL || count_ptr == NULL) - return false; + return FALSE; - pid_t pid = getpid(); + pid = getpid(); sprintf(buf, "/proc/%d/maps", pid); - FILE* file = fopen(buf, "rt"); + file = fopen(buf, "rt"); if (!file) - return false; + return FALSE; - POINTER_SIZE_INT start, end; - char acc_r, acc_x; - char filename[_MAX_PATH]; - raw_module module; // First raw module - raw_module* lastseg = &module; // Address of last filled segment - size_t segment_count = 0; - int module_count = 0; - native_module_t** cur_next_ptr = list_ptr; + segment_count = 0; + module_count = 0; + cur_next_ptr = list_ptr; module.name = NULL; module.next = NULL; *list_ptr = NULL; @@ -168,9 +178,9 @@ bool get_all_native_modules(native_modul if (!filled) { native_clear_raw_list(&module); - clear_native_modules(list_ptr); + port_clear_modules(list_ptr); fclose(file); - return false; + return FALSE; } *cur_next_ptr = filled; @@ -183,9 +193,9 @@ bool get_all_native_modules(native_modul if (module.name == NULL) { native_clear_raw_list(&module); - clear_native_modules(list_ptr); + port_clear_modules(list_ptr); fclose(file); - return false; + return FALSE; } strcpy(module.name, filename); @@ -212,9 +222,9 @@ bool get_all_native_modules(native_modul if (lastseg == NULL) { native_clear_raw_list(&module); - clear_native_modules(list_ptr); + port_clear_modules(list_ptr); fclose(file); - return false; + return FALSE; } ++segment_count; @@ -228,9 +238,9 @@ bool get_all_native_modules(native_modul if (!filled) { native_clear_raw_list(&module); - clear_native_modules(list_ptr); + port_clear_modules(list_ptr); fclose(file); - return false; + return FALSE; } *cur_next_ptr = filled; @@ -240,5 +250,5 @@ bool get_all_native_modules(native_modul fclose(file); *count_ptr = module_count; - return true; + return TRUE; } diff --git a/vm/port/src/modules/native_modules.c b/vm/port/src/modules/native_modules.c index 5cfe62e..ac2c6ca 100644 --- a/vm/port/src/modules/native_modules.c +++ b/vm/port/src/modules/native_modules.c @@ -15,19 +15,25 @@ * limitations under the License. */ +#include #include "open/types.h" -#include "native_modules.h" #include "port_malloc.h" +#include "native_modules.h" -native_module_t* find_native_module(native_module_t* modules, void* code_ptr) + +native_module_t* port_find_module(native_module_t* modules, void* code_ptr) { - for (native_module_t* module = modules; NULL != module; - module = module->next) { - for (size_t s = 0; s < module->seg_count; s++) { - void* base = module->segments[s].base; + native_module_t* module; + size_t s; + + for (module = modules; NULL != module; module = module->next) + { + for (s = 0; s < module->seg_count; s++) + { + char* base = module->segments[s].base; size_t size = module->segments[s].size; - if (code_ptr >= base && code_ptr < (char*) base + size) + if ((char*)code_ptr >= base && (char*)code_ptr < base + size) return module; } } @@ -36,16 +42,19 @@ native_module_t* find_native_module(nati return NULL; } -void dump_native_modules(native_module_t* modules, FILE *out) +void port_dump_modules(native_module_t* modules, FILE *out) { - for (native_module_t* module = modules; module; module = module->next) + native_module_t* module; + size_t i; + + for (module = modules; module; module = module->next) { if (!module->filename) continue; fprintf(out, "%s:\n", module->filename); - for (size_t i = 0; i < module->seg_count; i++) + for (i = 0; i < module->seg_count; i++) { size_t base = (size_t)module->segments[i].base; @@ -55,7 +64,7 @@ void dump_native_modules(native_module_t } } -void clear_native_modules(native_module_t** list_ptr) +void port_clear_modules(native_module_t** list_ptr) { native_module_t* cur = *list_ptr; diff --git a/vm/port/src/modules/win/native_modules_os.c b/vm/port/src/modules/win/native_modules_os.c index 0de5d77..19fe9ce 100644 --- a/vm/port/src/modules/win/native_modules_os.c +++ b/vm/port/src/modules/win/native_modules_os.c @@ -27,7 +27,7 @@ #include "native_modules.h" static native_module_t* fill_module(MODULEENTRY32 src); -bool get_all_native_modules(native_module_t** list_ptr, int* count_ptr) +Boolean port_get_all_modules(native_module_t** list_ptr, int* count_ptr) { HANDLE hModuleSnap = INVALID_HANDLE_VALUE; MODULEENTRY32 module; @@ -38,7 +38,7 @@ bool get_all_native_modules(native_modul CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId()); if (hModuleSnap == INVALID_HANDLE_VALUE) - return false; + return FALSE; *list_ptr = NULL; @@ -47,7 +47,7 @@ bool get_all_native_modules(native_modul if ( !Module32First(hModuleSnap, &module) ) { CloseHandle(hModuleSnap); - return false; + return FALSE; } do @@ -57,8 +57,8 @@ bool get_all_native_modules(native_modul if (!filled) { CloseHandle(hModuleSnap); - clear_native_modules(list_ptr); - return false; + port_clear_modules(list_ptr); + return FALSE; } *cur_next_ptr = filled; @@ -70,18 +70,20 @@ bool get_all_native_modules(native_modul CloseHandle(hModuleSnap); *count_ptr = count; - return true; + return TRUE; } native_module_t* fill_module(MODULEENTRY32 src) { + MEMORY_BASIC_INFORMATION mem_info; + size_t path_size = strlen(src.szExePath) + 1; + native_module_t* module = (native_module_t*)STD_MALLOC(sizeof(native_module_t)); if (module == NULL) return NULL; - size_t path_size = strlen(src.szExePath) + 1; module->filename = (char*)STD_MALLOC(path_size); if (module->filename == NULL) { @@ -97,7 +99,6 @@ native_module_t* fill_module(MODULEENTRY module->segments[0].size = (size_t)src.modBaseSize; module->next = NULL; - MEMORY_BASIC_INFORMATION mem_info; VirtualQuery(src.modBaseAddr, &mem_info, sizeof(mem_info)); if ((mem_info.Protect & (PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY)) != 0) diff --git a/vm/vmcore/src/init/vm_properties.cpp b/vm/vmcore/src/init/vm_properties.cpp index 209e823..b3257a0 100644 --- a/vm/vmcore/src/init/vm_properties.cpp +++ b/vm/vmcore/src/init/vm_properties.cpp @@ -118,10 +118,10 @@ #if defined(FREEBSD) } return apr_pstrdup(prop_pool, info.dli_fname); #else - if (! get_all_native_modules(&modules, &modules_count)) + if (! port_get_all_modules(&modules, &modules_count)) return NULL; - native_module_t* module = find_native_module(modules, code_ptr); + native_module_t* module = port_find_module(modules, code_ptr); char* filename = NULL; @@ -129,7 +129,7 @@ #else filename = apr_pstrdup(prop_pool, module->filename); } - clear_native_modules(&modules); + port_clear_modules(&modules); return filename; #endif diff --git a/vm/vmcore/src/ncai/ncai_modules.cpp b/vm/vmcore/src/ncai/ncai_modules.cpp index 84ebfba..990c43e 100644 --- a/vm/vmcore/src/ncai/ncai_modules.cpp +++ b/vm/vmcore/src/ncai/ncai_modules.cpp @@ -369,7 +369,7 @@ static ncaiError ncai_get_all_modules(nc ncai_set_global_list_modules_dead(*list); - bool result = get_all_native_modules(&modules, &mod_count); + bool result = port_get_all_modules(&modules, &mod_count); if (!result) return NCAI_ERROR_INTERNAL; @@ -383,12 +383,12 @@ static ncaiError ncai_get_all_modules(nc if (error != NCAI_ERROR_NONE) { - clear_native_modules(&modules); + port_clear_modules(&modules); return error; } } - clear_native_modules(&modules); + port_clear_modules(&modules); ncai_clean_dead_modules_from_global_list(list); ncai_mark_JNI_modules(*list); diff --git a/vm/vmcore/src/stack/stack_dump.cpp b/vm/vmcore/src/stack/stack_dump.cpp index b536398..948a988 100644 --- a/vm/vmcore/src/stack/stack_dump.cpp +++ b/vm/vmcore/src/stack/stack_dump.cpp @@ -48,7 +48,7 @@ static void sd_fill_modules() return; int count; - bool res = get_all_native_modules(&g_modules, &count); + bool res = port_get_all_modules(&g_modules, &count); assert(res && g_modules && count); } @@ -65,10 +65,10 @@ void sd_update_modules() hymutex_lock(sd_lock); if (g_modules) - clear_native_modules(&g_modules); + port_clear_modules(&g_modules); int count; - res = get_all_native_modules(&g_modules, &count); + res = port_get_all_modules(&g_modules, &count); assert(res && g_modules && count); hymutex_unlock(sd_lock); @@ -205,7 +205,7 @@ static void sd_print_stack_jit(VM_thread } // pure native frame - native_module_t* module = find_native_module(g_modules, cur_ip); + native_module_t* module = port_find_module(g_modules, cur_ip); sd_get_c_method_info(&m, module, cur_ip); sd_print_line(count++, &m); ++frame_num; @@ -222,7 +222,7 @@ static void sd_print_stack_jit(VM_thread if (si_is_native(si) && frame_num < num_frames) { // Print information from native stack trace for JNI frames - native_module_t* module = find_native_module(g_modules, cur_ip); + native_module_t* module = port_find_module(g_modules, cur_ip); sd_get_c_method_info(&m, module, cur_ip); sd_print_line(count, &m); } @@ -290,7 +290,7 @@ static void sd_print_stack_interpreter(V if (frame_num < num_frames && frames[frame_num].java_depth < 0) { // pure native frame - native_module_t* module = find_native_module(g_modules, frames[frame_num].ip); + native_module_t* module = port_find_module(g_modules, frames[frame_num].ip); sd_get_c_method_info(&m, module, frames[frame_num].ip); sd_print_line(count++, &m); ++frame_num; @@ -307,7 +307,7 @@ static void sd_print_stack_interpreter(V if (frame_num < num_frames && (!method || method_is_native(method))) { - native_module_t* module = find_native_module(g_modules, frames[frame_num].ip); + native_module_t* module = port_find_module(g_modules, frames[frame_num].ip); sd_get_c_method_info(&m, module, frames[frame_num].ip); sd_print_line(count, &m); } @@ -371,14 +371,14 @@ #ifdef SD_UPDATE_MODULES sd_fill_modules(); // Fill modules table if needed #endif - native_module_t* module = find_native_module(g_modules, (void*)regs->get_ip()); + native_module_t* module = port_find_module(g_modules, (void*)regs->get_ip()); sd_parse_module_info(module, (void*)regs->get_ip()); } static void sd_print_modules() { fprintf(stderr, "\nLoaded modules:\n\n"); - dump_native_modules(g_modules, stderr); + port_dump_modules(g_modules, stderr); } diff --git a/vm/vmcore/src/util/em64t/base/native_stack_em64t.cpp b/vm/vmcore/src/util/em64t/base/native_stack_em64t.cpp index fd71c4e..c8f139c 100644 --- a/vm/vmcore/src/util/em64t/base/native_stack_em64t.cpp +++ b/vm/vmcore/src/util/em64t/base/native_stack_em64t.cpp @@ -112,9 +112,9 @@ static bool native_check_caller(WalkCont return true; native_module_t* cur_module = - find_native_module(context->modules, regs->get_ip()); + port_find_module(context->modules, regs->get_ip()); native_module_t* found_module = - find_native_module(context->modules, target); + port_find_module(context->modules, target); return (cur_module == found_module); } diff --git a/vm/vmcore/src/util/ia32/base/native_stack_ia32.cpp b/vm/vmcore/src/util/ia32/base/native_stack_ia32.cpp index 2f5b694..cbfc211 100644 --- a/vm/vmcore/src/util/ia32/base/native_stack_ia32.cpp +++ b/vm/vmcore/src/util/ia32/base/native_stack_ia32.cpp @@ -112,9 +112,9 @@ static bool native_check_caller(WalkCont return true; native_module_t* cur_module = - find_native_module(context->modules, regs->get_ip()); + port_find_module(context->modules, regs->get_ip()); native_module_t* found_module = - find_native_module(context->modules, target); + port_find_module(context->modules, target); return (cur_module == found_module); } diff --git a/vm/vmcore/src/util/native_stack.cpp b/vm/vmcore/src/util/native_stack.cpp index bea1d99..41578e3 100644 --- a/vm/vmcore/src/util/native_stack.cpp +++ b/vm/vmcore/src/util/native_stack.cpp @@ -104,7 +104,7 @@ bool native_init_walk_context(WalkContex int mod_count; native_module_t* mod_list = NULL; - if (!get_all_native_modules(&mod_list, &mod_count)) + if (!port_get_all_modules(&mod_list, &mod_count)) return false; context->clean_modules = true; @@ -119,7 +119,7 @@ bool native_init_walk_context(WalkContex if (!native_get_stack_range(context, regs, &context->stack)) { if (context->clean_modules) - clear_native_modules(&context->modules); + port_clear_modules(&context->modules); return false; } @@ -133,7 +133,7 @@ void native_clean_walk_context(WalkConte if (context->modules && context->clean_modules) { - clear_native_modules(&context->modules); + port_clear_modules(&context->modules); } context->modules = NULL; -- 1.3.3