⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asmdefs.h

📁 open source bios with linux platform, very good and can be reused.
💻 H
字号:
/*   -*- asm -*-  * *   Creation Date: <2001/02/03 19:38:07 samuel> *   Time-stamp: <2003/07/08 18:55:50 samuel> *    *	<asmdefs.h> *	 *	Common assembly definitions *    *   Copyright (C) 2001, 2002, 2003 Samuel Rydh (samuel@ibrium.se) *    *   This program is free software; you can redistribute it and/or *   modify it under the terms of the GNU General Public License *   as published by the Free Software Foundation *    */#ifndef _H_ASMDEFS#define _H_ASMDEFS#include "openbios/asm.m4"	#ifndef __ASSEMBLY__#error	This file is only to be included from assembler code!#endif/************************************************************************//*	High/low halfword compatibility macros				*//************************************************************************/#ifdef __linux__#define 	ha16( v )	(v)##@ha#define 	hi16( v )	(v)##@h#define 	lo16( v )	(v)##@l#endif#define		HA(v)		ha16(v)#define		HI(v)		hi16(v)#define		LO(v)		lo16(v)	/************************************************************************//*	Register name prefix						*//************************************************************************/#ifdef __linux__define([rPREFIX], [])define([fPREFIX], [])define([srPREFIX], [])#elsedefine([rPREFIX], [r])define([fPREFIX], [f])define([srPREFIX], [sr])/* frN -> fN */mFORLOOP([i],0,31,[define(fr[]i,f[]i)])#endif/************************************************************************//*	Macros and definitions						*//************************************************************************/#ifdef __darwin__#define balign_4	.align 2,0#define balign_8	.align 3,0#define balign_16	.align 4,0#define balign_32	.align 5,0#endif#ifdef __linux__#define balign_4	.balign 4,0#define balign_8	.balign 8,0#define balign_16	.balign 16,0#define balign_32	.balign 32,0#endif	MACRO(LOADVAR, [dreg, variable], [	lis	_dreg,HA(_variable)	lwz	_dreg,LO(_variable)(_dreg)])MACRO(LOADI, [dreg, addr], [	lis	_dreg,HA(_addr)	addi	_dreg,_dreg,LO(_addr)])MACRO(LOAD_GPR_RANGE, [start, endx, offs, base], [	mFORLOOP([i],0,31,[ .if (i >= _start) & (i <= _endx)		lwz rPREFIX[]i,_offs+i[]*4(_base)	.endif ])])MACRO(STORE_GPR_RANGE, [start, endx, offs, base], [	 mFORLOOP([i],0,31,[ .if (i >= _start) & (i <= _endx)		stw rPREFIX[]i,_offs+i[]*4(_base)	.endif ])])MACRO(LOAD_FPR_RANGE, [start, endx, offs, base], [	mFORLOOP([i],0,31,[ .if (i >= _start) & (i <= _endx)		lfd fPREFIX[]i,_offs+i[]*8(_base)	.endif])])MACRO(STORE_FPR_RANGE, [start, endx, offs, base], [	mFORLOOP([i],0,31,[ .if (i >= _start) & (i <= _endx)		stfd fPREFIX[]i,_offs+i[]*8(_base)	.endif ])])/************************************************************************//*	FPU load/save macros						*//************************************************************************/	// The FPU macros are used both in the kernel and in	// mainloop_asm.h.MACRO(xFPR_LOAD_RANGE, [from, to, mbase], [	LOAD_FPR_RANGE _from,_to,xFPR_BASE,_mbase])MACRO(xFPR_SAVE_RANGE, [from, to, mbase], [	STORE_FPR_RANGE _from,_to,xFPR_BASE,_mbase])	// The low half of the fpu is fr0-fr12. I.e. the FPU registers 	// that might be overwritten when a function call is taken	// (fr13 and fpscr are treated specially).MACRO(xLOAD_LOW_FPU, [mbase], [	xFPR_LOAD_RANGE 0,12,_mbase])MACRO(xLOAD_TOPHALF_FPU, [mbase], [	xFPR_LOAD_RANGE 14,31,_mbase])MACRO(xLOAD_FULL_FPU, [mbase], [	xLOAD_LOW_FPU _mbase	xLOAD_TOPHALF_FPU _mbase])MACRO(xSAVE_LOW_FPU, [mbase], [	xFPR_SAVE_RANGE 0,12,_mbase])MACRO(xSAVE_TOPHALF_FPU, [mbase], [	xFPR_SAVE_RANGE 14,31,_mbase])MACRO(xSAVE_FULL_FPU, [mbase], [	xSAVE_LOW_FPU _mbase	xSAVE_TOPHALF_FPU _mbase	])/************************************************************************//*	GPR load/save macros						*//************************************************************************/MACRO(xGPR_SAVE_RANGE, [from, to, mbase], [	STORE_GPR_RANGE _from, _to, xGPR0, _mbase])MACRO(xGPR_LOAD_RANGE, [from, to, mbase], [	LOAD_GPR_RANGE _from, _to, xGPR0, _mbase])/************************************************************************//*	AltiVec								*//************************************************************************/#ifdef __linux__define(vPREFIX,[])#ifndef HAVE_ALTIVEC#define VEC_OPCODE( op1,op2,A,B,C ) \	.long	(((op1) << (32-6)) | (op2) | ((A) << (32-11)) | ((B) << (32-16)) | ((C) << (32-21))) ;	#define __stvx( vS,rA,rB )	VEC_OPCODE( 31,0x1ce,vS,rA,rB )#define __lvx( vD,rA,rB )	VEC_OPCODE( 31,0xce, vD,rA,rB )#define __mfvscr( vD )		VEC_OPCODE( 4,1540,vD,0,0 )#define __mtvscr( vB )		VEC_OPCODE( 4,1604,0,0,vB )#define __stvewx( vS,rA,rB )	VEC_OPCODE( 31,(199<<1), vS,rA,rB )mFORLOOP([i],0,31,[define(v[]i,[]i)])MACRO(stvx, [vS,rA,rB],		[ __stvx( _vS,_rA,_rB ) ; ])MACRO(lvx,  [vD,rA,rB],		[ __lvx( _vD,_rA,_rB ) ; ])MACRO(mfvscr, [vD],		[ __mfvscr( _vD ) ; ])MACRO(mtvscr, [vB],		[ __mtvscr( _vB ) ; ])MACRO(stvewx, [vS,rA,rB],	[ __stvewx( _vS,_rA,_rB ) ; ])#endif#else	/* __linux__ */define(vPREFIX,[v])#endif	/* __linux__ */// NOTE: Writing to VSCR won't cause exceptions (this// is different compared to FPSCR).MACRO(xVEC_SAVE, [mbase, scr], [	addi	_scr,_mbase,xVEC_BASE	mFORLOOP([i],0,31,[		stvx	vPREFIX[]i,0,_scr		addi	_scr,_scr,16	])	addi	_scr,_mbase,xVSCR-12	mfvscr	v0	stvx	v0,0,_scr	addi	_scr,_mbase,xVEC0	lvx	v0,0,_scr	mfspr	_scr,S_VRSAVE	stw	_scr,xVRSAVE(_mbase)])MACRO(xVEC_LOAD, [mbase, scr], [	addi	_scr,_mbase,xVSCR-12	lvx	v0,0,_scr	mtvscr	v0	addi	_scr,_mbase,xVEC_BASE	mFORLOOP([i],0,31,[		lvx	vPREFIX[]i,0,_scr		addi	_scr,_scr,16	])	lwz	_scr,xVRSAVE(_mbase)	mtspr	S_VRSAVE,_scr])	/************************************************************************//*	Instructions							*//************************************************************************/#ifdef __darwin__MACRO(mtsprg0, [reg], [mtspr SPRG0,_reg] )MACRO(mtsprg1, [reg], [mtspr SPRG1,_reg] )MACRO(mtsprg2, [reg], [mtspr SPRG2,_reg] )MACRO(mtsprg3, [reg], [mtspr SPRG3,_reg] )MACRO(mfsprg0, [reg], [mfspr _reg,SPRG0] )MACRO(mfsprg1, [reg], [mfspr _reg,SPRG1] )MACRO(mfsprg2, [reg], [mfspr _reg,SPRG2] )MACRO(mfsprg3, [reg], [mfspr _reg,SPRG3] )#endif/************************************************************************//*	Register names							*//************************************************************************/#ifdef __darwin__/* These symbols are not defined under Darwin */#define		cr0	0#define		cr1	1#define		cr2	2#define		cr3	3#define		cr4	4#define		cr5	5#define		cr6	6#define		cr7	7	#define		cr8	8#define		lt	0	/* Less than */#define		gt	1	/* Greater than */#define		eq	2	/* Equal */#define		so	3	/* Summary Overflow */#define		un	3	/* Unordered (after floating point) */#endif	/* FPU register names (to be used as macro arguments) */#define	FR0	0#define	FR1	1#define	FR2	2#define	FR3	3#define	FR4	4#define	FR5	5#define	FR6	6#define	FR7	7#define	FR8	8#define	FR9	9#define	FR10	10#define	FR11	11#define	FR12	12#define	FR13	13#define	FR14	14#define	FR15	15#define	FR16	16#define	FR17	17#define	FR18	18#define	FR19	19#define	FR20	20#define	FR21	21#define	FR22	22#define	FR23	23#define	FR24	24#define	FR25	25#define	FR26	26#define	FR27	27#define	FR28	28#define	FR29	29#define	FR30	30#define	FR31	31/* GPR register names (to be used as macro arguments) */#define	R0	0#define	R1	1#define	R2	2#define	R3	3#define	R4	4#define	R5	5#define	R6	6#define	R7	7#define	R8	8#define	R9	9#define	R10	10#define	R11	11#define	R12	12#define	R13	13#define	R14	14#define	R15	15#define	R16	16#define	R17	17#define	R18	18#define	R19	19#define	R20	20#define	R21	21#define	R22	22#define	R23	23#define	R24	24#define	R25	25#define	R26	26#define	R27	27#define	R28	28#define	R29	29#define	R30	30#define	R31	31		#ifndef __darwin__/* GPR register names, rN -> N, frN -> N, vN -> N */mFORLOOP([i],0,31,[define(r[]i,[]i)])	mFORLOOP([i],0,31,[define(fr[]i,[]i)])	mFORLOOP([i],0,31,[define(v[]i,[]i)])	#endif /* __darwin__ *//************************************************************************//*	useful macros							*//************************************************************************/MACRO(ori_, [reg1, reg2, value], [	.if (_value & 0xffff)		ori _reg1, _reg2, (_value) & 0xffff	.endif	.if (_value & ~0xffff)		oris _reg1, _reg2, (_value) >> 16	.endif])	/************************************************************************//*	MISC								*//************************************************************************/#ifdef __linux__#define GLOBL( name )		.globl name ; name#define EXTERN( name )		name#else/* an underscore is needed on Darwin */#define GLOBL( name )		.globl _##name ; name: ; _##name#define EXTERN( name )		_##name#endif	#define	BIT(n)		(1<<(31-(n)))#endif   /* _H_ASMDEFS */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -