1.0.0.3: correct stack start addresses on Windows
[sbcl.git] / src / runtime / x86-win32-os.c
index 0b15ad2..13f3233 100644 (file)
 #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;
-
-        /*
-         * We use top_exception_frame rather than cur_stack_end
-         * to elide the last few (boring) stack entries at the
-         * bottom of the backtrace.
+         * it from being used, so do a quick VirtualQuery() and
+         * grab the AllocationBase. -AB 2006/11/25
+        */
+
+       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;