Annotation of cci/d/entry/init.x, revision 1.1

1.1     ! root        1: 
        !             2: /*     init.s                                                          */
        !             3: 
        !             4: 
        !             5: /*     This file is a diagnostic version of locore.s.                  */
        !             6: /*     It contains the following:                                      */
        !             7: /*     *system data area = scb, dump buffer, interrupt stack,          */
        !             8: /*     *system page table,user page tables,pcbs,iomap, & io buffers.   */
        !             9: /*                                                                     */
        !            10: /*     *system code = interrupt vectors, initialization of system data,*/
        !            11: /*     *memory size calculation,initialization of SPT, zeroing of      */
        !            12: /*     *unused memory, & loading of SBR & SLR.                         */
        !            13: /*     *                                                               */
        !            14: /*     *at the end of this code, you are ready to go to virtual mode.  */
        !            15: /*     * --- GOOD LUCK!                                                */
        !            16: 
        !            17: 
        !            18: /*     privileged registers addresses  */
        !            19: #include       "prvreg.h"
        !            20:        
        !            21: /*     program status long word definition     */
        !            22: #include       "psl.h" 
        !            23: 
        !            24: /*     page table entry definition             */
        !            25: #include       "pte.h"
        !            26:        
        !            27: /*     process control block offsets   */
        !            28: #include       "pcboffset.h"   
        !            29: 
        !            30: /*     fundamental constants for globl use     */
        !            31: #include       "const.h"       
        !            32: 
        !            33: /*     system control block offsets*/
        !            34: #include       "scboffset.h"
        !            35: /*     SPT offsets                             */
        !            36: #include       "sptoffset.h"
        !            37: 
        !            38: /*     trap numbers*/
        !            39: #include       "trap.h"        
        !            40: 
        !            41: 
        !            42: #define V_TRAP         0
        !            43: #define V_SYSCALL      4
        !            44: 
        !            45:        .set    HIGH,0x1f       /*mask for disabling all interrupts     */
        !            46:        .set    MCKVEC,4        /*scb offset for machinecheck vector    */
        !            47:        .set    NISP,2          /*no. of interrupt stack pages          */
        !            48:        .set    DONE,255        /*user process done code                */
        !            49:        .set    TTRAP,0x32
        !            50:        .set    TRANS,0x30
        !            51:        .set    PRIVS,0x2c
        !            52: 
        !            53:        .text
        !            54: 
        !            55:                /* PROCESSOR STORAGE AREA               */
        !            56: #include "pstorage.s"
        !            57: 
        !            58:        .globl  _Entry
        !            59: _Entry:
        !            60:        jmp     begin
        !            61:        .space  (1024-6)
        !            62: 
        !            63: /*             globl dump buffer to be used for communication          */
        !            64: /*             between tests & interrupt handlers, & other misc.       */
        !            65: /*             purposes.                                               */
        !            66:                                
        !            67: /*     Physical page 3 : Used for global variables             */
        !            68: 
        !            69:        .set    NLWU,35         /*no. of longwords already used         */
        !            70:                                /*this must be changed when you define  */
        !            71:                                /*additional variables below before     */
        !            72:                                /*_dbuf                                 */
        !            73:        .globl  _Codek
        !            74: _Codek:        .long   0               /* Code cache key */
        !            75: 
        !            76:        .globl  _restart
        !            77: _restart:
        !            78:        .space  4               /*contains restart address for restarting*/
        !            79:                                /*after power is restored (loaded by    */
        !            80:                                /*power fail interrupt handler & used by*/
        !            81:                                /*CPU 2                                 */      
        !            82:        .globl  _maxmem
        !            83: _maxmem:
        !            84:        .space  4               /*memory size in no of bytes            */
        !            85: 
        !            86:        .globl  _maxpages
        !            87: _maxpages:
        !            88:        .space  4               /*memory size in no. of physical pages  */
        !            89: 
        !            90:        .globl  _lastadd
        !            91: _lastadd:
        !            92:        .space  4               /*address of the last long word         */
        !            93: 
        !            94:        .globl  _unused
        !            95: _unused:
        !            96:        .space  4               /*first unused page in system space     */
        !            97: 
        !            98:        .globl  _ctlblk
        !            99: _ctlblk:
        !           100:        .long   0               /* pointer to SCB */
        !           101: 
        !           102:        .globl  _savvec0        /*save vectors area                     */
        !           103: _savvec0:
        !           104:        .space  4
        !           105: 
        !           106:        .globl  _savvec1        /*save vectors area                     */
        !           107: _savvec1:
        !           108:        .space  4
        !           109: 
        !           110:        .globl  _savvec2        /*save vectors area                     */
        !           111: _savvec2:
        !           112:        .space  4
        !           113: 
        !           114:        .globl  _savvec3        /*save vectors area                     */
        !           115: _savvec3:
        !           116:        .space  4
        !           117: 
        !           118:        .globl  _savvec4        /*save vectors area                     */
        !           119: _savvec4:
        !           120:        .space  4
        !           121: 
        !           122:        .globl  _savvec5        /*save vectors area                     */
        !           123: _savvec5:
        !           124:        .space  4
        !           125:        .globl  _savvec6        /*save vectors area                     */
        !           126: _savvec6:
        !           127:        .space  4
        !           128:        .globl  _savvec7        /*save vectors area                     */
        !           129: _savvec7:
        !           130:        .space  4
        !           131: 
        !           132:        .globl  _savvec8        /*save vectors area                     */
        !           133: _savvec8:
        !           134:        .space  4
        !           135: 
        !           136:        .globl  _r_no
        !           137: _r_no:
        !           138:        .long   0
        !           139:        .globl  _pt_base
        !           140: _pt_base:
        !           141:        .long   0
        !           142:        .globl  _saved_psl
        !           143: _saved_psl:
        !           144:        .long   0
        !           145:        .globl  _saved_sp
        !           146: _saved_sp:
        !           147:        .long   0
        !           148:        .globl  _saved_fp
        !           149: _saved_fp:
        !           150:        .long   0
        !           151:        .globl  _ret_adr
        !           152: _ret_adr:
        !           153:        .long   0
        !           154:        .globl  _exp_par0
        !           155: _exp_par0:
        !           156:        .long   0
        !           157:        .globl  _exp_par1
        !           158: _exp_par1:
        !           159:        .long   0
        !           160:        .globl  _f_vaddr
        !           161: _f_vaddr:
        !           162:        .long   0                       /* VA that caused fault */
        !           163: 
        !           164:        .globl  _f_ptr
        !           165: _f_ptr:
        !           166:        .long   0                       /* Pointer to fault parameters */
        !           167:        .globl  _df_cnt
        !           168: _df_cnt:
        !           169:        .long   0                       /* Count of data fault */
        !           170: 
        !           171:        .globl  _if_cnt
        !           172: _if_cnt:
        !           173:        .long   0                       /* Count of Instruction fault */
        !           174: 
        !           175:        .globl  _newepc
        !           176: _newepc:
        !           177:        .long   0
        !           178: 
        !           179:        .globl  _act_pc
        !           180: _act_pc:
        !           181:        .long   0                       /* Actual PC */
        !           182:        .globl  _exp_pc
        !           183: _exp_pc:
        !           184:        .long   0                       /* Expected PC */
        !           185: 
        !           186:        .globl  _ttcnt
        !           187: _ttcnt:
        !           188:        .long   0                       /* Count of Trap exception */
        !           189:        .globl  _trcnt
        !           190: _trcnt:
        !           191:        .long   0                       /* Count of Translation fault */
        !           192: 
        !           193:        .globl  _Ufpte
        !           194: _Ufpte: .long  0
        !           195:        .globl  _Ulpte
        !           196: _Ulpte: .long  0
        !           197: 
        !           198:        .globl  _dbuf           /*dump buffer left out of 1K            */
        !           199: _dbuf:
        !           200:        .space  NBPG - (NLWU *4)
        !           201: edbuf:
        !           202: 
        !           203: 
        !           204:        .globl  _intstack       /* Interrupt stack                      */
        !           205: _intstack:                     /* Physical pages 4 & 5                 */
        !           206:        .space  NISP*NBPG
        !           207: eintstack:
        !           208: 
        !           209: 
        !           210:        .set    SYSPTSIZE,512   /* No. of entries in SPT                */
        !           211:  
        !           212: /*
        !           213:        System Page Table -- physical page 6 & 7
        !           214: */ 
        !           215:        .align  2
        !           216:        .globl  _Sysmap
        !           217: _Sysmap:
        !           218:        .space  SYSPTSIZE*4     /* 512 max pages allowed for system     */
        !           219: eSysmap:
        !           220:        .globl  _Syssize
        !           221:        .set    _Syssize,(eSysmap-_Sysmap)/4    /* should be SYSPTSIZE  */
        !           222:        
        !           223:        .globl  _iomap          /* Physical page 8      */
        !           224: _iomap:        .space  1024            /* IOMAP - unused       */
        !           225:        .globl  _eiomap
        !           226: _eiomap:
        !           227: 
        !           228:        .globl  _pcb0           /* Physical page 9      */
        !           229: _pcb0: .space  128             /*process control block 0               */
        !           230:        .globl  _pcb1
        !           231: _pcb1: .space 128              /*process control block 1               */
        !           232:        .globl  _pcb2
        !           233: _pcb2: .space 128              /*process control block 2               */
        !           234:        .globl  _pcb3
        !           235: _pcb3: .space 128              /*process control block 3               */
        !           236:        .globl  _pcb4
        !           237: _pcb4: .space 128              /*process control block 4               */
        !           238:        .globl  _pcb5
        !           239: _pcb5: .space 128              /*process control block 5               */
        !           240:        .globl  _pcb6
        !           241: _pcb6: .space 128              /*process control block 6               */
        !           242:        .globl  _pcb7
        !           243: _pcb7: .space 128              /*process control block 7               */
        !           244: 
        !           245: /*
        !           246:        *user #0 page tables -- P0PT, P1PT, P2PT                        
        !           247:        *physical memory     --  page10, 11, & 12  respectively
        !           248: */
        !           249:        .align  2
        !           250:        .globl  _u0p0pt
        !           251: _u0p0pt:
        !           252:        .space  1024            /*255 max pages for user #0 text        */
        !           253:        .globl  _u0p1pt
        !           254: _u0p1pt:       
        !           255:        .space  1024            /*255 max pages for user #0 data        */
        !           256:        .globl  _u0p2pt
        !           257: _u0p2pt:       
        !           258:        .space  1020            /*255 max pages for user #0 stack       */
        !           259: eu0p2pt:
        !           260:        .space  4
        !           261: 
        !           262: /*
        !           263:        *user #1 page tables -- P0PT, P1PT, P2PT                        
        !           264:        *physical memory     --  page13 ,14, & 15  respectively
        !           265: */
        !           266:        .align  2
        !           267:        .globl  _u1p0pt
        !           268: _u1p0pt:
        !           269:        .space  1024            /*255 max pages for user #1 text        */
        !           270:        .globl  _u1p1pt
        !           271: _u1p1pt:       
        !           272:        .space  1024            /*255 max pages for user #1 data        */
        !           273:        .globl  _u1p2pt
        !           274: _u1p2pt:       
        !           275:        .space  1020            /*255 max pages for user #1 stack       */
        !           276: eu1p2pt:
        !           277:        .space  4
        !           278: 
        !           279: 
        !           280: /*
        !           281:        *user #2 page tables -- P0PT, P1PT, P2PT                        
        !           282:        *physical memory     --  page 16, 17 , & 18  respectively
        !           283: */
        !           284:        .align  2
        !           285:        .globl  _u2p0pt
        !           286: _u2p0pt:
        !           287:        .space  1024            /*255 max pages for user #2 text        */
        !           288:        .globl  _u2p1pt
        !           289: _u2p1pt:       
        !           290:        .space  1024            /*255 max pages for user #2 data        */
        !           291:        .globl  _u2p2pt
        !           292: _u2p2pt:       
        !           293:        .space  1020            /*255 max pages for user #2 stack       */
        !           294: eu2p2pt:
        !           295:        .space  4
        !           296: 
        !           297: 
        !           298: /*
        !           299:        *user #3 page tables -- P0PT, P1PT, P2PT                        
        !           300:        *physical memory     --  page 19, 20 , & 21  respectively
        !           301: */
        !           302:        .align  2
        !           303:        .globl  _u3p0pt
        !           304: _u3p0pt:
        !           305:        .space  1024            /*255 max pages for user #3 text        */
        !           306:        .globl  _u3p1pt
        !           307: _u3p1pt:       
        !           308:        .space  1024            /*255 max pages for user #3 data        */
        !           309:        .globl  _u3p2pt
        !           310: _u3p2pt:       
        !           311:        .space  1020            /*255 max pages for user #3 stack       */
        !           312: eu3p2pt:
        !           313:        .space  4
        !           314: 
        !           315: /*
        !           316:        *user #4 thru 6 page tables
        !           317:        *physical memory -- pages 22 thru 30
        !           318: */
        !           319:        .globl  _u4p0pt
        !           320: _u4p0pt:
        !           321:        .space  (9*NBPG) - 4
        !           322: eu6p2pt:
        !           323:        .space  4
        !           324: 
        !           325: /*
        !           326:        Area used for Kernel stack                      
        !           327:        physical memory --  page 31, 32 , 33
        !           328: */
        !           329: 
        !           330:        .align  2
        !           331:        .globl  _Kstack         /* Kernel stack */
        !           332: _Kstack:                       /* Physical pages 31,32,33 */
        !           333:        .space  3*NBPG
        !           334: ekstack:
        !           335: 
        !           336: 
        !           337:        .globl  _iob0           /*io buffer 0 */
        !           338: _iob0: .space  1024
        !           339:        .globl  _iob1           /*io buffer 1 */
        !           340: _iob1: .space  1024
        !           341:        .globl  _iob2           /*io buffer 2 */
        !           342: _iob2: .space  1024
        !           343:        .globl  _iob3           /*io buffer 3 */
        !           344: _iob3: .space  1024
        !           345:        .globl  _iob4           /*io buffer 4 */
        !           346: _iob4: .space  1024
        !           347:        .globl  _iob5           /*io buffer 5 */
        !           348: _iob5: .space  1024
        !           349:        .globl  _iob6           /*io buffer 6 */
        !           350: _iob6: .space  1024
        !           351: esysdata:
        !           352: 
        !           353: /*     SYSTEM CONTROL BLOCK            */
        !           354: #include "scblock.s"
        !           355: 
        !           356: 
        !           357: 
        !           358: #include       "evthandlers.s"
        !           359: 
        !           360: #define        ACBL(_n1,_n2,_n3,_n4) \
        !           361: addl2  _n2,_n3;\
        !           362: cmpl   _n3,_n1;\
        !           363: bleq   _n4;
        !           364: 
        !           365: 
        !           366: 
        !           367: /*
        !           368:        *INITIALIZATION CODE
        !           369:        *
        !           370:        * MME off; mode = k; IPL = 31; IS = 1
        !           371:        *
        !           372: */
        !           373: 
        !           374:        
        !           375:        .globl  begin
        !           376: begin:
        !           377:        movl    $0,sr0          /* Save r0, r1, r2 */
        !           378:        movl    $0,sr1
        !           379:        movl    $0,sr2
        !           380:        mtpr    $0,$MME         /* Disable MME */
        !           381:        movab   _scb,r0
        !           382:        andl2   $0x3ffffc00,r0
        !           383:        mtpr    r0,$SCBB        /* Set SCBB  */
        !           384:        mtpr    $0x1f,$IPL      /* Set IPL to HIGH */
        !           385: 
        !           386:        movpsl  r1
        !           387:        andl2   $0xffffff00,r1          /* Mask out flags               */
        !           388:        cmpl    r1,$0x041f0000          /*IS on,modes =k & IPL = 31?    */
        !           389:        beql    1f
        !           390: 2:     movl    $1,r0
        !           391:        movl    $0x041f0000,r2
        !           392:        halt                    /* PSL not initialized as expected      */
        !           393: 1:
        !           394:        movl    $_intstack+NISP*NBPG,r0
        !           395:        andl2   $0x3fffffff,r0          /* Mask out bit 30,31 */
        !           396:        mtpr    r0,$ISP                 /* init. ISP            */
        !           397:        movl    r0,sp                   /* in case we get exception     */
        !           398:        movab   (sp),fp                 /* Initialize FP                */
        !           399: /*
        !           400:        Clear system data area all the way upto system code
        !           401:        this includes dump buffer,interrupt stack,spt,iomap,pcbs,user 
        !           402:        page tables, & io buffer area.
        !           403: */
        !           404: 3:     
        !           405:        movab   esysdata,r7
        !           406:        movab   _restart,r6
        !           407: 1:     clrl    (r6)
        !           408:        ACBL(r7,$4,r6,1b)
        !           409: /*
        !           410:        Initialize System Page Table
        !           411: */
        !           412: 5:
        !           413:        clrl    r2
        !           414:        movab   esysdata,r1     /* R1 = Last address in system data area */
        !           415:        andl2   $0x3fffffff,r1  /* Mask out bit 30,31   */
        !           416:        shar    $PGSHIFT,r1,r1  /* Get page no. of last system data addr  */
        !           417:                                /* Map systm data area 1 to 1,kernel writable */
        !           418: 1:
        !           419:        orl3    $PG_V|PG_KW,r2,_Sysmap[r2]
        !           420:        aoblss  r1,r2,1b
        !           421: /*
        !           422:        Map system text area 1 to 1, Kernel read/write.
        !           423:        For this to work, the label _etext must exist at the end 
        !           424:        of system code; Add in 4 more pages for data area used in C
        !           425: */
        !           426:        movab   _Esys,r1        /* Map System text 1 to 1; Kernel R/W */
        !           427:        andl2   $0x3fffffff,r1
        !           428:        shar    $PGSHIFT,r1,r1
        !           429: 1:
        !           430:        orl3    $PG_V|PG_KW,r2,_Sysmap[r2]
        !           431:        aobleq  r1,r2,1b
        !           432: /*
        !           433:        Map from here to last page used by user :
        !           434:        invalid, User access, & virtual = physical
        !           435: */
        !           436:        movl    r2,_unused      /* Save first unused physical page no   */
        !           437:        movl    r2,_Ufpte               /* First PTE of User */
        !           438:        movl    $0x80000,r1             /* Allow this much memory for User */
        !           439:        shar    $PGSHIFT,r1,r1
        !           440:        movl    r1,_Ulpte               /* Last PTE of User */
        !           441: 1:
        !           442:        orl3    $PG_UW,r2,_Sysmap[r2]   /* User Read/Write */
        !           443:        aoblss  r1,r2,1b
        !           444: 
        !           445: /*
        !           446:        Initialize SBR, SLR
        !           447: */
        !           448: sysrdy:
        !           449:        mtpr    $_Sysmap,$SBR                   /* Set SYSTEM BASE REG */
        !           450:        mtpr    $_Syssize,$SLR
        !           451:        mtpr    $64,$DCR                        /* Enable fault */
        !           452: 
        !           453: /*             GO TO VIRTUAL MODE
        !           454:        Double map the kernel into user addresses : 
        !           455:        This will enable system to go to virtual mode the 1st time !!
        !           456: */
        !           457: 
        !           458:        orl3    $0xc0000000,$_Sysmap,r0 
        !           459:        mtpr    r0,$P0BR                        /* Double map P0BR to SBR */
        !           460:        mtpr    $_Syssize,$P0LR
        !           461:        mtpr    $1,$PADC                        /* Purge all data cache */
        !           462:        mtpr    $1,$TBIA                        /* Purge all Trans. buffer */
        !           463:        mtpr    $1,$MME                         /* Turn on MME */
        !           464:        jmp     *$vmode
        !           465: vmode:
        !           466:        clrl    _ttcnt
        !           467:        clrl    _trcnt
        !           468:        clrl    _if_cnt
        !           469:        clrl    _df_cnt
        !           470:        mfpr    $SCBB,r0
        !           471:        movab   _Ttrap,TTRAP*4(r0)      /* Set new trap handler */
        !           472:        movab   _Trans,TRANS*4(r0)      /* Set new trans. fault handler */
        !           473:        movab   _Prvis,PRIVS*4(r0)      /* Set new priv. ins. fault handler */
        !           474: 
        !           475:        mtpr    $_pcb0,$0xe             /* Init. PCBB to PCB_0 */
        !           476:        movab   _pcb0,r0
        !           477:        movab   ekstack,PCB_KSP(r0)     /* Init. PCB_KSP */
        !           478:        movab   eustack,PCB_USP(r0)     /* Init. PCB_USP */
        !           479:        mfpr    $P0BR,PCB_P0BR(r0)      /*  "    PCB_P0BR */
        !           480:        mfpr    $P0LR,PCB_P0LR(r0)      /*  "    PCB_P0LR */
        !           481:        movab   _monitor,PCB_PC(r0)     /* Set PCB_PC */
        !           482:        movab   _monitor,_exp_pc        /* 1st PC that has Translation fault */
        !           483:        movl    $1,_newepc
        !           484:        cmpl    $0xf,r12                /* Run process in KERNEL mode ? */
        !           485:        beql    1f
        !           486: 
        !           487:        movl    $0x1000010,PCB_PSL(r0)  /* Set PCB_PSL : User, Trace ON ! */
        !           488:        brb     2f
        !           489: 1:
        !           490:        movl    $0x0000010,PCB_PSL(r0)  /* Set PCB_PSL : Kernel, Trace ON ! */
        !           491: 2:
        !           492:        movl    $1,_Codek
        !           493:        mtpr    _Codek,$CCK             /* Set code cache key */
        !           494:        ldpctx                          /* Load user context : switch to KSP */
        !           495:        movl    sr0,r0
        !           496:        movl    sr1,r1
        !           497:        movl    sr2,r2                  /* Restore r0, r1, r2 */
        !           498:        rei                             /* Switch to excecute User code */
        !           499:        halt
        !           500: 
        !           501: /*
        !           502:        ******************************************
        !           503:              Trace trap exception handler
        !           504:        Set expected PC that have Translation fault
        !           505:        Increment Trace trap count
        !           506:        Invalidate all User PTE's
        !           507:        Purge Translation buffer
        !           508:        ******************************************
        !           509: */
        !           510:        .align  2
        !           511:        .globl  _Ttrap
        !           512: _Ttrap:
        !           513:        mtpr    $1,$IPL                 /* For REI in clock handler to work */
        !           514:        incl    _ttcnt                  /* Inc. trap count */
        !           515:        movl    (sp),_savvec0           /* PC that will have trans. fault */
        !           516:        svpctx
        !           517:        cmpl    $1,_newepc              /* Did I get a Trans. fault ? */
        !           518:        bneq    1f
        !           519:        movl    $0xeeeeeeee,r0          /* Miss 1 translation fault */
        !           520:        movl    _exp_pc,r1              /* at this address !!!  */
        !           521:        halt
        !           522: 
        !           523: 1:
        !           524:        movl    _savvec0,_exp_pc
        !           525:        incl    _newepc                 /* New expected PC is set */
        !           526:        movl    _Ufpte,r2               /* First PTE of User */
        !           527:        movl    _Ulpte,r1               /* Last PTE of User */
        !           528: 1:
        !           529:        andl2   $0x7fffffff,_Sysmap[r2] /* Mask out V_bit */
        !           530:        aoblss  r1,r2,1b
        !           531: 
        !           532:        mtpr    $1,$TBIA
        !           533:        incl    _Codek                  /* Bump code cache key */
        !           534:        cmpl    _Codek,$255             /* Last key yet ? */
        !           535:        jlss    1f
        !           536:        movl    $1,_Codek               /* Reset Code key to 1 */
        !           537:        mtpr    $1,$PACC                /* Purge all code cache */
        !           538: 1:
        !           539:        mtpr    _Codek,$CCK             /* Set new key */
        !           540:        ldpctx
        !           541:        rei
        !           542: 
        !           543: /*
        !           544:        ************************************
        !           545:            Translation exception handler
        !           546:        Increment counts
        !           547:        Validate Page that is invalid
        !           548:        Purge Translation buffer
        !           549:        ************************************
        !           550: */
        !           551:        .align  2
        !           552:        .globl  _Trans
        !           553: _Trans:
        !           554:        mtpr    $1,$IPL                 /* For REI in clock handler to work */
        !           555:        movl    (sp)+,_f_ptr                    /* Ignore 1st fault parameter */
        !           556:        movl    (sp)+,_f_vaddr                  /* Get VA that caused fault */
        !           557:        movl    (sp),_act_pc                    /* PC at fault */
        !           558:        svpctx
        !           559: 
        !           560:        incl    _trcnt                  /* Increment translation fault count */
        !           561:        movl    _act_pc,r1              /* R1 = Actual PC at fault */
        !           562:        cmpl    r1,_f_vaddr             /* Is instruction or data fault ? */
        !           563:        beql    1f
        !           564:        incl    _df_cnt                 /* Increment data fault count */
        !           565:        brw     2f                      /* Check Expected PC */
        !           566: 1:
        !           567:        incl    _if_cnt                 /* Increment instruction fault count */
        !           568:        cmpl    $1,_newepc              /* Have Trap hdlr set new expected PC */
        !           569:        jneq    1f                      /* Donot check PC if not !! */
        !           570: 2:
        !           571:        movl    _exp_pc,r2              /* R2 = Expected PC */
        !           572:        cmpl    r1,r2
        !           573:        beql    1f
        !           574:        movl    $0xffffffff,r0
        !           575:        halt                            /* Cannot restart inst. with wrong PC */
        !           576: 1:
        !           577:        clrl    _newepc         /* Tell Trap hdlr to set new expected PC  */
        !           578:        shar    $PGSHIFT,_f_vaddr,r11           /* R11 = PTE at fault */
        !           579:        orl2    $0x80000000,_Sysmap[r11]        /* Turn V_bit on */
        !           580:        mtpr    _f_vaddr,$TBIS
        !           581: 
        !           582:        movb    (r1),r2
        !           583:        andl2   $0xff,r2
        !           584:        cmpl    r2,$0x9b        /* Is next inst. a BICPSW ? */
        !           585:        jneq    2f              /* If not then skip */
        !           586:        andl3   $0x3ff,r1,r2
        !           587:        cmpl    $0x3ff,r2       /* Is this addr is on last byte of the page ? */
        !           588:        bneq    1f
        !           589:        addl3   $1,r1,r2        /* Yes,it is then validate the next page also */
        !           590:        shar    $PGSHIFT,r2,r11 /* R11 = PTE of next page */
        !           591:        orl2    $0x80000000,_Sysmap[r11]        /* Turn V_bit on */
        !           592:        mtpr    r2,$TBIS
        !           593: 1:
        !           594:        incb    r1
        !           595:                                /* Added 5/31/84 */
        !           596:        movb    (r1),r2         /* Get operand of BICPSW */
        !           597:        andl2   $0xf0,r2        /* Check if direct register mode */
        !           598:        cmpl    $0x50,r2
        !           599:        jeql    2f              /* If yes then skip */
        !           600: 
        !           601:        andb2   $0xef,(r1)      /* Not allow to clear T_bit */
        !           602: 
        !           603:        incl    _Codek                  /* Bump code cache key */
        !           604:        cmpl    _Codek,$255             /* Last key yet ? */
        !           605:        jlss    5f
        !           606:        movl    $1,_Codek               /* Reset Code key to 1 */
        !           607:        mtpr    $1,$PACC                /* Purge all code cache */
        !           608: 5:
        !           609:        mtpr    _Codek,$CCK             /* Set new key */
        !           610: 2:
        !           611:        ldpctx
        !           612:        rei                                     /* Restart instruction */
        !           613: 
        !           614: /*
        !           615:        **********************************************
        !           616:             Privilege instruction fault handler
        !           617:        **********************************************
        !           618: */
        !           619:        .align  2
        !           620:        .globl  _Prvis
        !           621: _Prvis:
        !           622: #      storer  $0xfff,sr0
        !           623:        cmpl    $0xcafebabe,r0
        !           624:        jeql    1f
        !           625: #      pushab  tn              /* Write test name */
        !           626: #      callf   $8,_writes
        !           627: #      pushl   sr11
        !           628: #      callf   $8,_writes
        !           629: 
        !           630:        halt                    /* Error HALT : error codes in r0 - r7 */
        !           631: 1:
        !           632:        movl    _trcnt,r1       /* R1 : No of demand page faults occured */
        !           633:        movl    _ttcnt,r2       /* R2 : No of Trace traps occured */
        !           634:        movl    _if_cnt,r3      /* R3 : No of transl. fault on inst. fetch */
        !           635:        movl    _df_cnt,r4      /* R4 : No of transl. fault on data access */
        !           636:        halt
        !           637: 
        !           638:        .align  2
        !           639: sr0:   .long   0
        !           640: sr1:   .long   0
        !           641: sr2:   .long   0
        !           642:        .long   0
        !           643:        .long   0
        !           644:        .long   0
        !           645:        .long   0
        !           646:        .long   0
        !           647:        .long   0
        !           648:        .long   0
        !           649:        .long   0
        !           650: sr11:  .long   0
        !           651: 
        !           652:        .align  1
        !           653: tn:    .ascii  "\ntest no \0"
        !           654: ec:    .ascii  "\nerror code \0"
        !           655: 
        !           656:        .globl  _Esys
        !           657: _Esys:
        !           658:        .space  NBPG
        !           659: #
        !           660: #
        !           661:        .globl  _Ustack         /* User stack   */
        !           662: _Ustack:                       /* 2 pages */
        !           663:        .space  (2*NBPG)-4
        !           664: eustack:
        !           665:        .long   0
        !           666:        .text
        !           667:        .globl  U_area
        !           668: U_area:

unix.superglobalmegacorp.com

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