Annotation of researchv10no/sys/ml/swtch.s, revision 1.1.1.1

1.1       root        1: /*
                      2:  * The following primitives use the fancy VAX instructions
                      3:  * much like VMS does.  _whichqs tells which of the 32 queues _qs
                      4:  * have processes in them.  Setrq puts processes into queues, Remrq
                      5:  * removes them from queues.  The running process is on no queue,
                      6:  * other processes are on a queue related to p->p_pri, divided by 4
                      7:  * actually to shrink the 0-127 range of priorities into the 32 available
                      8:  * queues.
                      9:  */
                     10:        .comm   _noproc,4
                     11:        .comm   _runrun,4
                     12:        .text
                     13: 
                     14: /*
                     15:  * Setrq(p), using fancy VAX instructions.
                     16:  *
                     17:  * Call should be made at spl6(), and p->p_stat should be SRUN
                     18:  */
                     19:        .globl  _Setrq          # <<<massaged to jsb by "asm.sed">>>
                     20: _Setrq:
                     21:        tstl    P_RLINK(r0)             ## firewall: p->p_rlink must be 0
                     22:        beql    set1                    ##
                     23:        pushab  set3                    ##
                     24:        calls   $1,_panic               ##
                     25: set1:
                     26:        bitl    $SPROCIO,P_FLAG(r0)     # if he's getting PROCIO'd,
                     27:        bneq    set2                    # we leave him alone
                     28:        movzbl  P_PRI(r0),r1            # put on queue which is p->p_pri / 4
                     29:        ashl    $-2,r1,r1
                     30:        movaq   _qs[r1],r2
                     31:        insque  (r0),*4(r2)             # at end of queue
                     32:        bbss    r1,_whichqs,set2        # mark queue non-empty
                     33: set2:
                     34:        rsb
                     35: 
                     36: set3:  .asciz  "setrq"
                     37: 
                     38: /*
                     39:  * Remrq(p), using fancy VAX instructions
                     40:  *
                     41:  * Call should be made at spl6().
                     42:  */
                     43:        .globl  _Remrq          # <<<massaged to jsb by "asm.sed">>>
                     44: _Remrq:
                     45:        bitl    $SPROCIO,P_FLAG(r0)     # if he's getting PROCIO'd,
                     46:        bneq    rem2a                   # we leave him alone
                     47:        movzbl  P_PRI(r0),r1
                     48:        ashl    $-2,r1,r1
                     49:        bbsc    r1,_whichqs,rem1
                     50:        pushab  rem3                    # it wasn't recorded to be on its q
                     51:        calls   $1,_panic
                     52: rem1:
                     53:        remque  (r0),r2
                     54:        beql    rem2
                     55:        bbss    r1,_whichqs,rem2
                     56: rem2:
                     57:        clrl    P_RLINK(r0)             ## for firewall checking
                     58: rem2a:
                     59:        rsb
                     60: 
                     61: rem3:  .asciz  "remrq"
                     62: 
                     63: /*
                     64:  * Masterpaddr is the p->p_addr of the running process on the master
                     65:  * processor.  When a multiprocessor system, the slave processors will have
                     66:  * an array of slavepaddr's.
                     67:  */
                     68:        .globl  _masterpaddr
                     69:        .data
                     70: _masterpaddr:
                     71:        .long   0
                     72: 
                     73:        .text
                     74: sw0:   .asciz  "swtch"
                     75: /*
                     76:  * Swtch(), using fancy VAX instructions
                     77:  */
                     78:        .globl  _Swtch
                     79: _Swtch:                                # <<<massaged to jsb by "asm.sed">>>
                     80:        movl    $1,_noproc
                     81:        clrl    _runrun
                     82: sw1:   ffs     $0,$32,_whichqs,r0      # look for non-empty queue
                     83:        bneq    sw1a
                     84:        mtpr    $0,$IPL                 # must allow interrupts here
                     85:        brw     sw1                     # this is an idle loop!
                     86: sw1a:  mtpr    $0x18,$IPL              # lock out all so _whichqs==_qs
                     87:        bbcc    r0,_whichqs,sw1         # proc moved via lbolt interrupt
                     88:        movaq   _qs[r0],r1
                     89:        remque  *(r1),r2                # r2 = p = highest pri process
                     90:        bvc     sw2                     # make sure something was there
                     91: sw1b:  pushab  sw0
                     92:        calls   $1,_panic
                     93: sw2:   beql    sw3
                     94:        insv    $1,r0,$1,_whichqs       # still more procs in this queue
                     95: sw3:
                     96:        clrl    _noproc
                     97:        movzbl  P_STAT(r2),r3           ## firewalls
                     98:        cmpl    $SRUN,r3                ##
                     99:        bneq    sw1b                    ##
                    100:        clrl    P_RLINK(r2)             ##
                    101:        movl    *P_ADDR(r2),r0
                    102:        movl    r0,_masterpaddr
                    103:        ashl    $PGSHIFT,r0,r0          # r0 = pcbb(p)
                    104: #      mfpr    $PCBB,r1                # resume of current proc is easy
                    105: #      cmpl    r0,r1
                    106: #      beql    res0
                    107: #      incl    _cnt+V_SWTCH
                    108: /* fall into... */
                    109: 
                    110: /*
                    111:  * Resume(pf)
                    112:  */
                    113:        .globl  _Resume         # <<<massaged to jsb by "asm.sed">>>
                    114: _Resume:
                    115:        mtpr    $0x18,$IPL                      # no interrupts, please
                    116:        pushl   _nofault
                    117:        pushl   _CMAP2          # yech
                    118:        svpctx
                    119:        mtpr    r0,$PCBB
                    120:        ldpctx
                    121:        movl    (sp)+,_CMAP2    # yech
                    122:        mtpr    $_CADDR2,$TBIS
                    123:        movl    (sp)+,_nofault
                    124: res0:
                    125:        tstl    _u+PCB_SSWAP
                    126:        bneq    res1
                    127:        rei
                    128: 
                    129: res1:
                    130:        movl    _u+PCB_SSWAP,r0                 # longjmp to saved context
                    131:        clrl    _u+PCB_SSWAP
                    132:        movq    (r0)+,r6
                    133:        movq    (r0)+,r8
                    134:        movq    (r0)+,r10
                    135:        movq    (r0)+,r12
                    136:        movl    (r0)+,r1
                    137:        cmpl    r1,sp                           # must be a pop
                    138:        bgequ   1f
                    139:        pushab  2f
                    140:        calls   $1,_panic
                    141:        /* NOTREACHED */
                    142: 1:
                    143:        movl    r1,sp
                    144:        movl    (r0),(sp)                       # address to return to
                    145:        movl    $PSL_PRVMOD,4(sp)               # ``cheating'' (jfr)
                    146:        rei
                    147: 
                    148: 2:     .asciz  "ldctx"

unix.superglobalmegacorp.com

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