Index: /trunk/source/lisp-kernel/memory.c
===================================================================
--- /trunk/source/lisp-kernel/memory.c	(revision 15462)
+++ /trunk/source/lisp-kernel/memory.c	(revision 15463)
@@ -1064,5 +1064,5 @@
                       0);
 
-  if (!work) {
+  if (work == MAP_FAILED) {
     Fatal("Can't allocate memory for thread-local storage.", "");
   }
Index: /trunk/source/lisp-kernel/thread_manager.c
===================================================================
--- /trunk/source/lisp-kernel/thread_manager.c	(revision 15462)
+++ /trunk/source/lisp-kernel/thread_manager.c	(revision 15463)
@@ -849,5 +849,5 @@
                              MACH_PORT_RIGHT_RECEIVE,
                              &thread_exception_port) == KERN_SUCCESS) {
-        tcr->io_datum = (void *)thread_exception_port;
+        tcr->io_datum = (void *)((natural)thread_exception_port);
         associate_tcr_with_exception_port(thread_exception_port,tcr);
       } else {
Index: /trunk/source/lisp-kernel/x86-exceptions.c
===================================================================
--- /trunk/source/lisp-kernel/x86-exceptions.c	(revision 15462)
+++ /trunk/source/lisp-kernel/x86-exceptions.c	(revision 15463)
@@ -3263,28 +3263,13 @@
 #define DARWIN_EXCEPTION_HANDLER signal_handler
 
-#define EXCEPTION_PORT_BUCKETS 109
-
-TCR *
-exception_port_map[EXCEPTION_PORT_BUCKETS];
-
-pthread_mutex_t 
-exception_port_map_lock = PTHREAD_MUTEX_INITIALIZER;
-
 TCR *
 find_tcr_from_exception_port(mach_port_t port)
 {
-  TCR *tcr = NULL;
-  pthread_mutex_lock(&exception_port_map_lock);
-
-  tcr = exception_port_map[(unsigned)port % EXCEPTION_PORT_BUCKETS];
-
-  while (tcr) {
-    if (TCR_TO_EXCEPTION_PORT(tcr) == port) {
-      break;
-    }
-    tcr = (TCR *)tcr->pending_io_info;
-  }
-  pthread_mutex_unlock(&exception_port_map_lock);
-  return tcr;
+  mach_vm_address_t addr = 0;
+  kern_return_t kret;
+
+  kret = mach_port_get_context(mach_task_self(),port,&addr);
+  MACH_CHECK_ERROR("finding TCR from exception port",kret);
+  return (TCR *)((natural)addr);
 }
 
@@ -3292,10 +3277,8 @@
 associate_tcr_with_exception_port(mach_port_t port, TCR *tcr)
 {
-  int b = (unsigned)port % EXCEPTION_PORT_BUCKETS;
-  pthread_mutex_lock(&exception_port_map_lock);
-
-  tcr->pending_io_info = (void *)(exception_port_map[b]);
-  exception_port_map[b] = tcr;
-  pthread_mutex_unlock(&exception_port_map_lock);
+  kern_return_t kret;
+
+  kret = mach_port_set_context(mach_task_self(),port,(mach_vm_address_t)((natural)tcr));
+  MACH_CHECK_ERROR("associating TCR with exception port",kret);
 }
 
@@ -3303,16 +3286,4 @@
 disassociate_tcr_from_exception_port(mach_port_t port)
 {
-  TCR **prev = &(exception_port_map[(unsigned)port % EXCEPTION_PORT_BUCKETS]),
-    *tcr;
-  pthread_mutex_lock(&exception_port_map_lock);
-
-  while((tcr = *prev) != NULL) {
-    if (TCR_TO_EXCEPTION_PORT(tcr) == port) {
-      *prev = (TCR *)tcr->pending_io_info;
-      break;
-    }
-    prev = (TCR **)&(tcr->pending_io_info);
-  }
-  pthread_mutex_unlock(&exception_port_map_lock);
 }
   
