Update of /cvsroot/sbcl/sbcl/src/runtime
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4325/src/runtime
Modified Files:
Tag: lutex-branch
x86-assem.S x86-arch.c thread.c interrupt.c bsd-os.c
Log Message:
0.9.10.46.lutex-branch.14
* align stack to 16-bytes in arrange_return_to_lisp_function and skip padding
in post_signal_tramp
* updated bugs list and added debugging info for current blockers
* lots of debugging FSHOWs (many of these can go away once things work)
Index: x86-assem.S
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/x86-assem.S,v
retrieving revision 1.32
retrieving revision 1.32.2.1
diff -u -d -r1.32 -r1.32.2.1
--- x86-assem.S 15 Mar 2006 05:40:17 -0000 1.32
+++ x86-assem.S 27 Mar 2006 19:45:16 -0000 1.32.2.1
@@ -842,6 +842,10 @@
addl $12,%esp /* clear call_into_lisp args from stack */
popal /* restore registers */
popfl
+#ifdef LISP_FEATURE_DARWIN
+ /* skip two padding words */
+ addl $8,%esp
+#endif
leave
ret
SIZE(GNAME(post_signal_tramp))
Index: x86-arch.c
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/x86-arch.c,v
retrieving revision 1.38.2.4
retrieving revision 1.38.2.5
diff -u -d -r1.38.2.4 -r1.38.2.5
--- x86-arch.c 25 Mar 2006 16:20:57 -0000 1.38.2.4
+++ x86-arch.c 27 Mar 2006 19:45:18 -0000 1.38.2.5
@@ -214,6 +214,8 @@
unsigned int trap;
#if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT)
+ FSHOW_SIGNAL((stderr, "/ TLS: restoring fs: %p in sigtrap_handler\n",
+ *CONTEXT_ADDR_FROM_STEM(fs)));
os_restore_tls_segment_register(context);
#endif
@@ -310,7 +312,7 @@
os_context_t *context = (os_context_t*)void_context;
#if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT)
- FSHOW_SIGNAL((stderr, " sigill handler restoring fs: %x\n",
+ FSHOW_SIGNAL((stderr, "/ TLS: restoring fs: %p in sigill_handler\n",
*CONTEXT_ADDR_FROM_STEM(fs)));
os_restore_tls_segment_register(context);
#endif
Index: thread.c
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/thread.c,v
retrieving revision 1.62.2.4
retrieving revision 1.62.2.5
diff -u -d -r1.62.2.4 -r1.62.2.5
--- thread.c 25 Mar 2006 16:20:33 -0000 1.62.2.4
+++ thread.c 27 Mar 2006 19:45:18 -0000 1.62.2.5
@@ -125,7 +125,6 @@
free_thread_stack_later(struct thread *thread_to_be_cleaned_up)
{
struct freeable_stack *new_freeable_stack = 0;
-
if (thread_to_be_cleaned_up) {
new_freeable_stack = (struct freeable_stack *)
os_validate(0, sizeof(struct freeable_stack));
@@ -136,9 +135,8 @@
new_freeable_stack = (struct freeable_stack *)
swap_lispobjs((lispobj *)(void *)&freeable_stack,
(lispobj)new_freeable_stack);
-
if (new_freeable_stack) {
- FSHOW((stderr,"/reaping %lu\n", new_freeable_stack->os_thread));
+ FSHOW((stderr,"/reaping %p\n", (void*) new_freeable_stack->os_thread));
/* #if !defined(LISP_FEATURE_DARWIN) */
/* Under NPTL pthread_join really waits until the thread
* exists and the stack can be safely freed. This is sadly not
@@ -193,7 +191,7 @@
os_invalidate((os_vm_address_t)th->interrupt_data,
(sizeof (struct interrupt_data)));
free_thread_stack_later(th);
- FSHOW((stderr,"/exiting thread %lu\n", thread_self()));
+ FSHOW((stderr,"/exiting thread %p\n", thread_self()));
return result;
}
Index: interrupt.c
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/interrupt.c,v
retrieving revision 1.110.2.3
retrieving revision 1.110.2.4
diff -u -d -r1.110.2.3 -r1.110.2.4
--- interrupt.c 25 Mar 2006 16:19:54 -0000 1.110.2.3
+++ interrupt.c 27 Mar 2006 19:45:18 -0000 1.110.2.4
@@ -332,6 +332,8 @@
lispobj context_sap;
#if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT)
+ FSHOW_SIGNAL((stderr, "/ TLS: restoring fs: %p in interrupt_internal_error\n",
+ *CONTEXT_ADDR_FROM_STEM(fs)));
os_restore_tls_segment_register(context);
#endif
@@ -467,6 +469,8 @@
union interrupt_handler handler;
#if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT)
+ FSHOW_SIGNAL((stderr, "/ TLS: restoring fs: %p in interrupt_handle_now\n",
+ *CONTEXT_ADDR_FROM_STEM(fs)));
os_restore_tls_segment_register(context);
#endif
@@ -585,6 +589,11 @@
* pending handler before calling it. Trust the handler to finish
* with the siginfo before enabling interrupts. */
void (*pending_handler) (int, siginfo_t*, void*)=data->pending_handler;
+ os_context_t *context = arch_os_get_context(&v_context);
+
+ FSHOW_SIGNAL((stderr, "/run_deferred_handler: signal %d context fs is: %p\n",
+ data->pending_signal,
+ *CONTEXT_ADDR_FROM_STEM(fs)));
data->pending_handler=0;
(*pending_handler)(data->pending_signal,&(data->pending_info), v_context);
}
@@ -608,9 +617,10 @@
store_signal_data_for_later(data,handler,signal,info,context);
SetSymbolValue(INTERRUPT_PENDING, T,thread);
FSHOW_SIGNAL((stderr,
- "/maybe_defer_handler(%x,%d),thread=%lu: deferred\n",
+ "/maybe_defer_handler(%x,%d),thread=%lu, fs=%p: deferred\n",
(unsigned int)handler,signal,
- (unsigned long)thread->os_thread));
+ (unsigned long)thread->os_thread,
+ *CONTEXT_ADDR_FROM_STEM(fs)));
return 1;
}
/* a slightly confusing test. arch_pseudo_atomic_atomic() doesn't
@@ -630,9 +640,10 @@
store_signal_data_for_later(data,handler,signal,info,context);
arch_set_pseudo_atomic_interrupted(context);
FSHOW_SIGNAL((stderr,
- "/maybe_defer_handler(%x,%d),thread=%lu: deferred(PA)\n",
+ "/maybe_defer_handler(%x,%d),thread=%lu, fs=%p: deferred(PA)\n",
(unsigned int)handler,signal,
- (unsigned long)thread->os_thread));
+ (unsigned long)thread->os_thread,
+ *CONTEXT_ADDR_FROM_STEM(fs)));
return 1;
}
FSHOW_SIGNAL((stderr,
@@ -656,6 +667,9 @@
data->pending_signal = signal;
if(info)
memcpy(&(data->pending_info), info, sizeof(siginfo_t));
+
+ FSHOW_SIGNAL((stderr, "/store_signal_data_for_later: signal: %d\n", signal));
+
if(context) {
/* the signal mask in the context (from before we were
* interrupted) is copied to be restored when
@@ -676,6 +690,8 @@
struct interrupt_data *data;
#if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT)
+ FSHOW_SIGNAL((stderr, "/ TLS: restoring fs: %p in maybe_now_maybe_later\n",
+ *CONTEXT_ADDR_FROM_STEM(fs)));
os_restore_tls_segment_register(context);
#endif
@@ -705,6 +721,8 @@
#endif
#if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT)
+ FSHOW_SIGNAL((stderr, "/ TLS: restoring fs: %p in low_level_interrupt_handle_now\n",
+ *CONTEXT_ADDR_FROM_STEM(fs)));
os_restore_tls_segment_register(context);
#endif
@@ -725,6 +743,8 @@
struct interrupt_data *data;
#if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT)
+ FSHOW_SIGNAL((stderr, "/ TLS: restoring fs: %p in low_level_maybe_now_maybe_later\n",
+ *CONTEXT_ADDR_FROM_STEM(fs)));
os_restore_tls_segment_register(context);
#endif
@@ -754,6 +774,8 @@
os_context_t *context = arch_os_get_context(&void_context);
#if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT)
+ FSHOW_SIGNAL((stderr, "/ TLS: restoring fs: %p in sig_stop_for_gc_handler\n",
+ *CONTEXT_ADDR_FROM_STEM(fs)));
os_restore_tls_segment_register(context);
#endif
@@ -898,6 +920,35 @@
u32 *sp=(u32 *)*os_context_register_addr(context,reg_ESP);
+ FSHOW_SIGNAL((stderr, "/arrange_return_to_lisp_function: preparing to go back\n"));
+
+#if defined(LISP_FEATURE_DARWIN)
+
+ /* return address for call_into_lisp: */
+ *(sp-17) = (u32)post_signal_tramp;
+ *(sp-16) = function; /* args for call_into_lisp : function*/
+ *(sp-15) = 0; /* arg array */
+ *(sp-14) = 0; /* no. args */
+ /* this order matches that used in POPAD */
+ *(sp-13)=*os_context_register_addr(context,reg_EDI);
+ *(sp-12)=*os_context_register_addr(context,reg_ESI);
+
+ *(sp-11)=*os_context_register_addr(context,reg_ESP)-10;
+ /* POPAD ignores the value of ESP: */
+ *(sp-10)=0;
+ *(sp-9)=*os_context_register_addr(context,reg_EBX);
+
+ *(sp-8)=*os_context_register_addr(context,reg_EDX);
+ *(sp-7)=*os_context_register_addr(context,reg_ECX);
+ *(sp-6)=*os_context_register_addr(context,reg_EAX);
+ *(sp-5)=*context_eflags_addr(context);
+ *(sp-4)=0;
+ *(sp-3)=0;
+ *(sp-2)=*os_context_register_addr(context,reg_EBP);
+ *(sp-1)=*os_context_pc_addr(context);
+
+#else
+
/* return address for call_into_lisp: */
*(sp-15) = (u32)post_signal_tramp;
*(sp-14) = function; /* args for call_into_lisp : function*/
@@ -919,6 +970,8 @@
*(sp-2)=*os_context_register_addr(context,reg_EBP);
*(sp-1)=*os_context_pc_addr(context);
+#endif
+
#elif defined(LISP_FEATURE_X86_64)
u64 *sp=(u64 *)*os_context_register_addr(context,reg_RSP);
/* return address for call_into_lisp: */
@@ -953,6 +1006,13 @@
#endif
#ifdef LISP_FEATURE_X86
+
+#if defined(LISP_FEATURE_DARWIN)
+ *os_context_pc_addr(context) = (os_context_register_t)call_into_lisp;
+ *os_context_register_addr(context,reg_ECX) = 0;
+ *os_context_register_addr(context,reg_EBP) = (os_context_register_t)(sp-4);
+ *os_context_register_addr(context,reg_ESP) = (os_context_register_t)(sp-17);
+#else
*os_context_pc_addr(context) = (os_context_register_t)call_into_lisp;
*os_context_register_addr(context,reg_ECX) = 0;
*os_context_register_addr(context,reg_EBP) = (os_context_register_t)(sp-2);
@@ -961,7 +1021,9 @@
(os_context_register_t)(sp-15);
#else
*os_context_register_addr(context,reg_ESP) = (os_context_register_t)(sp-15);
-#endif
+#endif /* __NETBSD__ */
+#endif /* LISP_FEATURE_DARWIN */
+
#elif defined(LISP_FEATURE_X86_64)
*os_context_pc_addr(context) = (os_context_register_t)call_into_lisp;
*os_context_register_addr(context,reg_RCX) = 0;
@@ -997,6 +1059,8 @@
os_context_t *context = (os_context_t*)arch_os_get_context(&v_context);
#if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT)
+ FSHOW_SIGNAL((stderr, "/ TLS: restoring fs: %p in interrupt_thread_handler\n",
+ *CONTEXT_ADDR_FROM_STEM(fs)));
os_restore_tls_segment_register(context);
#endif
@@ -1101,6 +1165,11 @@
interrupt_maybe_gc_int(int signal, siginfo_t *info, void *void_context)
{
os_context_t *context=(os_context_t *) void_context;
+#if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT)
+ FSHOW_SIGNAL((stderr, "/ TLS: restoring fs: %p in interrupt_maybe_gc_int\n",
+ *CONTEXT_ADDR_FROM_STEM(fs)));
+ os_restore_tls_segment_register(context);
+#endif
#ifndef LISP_FEATURE_WIN32
struct thread *thread=arch_os_get_current_thread();
#endif
@@ -1225,6 +1294,13 @@
unblock_me_trampoline(int signal, siginfo_t *info, void *void_context)
{
sigset_t unblock;
+#if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT)
+ os_context_t *context = (os_context_t*)void_context;
+ FSHOW_SIGNAL((stderr, "/ TLS: restoring fs: %p in unblock_me_trampoline\n",
+ *CONTEXT_ADDR_FROM_STEM(fs)));
+ os_restore_tls_segment_register(context);
+#endif
+
sigemptyset(&unblock);
sigaddset(&unblock, signal);
thread_sigmask(SIG_UNBLOCK, &unblock, 0);
@@ -1235,6 +1311,14 @@
low_level_unblock_me_trampoline(int signal, siginfo_t *info, void *void_context)
{
sigset_t unblock;
+
+#if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT)
+ os_context_t *context = (os_context_t*)void_context;
+ FSHOW_SIGNAL((stderr, "/ TLS: restoring fs: %p in low_level_unblock_me_trampoline\n",
+ *CONTEXT_ADDR_FROM_STEM(fs)));
+ os_restore_tls_segment_register(context);
+#endif
+
sigemptyset(&unblock);
sigaddset(&unblock, signal);
thread_sigmask(SIG_UNBLOCK, &unblock, 0);
Index: bsd-os.c
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/bsd-os.c,v
retrieving revision 1.38.2.5
retrieving revision 1.38.2.6
diff -u -d -r1.38.2.5 -r1.38.2.6
--- bsd-os.c 26 Mar 2006 18:51:36 -0000 1.38.2.5
+++ bsd-os.c 27 Mar 2006 19:45:18 -0000 1.38.2.6
@@ -190,6 +190,8 @@
#if defined LISP_FEATURE_GENCGC
+#define MEMORY_FAULT_DEBUG
+
/*
* The GENCGC needs to be hooked into whatever signal is raised for
* page fault on this OS.
@@ -201,6 +203,8 @@
void *fault_addr = arch_get_bad_addr(signal, siginfo, context);
#if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT)
+ FSHOW_SIGNAL((stderr, "/ TLS: restoring fs: %p in memory_fault_handler\n",
+ *CONTEXT_ADDR_FROM_STEM(fs)));
os_restore_tls_segment_register(context);
#endif
@@ -243,14 +247,16 @@
interrupt_thread_handler);
undoably_install_low_level_interrupt_handler(SIG_STOP_FOR_GC,
sig_stop_for_gc_handler);
+#ifdef LISP_FEATURE_DARWIN
undoably_install_low_level_interrupt_handler(SIG_RESUME_FROM_GC,
sig_stop_for_gc_handler);
#endif
+#endif
SHOW("leaving os_install_interrupt_handlers()");
}
-#else /* Currently Darwin only */
+#else /* Currently PPC/Darwin/Cheney only */
static void
sigsegv_handler(int signal, siginfo_t *info, void* void_context)
@@ -363,6 +369,7 @@
lose("unexpected i386_set_ldt(..) failure\n");
}
+ FSHOW_SIGNAL((stderr, "/ TLS: Allocated LDT %x\n", n));
sel.index = n;
sel.rpl = USER_PRIV;
sel.ti = SEL_LDT;
@@ -401,6 +408,8 @@
/* Set the %%fs register back to 0 and free the the ldt
* by setting it to NULL.
*/
+ FSHOW_SIGNAL((stderr, "/ TLS: Freeing LDT %x\n", n));
+
__asm__ __volatile__ ("mov %0, %%fs" : : "r"(0));
i386_set_ldt(n, NULL, 1);
#endif
|