Index: /branches/working-0711/ccl/lisp-kernel/ppc-constants.s
===================================================================
--- /branches/working-0711/ccl/lisp-kernel/ppc-constants.s	(revision 12986)
+++ /branches/working-0711/ccl/lisp-kernel/ppc-constants.s	(revision 12987)
@@ -189,6 +189,6 @@
 	 _node(initial_tcr)	        /* initial thread tcr */
 	 _node(image_name)	        /* --image-name argument */
-	 _node(BADfpscr_save_high)	        /* high word of FP reg used to save FPSCR */
-	 _node(BADfpscr_save)              /* saved FPSCR */
+	 _node(BADfpscr_save_high)      /* high word of FP reg used to save FPSCR */
+	 _node(unwind_resume)           /* _Unwind_Resume */
 	 _node(batch_flag)	        /* -b */
 	 _node(host_platform)	        /* for runtime platform-specific stuff */
@@ -201,5 +201,5 @@
 	 _node(double_float_one) 	/* high half of 1.0d0 */
 	 _node(short_float_zero) 	/* low half of 1.0d0 */
-	 _node(doh_head) 		/* creole objects header */
+	 _node(objc2_end_catch)         /* objc_end_catch() */
 	 _node(metering_info) 		/* address of lisp_metering global */
 	 _node(in_gc) 			/* non-zero when GC active */
@@ -207,7 +207,7 @@
 	 _node(lexpr_return) 		/* magic &lexpr return code. */
 	 _node(all_areas) 		/* doubly-linked list of all memory areas */
-	 _node(BAD_cs_overflow_limit) 	/* limit for control-stack overflow check */
-	 _node(kernel_name) 		/* real executable name */
-	 _node(BAD_current_vs) 		/* current value-stack area */
+	 _node(kernel_path) 		/* real executable name */
+	 _node(objc2_begin_catch) 	/* objc_begin_catch */
+	 _node(BAD_current_vs) 		/* current value-stack area   */
 	 _node(statically_linked)	/* non-zero if -static */
 	 _node(heap_end)                /* end of lisp heap */
@@ -230,5 +230,5 @@
 	 _node(saveR13)			/* probably don]t really need this */
 	 _node(saveTOC)                 /* where the 68K emulator stores the  emulated regs */
-	 _node(tcr_lock)		/* this thread]s exception frame chain */
+	 _node(objc_2_personality)      /* exception "personality routine" address for ObjC 2.0 */ 
 	 _node(kernel_imports) 		/* some things we need imported for us */
 	 _node(interrupt_signal)	/* signal used by PROCESS-INTERRUPT */
Index: /branches/working-0711/ccl/lisp-kernel/ppc-exceptions.c
===================================================================
--- /branches/working-0711/ccl/lisp-kernel/ppc-exceptions.c	(revision 12986)
+++ /branches/working-0711/ccl/lisp-kernel/ppc-exceptions.c	(revision 12987)
@@ -1852,9 +1852,4 @@
   xframe_list xframe_link;
 
-#ifdef DARWIN
-  if (running_under_rosetta) {
-    fprintf(dbgout, "signal handler: signal = %d, pc = 0x%08x\n", signum, xpPC(context));
-  }
-#endif
   if (!use_mach_exception_handling) {
     
Index: /branches/working-0711/ccl/lisp-kernel/ppc-spentry.s
===================================================================
--- /branches/working-0711/ccl/lisp-kernel/ppc-spentry.s	(revision 12986)
+++ /branches/working-0711/ccl/lisp-kernel/ppc-spentry.s	(revision 12987)
@@ -1,3 +1,3 @@
-/* Copyright (C) 1994-2001 Digitool, Inc */
+ /* Copyright (C) 1994-2001 Digitool, Inc */
 /* This file is part of OpenMCL.   */
 
@@ -1577,6 +1577,101 @@
         __(mtxer rzero)
         __(mtctr rzero)
-	__(blr)
-
+        __ifdef([PPC64])
+         __ifdef([DARWIN])
+          __(li imm3,1<<TCR_FLAG_BIT_FOREIGN_EXCEPTION)
+          __(ld imm4,tcr.flags(rcontext))
+          __(and. imm3,imm3,imm4)
+          __(bne cr0,0f)
+         __endif
+        __endif
+	__(blr)
+        __ifdef([PPC64])
+         __ifdef([DARWIN])
+0:        /* Got here because TCR_FLAG_BIT_FOREIGN_EXCEPTION */
+          /* was set in tcr.flags.  Clear that bit. */
+          __(andc imm4,imm4,imm3)
+          __(std imm4,tcr.flags(rcontext))
+ 	  /* Unboxed foreign exception (likely an NSException) in %imm0. */
+	  /* Box it, then signal a lisp error. */
+          __(li imm1,macptr_header)
+          __(Misc_Alloc_Fixed(arg_z,imm1,macptr.size))
+          __(std imm0,macptr.address(arg_z))
+          __(li arg_y,XFOREIGNEXCEPTION)
+          __(set_nargs(2))
+          __(b _SPksignalerr)
+        /* Handle exceptions, for ObjC 2.0 */
+LocalLabelPrefix[]ffcallLandingPad:      
+          __(mr save1,r3)
+          __(cmpdi r4,1)
+          __(beq 1f)
+LocalLabelPrefix[]ffcallUnwindResume:
+          __(ref_global(r12,unwind_resume))
+          __(mtctr r12)
+          __(bctrl)
+LocalLabelPrefix[]ffcallUnwindResume_end:         
+1:        __(mr r3,save1)
+LocalLabelPrefix[]ffcallBeginCatch:
+          __(ref_global(r12,objc2_begin_catch))
+          __(mtctr r12)
+          __(bctrl)
+LocalLabelPrefix[]ffcallBeginCatch_end:          
+          __(ld save1,0(r3)) /* indirection is necessary because we don't provide type info in lsda */
+LocalLabelPrefix[]ffcallEndCatch:  
+          __(ref_global(r12,objc2_end_catch))
+          __(mtctr r12)
+          __(bctrl)              
+LocalLabelPrefix[]ffcallEndCatch_end:     
+          __(ref_global(r12,get_tcr))
+          __(mtctr r12)
+          __(li imm0,1)       
+	  __(bctrl)
+          __(ld imm2,tcr.flags(imm0))
+          __(ori imm2,imm2,1<<TCR_FLAG_BIT_FOREIGN_EXCEPTION)
+          __(std imm2,tcr.flags(imm0))
+          __(mr imm0,save1)
+	  __(b LocalLabelPrefix[]ffcall_call_end)
+LocalLabelPrefix[]ffcall_end:   
+
+        	.section __DATA,__gcc_except_tab
+	  .align 3
+LLSDA1:
+	  .byte	0xff	/* @LPStart format (omit) */
+	  .byte	0x0	/* @TType format (absolute) */
+	  .byte	0x4d	/* uleb128 0x4d; @TType base offset */
+	  .byte	0x3	/* call-site format (udata4) */
+	  .byte	0x41	/* uleb128 0x41; Call-site table length */
+	
+	  .long Lffcall_setup-Lffcall	/* region 0 start */
+	  .long Lffcall_setup_end-Lffcall_setup	/* length */
+	  .long	0x0	/* landing pad */
+	  .byte	0x0	/* uleb128 0x0; action */
+        
+	  .long Lffcall_call-Lffcall	/* region 1 start */
+	  .long Lffcall_call_end-Lffcall_call	/* length */
+	  .long LffcallLandingPad-Lffcall	/* landing pad */
+	  .byte	0x1	/* uleb128 0x1; action */
+        
+	  .long LffcallUnwindResume-Lffcall	/* region 2 start */
+	  .long LffcallUnwindResume_end-LffcallUnwindResume	/* length */
+	  .long	0x0	/* landing pad */
+	  .byte	0x0	/* uleb128 0x0; action */
+	
+	  .long LffcallBeginCatch-Lffcall	/* region 3 start */
+	  .long LffcallBeginCatch_end-LffcallBeginCatch	/* length */
+	  .long 0	/* landing pad */
+	  .byte	0x0	/* uleb128 0x0; action */
+        
+	  .long LffcallEndCatch-Lffcall
+	  .long LffcallEndCatch_end-LffcallEndCatch	/* length */
+	  .long	0x0	/* landing pad */
+	  .byte	0x0	/* uleb128 0x0; action */
+        
+	  .byte	0x1	/* Action record table */
+	  .byte	0x0
+	  .align 3
+	  .quad	0       /* _OBJC_EHTYPE_$_NSException */
+          .text
+         __endif
+        __endif
 
 /* Just like poweropen_ffcall, only we save all argument(result)
@@ -1585,4 +1680,5 @@
    r9 and r10 - at least - are overloaded as dedicated lisp registers */
 _spentry(poweropen_ffcall_return_registers)
+LocalLabelPrefix[]ffcall_return_registers:                
 	__(mflr loc_pc)
 	__(vpush_saveregs())		/* Now we can use save0-save7 to point to stacks  */
@@ -1621,4 +1717,5 @@
 	 __(li rcontext,0)
         __endif
+LocalLabelPrefix[]ffcall_return_registers_setup: 
 	__(mtctr nargs)
 	__(ldr(r3,c_frame.param0(sp)))
@@ -1633,5 +1730,8 @@
 	/* to the function on entry.  */
 	__(mr r12,nargs)
+LocalLabelPrefix[]ffcall_return_registers_setup_end: 
+LocalLabelPrefix[]ffcall_return_registers_call:
 	__(bctrl)
+LocalLabelPrefix[]ffcall_return_registers_call_end:
         __(str(r3,0*node_size(save7)))        
         __(str(r4,1*node_size(save7)))        
@@ -1700,6 +1800,101 @@
         __(mtxer rzero)
         __(mtctr rzero)
-	__(blr)
-
+        __ifdef([DARWIN])
+         __ifdef([PPC64])
+          __(li imm3,1<<TCR_FLAG_BIT_FOREIGN_EXCEPTION)
+          __(ld imm4,tcr.flags(rcontext))
+          __(and. imm3,imm3,imm4)
+          __(bne 0f)
+         __endif
+        __endif
+	__(blr)
+
+        __ifdef([DARWIN])
+         __ifdef([PPC64])
+0:        /* Got here because TCR_FLAG_BIT_FOREIGN_EXCEPTION */
+          /* was set in tcr.flags.  Clear that bit. */
+          __(andc imm4,imm4,imm3)
+          __(std imm4,tcr.flags(rcontext))
+ 	  /* Unboxed foreign exception (likely an NSException) in %imm0. */
+	  /* Box it, then signal a lisp error. */
+          __(li imm1,macptr_header)
+          __(Misc_Alloc_Fixed(arg_z,imm1,macptr.size))
+          __(std imm0,macptr.address(arg_z))
+          __(li arg_y,XFOREIGNEXCEPTION)
+          __(set_nargs(2))
+          __(b _SPksignalerr)
+        /* Handle exceptions, for ObjC 2.0 */
+LocalLabelPrefix[]ffcall_return_registersLandingPad:      
+          __(mr save1,r3)
+          __(cmpdi r4,1)
+          __(beq 1f)
+LocalLabelPrefix[]ffcall_return_registersUnwindResume:
+          __(ref_global(r12,unwind_resume))
+          __(mtctr r12)
+          __(bctrl)
+LocalLabelPrefix[]ffcall_return_registersUnwindResume_end:         
+1:        __(mr r3,save1)
+LocalLabelPrefix[]ffcall_return_registersBeginCatch:
+          __(ref_global(r12,objc2_begin_catch))
+          __(mtctr r12)
+          __(bctrl)
+LocalLabelPrefix[]ffcall_return_registersBeginCatch_end:          
+          __(ld save1,0(r3)) /* indirection is necessary because we don't provide type info in lsda */
+LocalLabelPrefix[]ffcall_return_registersEndCatch:  
+          __(ref_global(r12,objc2_end_catch))
+          __(mtctr r12)
+          __(bctrl)              
+LocalLabelPrefix[]ffcall_return_registersEndCatch_end:     
+          __(ref_global(r12,get_tcr))
+          __(mtctr r12)
+          __(li imm0,1)       
+	  __(bctrl)
+          __(ld imm2,tcr.flags(imm0))
+          __(ori imm2,imm2,1<<TCR_FLAG_BIT_FOREIGN_EXCEPTION)
+          __(std imm2,tcr.flags(imm0))
+          __(mr imm0,save1)
+	  __(b LocalLabelPrefix[]ffcall_return_registers_call_end)
+LocalLabelPrefix[]ffcall_return_registers_end:
+	  .section __DATA,__gcc_except_tab
+	  .align 3
+LLSDA2:
+	  .byte	0xff	/* @LPStart format (omit) */
+  	  .byte	0x0	/* @TType format (absolute) */
+	  .byte	0x4d	/* uleb128 0x4d; @TType base offset */
+	  .byte	0x3	/* call-site format (udata4) */
+	  .byte	0x41	/* uleb128 0x41; Call-site table length */
+	
+	  .long Lffcall_return_registers_setup-Lffcall_return_registers	/* region 0 start */
+	  .long Lffcall_return_registers_setup_end-Lffcall_return_registers_setup	/* length */
+	  .long	0x0	/* landing pad */
+	  .byte	0x0	/* uleb128 0x0; action */
+        
+	  .long Lffcall_return_registers_call-Lffcall_return_registers	/* region 1 start */
+	  .long Lffcall_return_registers_call_end-Lffcall_return_registers_call	/* length */
+	  .long Lffcall_return_registersLandingPad-Lffcall_return_registers	/* landing pad */
+	  .byte	0x1	/* uleb128 0x1; action */
+        
+	  .long Lffcall_return_registersUnwindResume-Lffcall_return_registers	/* region 2 start */
+	  .long Lffcall_return_registersUnwindResume_end-Lffcall_return_registersUnwindResume	/* length */
+	  .long	0x0	/* landing pad */
+	  .byte	0x0	/* uleb128 0x0; action */
+	
+	  .long Lffcall_return_registersBeginCatch-Lffcall_return_registers	/* region 3 start */
+	  .long Lffcall_return_registersBeginCatch_end-Lffcall_return_registersBeginCatch	/* length */
+	  .long 0	/* landing pad */
+	  .byte	0x0	/* uleb128 0x0; action */
+        
+	  .long Lffcall_return_registersEndCatch-Lffcall_return_registers
+	  .long Lffcall_return_registersEndCatch_end-Lffcall_return_registersEndCatch	/* length */
+	  .long	0x0	/* landing pad */
+	  .byte	0x0	/* uleb128 0x0; action */
+	  .byte	0x1	/* Action record table */
+	  .byte	0x0
+	  .align 3
+	  .quad	0       /* _OBJC_EHTYPE_$_NSException */
+          .text
+         __endif
+        __endif
+                      
 
         	
@@ -6777,6 +6972,88 @@
         __(b _SPbind_interrupt_level)
 
+        .if 1
+        __ifdef([DARWIN])
+         __ifdef([PPC64])
+L_lisp_objc2_personality:       
+        __(ref_global(r12,objc_2_personality))
+        __(mtctr r12)
+        __(bctr)
+        .data
+        .globl _lisp_objc2_personality
+_lisp_objc2_personality: 
+        .quad L_lisp_objc2_personality
 	
-
+	.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
+EH_frame1:
+	.set L$set$12,LECIE1-LSCIE1
+	.long L$set$12	/* Length of Common Information Entry */
+LSCIE1:
+	.long	0x0	/* CIE Identifier Tag */
+	.byte	0x1	/* CIE Version */
+	.ascii "zPLR\0"	/* CIE Augmentation */
+	.byte	0x1	/* uleb128 0x1; CIE Code Alignment Factor */
+	.byte	0x78	/* sleb128 -8; CIE Data Alignment Factor */
+	.byte	0x41	/* CIE RA Column */
+	.byte	0x7
+	.byte	0x9b
+	.long   _lisp_objc2_personality-.
+	.byte	0x10	/* LSDA Encoding (pcrel) */
+	.byte	0x10	/* FDE Encoding (pcrel) */
+	.byte	0xc
+	.byte	0x1
+	.byte	0x0
+	.align 3
+LECIE1:
+        .globl _SPffcall.eh
+_SPffcall.eh:
+        .set assembler_nonsense,LEFDEffcall-LSFDEffcall
+        .long assembler_nonsense
+LSFDEffcall:      
+        .long LSFDEffcall-EH_frame1 /* FDE CIE offset */
+        .quad Lffcall-. /* FDE Initial Location */
+        .quad Lffcall_end-Lffcall /* FDE address range */
+        .byte 8 /* uleb128 0x8; Augmentation size */
+        .quad LLSDA1-.           /* Language Specific Data Area */
+	.byte DW_CFA_def_cfa_offset 
+	.byte 0xc0,0x1 /* uleb128 0xc0.  A lie:  the frame is variable-length */
+	.byte DW_CFA_offset_extended_sf
+	.byte	0x41	
+	.byte	0x7e	/* sleb128 -2 */
+	.byte DW_CFA_advance_loc4
+	.long Lffcall_setup-Lffcall
+	.byte DW_CFA_advance_loc4
+	.long Lffcall_setup_end-Lffcall_setup
+	.byte DW_CFA_advance_loc4
+	.long Lffcall_call_end-Lffcall_call
+	.align 3
+LEFDEffcall:
+	
+        .globl _SPffcall_return_registers.eh
+_SPffcall_return_registers.eh:
+        .set Lfmh,LEFDEffcall_return_registers-LSFDEffcall_return_registers
+        .long Lfmh
+LSFDEffcall_return_registers:      
+        .long LSFDEffcall_return_registers-EH_frame1 /* FDE CIE offset */
+        .quad Lffcall_return_registers-. /* FDE Initial Location */
+        .quad Lffcall_return_registers_end-Lffcall_return_registers /* FDE address range */
+        .byte 8 /* uleb128 0x8; Augmentation size */
+        .quad LLSDA2-.           /* Language Specific Data Area */
+	.byte DW_CFA_def_cfa_offset 
+	.byte 0xc0,0x1 /* uleb128 0xc0.  A lie:  the frame is variable-length */
+	.byte DW_CFA_offset_extended_sf
+	.byte 0x41	
+	.byte 0x7e	/* sleb128 -2 */
+	.byte DW_CFA_advance_loc4
+	.long Lffcall_return_registers_setup-Lffcall_return_registers
+	.byte DW_CFA_advance_loc4
+	.long Lffcall_return_registers_setup_end-Lffcall_return_registers_setup
+	.byte DW_CFA_advance_loc4
+	.long Lffcall_return_registers_call_end-Lffcall_return_registers_call
+	.align 3
+LEFDEffcall_return_registers:
+        .text
+         __endif
+        __endif
+        .endif
 
                                 
Index: /branches/working-0711/ccl/lisp-kernel/windows-calls.c
===================================================================
--- /branches/working-0711/ccl/lisp-kernel/windows-calls.c	(revision 12986)
+++ /branches/working-0711/ccl/lisp-kernel/windows-calls.c	(revision 12987)
@@ -294,5 +294,5 @@
 
 ssize_t
-lisp_read(HANDLE hfile, void *buf, unsigned int count)
+lisp_standard_read(HANDLE hfile, void *buf, unsigned int count)
 {
   HANDLE hevent;
@@ -338,4 +338,7 @@
   /* We block here */    
   wait_result = WaitForSingleObjectEx(hevent, INFINITE, true);
+
+
+
   tcr->pending_io_info = NULL;
   if (wait_result == WAIT_OBJECT_0) {
@@ -367,4 +370,91 @@
   }
 }
+
+ssize_t
+pipe_read(HANDLE hfile, void *buf, unsigned int count)
+{
+  DWORD navail, err;;
+
+  do {
+    navail = 0;
+    if (PeekNamedPipe(hfile, NULL, 0, NULL, &navail, NULL) == 0) {
+      err = GetLastError();
+      if (err = ERROR_HANDLE_EOF) {
+        return 0;
+      } else {
+        _dosmaperr(err);
+        return -1;
+      }
+    }
+    if (navail != 0) {
+      return lisp_standard_read(hfile, buf, count);
+    }
+    if (SleepEx(50, TRUE) == WAIT_IO_COMPLETION) {
+      errno = EINTR;
+      return -1;
+    }
+  } while (1);
+}
+
+ssize_t
+console_read(HANDLE hfile, void *buf, unsigned int count)
+{
+  DWORD err, eventcount, i, n;
+  INPUT_RECORD ir;
+
+  do {
+    err = WaitForSingleObjectEx(hfile, INFINITE, TRUE);
+    switch (err) {
+    case WAIT_OBJECT_0:
+      eventcount = 0;
+      GetNumberOfConsoleInputEvents(hfile, &eventcount);
+      for (i = 0; i < eventcount; i++) {
+        PeekConsoleInput(hfile, &ir, 1, &n);
+        if (ir.EventType == KEY_EVENT) {
+          return lisp_standard_read(hfile, buf, count);
+        } else {
+          ReadConsoleInput(hfile, &ir, 1, &n);
+        }
+      }
+      break;
+    case WAIT_IO_COMPLETION:
+      errno = EINTR;
+      return -1;
+      break;
+    case WAIT_FAILED:
+      _dosmaperr(GetLastError());
+      return -1;
+      break;
+    }
+  } while (1);
+}
+
+ssize_t
+lisp_read(HANDLE hfile, void *buf, unsigned int count) {
+  switch(GetFileType(hfile)) {
+  case FILE_TYPE_CHAR:
+    return console_read(hfile, buf, count);
+    break;
+
+  case FILE_TYPE_PIPE:          /* pipe or one of these newfangled socket things */
+    {
+      int socktype, optlen = sizeof(int);
+      if ((getsockopt((SOCKET)hfile, SOL_SOCKET, SO_TYPE, (char *)&socktype, &optlen) != 0) && (GetLastError() == WSAENOTSOCK)) {
+        return pipe_read(hfile, buf, count);
+      }
+    }
+    /* It's a socket, fall through */
+    
+  case FILE_TYPE_DISK:
+    return lisp_standard_read(hfile, buf, count);
+    break;
+
+  default:
+    errno = EBADF;
+    return -1;
+  }
+}
+
+
 
 ssize_t
@@ -618,7 +708,7 @@
   GetSystemTimeAsFileTime((FILETIME*)&now);
   now -= UNIX_EPOCH_IN_WINDOWS_EPOCH;
-  now /= 10000;
+  now /= 10000;               /* convert time to milliseconds */
   tp->tv_sec = now/1000LL;
-  tp->tv_usec = now%1000LL;
+  tp->tv_usec = 1000 * (now%1000LL); /* convert milliseconds to microseconds */
   return 0;
 }
