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

1.1       root        1: #include "data.h"
                      2: #include "definitions"
                      3: 
                      4: /*             Demand paging with auto_decrement mode
                      5:    Boundery of virtual Page _iob0 and _iob1 are used in this test. USP is set to
                      6:    1st byte of page _iob1, PTE of Page _iob0 is then set to invalid.  Program do
                      7:    a REI to user code which will execute the "clrl -(sp)" instruction . At
                      8:    this point translation not valid fault should occur and the exception
                      9:    handler will set page _iob0 to valid and do a REI to restart the instruction.
                     10: */
                     11: 
                     12: long exp_psl, exp_pc, act_pc, exp_result, act_result, exp_sp, act_sp;
                     13: long d1rei, *fault_vadr, saved_vec1, saved_vec2, saved_pte, temp_glb;
                     14: char *msg1, *msg2;
                     15: 
                     16: extern long iob1, iob2, iob3, u0p2pt, pcb0, savvec4, savvec5, savvec6, savvec7;
                     17: extern long ret_adr, saved_sp, saved_fp, *p_ptr;
                     18: 
                     19: dmp0()
                     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:        dpt1();
                     34:        asm("mtpr $0,$MME");
                     35:        asm("mtpr $0,$P0LR");
                     36: }
                     37: 
                     38: 
                     39: dpt1()
                     40: {
                     41:        long ix;
                     42: 
                     43:        savvec4 = (long)&pcb0;
                     44:        asm("mtpr _savvec4,$PCBB");             /* Set PCBB */
                     45:        asm("movab fault_pc1,_savvec4");
                     46:        savvec4 = (savvec4 >> PGSHIFT) & 0xfffff;
                     47:        fixpv_pte(P0BR,savvec4,&saved_pte,(PTE_V|PTE_UW));
                     48:        fixpv_pte(P0BR,(savvec4+1),&saved_pte,(PTE_V|PTE_UW));
                     49: 
                     50:        asm("movab fault_pc1,_exp_pc");
                     51:        exp_sp = TEST_PG << PGSHIFT;
                     52:        fault_vadr = (long *) (exp_sp-4);
                     53:        *fault_vadr = 0xfffffff;        /* set some value in test location */
                     54:        exp_result = 0;
                     55: 
                     56:        /* Set page _iob1 to valid      */
                     57:        fixpv_pte(P0BR,TEST_PG,&saved_pte,(PTE_V|PTE_UW));
                     58:        /* Set page _iob0 to invalid    */
                     59:        fixpv_pte(P0BR,(TEST_PG-1),&saved_pte,PTE_UW);
                     60: 
                     61:        /* Set new exception handlers  */
                     62:        asm("movab trans_f1,_savvec4");
                     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: 
                     69:        exp_psl = PSL_USR;                      /* User mode          */
                     70:        asm("mtpr _exp_sp,$USP");               /* Set USP to valid page */
                     71:        asm("movl fp,_saved_fp");               /* save FP to return  */
                     72:        asm("pushl _exp_psl");
                     73:        asm("pushl _exp_pc");                   /* Push PSL,PC for REI */
                     74:        asm("mtpr $1,$PACC");                   /* Purge all code cache */
                     75:        asm("movab d2pc,_d1rei");
                     76: asm("d2pc:");
                     77:        asm("rei");
                     78:        asm("halt");
                     79: 
                     80: asm(".align 2");
                     81: asm("rtn_t10:");
                     82:        asm("movl _saved_fp,fp");               /* restore FP */
                     83:        if (1) return;                  /* Avoid warning from compiler */
                     84: asm(".align 2");
                     85: asm("rtn_t11:");
                     86:        asm("movl _saved_fp,fp");               /* restore FP */
                     87:        act_result = *fault_vadr;
                     88:        if (act_result != exp_result)
                     89:                {
                     90:                msg1 = "** incorrect result after instruction is restarted.\n";
                     91:                d3err(msg1,act_result,exp_result,exp_pc,d1rei);
                     92:                }
                     93:        set_handler(CHMK_VEC,&temp_glb,saved_vec2);  /* Restore KCALL vector */
                     94: }
                     95: 
                     96: TEST_AREA()
                     97: {
                     98: asm("fault_pc1:");
                     99:        asm("clrl -(sp)");      /* should cause translation not valid fault */
                    100:        asm("kcall $0");        /* return */
                    101: }
                    102: 
                    103: new_hdr1()
                    104: {
                    105: asm(".align    2");                    /* Longword align */
                    106: asm("trans_f1:");
                    107: 
                    108:        asm("mtpr $0x1f,$IPL");
                    109:        asm("movl (sp)+,r12");          /* Ignore 1st parameter */
                    110:        asm("movl (sp)+,r12");          /* Ignore 2nd parameter */
                    111:        asm("movl (sp),_act_pc");       /* PC that caused fault */
                    112:        asm("movab (sp),fp");           /* set new frame pointer */
                    113:        asm("mfpr $USP,_act_sp");
                    114:        if ( act_pc != exp_pc )
                    115:                {       /* Error in PC */
                    116:                msg1="\nPC pushed on the stack is not correct.";
                    117:                d3err(msg1,act_pc,exp_pc,exp_pc,d1rei);
                    118:                asm("svpctx");                  /* Back to ISP */
                    119:                asm("jmp  rtn_t10");            /* return   */
                    120:                }
                    121:           else
                    122:                {
                    123:                if ( exp_sp != act_sp )
                    124:                        {
                    125:                        msg1 = "\nSP is not backed up correctly.";
                    126:                        d3err(msg1,act_sp,exp_sp,exp_pc,d1rei);
                    127:                        asm("svpctx");                  /* Back to ISP */
                    128:                        asm("jmp  rtn_t10");            /* return   */
                    129:                        }
                    130:                    else
                    131:                        {
                    132:                        /* Set V bit and restart instruction at PC */
                    133:                        fixpv_pte(P0BR,(TEST_PG-1),&saved_pte,(PTE_V|PTE_UW));
                    134:                        /* New handler for KCALL */
                    135:                        asm("movab kcall1,_savvec4");
                    136:                        set_handler(CHMK_VEC,&saved_vec2,savvec4);
                    137:                        /* restore original vector of TRANSLATION fault  */
                    138:                        set_handler(TRANS_VEC,&temp_glb,saved_vec1);
                    139:                        asm("movab d21pc,_d1rei");
                    140: asm("d21pc:");
                    141:                        asm("rei");
                    142:                        asm("halt");
                    143:                        }
                    144:                }
                    145: 
                    146: asm(".align 2");
                    147: asm("kcall1:");
                    148:        asm("mtpr $0x1f,$IPL");
                    149:        asm("svpctx");                  /* Back to ISP */
                    150:        asm("jmp rtn_t11");     
                    151: }
                    152: 
                    153: d3err(msg1,act,exp,pc,reipc)
                    154: char *msg1;
                    155: long act, exp, pc, reipc;
                    156: {
                    157:        writes(msg1);
                    158:        writes("\n** Actual   : "); writeh(act); 
                    159:        writes("\n** Expect   : "); writeh(exp);
                    160:        writes("\n** PC                   : "); writeh(pc);
                    161:        writes("\n** PC (REI instruction) : "); writeh(reipc);
                    162:        writec('\n');
                    163:        asm("halt");
                    164: }

unix.superglobalmegacorp.com

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