From: Nikodemus S. <de...@us...> - 2006-11-30 17:03:55
|
Update of /cvsroot/sbcl/sbcl/src/runtime In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv24087/src/runtime Modified Files: x86-win32-os.c Log Message: 1.0.0.3: correct stack start addresses on Windows * based on patch by Alastair Bridgewater. * add AB to initials glossary and sort it by initials. Index: x86-win32-os.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/x86-win32-os.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- x86-win32-os.c 7 Apr 2006 11:41:47 -0000 1.3 +++ x86-win32-os.c 30 Nov 2006 17:03:50 -0000 1.4 @@ -42,32 +42,32 @@ #include "validate.h" size_t os_vm_page_size; -int arch_os_thread_init(struct thread *thread) { +int arch_os_thread_init(struct thread *thread) +{ { void *top_exception_frame; void *cur_stack_end; void *cur_stack_start; - + MEMORY_BASIC_INFORMATION stack_memory; + asm volatile ("movl %%fs:0,%0": "=r" (top_exception_frame)); asm volatile ("movl %%fs:4,%0": "=r" (cur_stack_end)); - /* - * Can't pull stack start from fs:4 or fs:8 or whatever, + /* Can't pull stack start from fs:4 or fs:8 or whatever, * because that's only what currently has memory behind - * it from being used. Our basic options are to know, - * a priori, what the stack size is (1 meg by default) - * or to grub the default size out of the executable - * header in memory by means of hardcoded addresses and - * offsets. - * - * We'll just assume it's 1 megabyte. Easiest that way. - */ - cur_stack_start = cur_stack_end - 0x100000; + * it from being used, so do a quick VirtualQuery() and + * grab the AllocationBase. -AB 2006/11/25 + */ - /* - * We use top_exception_frame rather than cur_stack_end - * to elide the last few (boring) stack entries at the - * bottom of the backtrace. + if (!VirtualQuery(&stack_memory, &stack_memory, sizeof(stack_memory))) { + fprintf(stderr, "VirtualQuery: 0x%lx.\n", GetLastError()); + lose("Could not query stack memory information."); + } + cur_stack_start = stack_memory.AllocationBase; + + /* We use top_exception_frame rather than cur_stack_end to + * elide the last few (boring) stack entries at the bottom of + * the backtrace. */ thread->control_stack_start = cur_stack_start; thread->control_stack_end = top_exception_frame; |