Hello Weldon I've noticed that along with changes from Rana's patch from HARMONY-1786 you've committed some changes compile_IA32.cpp. They don't seem to be related to the patch, but rather a part of MMTK integration. Could it be that you had some modifications to compile_IA32.cpp and accidently committed them along with Rana's patch? Is it code safe to be committed in drlvm right now?
2006/10/25, [EMAIL PROTECTED] <[EMAIL PROTECTED]>:
Author: wjwashburn Date: Tue Oct 24 20:55:30 2006 New Revision: 467552 URL: http://svn.apache.org/viewvc?view=rev&rev=467552 Log: HARMONY-1786, a patch to fix Stack Overflow Error detection on Linux smoke tests pass on both Linux and WindowsXP Modified: incubator/harmony/enhanced/drlvm/trunk/vm/tests/smoke/StackTest.java incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/ia32/base/compile_IA32.cpp incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/linux/signals_ia32.cpp incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/win/ia32/nt_exception_filter.cpp Modified: incubator/harmony/enhanced/drlvm/trunk/vm/tests/smoke/StackTest.java URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/tests/smoke/StackTest.java?view=diff&rev=467552&r1=467551&r2=467552 ============================================================================== --- incubator/harmony/enhanced/drlvm/trunk/vm/tests/smoke/StackTest.java (original) +++ incubator/harmony/enhanced/drlvm/trunk/vm/tests/smoke/StackTest.java Tue Oct 24 20:55:30 2006 @@ -15,10 +15,6 @@ * limitations under the License. */ -/* - * $$$ GMJ - * @keyword XXX_StackOverflowBroken - */ public class StackTest { static int depth = 0; Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/ia32/base/compile_IA32.cpp URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/ia32/base/compile_IA32.cpp?view=diff&rev=467552&r1=467551&r2=467552 ============================================================================== --- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/ia32/base/compile_IA32.cpp (original) +++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/ia32/base/compile_IA32.cpp Tue Oct 24 20:55:30 2006 @@ -1,4 +1,4 @@ -/* +/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. @@ -88,6 +88,9 @@ unsigned cur_word = 0; for(unsigned i=0; i<num_args; i++) { Type_Info_Handle tih = method_args_get_type_info(msh, i); + bool is_magic = false; //wjw, MMTk support + const String *str = tih->get_type_name(); + switch (type_info_get_type(tih)) { case VM_DATA_TYPE_INT64: case VM_DATA_TYPE_UINT64: @@ -110,6 +113,19 @@ break; case VM_DATA_TYPE_CLASS: case VM_DATA_TYPE_ARRAY: + if (str) { //wjw MMTk support + if (strncmp(str->bytes, "org/vmmagic/unboxed/Address", str->len) == 0 ) + is_magic = true; + if (strncmp(str->bytes, "org/vmmagic/unboxed/Extent", str->len) == 0 ) + is_magic = true; + if (strncmp(str->bytes, "org/vmmagic/unboxed/Offset", str->len) == 0 ) + is_magic = true; + if (strncmp(str->bytes, "org/vmmagic/unboxed/Word", str->len) == 0 ) + is_magic = true; + if (strncmp(str->bytes, "org/vmmagic/unboxed/ObjectReference", str->len) == 0 ) + is_magic = true; + } + if (is_magic == false) gc->add_object((ManagedObject**)get_arg_word(num_arg_words, cur_word)); cur_word++; break; Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/linux/signals_ia32.cpp URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/linux/signals_ia32.cpp?view=diff&rev=467552&r1=467551&r2=467552 ============================================================================== --- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/linux/signals_ia32.cpp (original) +++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/linux/signals_ia32.cpp Tue Oct 24 20:55:30 2006 @@ -78,6 +78,8 @@ static int sc_nest = -1; static uint32 exam_point; + + void linux_ucontext_to_regs(Registers* regs, ucontext_t *uc) { regs->eax = uc->uc_mcontext.gregs[REG_EAX]; @@ -150,16 +152,13 @@ uint32 exception_esp = regs.esp; DebugUtilsTI* ti = VM_Global_State::loader_env->TI; - exn_athrow_regs(®s, exc_clss); - assert(exception_esp <= regs.esp); if (ti->get_global_capability(DebugUtilsTI::TI_GC_ENABLE_EXCEPTION_EVENT)) { regs.esp = regs.esp - 4; *((uint32*) regs.esp) = regs.eip; regs.eip = ((uint32)asm_jvmti_exception_catch_callback); } - linux_regs_to_ucontext(uc, ®s); } @@ -272,6 +271,7 @@ inline size_t find_guard_stack_size() { return 64*1024; + } inline size_t find_guard_page_size() { @@ -318,34 +318,39 @@ void set_guard_stack() { int err; - /* - * have the stack parameters been initialized? - * - * TODO - fix this - this probably should be elsewhere - */ - - if(!p_TLS_vmthread->stack_addr) { - init_stack_info(); - } - char* stack_addr = (char*) get_stack_addr(); size_t stack_size = get_stack_size(); size_t guard_stack_size = get_guard_stack_size(); size_t guard_page_size = get_guard_page_size(); - err = mprotect(stack_addr - stack_size + guard_page_size + guard_stack_size, - guard_page_size, PROT_NONE); + // map the guard page and protect it + void UNUSED *res = mmap(stack_addr - stack_size + guard_page_size + + guard_stack_size, guard_page_size, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + + assert(res!=MAP_FAILED); + + err = mprotect(stack_addr - stack_size + guard_page_size + + guard_stack_size, guard_page_size, PROT_NONE ); + + assert(!err); + + //map the alternate stack on which we want to handle the signal + void UNUSED *res2 = mmap(stack_addr - stack_size + guard_page_size, + guard_stack_size, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + + assert(res2!=MAP_FAILED); + -/* $$$ GMJ assert(!err); */ - stack_t sigalt; sigalt.ss_sp = stack_addr - stack_size + guard_page_size; sigalt.ss_flags = SS_ONSTACK; sigalt.ss_size = guard_stack_size; err = sigaltstack (&sigalt, NULL); - assert(!err); + } size_t get_available_stack_size() { @@ -376,8 +381,10 @@ size_t guard_stack_size = get_guard_stack_size(); size_t guard_page_size = get_guard_page_size(); - err = mprotect(stack_addr - stack_size + guard_page_size + guard_stack_size, - guard_page_size, PROT_READ | PROT_WRITE); + + err = mprotect(stack_addr - stack_size + guard_page_size + + guard_stack_size, guard_page_size, PROT_READ | PROT_WRITE); + stack_t sigalt; sigalt.ss_sp = stack_addr - stack_size + guard_page_size; @@ -385,6 +392,7 @@ sigalt.ss_size = guard_stack_size; err = sigaltstack (&sigalt, NULL); + } bool check_stack_overflow(siginfo_t *info, ucontext_t *uc) { @@ -395,6 +403,7 @@ char* guard_page_begin = stack_addr - stack_size + guard_page_size + guard_stack_size; char* guard_page_end = guard_page_begin + guard_page_size; + char* fault_addr = (char*)(info->si_addr); //char* esp_value = (char*)(uc->uc_mcontext.gregs[REG_ESP]); @@ -432,7 +441,7 @@ } void null_java_reference_handler(int signum, siginfo_t* UNREF info, void* context) -{ +{ ucontext_t *uc = (ucontext_t *)context; Global_Env *env = VM_Global_State::loader_env; @@ -443,7 +452,7 @@ stack_overflow_handler(signum, info, context); return; } - + if (env->shutting_down != 0) { fprintf(stderr, "null_java_reference_handler(): called in shutdown stage\n"); } else if (!interpreter_enabled()) { @@ -452,7 +461,6 @@ return; } } - fprintf(stderr, "SIGSEGV in VM code.\n"); Registers regs; linux_ucontext_to_regs(®s, uc); Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/win/ia32/nt_exception_filter.cpp URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/win/ia32/nt_exception_filter.cpp?view=diff&rev=467552&r1=467551&r2=467552 ============================================================================== --- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/win/ia32/nt_exception_filter.cpp (original) +++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/win/ia32/nt_exception_filter.cpp Tue Oct 24 20:55:30 2006 @@ -176,17 +176,6 @@ } void set_guard_stack() { - - /* - * have the stack parameters been initialized? - * - * TODO - fix this - this probably should be elsewhere - */ - - if(!p_TLS_vmthread->stack_addr) { - init_stack_info(); - } - void* stack_addr = get_stack_addr(); size_t stack_size = get_stack_size(); size_t page_size = get_guard_page_size();
-- Gregory Shimansky, Intel Middleware Products Division