0.7.6.7:
authorChristophe Rhodes <csr21@cam.ac.uk>
Thu, 25 Jul 2002 17:41:31 +0000 (17:41 +0000)
committerChristophe Rhodes <csr21@cam.ac.uk>
Thu, 25 Jul 2002 17:41:31 +0000 (17:41 +0000)
Fix up the SPARC fixups, *sigh*
... not only did my previous fix not run, it didn't compile, as
SIMPLE_FUN_CODE_OFFSET isn't defined in C, only in assembler.
... rewrite code address determination in two stages, and save
the fun object itself to go into reg_CODE on the SPARC
... [ keen observers will note that this is all terribly confusing. ]

src/runtime/interrupt.c
version.lisp-expr

index c5e70aa..08771dc 100644 (file)
@@ -524,28 +524,28 @@ boolean handle_control_stack_guard_triggered(os_context_t *context,void *addr)
      * it won't go back to what it was doing ... */
     if(addr>=CONTROL_STACK_GUARD_PAGE && 
        addr<(CONTROL_STACK_GUARD_PAGE+os_vm_page_size)) {
-       void *function;
+       void *fun;
+       void *code;
+       
        /* we hit the end of the control stack.  disable protection
         * temporarily so the error handler has some headroom */
        protect_control_stack_guard_page(0);
        
-       function=
-           &(((struct simple_fun *)
-              native_pointer(SymbolFunction(CONTROL_STACK_EXHAUSTED_ERROR)))
-             ->code);
+       fun = native_pointer(SymbolFunction(CONTROL_STACK_EXHAUSTED_ERROR));
+       code = &(((struct simple_fun *) fun)->code);
 
        /* Build a stack frame showing `interrupted' so that the
         * user's backtrace makes (as much) sense (as usual) */
        build_fake_control_stack_frames(context);
        /* signal handler will "return" to this error-causing function */
-       *os_context_pc_addr(context) = function;
+       *os_context_pc_addr(context) = code;
 #ifdef LISP_FEATURE_X86
-       /* this much of the calling convention is common to all
-          non-x86 ports */
        *os_context_register_addr(context,reg_ECX) = 0; 
 #else
+       /* this much of the calling convention is common to all
+          non-x86 ports */
        *os_context_register_addr(context,reg_NARGS) = 0; 
-       *os_context_register_addr(context,reg_LIP) = function;
+       *os_context_register_addr(context,reg_LIP) = code;
        *os_context_register_addr(context,reg_CFP) = 
            current_control_frame_pointer;
 #endif
@@ -562,9 +562,9 @@ boolean handle_control_stack_guard_triggered(os_context_t *context,void *addr)
           (INST MOVE CODE-TN FUNCTION) 
 
           in compiler/sparc/call.lisp is changed, then this bit can
-          probably go away. -- CSR, 2002-07-24 */
+          probably go away.  -- CSR, 2002-07-24 */
        *os_context_register_addr(context,reg_CODE) = 
-           function - SIMPLE_FUN_CODE_OFFSET;
+           fun + FUN_POINTER_LOWTAG;
 #endif
        return 1;
     }
index 66065ee..a650219 100644 (file)
@@ -18,4 +18,4 @@
 ;;; for internal versions, especially for internal versions off the
 ;;; main CVS branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
 
-"0.7.6.6"
+"0.7.6.7"