Annotation of cci/d/demand/dmp3.c, revision 1.1.1.1

1.1       root        1: #include "data.h"
                      2: #include "definitions"
                      3: 
                      4: extern long savvec4, iob1, iob2, pcb0;
                      5: 
                      6: /*     Demand paging with longword displacement deferred indexed
                      7:    Boundery of virtual Page 97 and 98 are used in this test. Opcodes of
                      8:    the "clrl *12(r5)[r6]" instruction is moved to last byte in page 22 
                      9:    and operand specifiers are moved to 1st byte in page 23. PTE of Page
                     10:    23 is then set to invalid.
                     11: */
                     12: 
                     13: long d5pc, exp_pc, act_pc, exp_psl, exp_fvadr, act_fvadr, exp_val, act_val;
                     14: long dummy, saved_vec1, saved_vec2, saved_pte1, saved_pte2;
                     15: char *msg1, *msg2;
                     16: 
                     17: 
                     18: dmp3()
                     19: {
                     20: 
                     21:        asm("mfpr $SBR,_savvec4");
                     22:        savvec4 |= (savvec4 | SADDR);           /* Make it system address */
                     23:        asm("mtpr _savvec4,$P0BR");             /* Double map P0PT to SPT */
                     24:        asm("mfpr $SLR,_savvec4");
                     25:        asm("mtpr _savvec4,$P0LR");
                     26: 
                     27:        asm("mtpr $6,$DCK");    
                     28:        asm("mtpr $0,$TBIA");   
                     29:        asm("mtpr $0,$PADC");   
                     30:        asm("mtpr $1,$MME");                    /* Enable MME */
                     31:        asm("jmp  *$0f");                       /* Go virtual */
                     32: asm("0:");
                     33:        tst_dmp3();
                     34:        asm("mtpr $0,$MME");                    /* Disable MME */
                     35:        asm("mtpr $0,$P0LR");
                     36: }
                     37: 
                     38: 
                     39: tst_dmp3()
                     40: {      char *byte_ptr, *msg1, *msg2;
                     41:        long dummy, ix, hdr_adr, pc_err, byte_no;
                     42: 
                     43:        savvec4 = (long)&pcb0;
                     44:        asm("mtpr _savvec4,$PCBB");             /* Initialize PCBB */
                     45: 
                     46:        asm("movab r5_here,_savvec4");  /* Make test area user read/write */
                     47:        savvec4 = (savvec4 >> PGSHIFT) & 0xfffff;
                     48:        fixpv_pte(P0BR,savvec4,&dummy,(PTE_V|PTE_UW));
                     49: 
                     50:        fixpv_pte(P0BR,(TEST_PG-1),&saved_pte1,(PTE_V|PTE_UW));
                     51: 
                     52: for(byte_no=1;byte_no<I3;byte_no++)
                     53:        {
                     54:        /* Move code to boundery of test page */
                     55:        exp_pc  = ((TEST_PG-1)<<PGSHIFT)|(NBPG-byte_no);
                     56:        byte_ptr = (char *)exp_pc;
                     57:        for(ix=0;ix<I3;ix++) *byte_ptr++ = CLRL3[ix];
                     58:        *byte_ptr++ = KCALL[0];                 /* move KCALL instruction */
                     59:        *byte_ptr = KCALL[1];
                     60: 
                     61:        exp_fvadr = (TEST_PG<<PGSHIFT) & 0xfffffc00;
                     62:        /* Invalidate PTE of test page */
                     63:        fixpv_pte(P0BR,TEST_PG,&saved_pte2,PTE_UW);
                     64: 
                     65:        /* Set new exception handlers  */
                     66:        asm("movab prot_f3,_savvec4");
                     67:        set_handler(TRANS_VEC,&saved_vec1,savvec4);
                     68: 
                     69:        /* Set up to execute REI      */
                     70:        asm("movab (sp),_savvec4");
                     71:        savvec4 -= 16;                          /* KSP is 4 words below ISP */
                     72:        asm("mtpr _savvec4,$KSP");
                     73:        asm("movl fp,_saved_fp");               /* save FP to return  */
                     74:        exp_psl = PSL_USR;                      /* PSL : user mode */
                     75: asm("again:");
                     76:        asm("pushl _exp_psl");                  /* Push PSL on stack */
                     77:        asm("pushl _exp_pc");                   /* Push PC on stack */
                     78: 
                     79:        /*      Set up for CLRL *12(r5)[r6]     */
                     80:        asm("movab r5_here,r5");
                     81:        asm("movl  $1,r6");                     /* Set index value in r6 */
                     82:        asm("movl $0xfffffff,operd");
                     83:        exp_val = 0;
                     84: 
                     85:        /* Use REI to switch to user mode */
                     86:        asm("mtpr $1,$PACC");                   /* Purge all code cache */
                     87:        asm("movab d5rei,_d5pc");
                     88: asm("d5rei:");
                     89:        asm("rei");
                     90:        asm("halt");
                     91: asm(".align 2");
                     92: asm("rtn_t30:");                               /* Return here if error */
                     93:        asm("movl _saved_fp,fp");               /* restore FP */
                     94:        break;                                  /* Stop test  */
                     95: asm("rtn_t31:");
                     96:        asm("movl _saved_fp,fp");               /* restore FP */
                     97:        asm("movl operd,_act_val");
                     98:        set_handler(CHMK_VEC,&dummy,saved_vec2);        /* restore handler */
                     99:        if (exp_val != act_val)         /* Demand paging fail !! */
                    100:                {
                    101:                msg1="** Incorrect result after instruction is restarted.\n";
                    102:                d2err(msg1,act_val,exp_val,exp_pc,d5pc,exp_fvadr);
                    103:                break;
                    104:                }
                    105:        }
                    106: }
                    107: 
                    108: 
                    109: t_space()
                    110: {
                    111:        /*      Operand of CLRL *12(r5)[r6]     */
                    112: asm(".align 2");
                    113: asm("r5_here:");
                    114:        asm(".long  0");
                    115:        asm(".space 8");    /* (8 + 4 of r5_here)12 bytes for displacement */
                    116:        asm(".long  base_op");
                    117: 
                    118: asm(".align 2");
                    119: asm("base_op:");
                    120:        asm(".long 0xffff");    /* four bytes for index by r6 */
                    121: asm("operd:");
                    122:        asm(".long 0xffffffff");
                    123:                        /* this loc will be clear if demand paging works */
                    124: 
                    125: }
                    126: 
                    127: prot_hdlr()
                    128: {
                    129: asm(".align 2");
                    130: asm("prot_f3:");
                    131:        asm("mtpr $0x1f,$IPL");
                    132:        asm("movl (sp)+,r12");          /* Ignore 1st parameter */
                    133:        asm("movl (sp)+,_act_fvadr");   /* Actual VA at fault */
                    134: 
                    135:        asm("movl (sp),_act_pc");       /* Actual PC that caused fault */
                    136:        asm("movab (sp),fp");   /* Set FP */
                    137:        if (act_pc != exp_pc)
                    138:                {
                    139:                msg1="** PC pushed on the stack is not correct.\n";
                    140:                d2err(msg1,act_pc,exp_pc,exp_pc,d5pc,exp_fvadr);
                    141:                asm("svpctx");                  /* Switch to ISP */
                    142:                asm("jmp rtn_t30");             /* Error return */
                    143:                }
                    144:        if ((act_fvadr & 0xfffffc00) != (exp_fvadr & 0xfffffc00))
                    145:                {
                    146:                msg1="** Fault virtual address pushed on the stack is not correct\n";
                    147:                d2err(msg1,(act_fvadr&0xfffffc00),(exp_fvadr&0xfffffc00),exp_pc,d5pc,exp_fvadr);
                    148:                asm("svpctx");                  /* Switch to ISP */
                    149:                asm("jmp rtn_t30");             /* Error return */
                    150:                }
                    151:            else
                    152:                {
                    153:                asm("movab kcall3,_savvec4");   /* New handler for KCALL */
                    154:                set_handler(CHMK_VEC,&saved_vec2,savvec4);
                    155:                /* Restore original TRANS. fault vector */
                    156:                set_handler(TRANS_VEC,&dummy,saved_vec1);
                    157:                /* Validate test page and restart instruction */
                    158:                fixpv_pte(P0BR,TEST_PG,&saved_pte2,(PTE_V|PTE_UW));
                    159:                asm("movab d51rei,_d5pc");
                    160: asm("d51rei:");
                    161:                asm("rei");
                    162:                }
                    163: 
                    164: 
                    165: asm(".align 2");
                    166: asm("kcall3:");
                    167:        asm("mtpr $0x1f,$IPL");
                    168:        asm("svpctx");                  /* Switch to ISP */
                    169:        asm("jmp rtn_t31");             /* Return */
                    170: }
                    171: 
                    172: 

unix.superglobalmegacorp.com

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