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

1.1       root        1: #include "definitions"
                      2: 
                      3: asm(".data");
                      4: 
                      5: /*     clrl r5 : register mode                 */
                      6: #define I0     2
                      7: char CLRL0[] = { 0x4d,0x55 };  
                      8: 
                      9: /*     clrl -(sp) : auto decrement             */
                     10: #define I1     2
                     11: char CLRL1[] = { 0x4d,0x7e };
                     12:        
                     13: /*     clrl *(sp)+ : auto increment deferred   */
                     14: #define I2     2
                     15: char CLRL2[] = { 0x4d,0x9e };          
                     16: 
                     17: /*     clrl *12(r5)[r6] : longword displacement deferred  indexed      */
                     18: #define I3     7
                     19: char CLRL3[] = { 0x4d,0x46,0xf5,0x00,0x00,0x00,0x0c };
                     20: 
                     21: /*     clrl *loc[r6] : longword relative deferred indexed  */
                     22: /*     loc is 1 Page away from PC                          */
                     23: #define I4     7
                     24: char CLRL4[] = { 0x4d,0x46,0xff,0x00,0x00,0x03,0xfc };
                     25: 
                     26: /*     4 Operands : emul *12(r3)[r4],r5,*12(r6)[r7],*12(r10)[r9]       */
                     27: #define I5     20
                     28: char EMUL[] = { 0x2e,0x44,0xf3,0x00,0x00,0x00,0x0c,0x55,
                     29:                0x47,0xf6,0x00,0x00,0x00,0x0c,0x49,0xfa,0x00,0x00,0x00,
                     30:                0x0c };
                     31: 
                     32: char KCALL[] = { 0xcf,0x50 };  /* kcall r0 */
                     33: 
                     34: asm(".text");
                     35: 
                     36: extern long iob2, iob3, u0p2pt, pcb0, savvec4, savvec5, savvec6, savvec7;
                     37: extern long ret_adr, saved_sp, saved_fp, *p_ptr;
                     38: 
                     39: 
                     40: 
                     41: /*             Demand paging with CALLS instruction  
                     42:    This test run virtual in P0 space with Kernel Privilege. Two entries in
                     43:    P2PT are mapped to iob2 and iob3. USP is set to 2nd word of page iob3, 
                     44:    PTE of Page iob2 is then set to invalid.  Program do
                     45:    a REI to user code which will execute the "calls" instruction , FP get
                     46:    push on the stack, FP is set to current SP, at this point SP is pointing
                     47:    to the 1st longword of page 98 and as soon as processor try to push the
                     48:    mask/arg on the the stack, SP point to last longword of the invalid page
                     49:    then page fault occurs.
                     50:    If USP is set point to a few longwords away from the top of page 98,then 
                     51:    page fault will occur when processor try to push PC or registers on the
                     52:    stack.
                     53: */
                     54: 
                     55:        long exp_fp, act_sp, act_fp, act_pc, act_psl;
                     56: 
                     57: dmp()
                     58: {      long *lptr, t_pte0, t_pte1;
                     59: 
                     60:        asm("mfpr $SBR,_savvec4");
                     61:        savvec4 |= (savvec4 | SADDR);           /* Make it system address */
                     62:        asm("mtpr _savvec4,$P0BR");             /* Double map P0PT to SPT */
                     63:        asm("mfpr $SLR,_savvec4");
                     64:        asm("mtpr _savvec4,$P0LR");
                     65: 
                     66:        asm("mtpr $6,$DCK");    
                     67:        asm("mtpr $0,$TBIA");   
                     68:        asm("mtpr $0,$PADC");   
                     69:        asm("mtpr $1,$MME");                    /* Enable MME */
                     70:        asm("jmp  *$0f");                       /* Go virtual */
                     71: asm("0:");
                     72:        /* Set up P2 space */
                     73:        lptr = &u0p2pt;
                     74:        *lptr = (IOB2);                         /* 1st PTE map to IOB2 */
                     75:        *(lptr+1) = (IOB3);                     /* 1st PTE map to IOB3 */
                     76:        savvec4 = ((long)lptr) | SADDR;
                     77:        savvec4 -= ((LAST_VPGNO-1) << 2);
                     78:        asm("mtpr _savvec4,$P2BR");
                     79:        asm("mtpr $0xffffd,$P2LR");             /* Use only 2 entries */
                     80: 
                     81:        asm("movab fpc1,_savvec4");
                     82:        savvec4 = (savvec4 >> PGSHIFT) & PTE_PFN;       /* Make test area */
                     83:        fixpv_pte(P0BR,savvec4,&t_pte0,(PTE_V | PTE_UW));       /* User R/W */
                     84:        fixpv_pte(P0BR,savvec4+1,&t_pte1,(PTE_V | PTE_UW));
                     85: 
                     86:        tst_call();
                     87:        asm("mtpr $0,$MME");                    /* Disable MME */
                     88:        asm("mtpr $0,$P0LR");
                     89: }
                     90: 
                     91: 
                     92: tst_call()
                     93: {      char *msg1, *msg2;
                     94:        long saved_pte, saved_vec1, saved_vec2, dummy;
                     95:        long reipc, exp_pc, exp_sp, exp_psl;
                     96: 
                     97:        /* Set up PCBB */
                     98:        savvec4 = (long)&pcb0;
                     99:        asm("mtpr _savvec4,$PCBB");
                    100:        
                    101:        fixpv_pte(P2BR,TST0_PTEP2,&saved_pte,(PTE_V|PTE_UW));
                    102:        fixpv_pte(P2BR,TST1_PTEP2,&saved_pte,PTE_UW);        /* Set V bit off */
                    103:        asm("movab fpc1,_savvec4");
                    104:        exp_pc = savvec4;                                    /* Expected PC */
                    105:        exp_sp = ((TST0_PTEP2 << PGSHIFT) | 8) | P2ADDR;     /* Expected SP */
                    106:        savvec4 = exp_sp;
                    107:        asm("mtpr _savvec4,$USP");      /* Set USP point to valid page */
                    108:        exp_fp = savvec4 + 4;
                    109:        asm("movab (sp),_savvec4"); 
                    110:        savvec4 -= 16;                          /* KSP is 4 words below IS */
                    111:        asm("mtpr _savvec4,$KSP");              /* Set KSP */
                    112:        asm("movab trans_flt,_savvec4");        /* New handler for TRANS_FLT */
                    113:        set_handler(TRANS_VEC,&saved_vec1,savvec4);
                    114: 
                    115: 
                    116:        exp_psl = PSL_USR;                      /* PSL : User mode    */
                    117:        savvec6 = exp_psl;
                    118:        asm("pushl _savvec6");                  /* Push PSL */
                    119:        asm("movab fpc1,_savvec7");
                    120:        asm("pushl _savvec7");                  /* Push PC */
                    121: 
                    122:        asm("movl fp,_saved_fp");               /* save FP to return  */
                    123:        asm("movl _exp_fp,fp");
                    124:        asm("mtpr $1,$PACC");                   /* Purge all code cache */
                    125: asm("d1pc:");
                    126:        asm("rei");                             /* ISP is saved here */
                    127:        asm("halt");
                    128: asm(".align 2");
                    129: asm("rtn_here:");
                    130:        asm("movl _saved_fp,fp");               /* restore FP */
                    131:        if (act_pc != exp_pc)
                    132:                {
                    133:                msg1="** PC pushed on the stack is not correct.";
                    134:                d1err(msg1,act_pc,exp_pc,exp_pc,exp_sp);
                    135:                }
                    136:        if (exp_sp != act_sp)
                    137:                {
                    138:                msg1="** SP is not restored to original value after translation not valid fault";
                    139:                d1err(msg1,act_sp,exp_sp,exp_pc,exp_sp);
                    140:                }
                    141:        if (exp_fp != act_fp)
                    142:                {
                    143:                msg2="** FP is not restored to original value after translation not valid fault";
                    144:                d1err(msg1,act_fp,exp_fp,exp_pc,exp_sp);
                    145:                }
                    146:        /* set page at fault to valid and restart instruction at PC */
                    147:        fixpv_pte(P2BR,TST1_PTEP2,&saved_pte,(PTE_V|PTE_UW));
                    148:        set_handler(TRANS_VEC,&dummy,saved_vec1);  /* restore handler */
                    149:        asm("movab kcall_dmp,_savvec4");        /* New handler for KCALL */
                    150:        set_handler(CHMK_VEC,&saved_vec1,savvec4);
                    151:        asm("pushl _savvec6");                  /* Push PSL */
                    152:        asm("pushl _savvec7");                  /* Push PC */
                    153:        asm("rei");
                    154:        asm("halt");
                    155: asm("good_rtn:");
                    156:        asm("movl _saved_fp,fp");               /* restore FP */
                    157:        set_handler(CHMK_VEC,&dummy,saved_vec1);
                    158: }
                    159: 
                    160: T_AREA()
                    161: {
                    162: asm("fpc1:");
                    163:        asm("calls $4,_proc");  /* should cause translation not valid fault */
                    164:        asm("kcall $0");        /* return */
                    165: }
                    166: 
                    167: /* Dummy procedure to test demand paging with CALLS instruction */
                    168: proc()
                    169: {
                    170: asm("ret");
                    171: }
                    172: 
                    173: 
                    174: ex_area()
                    175: {
                    176: asm(".align    2");                    /* Longword align */
                    177: asm("trans_flt:");
                    178: 
                    179:        asm("mtpr $0x1f,$IPL"); 
                    180:        asm("movl (sp)+,r12");          /* Pop 1st two paramters */
                    181:        asm("movl (sp)+,r12");  
                    182:        asm("movl (sp)+,_act_pc");      /* Actual PC */ 
                    183:        asm("movl (sp)+,_act_psl");     /* Actual PSL */        
                    184:        asm("movl fp,_act_fp");         /* Actual FP */
                    185:        asm("mfpr $USP,_act_sp");       /* Actual SP */
                    186:        asm("svpctx");                  /* Switch back to IS */
                    187:        asm("jmp  rtn_here");           /* return   */
                    188: 
                    189: asm("kcall_dmp:");
                    190:        asm("mtpr $0x1f,$IPL"); 
                    191:        asm("svpctx");                  /* Switch back to IS */
                    192:        asm("jmp  good_rtn");           /* return   */
                    193: }
                    194: 
                    195: 
                    196: d1err(msg1,act,exp,pc,sp)
                    197: char *msg1;
                    198: long act, exp, pc, sp;
                    199: {
                    200:        writes(msg1);
                    201:        writes("\n** Actual   : "); writeh(act); 
                    202:        writes("\n** Expect   : "); writeh(exp); 
                    203:        writes("\n** PC (CALLS intruction) : "); writeh(pc);
                    204:        writes("\n** SP (before CALLS)     : "); writeh(sp);
                    205:        writec('\n');
                    206:        asm("halt");
                    207: }

unix.superglobalmegacorp.com

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