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

📄 asm_depend.h

📁 日本著名的的嵌入式实时操作系统T-Kernel的源码及用户手册。
💻 H
字号:
/* *---------------------------------------------------------------------- *    T-Kernel * *    Copyright (C) 2004 by Ken Sakamura. All rights reserved. *    T-Kernel is distributed under the T-License. *---------------------------------------------------------------------- * *    Version:   1.01.00 *    Released by T-Engine Forum(http://www.t-engine.org) at 2004/6/28. * *---------------------------------------------------------------------- *//* *	@(#)asm_depend.h (tk/SH7751R) * *	Assembler Macro for SH7751R */#ifndef __TK_ASM_DEPEND_H__#define __TK_ASM_DEPEND_H__/* * Stack state at Exception/Interrupt * *		+-------+ *   new ISP ->	| R0	| *		| SPC	| *		| SSR	| *		| MDR	| *		| USP	| Save USP only when switching to the system stack *		+-------+ *   old ISP -> * * Macro *	INT_ENTER	* EIT entry *			Save to the interrupt stack as shown above. *	INT_RETURN	* EIT return *			Restore from the interrupt stack shown above *			and return (RTE). * *	If it is not the task independent part like extension SVC, *	need to move to the system stack before dispatch is enabled *	(interrupt enable) becauaes the interrupt stack can not be *	used continuously. * *	MOVE_ISP_SSP	Move from the interrupt stack to the system stack *	MOVE_SSP_ISP	Move from the system stack to the interrupt stack *//* * Exception/Interrupt entry common processing */ .macro	INT_ENTER name	mov	#3, r7		// If CPL > 0, switch to system stack	tst	r7, MDR	bt	l_nochg_\name	mov.l	SP, @-ISP	// User stack save	mov	SST, SP		// Switch to system stack  l_nochg_\name:	mov.l	MDR, @-ISP	// Operation mode save 	shll16	MDR		// Operation mode update 	stc.l	ssr, @-ISP	// SSR save	stc.l	spc, @-ISP	// SPC save 	mov.l	r0,  @-ISP	// R0 save	stc	sr, r0		// Interrupt disable SR.I = 15	or	#SR_I(15), r0	ldc	r0, sr .endm/* * Exception/Interrupt return common processing *	Execute by setting SR.BL=1 and SR.RB=1 */ .macro	INT_RETURN name	mov.l	@ISP+, r0	// R0 restore	ldc.l	@ISP+, spc	// SPC restore	ldc.l	@ISP+, ssr	// SSR restore	mov.l	@ISP+, MDR	// MDR restore	mov	#3, r7		// If PPL > 0, switch to user stack	tst	r7, MDR	bt	l_norst_\name	mov.l	@ISP+, SP	// Switch to user stack  l_norst_\name:	rte	nop .endm/* * TRAPA return common processing *	Execute by setting SR.BL=1 and SR.RB=1 *	Restore SSR to be always SR.FD = 1 */ .macro	CALL_RETURN name	mov.l	@(2*4, ISP), r0	// SSR	mov.l	l_srfd_\name, r7	or	r7, r0		// SSR.FD = 1	ldc	r0, ssr		// SSR restore	mov.l	@ISP+, r0	// R0 restore	ldc.l	@ISP+, spc	// SPC restore	add	#4, ISP		// skip SSR size(4byte)	mov.l	@ISP+, MDR	// MDR restore	mov	#3, r7		// If PPL > 0, switch to user stack	tst	r7, MDR	bt	l_norst_\name	mov.l	@ISP+, SP	// Switch to user stack  l_norst_\name:	rte	nop			.balign	4  l_srfd_\name:		.long	SR_FD .endm/* * ISP -> SSP move *	Execute by setting SR.BL=0 and SR.RB=1 */ .macro	MOVE_ISP_SSP name	mov.l	@(3*4,ISP), r0	// MDR	tst	#3, r0		// Check whether USP is saved	bt	l_nousp1_\name	// If PPL > 0, USP is saved	mov.l	@(4*4,ISP), r0	// USP	mov.l	r0, @-SP  l_nousp1_\name:	mov.l	@(3*4,ISP), r0	// MDR	mov.l	r0, @-SP	mov.l	@(2*4,ISP), r0	// SSR	mov.l	r0, @-SP	mov.l	@(1*4,ISP), r0	// SPC	mov.l	r0, @-SP	mov.l	@(0*4,ISP), r0	// R0	mov.l	r0, @-SP	bt	l_nousp2_\name	// Waste from interrupt stack	add	#1*4, ISP  l_nousp2_\name:	add	#4*4, ISP .endm/* * SSP -> ISP move *	Execute by setting SR.BL=0 and SR.RB=1 */ .macro	MOVE_SSP_ISP name	mov.l	@(3*4,SP), r0	// MDR	tst	#3, r0		// Check whether USP is saved	bt	l_nousp3_\name	// If PPL > 0, USP is saved	mov.l	@(4*4,SP), r0	// USP	mov.l	r0, @-ISP  l_nousp3_\name:	mov.l	@(3*4,SP), r0	// MDR	mov.l	r0, @-ISP	mov.l	@(2*4,SP), r0	// SSR	mov.l	r0, @-ISP	mov.l	@(1*4,SP), r0	// SPC	mov.l	r0, @-ISP	mov.l	@(0*4,SP), r0	// R0	mov.l	r0, @-ISP	bt	l_nousp4_\name	// Waste from system stack	add	#1*4, SP  l_nousp4_\name:	add	#4*4, SP .endm/* * Task exception handler entry * *		+---------------+ *  USP(R15) ->	| save SR	| Restore when returning from handler SR *	+4	| retadr	| Return address from handler *	+8	| texcd		| Exception code *		+---------------+ * *	Note that the privilege instruction is not available *	because it may be executed by the user mode. *	Since stack is alignmented by 4 bytes, it cannot be accessed *	by double(8bytes). */ .macro TEXHDR_ENTRY texhdr	mov.l	r4, @-SP		// R4 save	mov.l	@(3*4, SP), r4		// R4 = texcd	mov.l	r0, @(3*4, SP)		// R0 save	stc.l	gbr,  @-SP		// Save other register	sts.l	pr,   @-SP	sts.l	mach, @-SP	sts.l	macl, @-SP	mov.l	r1,   @-SP	mov.l	r2,   @-SP	mov.l	r3,   @-SP	mov.l	r5,   @-SP	mov.l	r6,   @-SP	mov.l	r7,   @-SP	sts.l	fpscr, @-SP		// Save FPU register	sts.l	fpul,  @-SP	mov	#0, r0	lds	r0, fpscr	frchg				// FPSCR.FR=1 SZ=0	fmov.s	fr15, @-SP	fmov.s	fr14, @-SP	fmov.s	fr13, @-SP	fmov.s	fr12, @-SP	fmov.s	fr11, @-SP	fmov.s	fr10, @-SP	fmov.s	fr9,  @-SP	fmov.s	fr8,  @-SP	fmov.s	fr7,  @-SP	fmov.s	fr6,  @-SP	fmov.s	fr5,  @-SP	fmov.s	fr4,  @-SP	fmov.s	fr3,  @-SP	fmov.s	fr2,  @-SP	fmov.s	fr1,  @-SP	fmov.s	fr0,  @-SP	frchg				// FPSCR.FR=0	fmov.s	fr11, @-SP	fmov.s	fr10, @-SP	fmov.s	fr9,  @-SP	fmov.s	fr8,  @-SP	fmov.s	fr7,  @-SP	fmov.s	fr6,  @-SP	fmov.s	fr5,  @-SP	fmov.s	fr4,  @-SP	fmov.s	fr3,  @-SP	fmov.s	fr2,  @-SP	fmov.s	fr1,  @-SP	fmov.s	fr0,  @-SP	mov.l	l_fpscr_\texhdr, r0	lds.l	@r0+, fpscr		// FPSCR initialize	mov.l	l_\texhdr, r0	jsr	@r0			// call texhdr(texcd)	nop	mov	#0, r0	lds	r0, fpscr		// FPSCR.FR=0 SZ=0	fmov.s	@SP+, fr0	fmov.s	@SP+, fr1	fmov.s	@SP+, fr2	fmov.s	@SP+, fr3	fmov.s	@SP+, fr4	fmov.s	@SP+, fr5	fmov.s	@SP+, fr6	fmov.s	@SP+, fr7	fmov.s	@SP+, fr8	fmov.s	@SP+, fr9	fmov.s	@SP+, fr10	fmov.s	@SP+, fr11	frchg				// FPSCR.FR=1	fmov.s	@SP+, fr0	fmov.s	@SP+, fr1	fmov.s	@SP+, fr2	fmov.s	@SP+, fr3	fmov.s	@SP+, fr4	fmov.s	@SP+, fr5	fmov.s	@SP+, fr6	fmov.s	@SP+, fr7	fmov.s	@SP+, fr8	fmov.s	@SP+, fr9	fmov.s	@SP+, fr10	fmov.s	@SP+, fr11	fmov.s	@SP+, fr12	fmov.s	@SP+, fr13	fmov.s	@SP+, fr14	fmov.s	@SP+, fr15	lds.l	@SP+, fpul	lds.l	@SP+, fpscr	mov.l	@SP+, r7		// Restore registers	mov.l	@SP+, r6	mov.l	@SP+, r5	mov.l	@SP+, r3	mov.l	@SP+, r2	mov.l	@SP+, r1	lds.l	@SP+, macl	lds.l	@SP+, mach	lds.l	@SP+, pr	ldc.l	@SP+, gbr	mov.l	@SP+, r4	mov.l	@SP+, r0		// SR restore	trapa	#0x75			// R0 -> SR	mov.l	@SP+, r0		// Return address from handler	jmp	@r0	mov.l	@SP+, r0		// R0 restore			.balign	4  l_\texhdr:		.long	\texhdr	// handler address  l_fpscr_\texhdr:	.long	__fpscr_values + 4 .endm#endif /* __TK_ASM_DEPEND_H__ */

⌨️ 快捷键说明

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