1.0.41.13: gc: Fix interrupt context scavenging of interior pointers.
[sbcl.git] / src / runtime / x86-win32-os.c
index 0b15ad2..fc076de 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.
+         * it from being used, so do a quick VirtualQuery() and
+         * grab the AllocationBase. -AB 2006/11/25
          */
-        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.
+        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;