Annotation of cci/d/demand/dmp.c, revision 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.