V10/lbin/libjobs/signal.s
# C library -- sigsys
# sigsys(n, SIG_DFL); /* default action on signal(n) */
# sigsys(n, SIG_HOLD); /* block signal temporarily */
# sigsys(n, SIG_IGN); /* ignore signal(n) */
# sigsys(n, label); /* goto label on signal(n) */
# sigsys(n, DEFERSIG(label)); /* goto label with signal SIG_HOLD */
# returns old label, only one level.
.set SIGDORTI,0x200
.set signal,48
.globl _sigsys
.globl cerror
.align 1
_sigsys:
.word 0x0000
chmk $signal
bcc noerror
jmp cerror
noerror:
ret
#
# sigpeel(n, newact)
#
# when called from routine which was called by system, peels
# back frames to the last one, then calls the system to reenable
# the signal with newact, arranging to clean the stack before the
# signal can happen again
#
.globl _sigpeel
.align 1
_sigpeel:
.word 0x0000
.set RETOFF,16 # offset of return address in frame
# get signal number value to set
movl 4(ap),r0
movl 8(ap),r1
movab unw1,RETOFF(fp)
ret # peel off our frame
# top frame is now frame of routine signal action called
unw1:
movab unw2,RETOFF(fp)
ret
# now frame from callg of ``locore.s/sigcode()'' is gone
# if no value to set, can just ret now to go back to old code
# with an ret->rei, else must make the frame passed to us into a
# signal call frame by putting the new signal code in the
# second word, and call the kernel which will pop off the frame.
unw2:
tstl r1
bneq unw3
ret # easy
# mark dorti wanted, and reenable signal
unw3:
### bisl3 $SIGDORTI,r0,4(ap) ### SIGDORTI no longer in system
movl r0,4(ap) ### for testing on old system
movl r1,8(ap)
chmk $signal
### halt # can't happen
### for testing on old system
ret # and then rei, natch