ack/lang/cem/libcc/gen/setjmp.e

81 lines
1.3 KiB
Text
Raw Normal View History

1987-01-27 15:57:55 +00:00
#
mes 2,EM_WSIZE,EM_PSIZE
;
; layout of a setjmp buffer:
;
; -----------------
; | signal mask | (only for Berkeley 4.2)
; -----------------
; | |
; | GTO descriptor |
; | (SP, LB, PC) |
; | |
; -----------------
;
; setjmp saves the signalmask, PC, SP, and LB of caller, and creates a
1988-04-20 16:58:29 +00:00
; GTO descriptor from this.
; The big problem here is how to get the return address, i.e. the PC of
; the caller; This problem is solved by the front-end, which must pass
; it as an extra parameter to setjmp.
1987-01-27 15:57:55 +00:00
gtobuf
bss 3*EM_PSIZE,0,0
1987-01-27 15:57:55 +00:00
inp $fill_ret_area
exp $setjmp
pro $setjmp,0
mes 11
#ifdef __BSD4_2
loc 0
cal $sigblock
asp EM_WSIZE
lfr EM_WSIZE
1987-01-27 15:57:55 +00:00
lal 0
loi EM_PSIZE
1988-04-20 16:58:29 +00:00
stf 3*EM_PSIZE
#endif
; create GTO descriptor for longjmp
lxl 0
dch ; Local Base of caller
lxa 0 ; Stackpointer of caller
lal EM_PSIZE
1987-01-27 15:57:55 +00:00
loi EM_PSIZE
lal 0
loi EM_PSIZE
1988-04-20 16:58:29 +00:00
sti 3*EM_PSIZE ; stored in jmpbuf
1987-01-27 15:57:55 +00:00
loc 0
ret EM_WSIZE
end 0
pro $fill_ret_area,0
1988-04-20 16:58:29 +00:00
lol 0
ret EM_WSIZE
end 0
exp $longjmp
pro $longjmp,?
1987-01-27 15:57:55 +00:00
lal 0
loi EM_PSIZE
#ifdef __BSD4_2
dup EM_PSIZE
1988-04-20 16:58:29 +00:00
lof 3*EM_PSIZE
cal $sigsetmask
asp EM_WSIZE
lfr EM_WSIZE
asp EM_WSIZE
#endif
1988-04-20 16:58:29 +00:00
lae gtobuf
blm 3*EM_PSIZE
lol EM_PSIZE
1987-01-27 15:57:55 +00:00
dup EM_WSIZE
zne *3
; of course, longjmp may not return 0!
asp EM_WSIZE
loc 1
3
1988-04-20 16:58:29 +00:00
cal $fill_ret_area
asp EM_WSIZE
gto gtobuf ; there we go ...
end 0