Annotation of 43BSDReno/sys/GENERIC.alltahoe/locore.c, revision 1.1.1.1

1.1       root        1: #ifdef LOCORE
                      2: #define        U_PROCP 144
                      3: #define        P_LINK 0
                      4: #define        P_RLINK 4
                      5: #define        P_XLINK 116
                      6: #define        P_ADDR 16
                      7: #define        P_PRI 21
                      8: #define        P_STAT 23
                      9: #define        P_WCHAN 104
                     10: #define        P_TSIZE 72
                     11: #define        P_SSIZE 84
                     12: #define        P_P0BR 112
                     13: #define        P_SZPT 70
                     14: #define        P_TEXTP 108
                     15: #define        P_FLAG 44
                     16: #define        P_DKEY 240
                     17: #define        P_CKEY 236
                     18: #define        SSLEEP 1
                     19: #define        SRUN 3
                     20: #define        V_SWTCH 0
                     21: #define        V_TRAP 4
                     22: #define        V_SYSCALL 8
                     23: #define        V_INTR 12
                     24: #define        V_SOFT 16
                     25: #define        V_FPE 116
                     26: #define        V_ALIGN 120
                     27: #define        MCLBYTES 1024
                     28: #define        NBPG 1024
                     29: #define        PGSHIFT 10
                     30: #define        UPAGES 8
                     31: #define        CLSIZE 1
                     32: #define        MAXPHYS 65536
                     33: #define        SYSPTSIZE 11264
                     34: #define        USRPTSIZE 1024
                     35: #define        VBIOSIZE 1020
                     36: #define        MSGBUFPTECNT 4
                     37: #define        NMBCLUSTERS 256
                     38: #define        NKMEMCLUSTERS 512
                     39: #define        PCB_KSP 0
                     40: #define        PCB_USP 4
                     41: #define        PCB_R0 8
                     42: #define        PCB_R1 12
                     43: #define        PCB_R2 16
                     44: #define        PCB_R3 20
                     45: #define        PCB_R4 24
                     46: #define        PCB_R5 28
                     47: #define        PCB_R6 32
                     48: #define        PCB_R7 36
                     49: #define        PCB_R8 40
                     50: #define        PCB_R9 44
                     51: #define        PCB_R10 48
                     52: #define        PCB_R11 52
                     53: #define        PCB_R12 56
                     54: #define        PCB_R13 60
                     55: #define        PCB_FP 60
                     56: #define        PCB_PC 64
                     57: #define        PCB_PSL 68
                     58: #define        PCB_P0BR 72
                     59: #define        PCB_P0LR 76
                     60: #define        PCB_P1BR 80
                     61: #define        PCB_P1LR 84
                     62: #define        PCB_P2BR 88
                     63: #define        PCB_P2LR 92
                     64: #define        PCB_ACH 96
                     65: #define        PCB_ACL 100
                     66: #define        PCB_HFS 104
                     67: #define        PCB_SAVACC 108
                     68: #define        PCB_SZPT 112
                     69: #define        PCB_CMAP2 116
                     70: #define        PCB_SSWAP 120
                     71: #define        PCB_SIGC 124
                     72: #define        SCB_DOADUMP 8
                     73: #define        SCB_BUSERR 128
                     74: #define        SCB_DEVBASE 64
                     75: #endif
                     76: /*
                     77:  *     @(#)scb.s       7.1 (Berkeley) 5/21/88
                     78:  */
                     79: 
                     80: /*
                     81:  * System control block
                     82:  */
                     83: #define        STRAY   .long   _Xstray
                     84: #define        STRAY8  STRAY;STRAY;STRAY;STRAY;STRAY;STRAY;STRAY;STRAY
                     85: #define        KS(a)   .long   _X/**/a
                     86: #define        IS(a)   .long   _X/**/a
                     87: 
                     88: _scb:  .globl  _scb
                     89: /* 000 */      STRAY;          IS(powfail);    IS(doadump);    STRAY;
                     90: /* 004 */      STRAY;          STRAY;          STRAY;          IS(hardclock);
                     91: /* 008 */      STRAY;          STRAY;          IS(cnrint);     IS(cnxint);
                     92: /* 00c */      IS(rmtrint);    IS(rmtxint);    STRAY;          STRAY;
                     93: /* 010 */      IS(kdbintr);    STRAY;          STRAY;          IS(netintr);
                     94: /* 014 */      STRAY;          STRAY;          STRAY;          IS(softclock);
                     95: /* 018 */      STRAY;          STRAY;          STRAY;          STRAY;
                     96: /* 01c */      STRAY;          STRAY;          STRAY;          STRAY;
                     97: /* 020 */      IS(buserr);     STRAY;          STRAY;          STRAY;
                     98: /* 024 */      STRAY;          STRAY;          STRAY;          STRAY;
                     99: /* 028 */      STRAY;          STRAY;          STRAY;          KS(syscall);
                    100: /* 02c */      KS(privinflt);  KS(resopflt);   KS(resadflt);   KS(protflt);
                    101: /* 030 */      KS(transflt);   IS(kspnotval);  KS(tracep);     KS(bptflt);
                    102: /* 034 */      KS(arithtrap);  KS(alignflt);   KS(sfexcep);    KS(fpm);
                    103: /* 038 */      STRAY;          STRAY;          STRAY;          STRAY;
                    104: /* 03c */      STRAY;          STRAY;          STRAY;          STRAY;
                    105:        /* device interrupt vectors */
                    106: /* 040 */      STRAY8;         STRAY8;         STRAY8;         STRAY8;
                    107: /* 060 */      STRAY8;         STRAY8;         STRAY8;         STRAY8;
                    108: /* 080 */      STRAY8;         STRAY8;         STRAY8;         STRAY8;
                    109: /* 0a0 */      STRAY8;         STRAY8;         STRAY8;         STRAY8;
                    110: /* 0c0 */      STRAY8;         STRAY8;         STRAY8;         STRAY8;
                    111: /* 0e0 */      STRAY8;         STRAY8;         STRAY8;         STRAY8;
                    112: #define        I_CLOCK 0
                    113: #define        I_CNR   4
                    114: #define        I_CNX   8
                    115: #define        I_RMTR  12
                    116: #define        I_RMTX  16
                    117: #define        I_BUSERR        20
                    118: /*
                    119:  * Copyright (c) 1988 Regents of the University of California.
                    120:  * All rights reserved.  The Berkeley software License Agreement
                    121:  * specifies the terms and conditions for redistribution.
                    122:  *
                    123:  *     @(#)locore.s    7.14 (Berkeley) 5/10/90
                    124:  */
                    125: 
                    126: #include "../tahoe/mtpr.h"
                    127: #include "../tahoe/trap.h"
                    128: #include "../tahoe/psl.h"
                    129: #include "../tahoe/pte.h"
                    130: #include "../tahoe/cp.h"
                    131: #include "../tahoe/mem.h"
                    132: #include "../tahoe/SYS.h"
                    133: 
                    134: #include "../tahoemath/fp.h"
                    135: 
                    136: #include "errno.h"
                    137: #include "syscall.h"
                    138: #include "cmap.h"
                    139: 
                    140:        .set    HIGH,0x1f               # mask for total disable
                    141:        .set    NISP,3                  # number of interrupt stack pages
                    142:        .set    SYSTEM,0xC0000000       # virtual address of system start
                    143:        .set    PPAGES,0x100000         # possible pages in P0,P1, etc.
                    144: 
                    145: /* ACBL for non-negative '_add' */
                    146: #define ACBL(_limit,_add,_index,_displ) \
                    147:        addl2   _add,_index; \
                    148:        cmpl    _index,_limit; \
                    149:        bleq    _displ
                    150: 
                    151: /* _ACBL for negative '_add' */
                    152: #define _ACBL(_limit,_add,_index,_displ) \
                    153:        addl2   _add,_index; \
                    154:        cmpl    _index,_limit; \
                    155:        bgeq    _displ
                    156: 
                    157: #define        MOVC3(_srcaddr,_dstaddr,_len) \
                    158:        movl    _srcaddr,r0; \
                    159:        movl    _dstaddr,r1; \
                    160:        movl    _len,r2; \
                    161:        movblk
                    162: 
                    163: /* keep address of psl if coming from user mode */
                    164: #define CHECK_SFE(_delta) \
                    165:        bitl    $PSL_CURMOD,_delta(sp); \
                    166:        jeql    1f; \
                    167:        moval   _delta(sp),_user_psl; \
                    168: 1:
                    169: 
                    170: /*
                    171:  * User structure is UPAGES at top of user space.
                    172:  */
                    173:        .globl  _u
                    174:        .set    _u,SYSTEM - UPAGES*NBPG
                    175: 
                    176: /*
                    177:  * Restart stack. Used on power recovery or panic.
                    178:  * Takes a core-dump and then halts.
                    179:  */ 
                    180:        .globl  _rsstk
                    181:        .globl  pwfl_stk        
                    182: _rsstk:
                    183:        .space  1024-8
                    184: pwfl_stk:
                    185:        .space  4
                    186: dumpflag:
                    187:        .space  4
                    188: 
                    189:        .globl  _intstack
                    190: _intstack:
                    191:        .space  NISP*NBPG
                    192: eintstack:
                    193: 
                    194: /*
                    195:  * Power failure storage block and
                    196:  * macros for saving and restoring.
                    197:  */
                    198: #define        POWERFAIL(id,longs) \
                    199:        .globl  pwfl_/**/id \
                    200: pwfl_/**/id: .space longs*4
                    201:        .data
                    202:        POWERFAIL(r0,   14)             # r0-r13
                    203:        POWERFAIL(sp,   1)              # r14
                    204:        POWERFAIL(SCBB, 1)              # system control block base
                    205:        POWERFAIL(SBR,  1)              # system pte base
                    206:        POWERFAIL(SLR,  1)              # system pte length
                    207:        POWERFAIL(P0BR, 1)              # p0 pte base
                    208:        POWERFAIL(P0LR, 1)              # p0 pte length
                    209:        POWERFAIL(P1BR, 1)              # p1 pte base
                    210:        POWERFAIL(P1LR, 1)              # p1 pte length
                    211:        POWERFAIL(P2BR, 1)              # p2 pte base
                    212:        POWERFAIL(P2LR, 1)              # p2 pte length
                    213:        POWERFAIL(IPL,  1)              # interrupt priority level
                    214:        POWERFAIL(DCK,  1)              # data cache key
                    215:        POWERFAIL(CCK,  1)              # code cache key
                    216:        POWERFAIL(PCBB, 1)              # process control block base
                    217:        POWERFAIL(ISP,  1)              # interrupt stack pointer
                    218:        POWERFAIL(KSP,  1)              # kernel mode stack pointer
                    219:        POWERFAIL(USP,  1)              # user mode stack pointer
                    220:        POWERFAIL(MME,  1)              # memory management enable
                    221:        POWERFAIL(PSL,  1)              # processor status longword
                    222: 
                    223: /*
                    224:  * Save current state in power fail storage block.
                    225:  */
                    226: #define        SAVEpwfl() \
                    227:        movpsl  pwfl_PSL        # Keeps all flags, etc. \
                    228:        storer  $0x3fff,pwfl_r0 # Saves r0-r13 \
                    229:        moval   0(sp),pwfl_sp   # Saves sp (=r14) \
                    230:        mfpr    $SBR,pwfl_SBR   # Save all re_loadable registers \
                    231:        mfpr    $SLR,pwfl_SLR \
                    232:        mfpr    $P0BR,pwfl_P0BR \
                    233:        mfpr    $P0LR,pwfl_P0LR \
                    234:        mfpr    $P1BR,pwfl_P1BR \
                    235:        mfpr    $P1LR,pwfl_P1LR \
                    236:        mfpr    $P2BR,pwfl_P2BR \
                    237:        mfpr    $P2LR,pwfl_P2LR \
                    238:        mfpr    $IPL,pwfl_IPL \
                    239:        mfpr    $MME,pwfl_MME \
                    240:        mfpr    $DCK,pwfl_DCK \
                    241:        mfpr    $CCK,pwfl_CCK \
                    242:        mfpr    $PCBB,pwfl_PCBB \
                    243:        mfpr    $ISP,pwfl_ISP \
                    244:        mfpr    $SCBB,pwfl_SCBB \
                    245:        mfpr    $KSP,pwfl_KSP \
                    246:        mfpr    $USP,pwfl_USP
                    247: 
                    248: /*
                    249:  * Restore state saved in power fail block and
                    250:  * jmp to location specified after (possibly)
                    251:  * enabling memory management.
                    252:  */
                    253: #define        RESTOREpwfl(loc) \
                    254:        loadr   $0x3fff,pwfl_r0 # Restore r0-r13 \
                    255:        movl    pwfl_sp,sp      # Restore sp (=r14) \
                    256:        mtpr    pwfl_SCBB,$SCBB \
                    257:        mtpr    pwfl_SBR,$SBR   # Restore all re_loadable registers \
                    258:        mtpr    pwfl_SLR,$SLR \
                    259:        mtpr    pwfl_P0BR,$P0BR \
                    260:        mtpr    pwfl_P0LR,$P0LR \
                    261:        mtpr    pwfl_P1BR,$P1BR \
                    262:        mtpr    pwfl_P1LR,$P1LR \
                    263:        mtpr    pwfl_P2BR,$P2BR \
                    264:        mtpr    pwfl_P2LR,$P2LR \
                    265:        mtpr    pwfl_IPL,$IPL \
                    266:        mtpr    pwfl_DCK,$DCK \
                    267:        mtpr    pwfl_CCK,$CCK \
                    268:        mtpr    pwfl_PCBB,$PCBB \
                    269:        mtpr    pwfl_ISP,$ISP \
                    270:        mtpr    pwfl_KSP,$KSP \
                    271:        mtpr    pwfl_USP,$USP \
                    272: \
                    273:        bicpsw  $0xff           # Restore PSW. \
                    274:        bispsw  pwfl_PSL+2      # Set original bits back (just in case..) \
                    275: # now go to mapped mode \
                    276: # Have to change PC to system addresses \
                    277:        mtpr    $1,$PACC        # Thoroughly clean up caches. \
                    278:        mtpr    $1,$PADC \
                    279:        mtpr    $1,$TBIA \
                    280:        mtpr    pwfl_MME,$MME   # Restore MME. Last thing to be done. \
                    281:        jmp     loc
                    282: 
                    283: /*
                    284:  * Do a dump.
                    285:  * Called by auto-restart.
                    286:  * May be called manually.
                    287:  */
                    288:        .align  2
                    289:        .text
                    290:        .globl  _Xdoadump
                    291:        .globl  _doadump
                    292: _Xdoadump:                                     # CP comes here after power fail
                    293:        RESTOREpwfl(*0f)                        # restore state
                    294: _doadump:
                    295:        .word 0
                    296: 0:     mtpr    $HIGH,$IPL
                    297: #define        _rsstkmap _Sysmap+12    # powerfail storage, scb, rsstk, int stack
                    298:        tstl    dumpflag                        # dump only once!
                    299:        bneq    1f
                    300:        andl2   $~PG_PROT,_rsstkmap
                    301:        orl2    $PG_KW,_rsstkmap                # Make dump stack r/w
                    302:        mtpr    $0,$TBIA
                    303:        movl    $1,dumpflag
                    304:        movab   dumpflag,sp
                    305:        callf   $4,_dumpsys
                    306: 1:
                    307:        halt
                    308: 
                    309: /*
                    310:  * Interrupt vector routines
                    311:  */ 
                    312:        .globl  _waittime
                    313: #define        SCBVEC(name) \
                    314:        .align 2; \
                    315:        .globl _X/**/name; \
                    316: _X/**/name
                    317: #define        PANIC(msg) \
                    318:        clrl _waittime; pushab 1f; callf $8,_panic; 1: .asciz msg
                    319: #define        PRINTF(n,msg) \
                    320:        pushab 1f; callf $(n+2)*4,_printf; MSG(msg)
                    321: #define        MSG(msg) .data; 1: .asciz msg; .text
                    322: /*
                    323:  * r0-r5 are saved across all faults and interrupts.
                    324:  * Routines below and those hidden in vbglue.s (device
                    325:  * interrupts) invoke the PUSHR/POPR macros to execute
                    326:  * this.  Also, certain stack frame offset calculations
                    327:  * use this, using the REGSPC definition (and FPSPC defined below).
                    328:  */
                    329: #define        REGSPC  6*4
                    330: #define        PUSHR   movab -REGSPC(sp),sp; storer $0x3f,(sp)
                    331: #define        POPR    loadr $0x3f,(sp); movab REGSPC(sp),sp
                    332: 
                    333: /*
                    334:  * Floating point state is saved across faults and
                    335:  * interrupts.  The state occupies 4 longwords on
                    336:  * the stack:
                    337:  *     precision indicator (single = 0/double = 1)
                    338:  *     double representation of accumulator
                    339:  *     save accumulator status flag (pcb_savacc)
                    340:  */
                    341: #define        FPSPC   (4*4)
                    342: 
                    343: #define SAVE_FPSTAT(_delta) \
                    344:        bitl    $PSL_DBL,_delta(sp); \
                    345:        beql    1f; \
                    346:        pushl   $1; \
                    347:        pushd; \
                    348:        jmp     2f; \
                    349: 1:     pushl   $0; \
                    350:        pushl   $0; \
                    351:        stf     -(sp); \
                    352: 2:     tstl    _u+PCB_SAVACC; \
                    353:        bneq    3f; \
                    354:        moval   0(sp),_u+PCB_SAVACC; \
                    355:        orl2    $2,8(sp);\
                    356: 3:     pushl   $0;
                    357: 
                    358: #define REST_FPSTAT \
                    359:        tstl    (sp)+; \
                    360:        bitl    $2,8(sp);\
                    361:        beql    1f;\
                    362:        movl    $0,_u+PCB_SAVACC; \
                    363: 1:     bitl    $1,8(sp); \
                    364:        beql    2f; \
                    365:        ldd     (sp); \
                    366:        jmp     3f; \
                    367: 2:     ldf     (sp); \
                    368: 3:     moval   12(sp),sp;
                    369: 
                    370: #define REST_ACC \
                    371:        tstl    _u+PCB_SAVACC; \
                    372:        beql    2f; \
                    373:        movl    _u+PCB_SAVACC,r1; \
                    374:        andl3   $(EXPMASK|SIGNBIT),(r1),-(sp); \
                    375:        cmpl    $0x80000000,(sp)+; \
                    376:        bneq    3f; \
                    377:        clrl    (r1); \
                    378: 3:     bitl    $1,8(r1); \
                    379:        beql    1f; \
                    380:        ldd     (r1); \
                    381:        jmp     2f; \
                    382: 1:     ldf     (r1); \
                    383: 2:     ;
                    384: 
                    385:        .data
                    386: nofault: .space        4                       # bus error non-local goto label
                    387: 
                    388:        .text
                    389: SCBVEC(buserr):
                    390:        CHECK_SFE(12)
                    391:        SAVE_FPSTAT(12)
                    392:        incl    _intrcnt+I_BUSERR       # keep stats...
                    393:        pushl   r0                      # must save
                    394:        andl3   24(sp),$ERRCD,r0        # grab pushed MER value
                    395:        cmpl    r0,$APE                 # address parity error?
                    396:        jneq    1f
                    397:        halt    
                    398: 1:     cmpl    r0,$VBE                 # versabus error?
                    399:        jneq    2f
                    400:        halt
                    401: 2:
                    402:        movl    (sp)+,r0                # restore r0 and...
                    403:        bitl    $PSL_CURMOD,4*4+3*4(sp) # check if happened in user mode?
                    404:        jeql    3f                      # yes, then shift stack up for trap...
                    405:        movl    12(sp),16(sp)           # sorry, no space for which-buss...
                    406:        movl    8(sp),12(sp)
                    407:        movl    4(sp),8(sp)
                    408:        movl    0(sp),4(sp)
                    409:        movl    $T_BUSERR,0(sp)         # push trap type code and...
                    410:        jbr     alltraps                # ...merge with all other traps
                    411: 3:                                     # kernel mode, check to see if...
                    412:        tstl    nofault                 # ...doing peek/poke?
                    413:        jeql    4f                      # nofault set? if so, jump to it...
                    414:        movl    nofault,4*4+2*4(sp)     # ...setup for non-local goto
                    415:        clrl    nofault
                    416:        jbr     5f
                    417: 4:
                    418:        PUSHR
                    419:        pushab  4*4+REGSPC(sp)          # address of bus error parameters
                    420:        callf   $8,_buserror
                    421:        POPR
                    422: 5:
                    423:        REST_FPSTAT
                    424:        movab   8(sp),sp                # remove bus error parameters
                    425:        rei
                    426: 
                    427: SCBVEC(powfail):                       # We should be on interrupt stack now.
                    428:        SAVEpwfl()                      # save machine state
                    429:        moval   _Xdoadump-SYSTEM,_scb+SCB_DOADUMP
                    430:        halt
                    431: 
                    432: SCBVEC(stray):
                    433:        incl    _cnt+V_INTR             # add to statistics
                    434:        rei
                    435: 
                    436: #include "../net/netisr.h"
                    437:        .globl  _netisr
                    438: SCBVEC(netintr):
                    439:        CHECK_SFE(4)
                    440:        SAVE_FPSTAT(4); PUSHR
                    441: #include "imp.h"
                    442: #if NIMP > 0
                    443:        bbc     $NETISR_IMP,_netisr,1f;
                    444:        andl2   $~(1<<NETISR_IMP),_netisr
                    445:        callf   $4,_impintr;
                    446: 1:
                    447: #endif
                    448: #ifdef INET
                    449:        bbc     $NETISR_IP,_netisr,1f   
                    450:        andl2   $~(1<<NETISR_IP),_netisr
                    451:        callf   $4,_ipintr      
                    452: 1:
                    453: #endif
                    454: #ifdef NS
                    455:        bbc     $NETISR_NS,_netisr,1f   
                    456:        andl2   $~(1<<NETISR_NS),_netisr
                    457:        callf   $4,_nsintr      
                    458: 1:
                    459: #endif
                    460: #ifdef ISO
                    461:        bbc     $NETISR_ISO,_netisr,1f  
                    462:        andl2   $~(1<<NETISR_ISO),_netisr
                    463:        callf   $4,_clnlintr    
                    464: 1:
                    465: #endif
                    466:        incl    _cnt+V_SOFT
                    467:        POPR; REST_FPSTAT
                    468:        rei
                    469: 
                    470: SCBVEC(cnrint):
                    471:        CHECK_SFE(4)
                    472:        SAVE_FPSTAT(4); PUSHR; 
                    473:        pushl $CPCONS; callf $8,_cnrint;
                    474:        incl    _intrcnt+I_CNR
                    475:        incl    _cnt+V_INTR
                    476:        POPR; REST_FPSTAT;
                    477:        rei
                    478: SCBVEC(cnxint):
                    479:        CHECK_SFE(4)
                    480:        SAVE_FPSTAT(4); PUSHR; 
                    481:        pushl $CPCONS; callf $8,_cnxint;
                    482:        incl    _intrcnt+I_CNX
                    483:        incl    _cnt+V_INTR
                    484:        POPR; REST_FPSTAT;
                    485:        rei
                    486: SCBVEC(rmtrint):
                    487:        CHECK_SFE(4)
                    488:        SAVE_FPSTAT(4); PUSHR; 
                    489:        pushl $CPREMOT; callf $8,_cnrint;
                    490:        incl    _intrcnt+I_RMTR
                    491:        incl    _cnt+V_INTR
                    492:        POPR; REST_FPSTAT;
                    493:        rei
                    494: SCBVEC(rmtxint):
                    495:        CHECK_SFE(4)
                    496:        SAVE_FPSTAT(4); PUSHR; 
                    497:        pushl $CPREMOT; callf $8,_cnxint;
                    498:        incl    _intrcnt+I_RMTX
                    499:        incl    _cnt+V_INTR
                    500:        POPR; REST_FPSTAT;
                    501:        rei
                    502: 
                    503: #define PUSHPCPSL      pushl 4+FPSPC+REGSPC(sp); pushl 4+FPSPC+REGSPC(sp);
                    504: 
                    505: SCBVEC(hardclock):
                    506:        tstl    _clk_enable
                    507:        bneq    1f
                    508:        rei
                    509: 1:
                    510:        CHECK_SFE(4)
                    511:        SAVE_FPSTAT(4); PUSHR
                    512:        PUSHPCPSL                       # push pc and psl
                    513:        callf   $12,_hardclock          # hardclock(pc,psl)
                    514:        incl    _intrcnt+I_CLOCK
                    515:        incl    _cnt+V_INTR             ## temp so not to break vmstat -= HZ
                    516:        POPR; REST_FPSTAT
                    517:        rei
                    518: SCBVEC(softclock):
                    519:        CHECK_SFE(4)
                    520:        SAVE_FPSTAT(4); PUSHR;
                    521:        PUSHPCPSL                               # push pc and psl
                    522:        callf   $12,_softclock                  # softclock(pc,psl)
                    523:        incl    _cnt+V_SOFT
                    524:        POPR; REST_FPSTAT
                    525:        rei
                    526: 
                    527: /*
                    528:  * Stray VERSAbus interrupt catch routines
                    529:  */
                    530:        .data
                    531: #define        PJ      .align 2; callf $4,_Xvstray
                    532:        .globl  _catcher
                    533: _catcher:
                    534:        PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
                    535:        PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
                    536:        PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
                    537:        PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
                    538:        PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
                    539:        PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
                    540:        PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
                    541:        PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
                    542:        PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
                    543:        PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
                    544:        PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
                    545:        PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
                    546: 
                    547:        .align  2
                    548:        .globl  _cold
                    549: _cold: .long   0x3
                    550: 
                    551:        .text
                    552: SCBVEC(vstray):
                    553:        .word   0
                    554:        bbc     $0,_cold,2f             # system running?
                    555:        bbc     $1,_cold,1f             # doing autoconfig?
                    556:        jbr     3f                      # random interrupt, ignore
                    557: 1:
                    558:        mfpr    $IPL,r12                # ...setup br and cvec
                    559:        subl3   $_catcher+7,-8(fp),r11; shar $3,r11,r11
                    560:        addl2   $SCB_DEVBASE,r11
                    561:        jbr     3f
                    562: 2:
                    563:        PUSHR
                    564:        subl3   $_catcher+7,-8(fp),r0; shar $3,r0,r0
                    565:        addl3   $SCB_DEVBASE,r0,-(sp);
                    566:        mfpr    $IPL,-(sp)
                    567:        PRINTF(2, "stray intr ipl %x vec %x\n")
                    568:        POPR
                    569: 3:     moval   0f,-8(fp); ret          # pop callf frame...
                    570: 0:     rei                             # ...and return
                    571: 
                    572: /*
                    573:  * Trap and fault vector routines
                    574:  */ 
                    575: #define        TRAP(a) pushl $T_/**/a; jbr alltraps
                    576: 
                    577: /*
                    578:  * Ast delivery (profiling and/or reschedule)
                    579:  */
                    580: 
                    581: SCBVEC(kspnotval):
                    582:        CHECK_SFE(4)
                    583:        pushl $0;
                    584:        SAVE_FPSTAT(8)
                    585:        TRAP(KSPNOTVAL)
                    586: SCBVEC(privinflt):
                    587:        CHECK_SFE(4)
                    588:        pushl $0;
                    589:        SAVE_FPSTAT(8)
                    590:        TRAP(PRIVINFLT)
                    591: SCBVEC(resopflt):
                    592:        CHECK_SFE(4)
                    593:        pushl $0;
                    594:        SAVE_FPSTAT(8)
                    595:        TRAP(RESOPFLT)
                    596: SCBVEC(resadflt):
                    597:        CHECK_SFE(4)
                    598:        pushl $0;
                    599:        SAVE_FPSTAT(8)
                    600:        TRAP(RESADFLT)
                    601: SCBVEC(bptflt):
                    602:        CHECK_SFE(4)
                    603:        pushl $0;
                    604:        SAVE_FPSTAT(8)
                    605:        TRAP(BPTFLT)
                    606: SCBVEC(kdbintr):
                    607:        CHECK_SFE(4);
                    608:        pushl $0;
                    609:        SAVE_FPSTAT(8);
                    610:        TRAP(KDBTRAP);
                    611: SCBVEC(tracep):
                    612:        CHECK_SFE(4)
                    613:        pushl $0;
                    614:        SAVE_FPSTAT(8)
                    615:        TRAP(TRCTRAP)
                    616: SCBVEC(alignflt):
                    617: #ifdef ALIGN
                    618:        bitl    $PSL_CURMOD,4(sp)
                    619:        jeql    align_excp              # Can't emulate for kernel mode !
                    620:        jbr     non_aligned             # Only emulated for user mode.
                    621: align_excp:
                    622: #else
                    623:        CHECK_SFE(4)
                    624: #endif
                    625:        pushl $0;
                    626:        SAVE_FPSTAT(8)
                    627:        TRAP(ALIGNFLT)
                    628: SCBVEC(arithtrap):
                    629:        CHECK_SFE(8)
                    630:        SAVE_FPSTAT(8)
                    631:        TRAP(ARITHTRAP)
                    632: 
                    633: SCBVEC(protflt):
                    634:        CHECK_SFE(12)
                    635:        bitl    $1,(sp)+
                    636:        jneq    segflt
                    637:        SAVE_FPSTAT(8)
                    638:        TRAP(PROTFLT)
                    639: segflt:
                    640:        SAVE_FPSTAT(8)
                    641:        TRAP(SEGFLT)
                    642: 
                    643: SCBVEC(fpm):                   # Floating Point Emulation
                    644: #ifdef FPE
                    645:        CHECK_SFE(16)
                    646:        SAVE_FPSTAT(16)
                    647:        incl    _cnt+V_FPE      # count emulation traps
                    648:        callf   $4,_fpemulate
                    649:        REST_FPSTAT
                    650: #endif
                    651:        moval   8(sp),sp        # Pop operand
                    652:        tstl    (sp)            # Stack= PSL, PC, return_code
                    653:        jneq    _Xarithtrap     # If not OK, emulate F.P. exception
                    654:        movab   4(sp),sp        # Else remove return_code and
                    655:        rei
                    656: 
                    657: SCBVEC(sfexcep):
                    658:        CHECK_SFE(4)
                    659:        pushl $0
                    660:        SAVE_FPSTAT(8)
                    661:        TRAP(ASTFLT)
                    662: 
                    663: SCBVEC(transflt):
                    664:        CHECK_SFE(12)
                    665:        bitl    $2,(sp)+
                    666:        bneq    tableflt
                    667: pageflt:
                    668:        SAVE_FPSTAT(8)
                    669:        TRAP(PAGEFLT)
                    670: tableflt:
                    671:        SAVE_FPSTAT(8)
                    672:        TRAP(TABLEFLT)
                    673: 
                    674: #define REST_STACK     movab 4(sp), sp; REST_FPSTAT; movab 4(sp), sp
                    675: 
                    676: alltraps:
                    677:        mfpr    $USP,-(sp); 
                    678:        callf   $4,_trap;
                    679:        mtpr    (sp)+,$USP
                    680:        incl    _cnt+V_TRAP
                    681:        REST_STACK                      # pop type, code, and fp stuff
                    682:        mtpr    $HIGH,$IPL              ## dont go to a higher IPL (GROT)
                    683:        rei
                    684: 
                    685: SCBVEC(syscall):
                    686:        CHECK_SFE(8)
                    687:        SAVE_FPSTAT(8)
                    688:        pushl   $T_SYSCALL
                    689:        mfpr    $USP,-(sp);
                    690:        callf   $4,_syscall;
                    691:        mtpr    (sp)+,$USP
                    692:        incl    _cnt+V_SYSCALL
                    693:        REST_STACK                      # pop type, code, and fp stuff
                    694:        mtpr    $HIGH,$IPL              ## dont go to a higher IPL (GROT)
                    695:        rei
                    696: 
                    697: /*
                    698:  * System page table.
                    699:  *
                    700:  * Mbmap and Usrptmap are enlarged by CLSIZE entries
                    701:  * as they are managed by resource maps starting with index 1 or CLSIZE.
                    702:  */ 
                    703: #define        vaddr(x)        ((((x)-_Sysmap)/4)*NBPG+SYSTEM)
                    704: #define        SYSMAP(mname, vname, npte)                      \
                    705: _/**/mname:    .globl  _/**/mname;             \
                    706:        .space  (npte)*4;                       \
                    707:        .globl  _/**/vname;                     \
                    708:        .set    _/**/vname,vaddr(_/**/mname)
                    709: #define        ADDMAP(npte)    .space  (npte)*4
                    710: 
                    711:        .data
                    712:        .align  2
                    713:        SYSMAP(Sysmap   ,Sysbase        ,SYSPTSIZE      )
                    714:        SYSMAP(Forkmap  ,forkutl        ,UPAGES         )
                    715:        SYSMAP(Xswapmap ,xswaputl       ,UPAGES         )
                    716:        SYSMAP(Xswap2map,xswap2utl      ,UPAGES         )
                    717:        SYSMAP(Swapmap  ,swaputl        ,UPAGES         )
                    718:        SYSMAP(Pushmap  ,pushutl        ,UPAGES         )
                    719:        SYSMAP(Vfmap    ,vfutl          ,UPAGES         )
                    720:        SYSMAP(CMAP1    ,CADDR1         ,1              )
                    721:        SYSMAP(CMAP2    ,CADDR2         ,1              )
                    722:        SYSMAP(mmap     ,vmmap          ,1              )
                    723:        SYSMAP(alignmap ,alignutl       ,1              )       /* XXX */
                    724:        SYSMAP(msgbufmap,msgbuf         ,MSGBUFPTECNT   )
                    725:        SYSMAP(Mbmap    ,mbutl          ,NMBCLUSTERS*MCLBYTES/NBPG+CLSIZE )
                    726: #ifdef MFS
                    727: #include "../ufs/mfsiom.h"
                    728:        /*
                    729:         * Used by the mfs_doio() routine for physical I/O
                    730:         */
                    731:        SYSMAP(Mfsiomap ,mfsiobuf       ,MFS_MAPREG )
                    732: #endif /* MFS */
                    733: #ifdef NFS
                    734: #include "../nfs/nfsiom.h"
                    735:        /*
                    736:         * Used by the nfs_doio() routine for physical I/O
                    737:         */
                    738:        SYSMAP(Nfsiomap ,nfsiobuf       ,NFS_MAPREG )
                    739: #endif /* NFS */
                    740:        /*
                    741:         * This is the map used by the kernel memory allocator.
                    742:         * It is expanded as necessary by the special features
                    743:         * that use it.
                    744:         */
                    745:        SYSMAP(kmempt   ,kmembase       ,NKMEMCLUSTERS*CLSIZE   )
                    746: #ifdef SYSVSHM
                    747:                                ADDMAP( SHMMAXPGS       )
                    748: #endif
                    749: #ifdef GPROF
                    750:                                ADDMAP( 600*CLSIZE      )
                    751: #endif
                    752:        /*
                    753:         * Enlarge kmempt as needed for bounce buffers allocated
                    754:         * by tahoe controllers.
                    755:         */
                    756: #include "hd.h"
                    757: #if NHD > 0
                    758:                                ADDMAP( NHDC*(MAXPHYS/NBPG+CLSIZE) )
                    759: #endif
                    760: #include "dk.h"
                    761: #if NDK > 0
                    762:                                ADDMAP( NVD*(MAXPHYS/NBPG+CLSIZE) )
                    763: #endif
                    764: #include "yc.h"
                    765: #if NYC > 0
                    766:                                ADDMAP( NCY*(MAXPHYS/NBPG+CLSIZE) )
                    767: #endif
                    768: #include "mp.h"
                    769:                                ADDMAP( NMP*14          )
                    770:        SYSMAP(ekmempt  ,kmemlimit      ,0              )
                    771: 
                    772:        SYSMAP(VMEMbeg  ,vmembeg        ,0              )
                    773:        SYSMAP(VMEMmap  ,vmem           ,VBIOSIZE       )
                    774:        SYSMAP(VMEMmap1 ,vmem1          ,0              )
                    775: #include "ace.h"
                    776: #if NACE > 0
                    777:                                ADDMAP( NACE*32 )
                    778: #endif
                    779: #if NHD > 0
                    780:                                ADDMAP( NHDC )
                    781: #endif
                    782: #include "vx.h"
                    783: #if NVX > 0
                    784:                                ADDMAP( NVX * 16384/NBPG )
                    785: #endif
                    786:        SYSMAP(VMEMend  ,vmemend        ,0              )
                    787: 
                    788:        SYSMAP(VBmap    ,vbbase         ,CLSIZE         )
                    789: #if NHD > 0
                    790:                                ADDMAP( NHDC*(MAXPHYS/NBPG+CLSIZE) )
                    791: #endif
                    792: #if NDK > 0
                    793:                                ADDMAP( NVD*(MAXPHYS/NBPG+CLSIZE) )
                    794: #endif
                    795: #if NYC > 0
                    796:                                ADDMAP( NCY*(MAXPHYS/NBPG+CLSIZE) )
                    797: #endif
                    798:                                ADDMAP( NMP*14          )
                    799:        SYSMAP(eVBmap   ,vbend          ,0              )
                    800: 
                    801:        SYSMAP(Usrptmap ,usrpt          ,USRPTSIZE+CLSIZE )
                    802: eSysmap:
                    803:        .globl  _Syssize
                    804:        .set    _Syssize,(eSysmap-_Sysmap)/4
                    805: 
                    806:        .text
                    807: /*
                    808:  * Initialization
                    809:  *
                    810:  * IPL 0x1f; MME 0; scbb, pcbb, sbr, slr, isp, ksp not set
                    811:  */
                    812:        .align  2
                    813:        .globl  start
                    814: start:
                    815:        .word   0
                    816: /* set system control block base and system page table params */
                    817:        mtpr    $_scb-SYSTEM,$SCBB
                    818:        mtpr    $_Sysmap-SYSTEM,$SBR
                    819:        mtpr    $_Syssize,$SLR
                    820: /* double map the kernel into the virtual user addresses of phys mem */
                    821:        mtpr    $_Sysmap,$P0BR
                    822:        mtpr    $_Syssize,$P0LR
                    823:        mtpr    $_Sysmap,$P1BR                  # against Murphy
                    824:        mtpr    $_Syssize,$P1LR
                    825: /* set ISP */
                    826:        movl    $_intstack-SYSTEM+NISP*NBPG,sp  # still physical
                    827:        mtpr    $_intstack+NISP*NBPG,$ISP
                    828: /* count up memory; _physmem contains limit */
                    829:        clrl    r7
                    830:        shll    $PGSHIFT,_physmem,r8
                    831:        decl    r8
                    832: 1:     pushl   $1; pushl r7; callf $12,_badaddr; tstl r0; bneq 9f
                    833:        ACBL(r8,$64*1024,r7,1b)
                    834: 9:
                    835: /* clear memory from kernel bss and pages for proc 0 u. and page table */
                    836:        movab   _edata,r6; andl2 $~SYSTEM,r6
                    837:        movab   _end,r5; andl2 $~SYSTEM,r5
                    838: #ifdef KADB
                    839:        subl2   $4,r5
                    840: 1:     clrl    (r6); ACBL(r5,$4,r6,1b)         # clear just bss
                    841:        addl2   $4,r5
                    842:        bbc     $6,r11,0f                       # check RB_KDB
                    843:        andl3   $~SYSTEM,r9,r5                  # skip symbol & string tables
                    844:        andl3   $~SYSTEM,r9,r6
                    845: #endif
                    846: 0:     orl3    $SYSTEM,r5,r9                   # convert to virtual address
                    847:        addl2   $NBPG-1,r9                      # roundup to next page
                    848:        addl2   $(UPAGES*NBPG)+NBPG+NBPG,r5
                    849: 1:     clrl    (r6); ACBL(r5,$4,r6,1b)
                    850: /* trap(), syscall(), and fpemulate() save r0-r12 in the entry mask */
                    851:        orw2    $0x01fff,_trap
                    852:        orw2    $0x01fff,_syscall
                    853: #ifdef FPE
                    854:        orw2    $0x01fff,_fpemulate
                    855: #endif
                    856:        orw2    $0x01ffc,_panic                 # for debugging (no r0|r1)
                    857:        callf   $4,_fixctlrmask                 # setup for autoconfig
                    858: /* initialize system page table: scb and int stack writeable */
                    859:        clrl    r2
                    860:        movab   eintstack,r1 
                    861:        andl2   $~SYSTEM,r1
                    862:        shrl    $PGSHIFT,r1,r1                  # r1-page number of eintstack
                    863: /* make 1st page processor storage read/only, 2nd read/write */
                    864:        orl3    $PG_V|PG_KR,r2,_Sysmap[r2]; incl r2;
                    865:        orl3    $PG_V|PG_KW,r2,_Sysmap[r2]; incl r2;
                    866: /* other parts of the system are read/write for kernel */
                    867: 1:     orl3    $PG_V|PG_KW,r2,_Sysmap[r2];     # data:kernel write+phys=virtual
                    868:        aoblss r1,r2,1b
                    869: /* make rsstk read-only as red zone for interrupt stack */
                    870:        andl2   $~PG_PROT,_rsstkmap
                    871:        orl2    $PG_V|PG_KR,_rsstkmap
                    872: /* make kernel text space read-only */
                    873:        movab   _etext+NBPG-1,r1
                    874:        andl2   $~SYSTEM,r1
                    875:        shrl    $PGSHIFT,r1,r1
                    876: 1:     orl3    $PG_V|PG_KR,r2,_Sysmap[r2]
                    877:        aoblss r1,r2,1b
                    878: /* make kernel data, bss, read-write */
                    879:        andl3   $~SYSTEM,r9,r1
                    880:        shrl    $PGSHIFT,r1,r1
                    881: 1:     orl3    $PG_V|PG_KW,r2,_Sysmap[r2]
                    882:        aoblss r1,r2,1b
                    883: /* go to mapped mode, have to change both pc and sp to system addresses */
                    884:        mtpr    $1,$TBIA
                    885:        mtpr    $1,$PADC                        # needed by HW parity&ECC logic
                    886:        mtpr    $1,$PACC                        # just in case
                    887:        mtpr    $1,$MME
                    888:        movab   SYSTEM(sp),sp
                    889:        jmp     *$0f
                    890: 0:
                    891: /* disable any interrupts */
                    892:        movl    $0,_intenable
                    893: /* init mem sizes */
                    894:        shrl    $PGSHIFT,r7,_physmem
                    895: /* setup context for proc[0] == scheduler */
                    896:        andl3   $~SYSTEM,r9,r6                  # convert to physical
                    897:        andl2   $~(NBPG-1),r6                   # make page boundary
                    898: /* setup page table for proc[0] */
                    899:        shrl    $PGSHIFT,r6,r3                  # r3 = btoc(r6)
                    900:        orl3    $PG_V|PG_KW,r3,_Usrptmap        # init first upt entry
                    901:        incl    r3                              # r3 - next page
                    902:        movab   _usrpt,r0                       # r0 - first user page
                    903:        mtpr    r0,$TBIS
                    904: /* init p0br, p0lr */
                    905:        mtpr    r0,$P0BR                        # no p0 for proc[0]
                    906:        mtpr    $0,$P0LR
                    907:        mtpr    r0,$P1BR                        # no p1 either
                    908:        mtpr    $0,$P1LR
                    909: /* init p2br, p2lr */
                    910:        movab   NBPG(r0),r0
                    911:        movl    $PPAGES-UPAGES,r1
                    912:        mtpr    r1,$P2LR
                    913:        moval   -4*PPAGES(r0),r2
                    914:        mtpr    r2,$P2BR
                    915: /* setup mapping for UPAGES of _u */
                    916:        clrl    r2
                    917:        movl    $SYSTEM,r1
                    918:        addl2   $UPAGES,r3
                    919:        jbr 2f
                    920: 1:     decl    r3
                    921:        moval   -NBPG(r1),r1    # r1 = virtual add of next (downward) _u page
                    922:        subl2   $4,r0           # r0 = pte address
                    923:        orl3    $PG_V|PG_URKW,r3,(r0)
                    924:        mtpr    r1,$TBIS
                    925: 2:     aobleq  $UPAGES,r2,1b
                    926: /* initialize (slightly) the pcb */
                    927:        movab   UPAGES*NBPG(r1),PCB_KSP(r1)     # KSP starts at end of _u
                    928:        movl    r1,PCB_USP(r1)                  # USP starts just below _u
                    929:        mfpr    $P0BR,PCB_P0BR(r1)
                    930:        mfpr    $P0LR,PCB_P0LR(r1)
                    931:        mfpr    $P1BR,PCB_P1BR(r1)
                    932:        mfpr    $P1LR,PCB_P1LR(r1)
                    933:        mfpr    $P2BR,PCB_P2BR(r1)
                    934:        mfpr    $P2LR,PCB_P2LR(r1)
                    935:        movl    $CLSIZE,PCB_SZPT(r1)            # init u.u_pcb.pcb_szpt
                    936:        movl    r9,PCB_R9(r1)                   # r9 obtained from boot
                    937:        movl    r10,PCB_R10(r1)                 # r10 obtained from boot
                    938:        movl    r11,PCB_R11(r1)                 # r11 obtained from CP on boot
                    939:        movab   1f,PCB_PC(r1)                   # initial pc
                    940:        clrl    PCB_PSL(r1)                     # kernel mode, ipl=0
                    941:        shll    $PGSHIFT,r3,r3
                    942:        mtpr    r3,$PCBB                        # first pcbb (physical)
                    943: /* go to kernel mode */
                    944:        ldpctx
                    945:        rei                                     # Actually next instruction:
                    946: /* put signal trampoline code in u. area */
                    947: 1:     movab   sigcode,r0
                    948:        movab   _u+PCB_SIGC,r1
                    949:        movl    $19,r2
                    950:        movblk
                    951: /* save boot device in global _bootdev */
                    952:        movl    r10,_bootdev
                    953: /* save reboot flags in global _boothowto */
                    954:        movl    r11,_boothowto
                    955: #ifdef KADB
                    956: /* save end of symbol & string table in global _bootesym */
                    957:        subl3   $NBPG-1,r9,_bootesym
                    958: #endif
                    959: /* calculate firstaddr, and call main() */
                    960:        andl3   $~SYSTEM,r9,r0
                    961:        shrl    $PGSHIFT,r0,-(sp)
                    962:        addl2   $UPAGES+1,(sp)                  # first physical unused page
                    963:        callf   $8,_main
                    964: /* proc[1] == /etc/init now running here in kernel mode; run icode */
                    965:        pushl   $PSL_CURMOD                     # User mode PSL
                    966:        pushl $0                                # PC = 0 (virtual now)
                    967:        rei
                    968: 
                    969: /*
                    970:  * Mask for saving/restoring registers on entry to
                    971:  * a user signal handler.  Space for the registers
                    972:  * is reserved in sendsig, so beware if you want
                    973:  * to change the mask.
                    974:  */
                    975: #define        SIGREGS (R0|R1|R2|R3|R4|R5)
                    976:        .align  2
                    977:        .globl  sigcode
                    978: sigcode:
                    979:        storer  $SIGREGS,16(sp) # save volatile registers
                    980:        calls   $4*3+4,*12(sp)  # params pushed by sendsig for handler
                    981:        loadr   $SIGREGS,4(sp)  # restore volatile registers
                    982:        movab   24(sp),fp       # use parameter list set up in sendsig
                    983:        kcall   $SYS_sigreturn  # cleanup mask and onsigstack
                    984:        halt                    # sigreturn does not return!
                    985: 
                    986:        .globl  _icode
                    987:        .globl  _initflags
                    988:        .globl  _szicode
                    989: /*
                    990:  * Icode is copied out to process 1 to exec /etc/init.
                    991:  * If the exec fails, process 1 exits.
                    992:  */
                    993:        .align  2
                    994: _icode:
                    995:        /* try /sbin/init */
                    996:        pushab  b`argv1-l0(pc)
                    997: l0:    pushab  b`init1-l1(pc)
                    998: l1:    pushl   $2
                    999:        movab   (sp),fp
                   1000:        kcall   $SYS_execv
                   1001:        /* try /etc/init */
                   1002:        pushab  b`argv2-l2(pc)
                   1003: l2:    pushab  b`init2-l3(pc)
                   1004: l3:    pushl   $2
                   1005:        movab   (sp),fp
                   1006:        kcall   $SYS_execv
                   1007:        /* give up */
                   1008:        pushl   r0
                   1009:        pushl   $1
                   1010:        movab   (sp),fp
                   1011:        kcall   $SYS_exit
                   1012: 
                   1013: init1: .asciz  "/sbin/init"
                   1014: init2: .asciz  "/etc/init"
                   1015:        .align  2
                   1016: _initflags:
                   1017:        .long   0
                   1018: argv1: .long   init1+6-_icode
                   1019:        .long   _initflags-_icode
                   1020:        .long   0
                   1021: argv2: .long   init2+5-_icode
                   1022:        .long   _initflags-_icode
                   1023:        .long   0
                   1024: _szicode:
                   1025:        .long   _szicode-_icode
                   1026: 
                   1027: /*
                   1028:  * Primitives
                   1029:  */ 
                   1030: 
                   1031: /*
                   1032:  * badaddr(addr, len)
                   1033:  *     see if access addr with a len type instruction causes a machine check
                   1034:  *     len is length of access (1=byte, 2=short, 4=long)
                   1035:  *     r0 = 0 means good(exists); r0 =1 means does not exist.
                   1036:  */
                   1037: ENTRY(badaddr, R3|R4)
                   1038:        mfpr    $IPL,r1
                   1039:        mtpr    $HIGH,$IPL
                   1040:        movl    _scb+SCB_BUSERR,r2
                   1041:        movl    4(fp),r3
                   1042:        movl    8(fp),r4
                   1043:        movab   9f,_scb+SCB_BUSERR
                   1044:        bbc     $0,r4,1f; tstb  (r3)
                   1045: 1:     bbc     $1,r4,1f; tstw  (r3)
                   1046: 1:     bbc     $2,r4,1f; tstl  (r3)
                   1047: 1:     clrl    r0
                   1048: 2:     movl    r2,_scb+SCB_BUSERR
                   1049:        mtpr    r1,$IPL
                   1050:        ret
                   1051: 
                   1052: /*
                   1053:  * wbadaddr(addr, len, value)
                   1054:  *     see if write of value to addr with a len type instruction causes
                   1055:  *     a machine check
                   1056:  *     len is length of access (1=byte, 2=short, 4=long)
                   1057:  *     r0 = 0 means good(exists); r0 =1 means does not exist.
                   1058:  */
                   1059: ENTRY(wbadaddr, R3|R4)
                   1060:        mfpr    $IPL,r1
                   1061:        mtpr    $HIGH,$IPL
                   1062:        movl    _scb+SCB_BUSERR,r2
                   1063:        movl    4(fp),r3
                   1064:        movl    8(fp),r4
                   1065:        movab   9f,_scb+SCB_BUSERR
                   1066:        bbc     $0,r4,1f; movb  15(fp), (r3)
                   1067: 1:     bbc     $1,r4,1f; movw  14(fp), (r3)
                   1068: 1:     bbc     $2,r4,1f; movl  12(fp), (r3)
                   1069: 1:     movl    $30000,r0               # delay for error interrupt
                   1070: 1:     decl    r0
                   1071:        jneq    1b
                   1072: 2:     movl    r2,_scb+SCB_BUSERR      # made it w/o machine checks; r0 is 0
                   1073:        mtpr    r1,$IPL
                   1074:        ret
                   1075: 
                   1076:        .align  2
                   1077: 9:                             # catch buss error (if it comes)
                   1078:        andl3   4(sp),$ERRCD,r0
                   1079:        cmpl    r0,$APE
                   1080:        jneq    1f
                   1081:        halt                    # address parity error
                   1082: 1:     cmpl    r0,$VBE
                   1083:        jneq    1f
                   1084:        halt                    # Versabus error
                   1085: 1:
                   1086:        movl    $1,r0           # Anything else = bad address
                   1087:        movab   8(sp),sp        # discard buss error trash
                   1088:        movab   2b,(sp)         # new program counter on stack.
                   1089:        rei
                   1090: 
                   1091: /*
                   1092:  * badcyaddr(addr)
                   1093:  *     see if access tape master controller addr causes a bus error
                   1094:  *     r0 = 0: no error; r0 = 1: timeout error.
                   1095:  */
                   1096: ENTRY(badcyaddr, 0)
                   1097:        mfpr    $IPL,r1
                   1098:        mtpr    $HIGH,$IPL
                   1099:        clrl    r2
                   1100:        movab   2f,nofault
                   1101:        movob   $-1, *4(fp)
                   1102: 1:     aobleq  $1000, r2, 1b
                   1103:        clrl    nofault                 # made it w/o bus error
                   1104:        clrl    r0
                   1105:        jbr     3f
                   1106: 2:     movl    $1,r0
                   1107: 3:     mtpr    r1,$IPL
                   1108:        ret
                   1109: 
                   1110: /*
                   1111:  * peek(addr)
                   1112:  *     fetch word and catch any bus error
                   1113:  */
                   1114: ENTRY(peek, 0)
                   1115:        mfpr    $IPL,r1
                   1116:        mtpr    $0x18,$IPL      # not reentrant
                   1117:        movl    4(fp),r2
                   1118:        movab   1f,nofault
                   1119:        movw    (r2),r0
                   1120:        clrl    nofault
                   1121:        andl2   $0xffff,r0
                   1122:        jbr     2f
                   1123: 1:     movl    $-1,r0          # bus error
                   1124: 2:     mtpr    r1,$IPL
                   1125:        ret
                   1126: 
                   1127: /*
                   1128:  * poke(addr, val)
                   1129:  *     write word and catch any bus error
                   1130:  */
                   1131: ENTRY(poke, R3)
                   1132:        mfpr    $IPL,r1
                   1133:        mtpr    $0x18,$IPL      # not reentrant
                   1134:        movl    4(fp),r2
                   1135:        movl    8(fp),r3
                   1136:        clrl    r0
                   1137:        movab   1f,nofault
                   1138:        movw    r3,(r2)
                   1139:        clrl    nofault
                   1140:        jbr     2f
                   1141: 1:     movl    $-1,r0          # bus error
                   1142: 2:     mtpr    r1,$IPL
                   1143:        ret
                   1144: 
                   1145: /*
                   1146:  * Copy a potentially overlapping block of memory.
                   1147:  *
                   1148:  * ovbcopy(src, dst, count)
                   1149:  *     caddr_t src, dst; unsigned count;
                   1150:  */
                   1151: ENTRY(ovbcopy, R3|R4)
                   1152:        movl    4(fp),r0
                   1153:        movl    8(fp),r1
                   1154:        movl    12(fp),r2
                   1155:        cmpl    r0,r1
                   1156:        bgtru   1f                      # normal forward case
                   1157:        beql    2f                      # equal, nothing to do
                   1158:        addl2   r2,r0                   # may be overlapping
                   1159:        cmpl    r0,r1
                   1160:        bgtru   3f
                   1161:        subl2   r2,r0                   # normal forward case
                   1162: 1:
                   1163:        movblk
                   1164: 2:
                   1165:        ret
                   1166: 3:
                   1167:        addl2   r2,r1                   # overlapping, must do backwards
                   1168:        subl3   r0,r1,r3
                   1169:        movl    r2,r4
                   1170:        jbr     5f
                   1171: 4:
                   1172:        subl2   r3,r0
                   1173:        subl2   r3,r1
                   1174:        movl    r3,r2
                   1175:        movblk
                   1176:        subl2   r3,r0
                   1177:        subl2   r3,r1
                   1178:        subl2   r3,r4
                   1179: 5:
                   1180:        cmpl    r4,r3
                   1181:        jgtr    4b
                   1182:        movl    r4,r2
                   1183:        subl2   r2,r0
                   1184:        subl2   r2,r1
                   1185:        movblk
                   1186:        ret
                   1187: 
                   1188: /*
                   1189:  * Copy a null terminated string from the user address space into
                   1190:  * the kernel address space.
                   1191:  *
                   1192:  * copyinstr(fromaddr, toaddr, maxlength, &lencopied)
                   1193:  */
                   1194: ENTRY(copyinstr, 0)
                   1195:        movl    12(fp),r5               # r5 = max length
                   1196:        jlss    5f
                   1197:        movl    8(fp),r4                # r4 = kernel address
                   1198:        movl    4(fp),r0                # r0 = user address
                   1199:        andl3   $(NBPG*CLSIZE-1),r0,r2  # r2 = bytes on first page
                   1200:        subl3   r2,$(NBPG*CLSIZE),r2
                   1201: 1:
                   1202:        cmpl    r5,r2                   # r2 = min(bytes on page, length left);
                   1203:        jgeq    2f
                   1204:        movl    r5,r2
                   1205: 2:
                   1206:        prober  $1,(r0),r2              # bytes accessible?
                   1207:        jeql    5f
                   1208:        subl2   r2,r5                   # update bytes left count
                   1209:        movl    r2,r3                   # r3 = saved count
                   1210:        movl    r0,r1
                   1211:        cmps3                           # check for null
                   1212:        tstl    r2
                   1213:        jneq    3f
                   1214:        subl2   r3,r0                   # back up r0
                   1215:        movl    r4,r1
                   1216:        movl    r3,r2
                   1217:        movblk                          # copy in next piece
                   1218:        movl    r1,r4
                   1219:        movl    $(NBPG*CLSIZE),r2       # check next page
                   1220:        tstl    r5                      # run out of space?
                   1221:        jneq    1b
                   1222:        movl    $ENOENT,r0              # set error code and return
                   1223:        jbr     6f
                   1224: 3:
                   1225:        tstl    16(fp)                  # return length?
                   1226:        beql    4f
                   1227:        subl3   r5,12(fp),r5            # actual len = maxlen - unused pages
                   1228:        subl2   r2,r5                   #       - unused on this page
                   1229:        addl3   $1,r5,*16(fp)           #       + the null byte
                   1230: 4:
                   1231:        movl    r4,r1
                   1232:        subl3   r2,r3,r2                # calc char cnt
                   1233:        subl2   r2,r0                   # back up r0
                   1234:        incl    r2                      # add on null byte
                   1235:        movblk                          # copy last piece
                   1236:        clrl    r0
                   1237:        ret
                   1238: 5:
                   1239:        movl    $EFAULT,r0
                   1240: 6:
                   1241:        tstl    16(fp)
                   1242:        beql    7f
                   1243:        subl3   r5,12(fp),*16(fp)
                   1244: 7:
                   1245:        ret
                   1246: 
                   1247: /*
                   1248:  * Copy a null terminated string from the kernel
                   1249:  * address space to the user address space.
                   1250:  *
                   1251:  * copyoutstr(fromaddr, toaddr, maxlength, &lencopied)
                   1252:  */
                   1253: ENTRY(copyoutstr, 0)
                   1254:        movl    12(fp),r5               # r5 = max length
                   1255:        jlss    5f
                   1256:        movl    4(fp),r0                # r0 = kernel address
                   1257:        movl    8(fp),r4                # r4 = user address
                   1258:        andl3   $(NBPG*CLSIZE-1),r4,r2  # r2 = bytes on first page
                   1259:        subl3   r2,$(NBPG*CLSIZE),r2
                   1260: 1:
                   1261:        cmpl    r5,r2                   # r2 = min(bytes on page, length left);
                   1262:        jgeq    2f
                   1263:        movl    r5,r2
                   1264: 2:
                   1265:        probew  $1,(r4),r2              # bytes accessible?
                   1266:        jeql    5f
                   1267:        subl2   r2,r5                   # update bytes left count
                   1268:        movl    r2,r3                   # r3 = saved count
                   1269:        movl    r0,r1
                   1270: /*
                   1271:  * This is a workaround for a microcode bug that causes
                   1272:  * a trap type 9 when cmps3/movs3 touches the last byte
                   1273:  * on a valid page immediately followed by an invalid page.
                   1274:  */
                   1275: #ifdef good_cmps3
                   1276:        cmps3                           # check for null
                   1277:        tstl    r2
                   1278:        jneq    3b
                   1279: #else
                   1280:        decl    r2
                   1281:        beql    9f                      # cannot handle case of r2 == 0!
                   1282:        cmps3                           # check for null up to last byte
                   1283: 9:
                   1284:        incl    r2
                   1285:        cmpl    $1,r2                   # get to last byte on page?
                   1286:        bneq    3b
                   1287:        tstb    (r0)                    # last byte on page null?
                   1288:        beql    3b
                   1289:        incl    r0                      # not null, so bump pointer
                   1290: #endif not good_cmps3
                   1291:        subl2   r3,r0                   # back up r0
                   1292:        movl    r4,r1
                   1293:        movl    r3,r2
                   1294:        movblk                          # copy out next piece
                   1295:        movl    r1,r4
                   1296:        movl    $(NBPG*CLSIZE),r2       # check next page
                   1297:        tstl    r5                      # run out of space?
                   1298:        jneq    1b
                   1299:        movl    $ENOENT,r0              # set error code and return
                   1300:        jbr     6b
                   1301: 5:
                   1302:        clrl    *$0             # this should never execute, if it does
                   1303:        movl    $EFAULT,r0      #  save me a core dump (mkm - 9/87)
                   1304: 6:
                   1305:        tstl    16(fp)
                   1306:        beql    7f
                   1307:        subl3   r5,12(fp),*16(fp)
                   1308: 7:
                   1309:        ret
                   1310: 
                   1311: 
                   1312: /*
                   1313:  * Copy a null terminated string from one point to another in
                   1314:  * the kernel address space.
                   1315:  *
                   1316:  * copystr(fromaddr, toaddr, maxlength, &lencopied)
                   1317:  */
                   1318: ENTRY(copystr, 0)
                   1319:        movl    12(fp),r3               # r3 = max length
                   1320:        jlss    5b
                   1321:        movl    4(fp),r0                # r0 = src address
                   1322:        movl    8(fp),r4                # r4 = dest address
                   1323:        clrl    r5                      # r5 = bytes left
                   1324:        movl    r3,r2                   # r2 = max bytes to copy
                   1325:        movl    r0,r1
                   1326:        cmps3                           # check for null
                   1327:        tstl    r2
                   1328:        jneq    3b
                   1329:        subl2   r3,r0                   # back up r0
                   1330:        movl    r4,r1
                   1331:        movl    r3,r2
                   1332:        movblk                          # copy next piece
                   1333:        movl    $ENOENT,r0              # set error code and return
                   1334:        jbr     6b
                   1335: 
                   1336: /*
                   1337:  * Copy a block of data from the user address space into
                   1338:  * the kernel address space.
                   1339:  *
                   1340:  * copyin(fromaddr, toaddr, count)
                   1341:  */
                   1342: ENTRY(copyin, 0)
                   1343:        movl    12(fp),r0               # copy length
                   1344:        blss    9f
                   1345:        movl    4(fp),r1                # copy user address
                   1346:        cmpl    $(CLSIZE*NBPG),r0       # probing one page or less ?
                   1347:        bgeq    2f                      # yes
                   1348: 1:
                   1349:        prober  $1,(r1),$(CLSIZE*NBPG)  # bytes accessible ?
                   1350:        beql    9f                      # no
                   1351:        addl2   $(CLSIZE*NBPG),r1       # incr user address ptr
                   1352:        _ACBL($(CLSIZE*NBPG+1),$(-CLSIZE*NBPG),r0,1b)   # reduce count and loop
                   1353: 2:
                   1354:        prober  $1,(r1),r0              # bytes accessible ?
                   1355:        beql    9f                      # no
                   1356:        MOVC3(4(fp),8(fp),12(fp))
                   1357:        clrl    r0
                   1358:        ret
                   1359: 9:
                   1360:        movl    $EFAULT,r0
                   1361:        ret
                   1362: 
                   1363: /*
                   1364:  * Copy a block of data from the kernel 
                   1365:  * address space to the user address space.
                   1366:  *
                   1367:  * copyout(fromaddr, toaddr, count)
                   1368:  */
                   1369: ENTRY(copyout, 0)
                   1370:        movl    12(fp),r0               # get count
                   1371:        blss    9b
                   1372:        movl    8(fp),r1                # get user address
                   1373:        cmpl    $(CLSIZE*NBPG),r0       # can do in one probew?
                   1374:        bgeq    2f                      # yes
                   1375: 1:
                   1376:        probew  $1,(r1),$(CLSIZE*NBPG)  # bytes accessible?
                   1377:        beql    9b                      # no 
                   1378:        addl2   $(CLSIZE*NBPG),r1       # increment user address
                   1379:        _ACBL($(CLSIZE*NBPG+1),$(-CLSIZE*NBPG),r0,1b)   # reduce count and loop
                   1380: 2:
                   1381:        probew  $1,(r1),r0              # bytes accessible?
                   1382:        beql    9b                      # no
                   1383:        MOVC3(4(fp),8(fp),12(fp))
                   1384:        clrl    r0
                   1385:        ret
                   1386: 
                   1387: /*
                   1388:  * savectx is like setjmp but saves all registers.
                   1389:  * Called before swapping out the u. area, restored by resume()
                   1390:  * below.
                   1391:  */
                   1392: ENTRY(savectx, 0)
                   1393:        movl    4(fp),r2
                   1394:        storer  $0x1ff8,(r2); addl2 $40,r2      # r3-r12
                   1395:        movl    (fp),(r2); addl2 $4,r2          # fp
                   1396:        movab   8(fp),(r2); addl2 $4,r2         # sp
                   1397:        movl    -8(fp),(r2)                     # pc
                   1398:        clrl    r0
                   1399:        ret
                   1400: 
                   1401: #ifdef KADB
                   1402: /*
                   1403:  * C library -- reset, setexit -- XXX
                   1404:  *
                   1405:  *     reset(x)
                   1406:  * will generate a "return" from
                   1407:  * the last call to
                   1408:  *     setexit()
                   1409:  * by restoring r2 - r12, fp
                   1410:  * and doing a return.
                   1411:  * The returned value is x; on the original
                   1412:  * call the returned value is 0.
                   1413:  */
                   1414: ENTRY(setexit, 0)
                   1415:        movab   setsav,r0
                   1416:        storer  $0x1ffc, (r0)
                   1417:        movl    (fp),44(r0)             # fp
                   1418:        moval   4(fp),48(r0)            # sp
                   1419:        movl    -8(fp),52(r0)           # pc
                   1420:        clrl    r0
                   1421:        ret
                   1422: 
                   1423: ENTRY(reset, 0)
                   1424:        movl    4(fp),r0        # returned value
                   1425:        movab   setsav,r1
                   1426:        loadr   $0x1ffc,(r1)
                   1427:        movl    44(r1),fp
                   1428:        movl    48(r1),sp
                   1429:        jmp     *52(r1)
                   1430: 
                   1431:        .data
                   1432:        .align  2
                   1433: setsav:        .space  14*4
                   1434:        .text
                   1435: #endif
                   1436: 
                   1437:        .globl  _whichqs
                   1438:        .globl  _qs
                   1439:        .globl  _cnt
                   1440: 
                   1441:        .globl  _noproc
                   1442:        .comm   _noproc,4
                   1443:        .globl  _runrun
                   1444:        .comm   _runrun,4
                   1445: /*
                   1446:  * The following primitives use the fancy TAHOE instructions.
                   1447:  * _whichqs tells which of the 32 queues _qs
                   1448:  * have processes in them.  setrq puts processes into queues, remrq
                   1449:  * removes them from queues.  The running process is on no queue,
                   1450:  * other processes are on a queue related to p->p_pri, divided by 4
                   1451:  * actually to shrink the 0-127 range of priorities into the 32 available
                   1452:  * queues.
                   1453:  */
                   1454: 
                   1455: /*
                   1456:  * setrq(p), using fancy TAHOE instructions.
                   1457:  *
                   1458:  * Call should be made at spl8(), and p->p_stat should be SRUN
                   1459:  */
                   1460: ENTRY(setrq, 0)
                   1461:        movl    4(fp),r0
                   1462:        tstl    P_RLINK(r0)             ## firewall: p->p_rlink must be 0
                   1463:        beql    set1                    ##
                   1464:        pushab  set3                    ##
                   1465:        callf   $8,_panic               ##
                   1466: set1:
                   1467:        movzbl  P_PRI(r0),r1            # put on queue which is p->p_pri / 4
                   1468:        shar    $2,r1,r1
                   1469:        shal    $1,r1,r2
                   1470:        moval   _qs[r2],r2
                   1471:        insque  (r0),*4(r2)             # at end of queue
                   1472:        shal    r1,$1,r1
                   1473:        orl2    r1,_whichqs             # mark queue non-empty
                   1474:        ret
                   1475: 
                   1476: set3:  .asciz  "setrq"
                   1477: 
                   1478: /*
                   1479:  * remrq(p), using fancy TAHOE instructions
                   1480:  *
                   1481:  * Call should be made at spl8().
                   1482:  */
                   1483: ENTRY(remrq, 0)
                   1484:        movl    4(fp),r0
                   1485:        movzbl  P_PRI(r0),r1
                   1486:        shar    $2,r1,r1
                   1487:        bbs     r1,_whichqs,rem1
                   1488:        pushab  rem3                    # it wasn't recorded to be on its q
                   1489:        callf   $8,_panic
                   1490: rem1:
                   1491:        remque  (r0)
                   1492:        bneq    rem2                    # q not empty yet
                   1493:        shal    r1,$1,r1
                   1494:        mcoml   r1,r1
                   1495:        andl2   r1,_whichqs             # mark queue empty
                   1496: rem2:
                   1497:        clrl    P_RLINK(r0)             ## for firewall checking
                   1498:        ret
                   1499: 
                   1500: rem3:  .asciz  "remrq"
                   1501: 
                   1502: /*
                   1503:  * Masterpaddr is the p->p_addr of the running process on the master
                   1504:  * processor.  When a multiprocessor system, the slave processors will have
                   1505:  * an array of slavepaddr's.
                   1506:  */
                   1507:        .globl  _masterpaddr
                   1508:        .data
                   1509:        .align  2
                   1510: _masterpaddr: .long    0
                   1511: 
                   1512:        .text
                   1513: sw0:   .asciz  "swtch"
                   1514: 
                   1515: /*
                   1516:  * When no processes are on the runq, swtch branches to idle
                   1517:  * to wait for something to come ready.
                   1518:  */
                   1519:        .globl  Idle
                   1520: Idle: idle:
                   1521:        movl    $1,_noproc
                   1522:        mtpr    $0,$IPL                 # must allow interrupts here
                   1523: 1:
                   1524:        tstl    _whichqs                # look for non-empty queue
                   1525:        bneq    sw1
                   1526:        brb     1b
                   1527: 
                   1528: badsw: pushab  sw0
                   1529:        callf   $8,_panic
                   1530:        /* NOTREACHED */
                   1531: 
                   1532:        .align  2
                   1533: /*
                   1534:  * swtch(), using fancy tahoe instructions
                   1535:  */
                   1536: ENTRY(swtch, 0)
                   1537:        movl    (fp),fp                 # prepare for rei
                   1538:        movl    (sp),4(sp)              # saved pc
                   1539:        tstl    (sp)+
                   1540:        movpsl  4(sp)
                   1541:        incl    _cnt+V_SWTCH
                   1542: sw1:   ffs     _whichqs,r0             # look for non-empty queue
                   1543:        blss    idle                    # if none, idle
                   1544:        mtpr    $0x18,$IPL              # lock out all so _whichqs==_qs
                   1545:        bbc     r0,_whichqs,sw1         # proc moved via interrupt
                   1546:        shal    $1,r0,r1
                   1547:        moval   _qs[r1],r1
                   1548:        movl    (r1),r2                 # r2 = p = highest pri process
                   1549:        remque  *(r1)
                   1550:        bvs     badsw                   # make sure something was there
                   1551:        bneq    sw2
                   1552:        shal    r0,$1,r1
                   1553:        mcoml   r1,r1
                   1554:        andl2   r1,_whichqs             # no more procs in this queue
                   1555: sw2:
                   1556:        clrl    _noproc
                   1557:        clrl    _runrun
                   1558: #ifdef notdef
                   1559:        tstl    P_WCHAN(r2)             ## firewalls
                   1560:        bneq    badsw                   ##
                   1561:        cmpb    P_STAT(r2),$SRUN        ##
                   1562:        bneq    badsw                   ##
                   1563: #endif
                   1564:        clrl    P_RLINK(r2)             ##
                   1565:        movl    *P_ADDR(r2),r0
                   1566: #ifdef notdef
                   1567:        cmpl    r0,_masterpaddr         # resume of current proc is easy
                   1568:        beql    res0
                   1569: #endif
                   1570:        movl    r0,_masterpaddr
                   1571:        shal    $PGSHIFT,r0,r0          # r0 = pcbb(p)
                   1572:        brb     swresume
                   1573: 
                   1574: /*
                   1575:  * resume(pf)
                   1576:  */
                   1577: ENTRY(resume, 0)
                   1578:        shal    $PGSHIFT,4(fp),r0       # r0 = pcbb(pf)
                   1579:        movl    (fp),fp                 # prepare for rei
                   1580:        movl    (sp)+,4(sp)             # saved pc
                   1581:        tstl    (sp)+
                   1582:        movpsl  4(sp)
                   1583: swresume:
                   1584:        mtpr    $0x18,$IPL              # no interrupts, please
                   1585:        movl    _CMAP2,_u+PCB_CMAP2     # yech
                   1586:        REST_ACC                        # restore original accumulator
                   1587:        svpctx
                   1588:        mtpr    r0,$PCBB
                   1589:        ldpctx
                   1590:        movl    _u+PCB_CMAP2,_CMAP2     # yech
                   1591:        mtpr    $_CADDR2,$TBIS
                   1592: res0:
                   1593:        movl    _u+U_PROCP,r2           # r2 = u.u_procp
                   1594:        tstl    P_CKEY(r2)              # does proc have code key?
                   1595:        bneq    1f
                   1596:        callf   $4,_getcodekey          # no, give him one
                   1597:        movl    _u+U_PROCP,r2           # r2 = u.u_procp
                   1598:        movl    r0,P_CKEY(r2)
                   1599: 1:
                   1600:        tstl    P_DKEY(r2)              # does proc have data key?
                   1601:        bneq    1f
                   1602:        callf   $4,_getdatakey          # no, give him one
                   1603:        movl    _u+U_PROCP,r2           # r2 = u.u_procp
                   1604:        movl    r0,P_DKEY(r2)
                   1605: 1:
                   1606:        mtpr    P_CKEY(r2),$CCK         # set code cache key
                   1607:        mtpr    P_DKEY(r2),$DCK         # set data cache key
                   1608:        tstl    _u+PCB_SSWAP
                   1609:        bneq    res1
                   1610:        rei
                   1611: res1:                                  # restore alternate saved context
                   1612:        movl    _u+PCB_SSWAP,r2
                   1613:        clrl    _u+PCB_SSWAP
                   1614:        loadr   $0x3ff8,(r2); addl2 $44,r2      # restore r3-r13 (r13=fp)
                   1615:        movl    (r2),r1; addl2 $4,r2    # fetch previous sp ...
                   1616:        movab   (sp),r0                 # ... and current sp and
                   1617:        cmpl    r1,r0                   # check for credibility,
                   1618:        bgequ   1f                      # if further up stack ...
                   1619:        pushab 2f; callf $8,_panic      # ... panic
                   1620:        /*NOTREACHED*/
                   1621: 1:                                     # sp ok, complete return
                   1622:        movl    r1,sp                   # restore sp
                   1623:        pushl   $PSL_PRVMOD             # kernel mode, ipl 0
                   1624:        pushl   (r2)                    # return address
                   1625:        rei
                   1626: 2:     .asciz  "ldctx"
                   1627: 
                   1628: /*
                   1629:  * {fu,su},{byte,word}
                   1630:  */
                   1631: ENTRY(fuword, 0)
                   1632:        movl    4(fp), r1
                   1633:        prober  $1,(r1),$4              # check access
                   1634:        beql    fserr                   # page unreadable
                   1635:        bitl    $1,r1                   # check byte alignment
                   1636:        bneq    2f                      # odd, do byte-word-byte
                   1637:        bitl    $2,r1                   # check word alignment
                   1638:        bneq    1f                      # odd, do in 2 words
                   1639:        movl    (r1),r0                 # move longword
                   1640:        ret
                   1641: 1:
                   1642:        movw    (r1),r0                 # move two words
                   1643:        shal    $16,r0,r0
                   1644:        movzwl  2(r1),r1                # orw2 sign extends
                   1645:        orl2    r1,r0
                   1646:        ret
                   1647: 2:
                   1648:        movb    (r1),r0                 # move byte-word-byte
                   1649:        shal    $24,r0,r0
                   1650:        movzwl  1(r1),r2                # orw2 sign extends
                   1651:        shal    $8,r2,r2
                   1652:        movzbl  3(r1),r1                # orb2 sign extends
                   1653:        orl2    r2,r1
                   1654:        orl2    r1,r0
                   1655:        ret
                   1656: fserr:
                   1657:        mnegl   $1,r0
                   1658:        ret
                   1659: 
                   1660: ENTRY(fubyte, 0)
                   1661:        prober  $1,*4(fp),$1
                   1662:        beql    fserr
                   1663:        movzbl  *4(fp),r0
                   1664:        ret
                   1665: 
                   1666: ENTRY(suword, 0)
                   1667:        movl    4(fp), r0
                   1668:        probew  $1,(r0),$4              # check access
                   1669:        beql    fserr                   # page unwritable
                   1670:        bitl    $1,r0                   # check byte alignment
                   1671:        bneq    1f                      # odd byte boundary
                   1672:        bitl    $2,r0                   # check word alignment
                   1673:        beql    2f                      # longword aligned
                   1674:        movw    8(fp),(r0)              # move two words
                   1675:        movw    10(fp),2(r0)
                   1676:        jbr     3f
                   1677: 1:
                   1678:        movb    8(fp),(r0)
                   1679:        movb    9(fp),1(r0)
                   1680:        movb    10(fp),2(r0)
                   1681:        movb    11(fp),3(r0)
                   1682:        jbr     3f
                   1683: 2:
                   1684:        movl    8(fp),(r0)
                   1685: 3:
                   1686:        clrl    r0
                   1687:        ret
                   1688: 
                   1689: ENTRY(subyte, 0)
                   1690:        probew  $1,*4(fp),$1
                   1691:        beql    fserr
                   1692:        movb    11(fp),*4(fp)
                   1693:        clrl    r0
                   1694:        ret
                   1695: 
                   1696: /*
                   1697:  * Copy 1 relocation unit (NBPG bytes)
                   1698:  * from user virtual address to physical address
                   1699:  */
                   1700: ENTRY(copyseg, 0)
                   1701:        orl3    $PG_V|PG_KW,8(fp),_CMAP2
                   1702:        mtpr    $_CADDR2,$TBIS  # invalidate entry for copy 
                   1703:        MOVC3(4(fp),$_CADDR2,$NBPG)
                   1704:        ret
                   1705: 
                   1706: /*
                   1707:  * Clear a page of memory.  The page frame is specified.
                   1708:  *
                   1709:  * clearseg(pf);
                   1710:  */
                   1711: ENTRY(clearseg, 0)
                   1712:        orl3    $PG_V|PG_KW,4(fp),_CMAP1        # Maps to virtual addr CADDR1
                   1713:        mtpr    $_CADDR1,$TBIS
                   1714:        movl    $255,r0                         # r0 = limit
                   1715:        clrl    r1                              # r1 = index of cleared long
                   1716: 1:
                   1717:        clrl    _CADDR1[r1]
                   1718:        aobleq  r0,r1,1b
                   1719:        ret
                   1720: 
                   1721: /*
                   1722:  * Check user mode read/write access.
                   1723:  *
                   1724:  * useracc(addr, count, mode)
                   1725:  *     caddr_t addr; int count, mode;
                   1726:  * mode = 0    write access
                   1727:  * mode = 1    read access
                   1728:  */
                   1729: ENTRY(useracc, 0)
                   1730:        movl    $1,r2                   # r2 = 'user mode' for probew/probew
                   1731: probes:
                   1732:        movl    4(fp),r0                # get va
                   1733:        movl    8(fp),r1                # count
                   1734:        tstl    12(fp)                  # test for read access ?
                   1735:        bneq    userar                  # yes
                   1736:        cmpl    $(CLSIZE*NBPG),r1       # can we do it in one probe ?
                   1737:        bgeq    uaw2                    # yes
                   1738: uaw1:
                   1739:        probew  r2,(r0),$(CLSIZE*NBPG)
                   1740:        beql    uaerr                   # no access
                   1741:        addl2   $(CLSIZE*NBPG),r0
                   1742:        _ACBL($(CLSIZE*NBPG+1),$(-CLSIZE*NBPG),r1,uaw1)
                   1743: uaw2:
                   1744:        probew  r2,(r0),r1
                   1745:        beql    uaerr
                   1746:        movl    $1,r0
                   1747:        ret
                   1748: userar:
                   1749:        cmpl    $(CLSIZE*NBPG),r1
                   1750:        bgeq    uar2
                   1751: uar1:
                   1752:        prober  r2,(r0),$(CLSIZE*NBPG)
                   1753:        beql    uaerr
                   1754:        addl2   $(CLSIZE*NBPG),r0
                   1755:        _ACBL($(CLSIZE*NBPG+1),$(-CLSIZE*NBPG),r1,uar1)
                   1756: uar2:
                   1757:        prober  r2,(r0),r1
                   1758:        beql    uaerr
                   1759:        movl    $1,r0
                   1760:        ret
                   1761: uaerr:
                   1762:        clrl    r0
                   1763:        ret
                   1764: 
                   1765: /*
                   1766:  * Check kernel mode read/write access.
                   1767:  *
                   1768:  * kernacc(addr, count, mode)
                   1769:  *     caddr_t addr; int count, mode;
                   1770:  * mode = 0    write access
                   1771:  * mode = 1    read access
                   1772:  */
                   1773: ENTRY(kernacc, 0)
                   1774:        clrl    r2              # r2 = 0 means kernel mode probe.
                   1775:        jbr     probes          # Dijkstra would get gastric distress here.
                   1776: 
                   1777: /*
                   1778:  * addupc - increment some histogram counter
                   1779:  *     in the profiling buffer
                   1780:  *
                   1781:  * addupc(pc, prof, delta)
                   1782:  *     long pc; short delta; struct uprof *prof;
                   1783:  * 
                   1784:  * struct uprof {              # profile arguments 
                   1785:  *     short   *r_base;        # buffer base 
                   1786:  *     unsigned pr_size;       # buffer size 
                   1787:  *     unsigned pr_off;        # pc offset 
                   1788:  *     unsigned pr_scale;      # pc scaling 
                   1789:  * }
                   1790:  */
                   1791: ENTRY(addupc, 0)
                   1792:        movl    8(fp),r2                # r2 points to structure
                   1793:        subl3   8(r2),4(fp),r0          # r0 = PC - lowpc
                   1794:        jlss    9f                      # PC < lowpc , out of range !
                   1795:        shrl    $1,r0,r0                # the unit is words
                   1796:        shrl    $1,12(r2),r1            # ditto for scale
                   1797:        emul    r1,r0,$0,r0
                   1798:        shrq    $14,r0,r0
                   1799:        tstl    r0                      # too big
                   1800:        jneq    9f
                   1801:        cmpl    r1,4(r2)                # Check buffer overflow
                   1802:        jgequ   9f
                   1803:        probew  $1,*0(r2)[r1],$2        # counter accessible?
                   1804:        jeql    9f
                   1805:        shrl    $1,r1,r1                # make r1 word index
                   1806:        addw2   14(fp),*0(r2)[r1]
                   1807: 9:     ret
                   1808: 
                   1809: /*
                   1810:  * scanc(size, cp, table, mask)
                   1811:  */
                   1812: ENTRY(scanc, R3|R4)
                   1813:        movl    8(fp),r0                # r0 = cp
                   1814:        addl3   4(fp),r0,r2             # end = &cp[size]
                   1815:        movl    12(fp),r1               # r1 = table
                   1816:        movb    19(fp),r4               # r4 = mask
                   1817:        decl    r0                      # --cp
                   1818:        jbr     0f                      # just like Fortran...
                   1819: 1:                                     # do {
                   1820:        movzbl  (r0),r3 
                   1821:        bitb    r4,(r1)[r3]             #       if (table[*cp] & mask)
                   1822:        jneq    2f                      #               break;
                   1823: 0:     aoblss  r2,r0,1b                # } while (++cp < end);
                   1824: 2:
                   1825:        subl3   r0,r2,r0; ret           # return (end - cp);
                   1826: 
                   1827: /*
                   1828:  * skpc(mask, size, cp)
                   1829:  */
                   1830: ENTRY(skpc, 0)
                   1831:        movl    12(fp),r0               # r0 = cp
                   1832:        addl3   8(fp),r0,r1             # r1 = end = &cp[size];
                   1833:        movb    7(fp),r2                # r2 = mask
                   1834:        decl    r0                      # --cp;
                   1835:        jbr     0f
                   1836: 1:                                     # do
                   1837:        cmpb    (r0),r2                 #       if (*cp != mask)
                   1838:        jneq    2f                      #               break;
                   1839: 0:     aoblss  r1,r0,1b                # while (++cp < end);
                   1840: 2:
                   1841:        subl3   r0,r1,r0; ret           # return (end - cp);
                   1842: 
                   1843: /*
                   1844:  * locc(mask, size, cp)
                   1845:  */
                   1846: ENTRY(locc, 0)
                   1847:        movl    12(fp),r0               # r0 = cp
                   1848:        addl3   8(fp),r0,r1             # r1 = end = &cp[size]
                   1849:        movb    7(fp),r2                # r2 = mask
                   1850:        decl    r0                      # --cp;
                   1851:        jbr     0f
                   1852: 1:                                     # do
                   1853:        cmpb    (r0),r2                 #       if (*cp == mask)
                   1854:        jeql    2f                      #               break;
                   1855: 0:     aoblss  r1,r0,1b                # while (++cp < end);
                   1856: 2:
                   1857:        subl3   r0,r1,r0; ret           # return (end - cp);
                   1858: 
                   1859: #ifdef ALIGN
                   1860: #include "../tahoealign/align.h"
                   1861: 
                   1862:        .globl  _alignment
                   1863: /*
                   1864:  * There's an intimate relationship between this piece of code
                   1865:  * and the alignment emulation code (especially the layout
                   1866:  * of local variables in alignment.c! Don't change unless
                   1867:  * you update both this, alignment.h and alignment.c !!
                   1868:  */
                   1869: non_aligned:
                   1870:        orb2    $EMULATEALIGN,_u+U_EOSYS
                   1871:        incl    _cnt+V_TRAP
                   1872:        incl    _cnt+V_ALIGN            # count emulated alignment traps
                   1873:        moval   4(sp),_user_psl
                   1874:        SAVE_FPSTAT(4)                  # Also zeroes out ret_exception !
                   1875:        pushl   $0                      # ret_addr
                   1876:        pushl   $0                      # ret_code
                   1877:        mfpr    $USP,-(sp)              # user sp
                   1878:        callf   $4,_alignment           # call w/o parms so regs may be modified
                   1879:        /*
                   1880:         * We return here after a successful emulation or an exception.
                   1881:         * The registers have been restored and we must not alter them
                   1882:         * before returning to the user.
                   1883:         */
                   1884: 2:     mtpr    (sp)+,$USP              # restore user sp
                   1885:        tstl    8(sp)                   # Any exception ?
                   1886:        bneq    got_excp                # Yes, reflect it back to user.
                   1887:        moval   8(sp),sp                # pop 2 zeroes pushed above
                   1888:        REST_FPSTAT
                   1889:        xorb2   $EMULATEALIGN,_u+U_EOSYS
                   1890: 
                   1891:        bitl    $PSL_T,4(sp)            # check for trace bit set
                   1892:        beql    9f
                   1893:        CHECK_SFE(4)
                   1894:        pushl $0
                   1895:        SAVE_FPSTAT(8)
                   1896:        TRAP(TRCTRAP)
                   1897: 9:     rei
                   1898: 
                   1899: got_excp:                              # decode exception
                   1900:        casel   8(sp),$ILL_ADDRMOD,$ALIGNMENT
                   1901:        .align  1
                   1902: L1:
                   1903:        .word   ill_addrmod-L1
                   1904:        .word   ill_access-L1
                   1905:        .word   ill_oprnd-L1
                   1906:        .word   arithmetic-L1
                   1907:        .word   alignment-L1
                   1908:        brw     alignment               # default - shouldn't come here at all !
                   1909: 
                   1910: ill_addrmod:                           # No other parameters. Set up stack as
                   1911:        moval   8(sp),sp                # the HW would do it in a real case.
                   1912:        REST_FPSTAT
                   1913:        jbr     _Xresadflt
                   1914: ill_oprnd:
                   1915:        moval   8(sp),sp
                   1916:        REST_FPSTAT
                   1917:        jbr     _Xresopflt
                   1918: alignment:
                   1919:        moval   8(sp),sp
                   1920:        REST_FPSTAT
                   1921:        jbr     align_excp      # NB: going to _Xalignflt would cause loop
                   1922: ill_access:
                   1923:        /*
                   1924:         * Must restore accumulator w/o modifying sp and w/o using
                   1925:         * registers.  Solution: copy things needed by REST_FPSTAT.
                   1926:         */
                   1927:        pushl   20(sp)                  # The flags longword
                   1928:        pushl   20(sp)                  # acc_low
                   1929:        pushl   20(sp)                  # acc_high
                   1930:        pushl   20(sp)                  # ret_exception ignored by REST_FPSTAT 
                   1931:        REST_FPSTAT                     # Back where we were with the sp !
                   1932:        movl    (sp),16(sp)             # code for illegal access
                   1933:        movl    4(sp),20(sp)            # original virtual address
                   1934:        moval   16(sp),sp               # Just like the HW would set it up
                   1935:        jbr     _Xprotflt
                   1936: arithmetic:                            # same trickery as above
                   1937:        pushl   20(sp)                  # The flags longword
                   1938:        pushl   20(sp)                  # acc_low
                   1939:        pushl   20(sp)                  # acc_high
                   1940:        pushl   20(sp)                  # ret_exception ignored by REST_FPSTAT 
                   1941:        REST_FPSTAT                     # Back where we were with the sp !
                   1942:        movl    (sp),20(sp)             # code for arithmetic exception
                   1943:        moval   20(sp),sp               # Just like the HW would set it up
                   1944:        jbr     _Xarithtrap
                   1945: #endif
                   1946: SCBVEC(vdintr0):
                   1947:        CHECK_SFE(4)
                   1948:        SAVE_FPSTAT(4)
                   1949:        PUSHR
                   1950:        incl    _fltintrcnt+(4*0)
                   1951:        pushl   $0
                   1952:        callf   $8,_vdintr
                   1953:        incl    _cnt+V_INTR
                   1954:        POPR
                   1955:        REST_FPSTAT
                   1956:        rei
                   1957: 
                   1958: SCBVEC(vdintr1):
                   1959:        CHECK_SFE(4)
                   1960:        SAVE_FPSTAT(4)
                   1961:        PUSHR
                   1962:        incl    _fltintrcnt+(4*1)
                   1963:        pushl   $1
                   1964:        callf   $8,_vdintr
                   1965:        incl    _cnt+V_INTR
                   1966:        POPR
                   1967:        REST_FPSTAT
                   1968:        rei
                   1969: 
                   1970: SCBVEC(vdintr2):
                   1971:        CHECK_SFE(4)
                   1972:        SAVE_FPSTAT(4)
                   1973:        PUSHR
                   1974:        incl    _fltintrcnt+(4*2)
                   1975:        pushl   $2
                   1976:        callf   $8,_vdintr
                   1977:        incl    _cnt+V_INTR
                   1978:        POPR
                   1979:        REST_FPSTAT
                   1980:        rei
                   1981: 
                   1982: SCBVEC(cyintr0):
                   1983:        CHECK_SFE(4)
                   1984:        SAVE_FPSTAT(4)
                   1985:        PUSHR
                   1986:        incl    _fltintrcnt+(4*3)
                   1987:        pushl   $0
                   1988:        callf   $8,_cyintr
                   1989:        incl    _cnt+V_INTR
                   1990:        POPR
                   1991:        REST_FPSTAT
                   1992:        rei
                   1993: 
                   1994: SCBVEC(cyintr1):
                   1995:        CHECK_SFE(4)
                   1996:        SAVE_FPSTAT(4)
                   1997:        PUSHR
                   1998:        incl    _fltintrcnt+(4*4)
                   1999:        pushl   $1
                   2000:        callf   $8,_cyintr
                   2001:        incl    _cnt+V_INTR
                   2002:        POPR
                   2003:        REST_FPSTAT
                   2004:        rei
                   2005: 
                   2006: SCBVEC(vackint0):
                   2007:        CHECK_SFE(4)
                   2008:        SAVE_FPSTAT(4)
                   2009:        PUSHR
                   2010:        incl    _fltintrcnt+(4*5)
                   2011:        pushl   $0
                   2012:        callf   $8,_vackint
                   2013:        incl    _cnt+V_INTR
                   2014:        POPR
                   2015:        REST_FPSTAT
                   2016:        rei
                   2017: 
                   2018: SCBVEC(vcmdrsp0):
                   2019:        CHECK_SFE(4)
                   2020:        SAVE_FPSTAT(4)
                   2021:        PUSHR
                   2022:        incl    _fltintrcnt+(4*6)
                   2023:        pushl   $0
                   2024:        callf   $8,_vcmdrsp
                   2025:        incl    _cnt+V_INTR
                   2026:        POPR
                   2027:        REST_FPSTAT
                   2028:        rei
                   2029: 
                   2030: SCBVEC(vunsol0):
                   2031:        CHECK_SFE(4)
                   2032:        SAVE_FPSTAT(4)
                   2033:        PUSHR
                   2034:        incl    _fltintrcnt+(4*7)
                   2035:        pushl   $0
                   2036:        callf   $8,_vunsol
                   2037:        incl    _cnt+V_INTR
                   2038:        POPR
                   2039:        REST_FPSTAT
                   2040:        rei
                   2041: 
                   2042: SCBVEC(vackint1):
                   2043:        CHECK_SFE(4)
                   2044:        SAVE_FPSTAT(4)
                   2045:        PUSHR
                   2046:        incl    _fltintrcnt+(4*8)
                   2047:        pushl   $1
                   2048:        callf   $8,_vackint
                   2049:        incl    _cnt+V_INTR
                   2050:        POPR
                   2051:        REST_FPSTAT
                   2052:        rei
                   2053: 
                   2054: SCBVEC(vcmdrsp1):
                   2055:        CHECK_SFE(4)
                   2056:        SAVE_FPSTAT(4)
                   2057:        PUSHR
                   2058:        incl    _fltintrcnt+(4*9)
                   2059:        pushl   $1
                   2060:        callf   $8,_vcmdrsp
                   2061:        incl    _cnt+V_INTR
                   2062:        POPR
                   2063:        REST_FPSTAT
                   2064:        rei
                   2065: 
                   2066: SCBVEC(vunsol1):
                   2067:        CHECK_SFE(4)
                   2068:        SAVE_FPSTAT(4)
                   2069:        PUSHR
                   2070:        incl    _fltintrcnt+(4*10)
                   2071:        pushl   $1
                   2072:        callf   $8,_vunsol
                   2073:        incl    _cnt+V_INTR
                   2074:        POPR
                   2075:        REST_FPSTAT
                   2076:        rei
                   2077: 
                   2078: SCBVEC(mpintr0):
                   2079:        CHECK_SFE(4)
                   2080:        SAVE_FPSTAT(4)
                   2081:        PUSHR
                   2082:        incl    _fltintrcnt+(4*11)
                   2083:        pushl   $0
                   2084:        callf   $8,_mpintr
                   2085:        incl    _cnt+V_INTR
                   2086:        POPR
                   2087:        REST_FPSTAT
                   2088:        rei
                   2089: 
                   2090: SCBVEC(mpdlintr0):
                   2091:        CHECK_SFE(4)
                   2092:        SAVE_FPSTAT(4)
                   2093:        PUSHR
                   2094:        incl    _fltintrcnt+(4*12)
                   2095:        pushl   $0
                   2096:        callf   $8,_mpdlintr
                   2097:        incl    _cnt+V_INTR
                   2098:        POPR
                   2099:        REST_FPSTAT
                   2100:        rei
                   2101: 
                   2102: SCBVEC(mpintr1):
                   2103:        CHECK_SFE(4)
                   2104:        SAVE_FPSTAT(4)
                   2105:        PUSHR
                   2106:        incl    _fltintrcnt+(4*13)
                   2107:        pushl   $1
                   2108:        callf   $8,_mpintr
                   2109:        incl    _cnt+V_INTR
                   2110:        POPR
                   2111:        REST_FPSTAT
                   2112:        rei
                   2113: 
                   2114: SCBVEC(mpdlintr1):
                   2115:        CHECK_SFE(4)
                   2116:        SAVE_FPSTAT(4)
                   2117:        PUSHR
                   2118:        incl    _fltintrcnt+(4*14)
                   2119:        pushl   $1
                   2120:        callf   $8,_mpdlintr
                   2121:        incl    _cnt+V_INTR
                   2122:        POPR
                   2123:        REST_FPSTAT
                   2124:        rei
                   2125: 
                   2126: SCBVEC(acecint0):
                   2127:        CHECK_SFE(4)
                   2128:        SAVE_FPSTAT(4)
                   2129:        PUSHR
                   2130:        incl    _fltintrcnt+(4*15)
                   2131:        pushl   $0
                   2132:        callf   $8,_acecint
                   2133:        incl    _cnt+V_INTR
                   2134:        POPR
                   2135:        REST_FPSTAT
                   2136:        rei
                   2137: 
                   2138: SCBVEC(acerint0):
                   2139:        CHECK_SFE(4)
                   2140:        SAVE_FPSTAT(4)
                   2141:        PUSHR
                   2142:        incl    _fltintrcnt+(4*16)
                   2143:        pushl   $0
                   2144:        callf   $8,_acerint
                   2145:        incl    _cnt+V_INTR
                   2146:        POPR
                   2147:        REST_FPSTAT
                   2148:        rei
                   2149: 
                   2150: SCBVEC(acecint1):
                   2151:        CHECK_SFE(4)
                   2152:        SAVE_FPSTAT(4)
                   2153:        PUSHR
                   2154:        incl    _fltintrcnt+(4*17)
                   2155:        pushl   $1
                   2156:        callf   $8,_acecint
                   2157:        incl    _cnt+V_INTR
                   2158:        POPR
                   2159:        REST_FPSTAT
                   2160:        rei
                   2161: 
                   2162: SCBVEC(acerint1):
                   2163:        CHECK_SFE(4)
                   2164:        SAVE_FPSTAT(4)
                   2165:        PUSHR
                   2166:        incl    _fltintrcnt+(4*18)
                   2167:        pushl   $1
                   2168:        callf   $8,_acerint
                   2169:        incl    _cnt+V_INTR
                   2170:        POPR
                   2171:        REST_FPSTAT
                   2172:        rei
                   2173: 
                   2174: SCBVEC(enpintr0):
                   2175:        CHECK_SFE(4)
                   2176:        SAVE_FPSTAT(4)
                   2177:        PUSHR
                   2178:        incl    _fltintrcnt+(4*19)
                   2179:        pushl   $0
                   2180:        callf   $8,_enpintr
                   2181:        incl    _cnt+V_INTR
                   2182:        POPR
                   2183:        REST_FPSTAT
                   2184:        rei
                   2185: 
                   2186: SCBVEC(enpintr1):
                   2187:        CHECK_SFE(4)
                   2188:        SAVE_FPSTAT(4)
                   2189:        PUSHR
                   2190:        incl    _fltintrcnt+(4*20)
                   2191:        pushl   $1
                   2192:        callf   $8,_enpintr
                   2193:        incl    _cnt+V_INTR
                   2194:        POPR
                   2195:        REST_FPSTAT
                   2196:        rei
                   2197: 
                   2198: SCBVEC(drintr0):
                   2199:        CHECK_SFE(4)
                   2200:        SAVE_FPSTAT(4)
                   2201:        PUSHR
                   2202:        incl    _fltintrcnt+(4*21)
                   2203:        pushl   $0
                   2204:        callf   $8,_drintr
                   2205:        incl    _cnt+V_INTR
                   2206:        POPR
                   2207:        REST_FPSTAT
                   2208:        rei
                   2209: 
                   2210: SCBVEC(ikintr0):
                   2211:        CHECK_SFE(4)
                   2212:        SAVE_FPSTAT(4)
                   2213:        PUSHR
                   2214:        incl    _fltintrcnt+(4*22)
                   2215:        pushl   $0
                   2216:        callf   $8,_ikintr
                   2217:        incl    _cnt+V_INTR
                   2218:        POPR
                   2219:        REST_FPSTAT
                   2220:        rei
                   2221: 
                   2222: SCBVEC(hdintr0):
                   2223:        CHECK_SFE(4)
                   2224:        SAVE_FPSTAT(4)
                   2225:        PUSHR
                   2226:        incl    _fltintrcnt+(4*23)
                   2227:        pushl   $0
                   2228:        callf   $8,_hdintr
                   2229:        incl    _cnt+V_INTR
                   2230:        POPR
                   2231:        REST_FPSTAT
                   2232:        rei
                   2233: 
                   2234: SCBVEC(hdintr1):
                   2235:        CHECK_SFE(4)
                   2236:        SAVE_FPSTAT(4)
                   2237:        PUSHR
                   2238:        incl    _fltintrcnt+(4*24)
                   2239:        pushl   $1
                   2240:        callf   $8,_hdintr
                   2241:        incl    _cnt+V_INTR
                   2242:        POPR
                   2243:        REST_FPSTAT
                   2244:        rei
                   2245: 
                   2246: SCBVEC(vackint2):
                   2247:        CHECK_SFE(4)
                   2248:        SAVE_FPSTAT(4)
                   2249:        PUSHR
                   2250:        incl    _fltintrcnt+(4*25)
                   2251:        pushl   $2
                   2252:        callf   $8,_vackint
                   2253:        incl    _cnt+V_INTR
                   2254:        POPR
                   2255:        REST_FPSTAT
                   2256:        rei
                   2257: 
                   2258: SCBVEC(vcmdrsp2):
                   2259:        CHECK_SFE(4)
                   2260:        SAVE_FPSTAT(4)
                   2261:        PUSHR
                   2262:        incl    _fltintrcnt+(4*26)
                   2263:        pushl   $2
                   2264:        callf   $8,_vcmdrsp
                   2265:        incl    _cnt+V_INTR
                   2266:        POPR
                   2267:        REST_FPSTAT
                   2268:        rei
                   2269: 
                   2270: SCBVEC(vunsol2):
                   2271:        CHECK_SFE(4)
                   2272:        SAVE_FPSTAT(4)
                   2273:        PUSHR
                   2274:        incl    _fltintrcnt+(4*27)
                   2275:        pushl   $2
                   2276:        callf   $8,_vunsol
                   2277:        incl    _cnt+V_INTR
                   2278:        POPR
                   2279:        REST_FPSTAT
                   2280:        rei
                   2281: 
                   2282: SCBVEC(vackint3):
                   2283:        CHECK_SFE(4)
                   2284:        SAVE_FPSTAT(4)
                   2285:        PUSHR
                   2286:        incl    _fltintrcnt+(4*28)
                   2287:        pushl   $3
                   2288:        callf   $8,_vackint
                   2289:        incl    _cnt+V_INTR
                   2290:        POPR
                   2291:        REST_FPSTAT
                   2292:        rei
                   2293: 
                   2294: SCBVEC(vcmdrsp3):
                   2295:        CHECK_SFE(4)
                   2296:        SAVE_FPSTAT(4)
                   2297:        PUSHR
                   2298:        incl    _fltintrcnt+(4*29)
                   2299:        pushl   $3
                   2300:        callf   $8,_vcmdrsp
                   2301:        incl    _cnt+V_INTR
                   2302:        POPR
                   2303:        REST_FPSTAT
                   2304:        rei
                   2305: 
                   2306: SCBVEC(vunsol3):
                   2307:        CHECK_SFE(4)
                   2308:        SAVE_FPSTAT(4)
                   2309:        PUSHR
                   2310:        incl    _fltintrcnt+(4*30)
                   2311:        pushl   $3
                   2312:        callf   $8,_vunsol
                   2313:        incl    _cnt+V_INTR
                   2314:        POPR
                   2315:        REST_FPSTAT
                   2316:        rei
                   2317: 
                   2318: SCBVEC(exintr0):
                   2319:        CHECK_SFE(4)
                   2320:        SAVE_FPSTAT(4)
                   2321:        PUSHR
                   2322:        incl    _fltintrcnt+(4*31)
                   2323:        pushl   $0
                   2324:        callf   $8,_exintr
                   2325:        incl    _cnt+V_INTR
                   2326:        POPR
                   2327:        REST_FPSTAT
                   2328:        rei
                   2329: 
                   2330: 
                   2331:        .globl  _intrnames
                   2332: 
                   2333:        .globl  _eintrnames
                   2334:        .data
                   2335: _intrnames:
                   2336:        .asciz  "clock"
                   2337:        .asciz  "cnr"
                   2338:        .asciz  "cnx"
                   2339:        .asciz  "rmtr"
                   2340:        .asciz  "rmtx"
                   2341:        .asciz  "buserr"
                   2342:        .asciz  "vd0"
                   2343:        .asciz  "vd1"
                   2344:        .asciz  "vd2"
                   2345:        .asciz  "cy0"
                   2346:        .asciz  "cy1"
                   2347:        .asciz  "vack0"
                   2348:        .asciz  "vcmdrsp0"
                   2349:        .asciz  "vunsol0"
                   2350:        .asciz  "vack1"
                   2351:        .asciz  "vcmdrsp1"
                   2352:        .asciz  "vunsol1"
                   2353:        .asciz  "mp0"
                   2354:        .asciz  "mpdl0"
                   2355:        .asciz  "mp1"
                   2356:        .asciz  "mpdl1"
                   2357:        .asciz  "acec0"
                   2358:        .asciz  "acer0"
                   2359:        .asciz  "acec1"
                   2360:        .asciz  "acer1"
                   2361:        .asciz  "enp0"
                   2362:        .asciz  "enp1"
                   2363:        .asciz  "dr0"
                   2364:        .asciz  "ik0"
                   2365:        .asciz  "hd0"
                   2366:        .asciz  "hd1"
                   2367:        .asciz  "vack2"
                   2368:        .asciz  "vcmdrsp2"
                   2369:        .asciz  "vunsol2"
                   2370:        .asciz  "vack3"
                   2371:        .asciz  "vcmdrsp3"
                   2372:        .asciz  "vunsol3"
                   2373:        .asciz  "ex0"
                   2374: _eintrnames:
                   2375: 
                   2376:        .globl  _intrcnt
                   2377: 
                   2378:        .globl  _eintrcnt
                   2379:        .align 2
                   2380: _intrcnt:
                   2381:        .space  4 * 6
                   2382: _fltintrcnt:
                   2383:        .space  4 * 32
                   2384: _eintrcnt:
                   2385: 
                   2386:        .text

unix.superglobalmegacorp.com

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