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. ]
* 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)) {
* 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 *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);
/* 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 */
/* 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;
- /* this much of the calling convention is common to all
- non-x86 ports */
*os_context_register_addr(context,reg_ECX) = 0;
#else
*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_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
*os_context_register_addr(context,reg_CFP) =
current_control_frame_pointer;
#endif
(INST MOVE CODE-TN FUNCTION)
in compiler/sparc/call.lisp is changed, then this bit can
(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) =
*os_context_register_addr(context,reg_CODE) =
- function - SIMPLE_FUN_CODE_OFFSET;
+ fun + FUN_POINTER_LOWTAG;
;;; for internal versions, especially for internal versions off the
;;; main CVS branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
;;; for internal versions, especially for internal versions off the
;;; main CVS branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)