File:  [Power 6/32 Unix Tahoe 4.2BSD] / cci / d / dmp4 / chk_dbl_psl.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Sun Jul 28 12:30:21 2019 UTC (7 years ago) by root
Branches: bsd, MAIN
CVS tags: v121, HEAD
Power 6/32 Unix version 1.21


#include "dmp_defs.h"


/***********************************************************************
*
*   Verify results after a double precision TSTD or CMPD(2) instruction
*
*  The final PSL value is compared to the expected value. Also, the
*  final accumulator and the registers are checked to make sure that 
*  they weren't modified.
*  The "no-fpp" firmware will not clear "bad 0" double precision accumulators.
***********************************************************************/
chk_dbl_psl()
{
	if( (dbl_ld_acc.m & 0x7f800000) ||	/* get the exp'd Acc */
	    (no_fpp_wcs) ) {
	     sgl_value_1 = dbl_ld_acc.m;
	     sgl_value_2 = dbl_ld_acc.l;
	} else {				/* zero accumulator */
	     sgl_value_1 = 0;		/* clear any bad 0's */
	     sgl_value_2 = 0;
	}  /* end of "0" accumulator */
	exp_psl = init_psl;			/* get the initial PSL      */
	exp_psl &= 0xfffffff1;			/* clear the flag bits      */
	exp_psl |= PSL_DBL;			/* set the DBL Acc. bit     */
	exp_psl |= PSL_C;			/* set the CARRY bit        */
	if( dbl_expected.m == ZERO )
	    exp_psl |= PSL_Z;			/* expect the ZERO bit set  */
	if( dbl_expected.m == NEGATIVE )
	    exp_psl |= PSL_N;			/* expect the NEG bit set   */
	if( psl_val != exp_psl ) {
	    errcnt++;
	    if( prt_error )
		 prt_d_psl_e( bad_psl_msg );
	    if( halt_flg )
		 hlt_d_psl_e( 2 );		/* error code 2 */
	    if( loop_on_err )
		 force_loop = TRUE;		/* set loop flag */
	}
	 else if( no_page_faults != exp_page_faults ) {
	    errcnt++;
	    if( prt_error )
		 prt_d_psl_e( trans_flt_cnt_msg );
	    if( halt_flg )
		 hlt_d_psl_e( 3 );		/* error code 3 */
	    if( loop_on_err )
		 force_loop = TRUE;		/* set loop flag */
	}
	 else if( (dbl_st_acc.m != sgl_value_1) ||  /* check final Acc. */
	          (dbl_st_acc.l != sgl_value_2) ) {
	    errcnt++;
	    if( prt_error )
		 prt_d_psl_e( acc_modified_msg );
	    if( halt_flg )
		 hlt_d_psl_e( 5 );		/* error code 5 */
	    if( loop_on_err )
		 force_loop = TRUE;		/* set loop flag */
	}
	 else {
	    reg_no = 0;
	    regs_ok = TRUE;
	    while( (reg_no <= 13) && (regs_ok) )  /* check 1st 13 regs */
		if( store_regs[ reg_no ] == exp_regs[ reg_no ] )
		    reg_no++;
		else
		    regs_ok = FALSE;
	    if( !regs_ok )
	    {
	        errcnt++;
	        if( prt_error )
		     prt_d_psl_e( reg_modified_msg );
	        if( halt_flg )
		     hlt_d_psl_e( 4 );		/* error code 4 */
	        if( loop_on_err )
		     force_loop = TRUE;		/* set loop flag */
	    }
	} 
}



/************************************************************************
*		PRINT AN ERROR MESSAGE OF THE FORM
*
* cycle: xx. DMP test xx. <inst>. <error message>, index = xx
* addressing mode: <addressing mode description>
* inst buf= xx xx xx xx xx xx xx xx xx xx xx -page faults on byte(s) 0, x 
* initial Acc = xxxxxxxx xxxxxxxx,  operand1 = xxxxxxxx xxxxxxxx,  xx pg faults
*   final Acc = xxxxxxxx xxxxxxxx,  operand2 = xxxxxxxx xxxxxxxx,  xx expected
* initial PSL = xxxxxxxx,   final PSL = xxxxxxxx,  expected PSL = xxxxxxxx
************************************************************************/
prt_d_psl_e( message )
char *message;
{
	prt_dmp_er_msg( message );		/* print the error header */
	writes("initial Acc = ");
	write32h( dbl_ld_acc.m );		/* print Acc loaded */
	writec(' ');
	write32h( dbl_ld_acc.l );
	if( no_ops ) {
	    writes(",  operand1 = ");
	    write32h( dbl_value_1.m );		/* write op 1 data */
	    writec(' ');
	    write32h( dbl_value_1.l );
	}
	writes(",  ");
	writed( no_page_faults );
	writes(" pg faults\n");
	writes("  final Acc = ");		/* write final ACC data */
	write32h( dbl_st_acc.m );
	writec(' ');
	write32h( dbl_st_acc.l );
	if( no_ops == 2 ) {
	    writes(",  operand2 = ");
	    write32h( dbl_value_2.m );		/* write op 2 data */
	    writec(' ');
	    write32h( dbl_value_2.l );
	}
	if( no_ops )
	    writes(",                                 ");
	else
	    writes(",  ");
	writed( exp_page_faults );
	writes(" expected\n");
	writes("\ninitial PSL = ");		/* print PSL data */
	write32h( init_psl );
	writes(",   final PSL = ");
	write32h( psl_val );
	writes(",  expected PSL = ");
	write32h( exp_psl );
	writec('\n');
	if( message == reg_modified_msg )	/* print modified register */
	    prt_reg_data();			/* print bad register      */
}



/**************************************************************************
*	Set up the registers and halt
**************************************************************************/
hlt_d_psl_e( code )
int code;
{
	sgl_dummy1 = code;
	asm("movl _test_no,r0");		/* r0  = test number       */
	asm("movl _addr_code,r1");		/* r1  = addressing mode   */
	asm("movl _sgl_dummy1,r2");		/* r2  = error code        */
	asm("movl _cycle,r3");			/* r3  = cycle count       */
	sgl_dummy1 = dbl_ld_acc.m;
	sgl_dummy2 = dbl_ld_acc.l;
	asm("movl _sgl_dummy1,r4");		/* r4  = MS of initial Acc */
	asm("movl _sgl_dummy2,r5");		/* r5  = LS of initial Acc */
	if( no_ops ) {
	    sgl_dummy1 = dbl_value_1.m;
	    sgl_dummy2 = dbl_value_1.m;
	    asm("movl _sgl_dummy1,r6");		/* r6  = MS of operand 1   */
	    asm("movl _sgl_dummy2,r7");		/* r7  = LS of operand 1   */
	} else {
	    asm("clrl r6");			/* r6, r7 = 0 for TSTD     */
	    asm("clrl r7");;
	}
	if( no_ops ==  2 ) {
	    sgl_dummy1 = dbl_value_2.m;
	    sgl_dummy2 = dbl_value_2.m;
	    asm("movl _sgl_dummy1,r8");		/* r8  = MS of operand 2   */
	    asm("movl _sgl_dummy2,r9");		/* r9  = LS of operand 2   */
	} else {
	    asm("clrl r8");			/* r8, r9 = 0 for TSTD,CMPD */
	    asm("clrl r9");;
	}
	if( code == 2 ) {  /* wrong PSL */
	    asm("movl _init_psl,r10");		/* r10 = initial psl       */
	    asm("movl _psl_val,r11");		/* r11 = final psl         */
	    asm("movl _exp_psl,r12");		/* r12 = expected psl      */
	    asm("movl _index,r13");		/* r13 = data index        */
	}
	 else if( code == 3 ) {  /* wrong # page faults */
	    asm("movl _no_page_faults,r10");	/* r10 = # page faults     */
	    asm("movl _exp_page_faults,r11");	/* r11 = # faults expected */
	}
	 else if( code == 5 ) {	/* corrupted accumulator */
	    sgl_dummy1 = dbl_st_acc.m;
	    sgl_dummy2 = dbl_st_acc.l;
	    asm("movl _sgl_dummy1,r10");	/* r10 = MS of final Acc.  */
	    asm("movl _sgl_dummy2,r11");	/* r11 = LS of final Acc.  */
	}
	else  {			/* corrupted register */
	    asm("movl _reg_no,r10");		/* r10 = bad register #    */
	    asm("movl _store_regs[r9],r11");	/* r11 = final (bad) value */
	    asm("movl _exp_regs[r9],r12");	/* r12 = expected value    */
	}
	asm(".globl _hlt_dbl_psl");
	asm("_hlt_dbl_psl:");
	asm("halt");
}


unix.superglobalmegacorp.com

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