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

1.1       root        1: #include "data.h"
                      2: #include "definitions"
                      3: 
                      4: /*             Demand paging with auto_increment deferred mode
                      5:    Virtual Page 97 is used in this test. "clrl *(sp)+"" is executed to
                      6:    cause translation not valid fault. USP is set point to a location which
                      7:    points to 1st location in Page 97, Page 97 is set to invalid. Program
                      8:    do REI to user to execute the above instruction which should cause the
                      9:    demand page fault. Exception handler will set Page to valid and restart
                     10:    the instruction.
                     11: */
                     12: 
                     13: long d3pc,exp_psl, exp_pc, act_pc, exp_result, act_result, exp_sp, act_sp;
                     14: long *fault_vadr, saved_vec1, saved_vec2, saved_pte, temp_glb;
                     15: char *msg1, *msg2;
                     16: 
                     17: 
                     18: extern long iob1, iob2, iob3, u0p2pt, pcb0, savvec4, savvec5, savvec6, savvec7;
                     19: extern long ret_adr, saved_sp, saved_fp, *p_ptr;
                     20: 
                     21: dmp1()
                     22: {
                     23:        asm("mfpr $SBR,_savvec4");
                     24:        savvec4 |= (savvec4 | SADDR);           /* Make it system address */
                     25:        asm("mtpr _savvec4,$P0BR");             /* Double map P0PT to SPT */
                     26:        asm("mfpr $SLR,_savvec4");
                     27:        asm("mtpr _savvec4,$P0LR");
                     28: 
                     29:        asm("mtpr $6,$DCK");    
                     30:        asm("mtpr $0,$TBIA");   
                     31:        asm("mtpr $0,$PADC");   
                     32:        asm("mtpr $1,$MME");                    /* Enable MME */
                     33:        asm("jmp  *$0f");                       /* Go virtual */
                     34: asm("0:");
                     35:        dpt2();
                     36:        asm("mtpr $0,$MME");
                     37:        asm("mtpr $0,$P0LR");
                     38: }
                     39: 
                     40: 
                     41: dpt2()
                     42: {      
                     43:        long ix, hdr_adr, pc_err;
                     44: 
                     45:        savvec4 = (long)&pcb0;
                     46:        asm("mtpr _savvec4,$PCBB");             /* Set PCBB */
                     47:        asm("movab fault_pc2,_savvec4");
                     48:        exp_pc = savvec4;
                     49:        savvec4 = (savvec4 >> PGSHIFT) & 0xfffff;
                     50:        fixpv_pte(P0BR,savvec4,&saved_pte,(PTE_V|PTE_UW));
                     51:        fixpv_pte(P0BR,(savvec4+1),&saved_pte,(PTE_V|PTE_UW));
                     52: 
                     53:        exp_result = 0;
                     54:        asm("movab op_addr,_exp_sp");
                     55:        asm("mtpr _exp_sp,$USP");       /* Set USP point to operand address */
                     56:        fault_vadr = (long *) (TEST_PG << PGSHIFT);
                     57:        asm("movl _fault_vadr,op_addr");        /* Set operand address */
                     58:        *fault_vadr = 0xfffffff;                /* Dummy value in test loc */
                     59: 
                     60:        /* Invalidate PTE of test page  */
                     61:        fixpv_pte(P0BR,TEST_PG,&saved_pte,PTE_UW);
                     62:        asm("movab trans_f2,_savvec4");      /* New handler for TRANS_FAULT */
                     63:        set_handler(TRANS_VEC,&saved_vec1,savvec4);
                     64: 
                     65:        asm("movab (sp),_savvec4");
                     66:        savvec4 -= 16;                          /* KSP is 4 words below ISP */
                     67:        asm("mtpr _savvec4,$KSP");
                     68:        exp_psl = PSL_USR;                      /* User mode          */
                     69:        asm("movl fp,_saved_fp");               /* save FP to return  */
                     70:        asm("pushl _exp_psl");
                     71:        asm("pushl _exp_pc");                   /* Push PSL,PC for REI */
                     72:        asm("mtpr $1,$PACC");                   /* Purge all code cache */
                     73:        asm("movab d3rei,_d3pc");
                     74: asm("d3rei:");
                     75:        asm("rei");
                     76:        asm("halt");
                     77: 
                     78: asm(".align 2");
                     79: asm("rtn_t50:");               /* Return from error */
                     80:        asm("movl _saved_fp,fp");               /* restore FP */
                     81:        return;
                     82: asm("rtn_t51:");
                     83:        asm("movl _saved_fp,fp");               /* restore FP */
                     84:        act_result = *fault_vadr;
                     85:        if (act_result != exp_result)
                     86:                {
                     87:                msg1 = "** Incorrect result after instruction is restarted.\n";
                     88:                d3err(msg1,act_result,exp_result,exp_pc,d3pc);
                     89:                }
                     90:        set_handler(CHMK_VEC,&temp_glb,saved_vec2);  /* Restore KCALL vector */
                     91: }
                     92: 
                     93: 
                     94: TEST_AREA2()
                     95: {
                     96: asm("fault_pc2:");
                     97:        asm("clrl *(sp)+");     /* should cause translation not valid fault */
                     98:        asm("kcall $0");                        /* return */
                     99: asm(".align 2");
                    100: asm("op_addr:");
                    101:        asm(".long 0");                 /* contain address of operand */
                    102: }
                    103: 
                    104: 
                    105: new_hdr2()
                    106: {
                    107: 
                    108: asm(".align    2");                    /* Longword align */
                    109: asm("trans_f2:");
                    110: 
                    111:        asm("mtpr $0x1f,$IPL");
                    112:        asm("movl (sp)+,r12");          /* Ignore 1st parameter */
                    113:        asm("movl (sp)+,r12");          /* Ignore 2nd parameter */
                    114:        asm("movl (sp),_act_pc");       /* PC that caused fault */
                    115:        asm("movab (sp),fp");           /* set new frame pointer */
                    116:        asm("mfpr $USP,_act_sp");
                    117:        if ( act_pc != exp_pc )
                    118:                {       /* Error in PC */
                    119:                msg1="** PC pushed on the stack is not correct.\n";
                    120:                d3err(msg1,act_pc,exp_pc,exp_pc,d3pc);
                    121:                asm("svpctx");                  /* Back to ISP */
                    122:                asm("jmp  rtn_t50");            /* return   */
                    123:                }
                    124:           else
                    125:                {
                    126:                if ( exp_sp != act_sp )
                    127:                        {
                    128:                        msg1 = "** SP is not backed up corectly.\n";
                    129:                        d3err(msg1,act_sp,exp_sp,exp_pc,d3pc);
                    130:                        asm("svpctx");                  /* Back to ISP */
                    131:                        asm("jmp  rtn_t50");            /* return   */
                    132:                        }
                    133:                    else
                    134:                        {
                    135:                        /* Set V bit and restart instruction at PC */
                    136:                        fixpv_pte(P0BR,TEST_PG,&saved_pte,(PTE_V|PTE_UW));
                    137:                        /* New handler for KCALL */
                    138:                        asm("movab kcall2,_savvec4");
                    139:                        set_handler(CHMK_VEC,&saved_vec2,savvec4);
                    140:                        /* restore original vector of TRANSLATION fault  */
                    141:                        set_handler(TRANS_VEC,&temp_glb,saved_vec1);
                    142:                        asm("movab d31rei,_d3pc");
                    143: asm("d31rei:");
                    144:                        asm("rei");
                    145:                        asm("halt");
                    146:                        }
                    147:                }
                    148: 
                    149: asm(".align 2");
                    150: asm("kcall2:");
                    151:        asm("mtpr $0x1f,$IPL");
                    152:        asm("svpctx");                  /* Back to ISP */
                    153:        asm("jmp rtn_t51");     
                    154: }
                    155: 
                    156: 

unix.superglobalmegacorp.com

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