1*47940Sbostic /*- 2*47940Sbostic * Copyright (c) 1980 The Regents of the University of California. 3*47940Sbostic * All rights reserved. 4*47940Sbostic * 5*47940Sbostic * %sccs.include.proprietary.c% 6*47940Sbostic */ 7*47940Sbostic 8*47940Sbostic #ifndef lint 9*47940Sbostic static char sccsid[] = "@(#)traper_.c 5.4 (Berkeley) 04/12/91"; 10*47940Sbostic #endif /* not lint */ 11*47940Sbostic 124154Sdlw /* 134154Sdlw * Full of Magic! DON'T CHANGE ANYTHING !! 144154Sdlw * 154154Sdlw * To use from f77: 164154Sdlw * integer oldmsk, traper 174154Sdlw * oldmsk = traper (mask) 1829959Smckusick * where for vax: 194154Sdlw * mask = 1 to trap integer overflow 204154Sdlw * mask = 2 to trap floating underflow 214154Sdlw * mask = 3 to trap both 224154Sdlw * These 2 bits will be set into the PSW. 234154Sdlw * The old state will be returned. 2429959Smckusick * 2529959Smckusick * where for CCI: 2629959Smckusick * mask = 0 to trap neither 2729959Smckusick * mask = 1 to trap integer overflow 2829959Smckusick * mask = 2 to trap floating underflow 2929959Smckusick * mask = 3 to trap both 3029959Smckusick * These 2 bits will be set into the PSL. 3129959Smckusick * The old state will be returned. 324154Sdlw */ 334154Sdlw 3429959Smckusick #ifdef vax traper_(msk)354154Sdlwlong traper_(msk) 364154Sdlw long *msk; 374154Sdlw { 384154Sdlw int old = 0; 394154Sdlw #define IOV_MASK 0140 404154Sdlw int **s = &msk; 414154Sdlw int psw; 424154Sdlw 434154Sdlw s -= 5; 444154Sdlw psw = (int)*s; 454154Sdlw old = (psw & IOV_MASK) >> 5; 464154Sdlw psw = (psw & ~IOV_MASK) | ((*msk << 5) & IOV_MASK); 474154Sdlw *s = (int *)psw; 484154Sdlw return((long)old); 494154Sdlw } 5029959Smckusick #endif vax 5129959Smckusick 5229959Smckusick /* 5329959Smckusick * Assumptions for CCI: 5429959Smckusick * - the two bits are contiguous in PSL; 5529959Smckusick * - integer overflow trap enable bit < floating underflow trap enable bit; 5629959Smckusick */ 5729959Smckusick #ifdef tahoe 5829959Smckusick # include <machine/psl.h> 5929959Smckusick 6029959Smckusick unsigned long old_msk; 6129959Smckusick unsigned short new_msk; 6229959Smckusick unsigned long tst_msk; 6329959Smckusick traper_(msk)6429959Smckusicklong traper_(msk) 6529959Smckusick long *msk; 6629959Smckusick { 6729959Smckusick #define IOV_MASK (PSL_IV | PSL_FU) 6829959Smckusick #define IOV_DISP 5 6929959Smckusick 7029959Smckusick asm(" movpsl _old_msk"); 7129959Smckusick 7229959Smckusick old_msk = (old_msk & IOV_MASK) >> IOV_DISP; 7329959Smckusick 7429959Smckusick new_msk = (*msk << IOV_DISP) & IOV_MASK; 7529959Smckusick asm(" bispsw _new_msk"); 7629959Smckusick 7729959Smckusick new_msk = ~(*msk << IOV_DISP) & IOV_MASK; 7829959Smckusick asm(" bicpsw _new_msk"); 7929959Smckusick 8029959Smckusick return(old_msk); 8129959Smckusick } 8229959Smckusick #endif tahoe 83