Annotation of 41BSD/lib/libjobs/signal.s, revision 1.1.1.1

1.1       root        1: # C library -- sigsys
                      2: 
                      3: # sigsys(n, SIG_DFL);          /* default action on signal(n) */
                      4: # sigsys(n, SIG_HOLD);         /* block signal temporarily */
                      5: # sigsys(n, SIG_IGN);          /* ignore signal(n) */
                      6: # sigsys(n, label);            /* goto label on signal(n) */
                      7: # sigsys(n, DEFERSIG(label));  /* goto label with signal SIG_HOLD */
                      8: 
                      9: # returns old label, only one level.
                     10: 
                     11:        .set    SIGDORTI,0x200
                     12: 
                     13:        .set    signal,48
                     14: .globl _sigsys
                     15: .globl  cerror
                     16: 
                     17:        .align  1
                     18: _sigsys:
                     19:        .word   0x0000
                     20:        chmk    $signal
                     21:        bcc     noerror
                     22:        jmp     cerror
                     23: noerror:
                     24:        ret
                     25: 
                     26: #
                     27: # sigpeel(n, newact)
                     28: #
                     29: # when called from routine which was called by system, peels
                     30: # back frames to the last one, then calls the system to reenable
                     31: # the signal with newact, arranging to clean the stack before the
                     32: # signal can happen again
                     33: #
                     34: .globl _sigpeel
                     35:        .align  1
                     36: _sigpeel:
                     37:        .word   0x0000
                     38:        .set    RETOFF,16       # offset of return address in frame
                     39: # get signal number value to set
                     40:        movl    4(ap),r0
                     41:        movl    8(ap),r1
                     42:        movab   unw1,RETOFF(fp)
                     43:        ret                     # peel off our frame
                     44: # top frame is now frame of routine signal action called
                     45: unw1:
                     46:        movab   unw2,RETOFF(fp)
                     47:        ret
                     48: # now frame from callg of ``locore.s/sigcode()'' is gone
                     49: # if no value to set, can just ret now to go back to old code
                     50: # with an ret->rei, else must make the frame passed to us into a
                     51: # signal call frame by putting the new signal code in the
                     52: # second word, and call the kernel which will pop off the frame.
                     53: unw2:
                     54:        tstl    r1
                     55:        bneq    unw3
                     56:        ret                     # easy
                     57: # mark dorti wanted, and reenable signal
                     58: unw3:
                     59:        bisl3   $SIGDORTI,r0,4(ap)
                     60: ###    movl    r0,4(ap)        ### for testing on old system
                     61:        movl    r1,8(ap)
                     62:        chmk    $signal
                     63:        halt                    # can't happen
                     64: 
                     65: ### for testing on old system
                     66: ###    ret                     # and then rei, natch

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.