X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fmips-assem.S;h=4eabf21855c52070c0672befffe125efb7c67288;hb=d94c1b4a8c534bde146823f56558faf37cd4c4d7;hp=b44b4bc10d48e4682d16af151761e9d49ec11c15;hpb=39e19255f69cbba8668b4b7ffa58532ab6309375;p=sbcl.git diff --git a/src/runtime/mips-assem.S b/src/runtime/mips-assem.S index b44b4bc..4eabf21 100644 --- a/src/runtime/mips-assem.S +++ b/src/runtime/mips-assem.S @@ -192,14 +192,14 @@ lra: .word RETURN_PC_HEADER_WIDETAG /* Nested lisp -> C calls may have clobbered gp. */ lw gp, framesize-16(sp) + /* Mark us as in C land. */ + sw reg_CSP, foreign_function_call_active + /* Set the pseudo-atomic flag. */ li reg_NL4, 0 addu reg_ALLOC, 1 .set reorder - /* Mark us as in C land. */ - sw reg_CSP, foreign_function_call_active - /* Save LISP state. */ subu reg_NL0, reg_ALLOC, 1 sw reg_NL0, dynamic_space_free_pointer @@ -262,15 +262,15 @@ lra: .word RETURN_PC_HEADER_WIDETAG move reg_CFP, reg_CSP addu reg_CSP, reg_CFP, 32 + /* Mark us as in C land. */ + sw reg_CSP, foreign_function_call_active + /* Set the pseudo-atomic flag. */ .set noreorder li reg_NL4, 0 addu reg_ALLOC, 1 .set reorder - /* Mark us as in C land. */ - sw reg_CSP, foreign_function_call_active - /* Convert the return address to an offset and save it on the stack. */ subu reg_NFP, reg_LIP, reg_CODE addu reg_NFP, OTHER_POINTER_LOWTAG @@ -447,10 +447,16 @@ funcallable_instance_tramp = . + 1 * copied and has to be relocatable. It also needs a properly aligned * header tag after the fun_end_breakpoint_guts symbol. */ + +/* + * For an explanation of the magic involved in function-end + * breakpoints, see the implementation in ppc-assem.S. + */ + .align 3 /* minimum alignment for a lisp object */ LEAF(fun_end_breakpoint_guts) .set noreorder - .word RETURN_PC_HEADER_WIDETAG + .word RETURN_PC_HEADER_WIDETAG + 0x800 b multiple_value_return nop .set reorder @@ -469,7 +475,16 @@ funcallable_instance_tramp = . + 1 multiple_value_return: FEXPORT(fun_end_breakpoint_trap) - break 0x0, trap_FunEndBreakpoint + .set noreorder b multiple_value_return + break 0x0, trap_FunEndBreakpoint + .set reorder EXPORT(fun_end_breakpoint_end) END(fun_end_breakpoint_guts) + + + .align 3 /* minimum alignment for a lisp object */ + LEAF(do_pending_interrupt) + break 0x0, trap_PendingInterrupt + jr reg_LIP + END(do_pending_interrupt)