version 1.15, 1996/07/16 20:57:11
|
version 1.16, 1996/07/19 20:45:01
|
Line 71 extern void cacheflush(void *, int, int)
|
Line 71 extern void cacheflush(void *, int, int)
|
|
|
# define ASS17(n)(((((n) >> 13) & 0x1F) << 16)| /* first 5 bits */ \ |
# define ASS17(n)(((((n) >> 13) & 0x1F) << 16)| /* first 5 bits */ \ |
((((n) >> 2) & 0x3FF) << 3)| /* second 11 bits */ \ |
((((n) >> 2) & 0x3FF) << 3)| /* second 11 bits */ \ |
((((n) >> 12) & 0x1) << 2) | /* lo sign (aaarg!) */ \ |
((((n) >> 12) & 0x1) << 2) | /* intermediate bit */ \ |
(((n) < 0) << 0)) /* sign bit */ |
(((n) < 0) << 0)) /* low sign bit (aaarg!) */ |
|
|
# define DIS17(n)(((((n) >> 16) & 0x1F) << 13)| /* first 5 bits */ \ |
# define DIS17(n)(((((n) >> 16) & 0x1F) << 13)| /* first 5 bits */ \ |
((((n) >> 3) & 0x3FF) << 2)| /* second 11 bits */ \ |
((((n) >> 3) & 0x3FF) << 2)| /* second 11 bits */ \ |
((((n) >> 2) & 0x1) << 12) | /* lo sign (aaarg!) */ \ |
((((n) >> 2) & 0x1) << 12) | /* intermediate bit */ \ |
(-((n) & 1) << 18)) /* sign bit */ |
(-((n) & 1) << 18)) /* low sign bit (aaarg!) */ |
|
|
# define CODE_ADDRESS(cfa)\ |
# define CODE_ADDRESS(cfa)\ |
((Label)({ \ |
((Label)({ \ |
unsigned int *_cfa=(unsigned int *)(cfa); unsigned _ca; \ |
unsigned int *_cfa=(unsigned int *)(cfa); \ |
if((_cfa[0] & 0xFFE0E002) == 0xE8000000) /* relative branch */ \ |
unsigned int _ca = DIS17(_cfa[0]); \ |
|
if((_cfa[0] & 0xFFE0E000) == 0xE8000000) /* relative branch */ \ |
{ \ |
{ \ |
_ca = _cfa[0]; \ |
|
_ca = DIS17(_ca); \ |
|
_ca += (int) (_cfa + 1); \ |
_ca += (int) (_cfa + 1); \ |
} \ |
} \ |
else if((_cfa[0] & 0xFFE0E002) == 0xE0000000) /* absolute branch */ \ |
else if((_cfa[0] & 0xFFE0E000) == 0xE0000000) /* absolute branch */ \ |
{ \ |
{ \ |
_ca = _cfa[0]; \ |
_ca = _ca-4; \ |
_ca = DIS17(_ca)-4; \ |
|
} \ |
} \ |
else \ |
else \ |
{ \ |
{ \ |
_ca = _cfa[0]; \ |
_ca = (int)_cfa; \ |
_ca = (_ca<<31) | \ |
|
((_ca>>1 ) & 0x00001800) | \ |
|
((_ca>>3 ) & 0x0003E000) | \ |
|
((_ca<<4 ) & 0x000C0000) | \ |
|
((_ca<<19) & 0x7FF00000) | \ |
|
((_cfa[1]>>1) & 0xFFC); \ |
|
} \ |
} \ |
/* printf("code-address at %08x: %08x\n",_ca,_cfa); */ \ |
/* printf("code-address at %08x: %08x\n",_ca,_cfa); */ \ |
_ca; \ |
_ca + ((_cfa[0] & 2) << 1); \ |
})) |
})) |
|
|
# define MAKE_CF(cfa,ca) \ |
# define MAKE_CF(cfa,ca) \ |
Line 120 extern void cacheflush(void *, int, int)
|
Line 112 extern void cacheflush(void *, int, int)
|
( 0 << 13) | /* space register */ \ |
( 0 << 13) | /* space register */ \ |
( 0 << 1) | /* if 1, don't execute delay slot */ \ |
( 0 << 1) | /* if 1, don't execute delay slot */ \ |
ASS17(_ca)); \ |
ASS17(_ca)); \ |
_cfa[1] = ((long *)(_ca))[-1]; /* or %r0,%r0,%r0 */; \ |
_cfa[1] = ((long *)(_ca))[-1]; /* fill delay slot with first inst */ \ |
} \ |
} \ |
else if(_dp < 0x40000 || _dp >= -0x40000) \ |
else if(_dp < 0x40000 || _dp >= -0x40000) \ |
{ \ |
{ \ |
Line 129 extern void cacheflush(void *, int, int)
|
Line 121 extern void cacheflush(void *, int, int)
|
( 0 << 13) | /* space register */ \ |
( 0 << 13) | /* space register */ \ |
( 0 << 1) | /* if 1, don't execute delay slot */ \ |
( 0 << 1) | /* if 1, don't execute delay slot */ \ |
ASS17(_dp)); \ |
ASS17(_dp)); \ |
_cfa[1] = ((long *)(_ca))[-1]; /* 0x08000240 or %r0,%r0,%r0 */; \ |
_cfa[1] = ((long *)(_ca))[-1]; /* fill delay slot with first inst */ \ |
} \ |
} \ |
else \ |
else \ |
{ \ |
{ \ |
_ca -= 4; \ |
fprintf(stderr,"CODE FIELD assignment failed, use ITC instead of DTC\n"); exit(1); \ |
_cfa[0] = (0x08 << 26) | \ |
|
((int)_ca<0) | \ |
|
(_ca & 0x00001800)<<1 | \ |
|
(_ca & 0x0003E000)<<3 | \ |
|
(_ca & 0x000C0000)>>4 | \ |
|
(_ca & 0x7FF00000)>>19; \ |
|
_ca &= 0x3FF; \ |
|
_cfa[1] =((0x38 << 26) | /* major opcode */ \ |
|
( 1 << 21) | /* register */ \ |
|
( 0 << 13) | /* space register */ \ |
|
( 1 << 1) | /* if 1, don't execute delay slot */ \ |
|
ASS17(_ca)); \ |
|
} \ |
} \ |
DOUT("%08x: %08x,%08x\n",(int)_cfa,_cfa[0],_cfa[1]); \ |
DOUT("%08x: %08x,%08x\n",(int)_cfa,_cfa[0],_cfa[1]); \ |
}) |
}) |
Line 158 extern void cacheflush(void *, int, int)
|
Line 138 extern void cacheflush(void *, int, int)
|
# define DOES_CODE1(cfa) ((Xt *)(((long *)(cfa))[1])) |
# define DOES_CODE1(cfa) ((Xt *)(((long *)(cfa))[1])) |
|
|
# define DOES_CODE(cfa) \ |
# define DOES_CODE(cfa) \ |
(((((*(long *)(cfa)) & 0xF7E0E002) == 0xE0000000) && \ |
(((((*(long *)(cfa)) & 0xF7E0E002) == 0xE0000002) && \ |
((long)(CODE_ADDRESS(CODE_ADDRESS(cfa))) == (long)symbols[DODOES])) ? \ |
((long)(CODE_ADDRESS(cfa)) == (long)symbols[DODOES])) ? \ |
DOES_CODE1(cfa) : 0L) |
DOES_CODE1(cfa) : 0L) |
|
|
/* ({register Xt * _ret asm("%r31"); _ret;}) */ |
/* ({register Xt * _ret asm("%r31"); _ret;}) */ |
Line 167 extern void cacheflush(void *, int, int)
|
Line 147 extern void cacheflush(void *, int, int)
|
/* HPPA uses register 2 for branch and link */ |
/* HPPA uses register 2 for branch and link */ |
|
|
# define DOES_HANDLER_SIZE 8 |
# define DOES_HANDLER_SIZE 8 |
# define MAKE_DOES_HANDLER(cfa) ({ *(long *)(cfa)=DODOES; }) |
# define MAKE_DOES_HANDLER(cfa) |
#ifdef undefined |
|
# define MAKE_DOES_HANDLER(cfa) \ |
|
({ \ |
|
long *_cfa = (long *)(cfa); \ |
|
int _ca = (int)symbols[DODOES]; \ |
|
int _dp = _ca-(int)(_cfa+2); \ |
|
\ |
|
if(_ca < 0x40000) /* Branch absolute */ \ |
|
{ \ |
|
_cfa[0] =((0x38 << 26) | /* major opcode */ \ |
|
( 0 << 21) | /* register */ \ |
|
( 0 << 13) | /* space register */ \ |
|
( 0 << 1) | /* if 1, don't execute delay slot */ \ |
|
ASS17(_ca)); \ |
|
_cfa[1] = 0x08000240 /* or %r0,%r0,%r0 */; \ |
|
} \ |
|
else if(_dp < 0x40000 || _dp >= -0x40000) \ |
|
{ \ |
|
_cfa[0] =((0x3A << 26) | /* major opcode */ \ |
|
( 0 << 21) | /* register */ \ |
|
( 0 << 13) | /* space register */ \ |
|
( 0 << 1) | /* if 1, don't execute delay slot */ \ |
|
ASS17(_dp)); \ |
|
_cfa[1] = 0x08000240 /* or %r0,%r0,%r0 */; \ |
|
} \ |
|
else \ |
|
{ \ |
|
_ca -= 4; \ |
|
_cfa[0] = ((0x08 << 26) | \ |
|
((int)_ca<0) | \ |
|
(_ca & 0x00001800)<<1 | \ |
|
(_ca & 0x0003E000)<<3 | \ |
|
(_ca & 0x000C0000)>>4 | \ |
|
(_ca & 0x7FF00000)>>19); \ |
|
_ca &= 0x3FF; \ |
|
_cfa[1] =((0x38 << 26) | /* major opcode */ \ |
|
( 1 << 21) | /* register */ \ |
|
( 0 << 13) | /* space register */ \ |
|
( 1 << 1) | /* if 1, don't execute delay slot */ \ |
|
ASS17(_ca)); \ |
|
} \ |
|
DOUT("%08x: %08x,%08x\n",(int)_cfa,_cfa[0],_cfa[1]); \ |
|
}) |
|
#endif |
|
|
|
# define MAKE_DOES_CF(cfa,ca) \ |
# define MAKE_DOES_CF(cfa,ca) \ |
({ \ |
({ \ |