projects
/
sbcl.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Pack (mostly) stack TNs according to lexical scope information
[sbcl.git]
/
src
/
runtime
/
x86-darwin-os.c
diff --git
a/src/runtime/x86-darwin-os.c
b/src/runtime/x86-darwin-os.c
index
bdc1854
..
bf127b6
100644
(file)
--- a/
src/runtime/x86-darwin-os.c
+++ b/
src/runtime/x86-darwin-os.c
@@
-44,14
+44,23
@@
void set_data_desc_addr(data_desc_t* desc, void* addr)
#endif
#endif
-#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER
-kern_return_t mach_thread_init(mach_port_t thread_exception_port);
+#ifdef LISP_FEATURE_SB_THREAD
+void
+arch_os_load_ldt(struct thread *thread)
+{
+ sel_t sel;
+
+ sel.index = thread->tls_cookie;
+ sel.rpl = USER_PRIV;
+ sel.ti = SEL_LDT;
+
+ __asm__ __volatile__ ("mov %0, %%fs" : : "r"(sel));
+}
#endif
int arch_os_thread_init(struct thread *thread) {
#ifdef LISP_FEATURE_SB_THREAD
int n;
#endif
int arch_os_thread_init(struct thread *thread) {
#ifdef LISP_FEATURE_SB_THREAD
int n;
- sel_t sel;
data_desc_t ldt_entry = { 0, 0, 0, DESC_DATA_WRITE,
3, 1, 0, DESC_DATA_32B, DESC_GRAN_BYTE, 0 };
data_desc_t ldt_entry = { 0, 0, 0, DESC_DATA_WRITE,
3, 1, 0, DESC_DATA_32B, DESC_GRAN_BYTE, 0 };
@@
-69,17
+78,13
@@
int arch_os_thread_init(struct thread *thread) {
thread_mutex_unlock(&modify_ldt_lock);
FSHOW_SIGNAL((stderr, "/ TLS: Allocated LDT %x\n", n));
thread_mutex_unlock(&modify_ldt_lock);
FSHOW_SIGNAL((stderr, "/ TLS: Allocated LDT %x\n", n));
- sel.index = n;
- sel.rpl = USER_PRIV;
- sel.ti = SEL_LDT;
-
- __asm__ __volatile__ ("mov %0, %%fs" : : "r"(sel));
-
thread->tls_cookie=n;
thread->tls_cookie=n;
+ arch_os_load_ldt(thread);
+
pthread_setspecific(specials,thread);
#endif
#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER
pthread_setspecific(specials,thread);
#endif
#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER
- mach_thread_init(THREAD_STRUCT_TO_EXCEPTION_PORT(thread));
+ mach_lisp_thread_init(thread);
#endif
#ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK
#endif
#ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK
@@
-386,7
+391,6
@@
catch_exception_raise(mach_port_t exception_port,
exception_data_t code_vector,
mach_msg_type_number_t code_count)
{
exception_data_t code_vector,
mach_msg_type_number_t code_count)
{
- struct thread *th = (struct thread*) exception_port;
x86_thread_state32_t thread_state;
mach_msg_type_number_t state_count;
vm_address_t region_addr;
x86_thread_state32_t thread_state;
mach_msg_type_number_t state_count;
vm_address_t region_addr;
@@
-400,6
+404,10
@@
catch_exception_raise(mach_port_t exception_port,
siginfo_t siginfo;
kern_return_t ret, dealloc_ret;
siginfo_t siginfo;
kern_return_t ret, dealloc_ret;
+ struct thread *th;
+
+ FSHOW((stderr,"/entering catch_exception_raise with exception: %d\n", exception));
+ th = *(struct thread**)exception_port;
/* Get state and info */
state_count = x86_THREAD_STATE32_COUNT;
if ((ret = thread_get_state(thread,
/* Get state and info */
state_count = x86_THREAD_STATE32_COUNT;
if ((ret = thread_get_state(thread,
@@
-496,6
+504,9
@@
catch_exception_raise(mach_port_t exception_port,
call_handler_on_thread(thread, &thread_state, signal, &siginfo, handler);
}
call_handler_on_thread(thread, &thread_state, signal, &siginfo, handler);
}
+ if (current_mach_task == MACH_PORT_NULL)
+ current_mach_task = mach_task_self();
+
dealloc_ret = mach_port_deallocate (current_mach_task, thread);
if (dealloc_ret) {
lose("mach_port_deallocate (thread) failed with return_code %d\n", dealloc_ret);
dealloc_ret = mach_port_deallocate (current_mach_task, thread);
if (dealloc_ret) {
lose("mach_port_deallocate (thread) failed with return_code %d\n", dealloc_ret);