4 #include "genesis/fdefn.h"
5 #include "genesis/closure.h"
6 #include "genesis/simple-fun.h"
7 #include "genesis/static-symbols.h"
43 * NESTED - declare nested routine entry point
45 #define NESTED(symbol, framesize, rpc) \
48 .type symbol,@function; \
50 symbol: .frame sp, framesize, rpc
53 * END - mark end of function
55 #define END(function) \
57 .size function,.-function
63 * Function to transfer control into lisp.
65 #define framesize 16*4
66 NESTED(call_into_lisp, framesize, ra)
68 /* Save all the C regs. */
71 sw s8, framesize-4(sp)
72 sw gp, framesize-8(sp)
73 sw s7, framesize-12(sp)
74 sw s6, framesize-16(sp)
75 sw s5, framesize-20(sp)
76 sw s4, framesize-24(sp)
77 sw s3, framesize-28(sp)
78 sw s2, framesize-32(sp)
79 sw s1, framesize-36(sp)
80 sw s0, framesize-40(sp)
82 /* Clear descriptor regs */
100 /* Start pseudo-atomic. */
106 /* No longer in foreign call. */
107 sw zero, foreign_function_call_active
109 /* Load the allocation pointer, preserving the low-bit of alloc */
110 lw reg_BSP, dynamic_space_free_pointer
111 add reg_ALLOC, reg_BSP
113 /* Load the rest of the LISP state. */
114 lw reg_BSP, current_binding_stack_pointer
115 lw reg_CSP, current_control_stack_pointer
116 lw reg_OCFP, current_control_frame_pointer
118 /* Check for interrupt */
131 lw reg_A0, 0(reg_CFP)
132 lw reg_A1, 4(reg_CFP)
133 lw reg_A2, 8(reg_CFP)
134 lw reg_A3, 12(reg_CFP)
135 lw reg_A4, 16(reg_CFP)
136 lw reg_A5, 20(reg_CFP)
139 la reg_LRA, lra + OTHER_POINTER_LOWTAG
141 /* Indirect closure */
142 lw reg_CODE, -1(reg_LEXENV)
144 /* Jump into lisp land. */
145 addu reg_LIP, reg_CODE, 6*4 - FUN_POINTER_LOWTAG
151 /* This particular KLUDGE is kept here as a reminder; for more
152 details, see irix-asm-munge.c from CMUCL's lisp directory.
153 Other examples have been deleted from later in the file in the
154 hope that they will not be needed. */
155 .globl mipsmungelra /* for our munging afterwards in irix-asm-munge */
159 .word RETURN_PC_HEADER_WIDETAG
161 /* Multiple value return spot, clear stack */
162 move reg_CSP, reg_OCFP
165 /* Set pseudo-atomic flag. */
170 /* Save LISP registers. */
171 subu reg_NL0, reg_ALLOC, 1
172 sw reg_NL0, dynamic_space_free_pointer
173 sw reg_BSP, current_binding_stack_pointer
174 sw reg_CSP, current_control_stack_pointer
175 sw reg_CFP, current_control_frame_pointer
177 /* Pass one return value back to C land. */
178 /* v0 is reg_ALLOC in this new world, so do this after saving
179 reg_ALLOC in dynamic_space_free_pointer */
182 /* Back in foreign function call */
183 sw reg_CFP, foreign_function_call_active
185 /* Check for interrupt */
196 lw s8, framesize-4(sp)
197 lw gp, framesize-8(sp)
198 lw s7, framesize-12(sp)
199 lw s6, framesize-16(sp)
200 lw s5, framesize-20(sp)
201 lw s4, framesize-24(sp)
202 lw s3, framesize-28(sp)
203 lw s2, framesize-32(sp)
204 lw s1, framesize-36(sp)
205 lw s0, framesize-40(sp)
207 /* Restore C stack. */
216 * Transfering control from Lisp into C
220 .type call_into_c,@function
223 /* Set up a stack frame. */
224 move reg_OCFP, reg_CFP
225 move reg_CFP, reg_CSP
226 addu reg_CSP, reg_CFP, 32
227 sw reg_OCFP, 0(reg_CFP)
228 subu reg_NL4, reg_LIP, reg_CODE
229 addu reg_NL4, OTHER_POINTER_LOWTAG
230 sw reg_NL4, 4(reg_CFP)
231 sw reg_CODE, 8(reg_CFP)
234 /* Note: the C stack is already set up. */
236 /* Set the pseudo-atomic flag. */
242 /* Save lisp state. */
243 subu t0, reg_ALLOC, 1
244 sw t0, dynamic_space_free_pointer
245 sw reg_BSP, current_binding_stack_pointer
246 sw reg_CSP, current_control_stack_pointer
247 sw reg_CFP, current_control_frame_pointer
249 /* Mark us as in C land. */
250 sw reg_CSP, foreign_function_call_active
252 /* Were we interrupted? */
261 /* Into C land we go. */
268 /* Clear unsaved descriptor regs */
283 /* Turn on pseudo-atomic. */
289 /* Mark us at in Lisp land. */
290 sw zero, foreign_function_call_active
292 /* Restore ALLOC, preserving pseudo-atomic-atomic */
293 lw a0, dynamic_space_free_pointer
296 /* Check for interrupt */
305 /* Restore LRA & CODE (they may have been GC'ed) */
306 lw reg_CODE, 8(reg_CFP)
308 subu a0, OTHER_POINTER_LOWTAG
309 addu reg_LIP, reg_CODE, a0
311 /* Reset the lisp stack. */
312 /* Note: OCFP and CFP are in saved regs. */
313 move reg_CSP, reg_CFP
314 move reg_CFP, reg_OCFP
316 /* Return to LISP. */
321 .globl start_of_tramps
325 * The undefined-function trampoline.
327 .globl undefined_tramp
332 .byte UNDEFINED_FUN_ERROR
334 .byte (0xc0 + sc_DescriptorReg)
340 * The closure trampoline.
345 lw reg_LEXENV, FDEFN_FUN_OFFSET(reg_FDEFN)
346 lw reg_L0, CLOSURE_FUN_OFFSET(reg_LEXENV)
347 addu reg_LIP, reg_L0, SIMPLE_FUN_CODE_OFFSET
356 * Function-end breakpoint magic.
361 .globl function_end_breakpoint_guts
362 fun_end_breakpoint_guts:
363 .word RETURN_PC_HEADER_WIDETAG
367 move reg_OCFP, reg_CSP
377 .globl fun_end_breakpoint_trap
378 fun_end_breakpoint_trap:
379 break trap_FunEndBreakpoint
383 .globl fun_end_breakpoint_end
384 fun_end_breakpoint_end: