| /* | 
 |  * entry.h - routines for context saving and restoring (for interrupts/exceptions) | 
 |  * | 
 |  * Copyright (c) 2005-2007 Analog Devices Inc. | 
 |  * | 
 |  * See file CREDITS for list of people who contributed to this | 
 |  * project. | 
 |  * | 
 |  * 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; either version 2 of | 
 |  * the License, or (at your option) any later version. | 
 |  * | 
 |  * This program is distributed in the hope that it will be useful, | 
 |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
 |  * GNU General Public License for more details. | 
 |  * | 
 |  * You should have received a copy of the GNU General Public License | 
 |  * along with this program; if not, write to the Free Software | 
 |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, | 
 |  * MA 02110-1301 USA | 
 |  */ | 
 |  | 
 | #ifndef __BLACKFIN_ENTRY_H | 
 | #define __BLACKFIN_ENTRY_H | 
 | #ifdef __ASSEMBLY__ | 
 |  | 
 | #define SAVE_ALL_INT		save_context_no_interrupts | 
 | #define SAVE_ALL_SYS		save_context_no_interrupts | 
 | #define SAVE_CONTEXT		save_context_with_interrupts | 
 |  | 
 | #define RESTORE_ALL		restore_context_no_interrupts | 
 | #define RESTORE_ALL_SYS		restore_context_no_interrupts | 
 | #define RESTORE_CONTEXT		restore_context_with_interrupts | 
 |  | 
 | /* | 
 |  * Code to save processor context. | 
 |  * We even save the register which are preserved by a function call | 
 |  * - r4, r5, r6, r7, p3, p4, p5 | 
 |  */ | 
 | .macro save_context_with_interrupts | 
 | 	[--sp] = R0; | 
 | 	[--sp] = ( R7:0, P5:0 ); | 
 | 	[--sp] = fp; | 
 | 	[--sp] = usp; | 
 |  | 
 | 	[--sp] = i0; | 
 | 	[--sp] = i1; | 
 | 	[--sp] = i2; | 
 | 	[--sp] = i3; | 
 |  | 
 | 	[--sp] = m0; | 
 | 	[--sp] = m1; | 
 | 	[--sp] = m2; | 
 | 	[--sp] = m3; | 
 |  | 
 | 	[--sp] = l0; | 
 | 	[--sp] = l1; | 
 | 	[--sp] = l2; | 
 | 	[--sp] = l3; | 
 |  | 
 | 	[--sp] = b0; | 
 | 	[--sp] = b1; | 
 | 	[--sp] = b2; | 
 | 	[--sp] = b3; | 
 | 	[--sp] = a0.x; | 
 | 	[--sp] = a0.w; | 
 | 	[--sp] = a1.x; | 
 | 	[--sp] = a1.w; | 
 |  | 
 | 	[--sp] = LC0; | 
 | 	[--sp] = LC1; | 
 | 	[--sp] = LT0; | 
 | 	[--sp] = LT1; | 
 | 	[--sp] = LB0; | 
 | 	[--sp] = LB1; | 
 |  | 
 | 	[--sp] = ASTAT; | 
 |  | 
 | 	[--sp] = r0;	/* Skip reserved */ | 
 | 	[--sp] = RETS; | 
 | 	[--sp] = RETI; | 
 | 	[--sp] = RETX; | 
 | 	[--sp] = RETN; | 
 | 	[--sp] = RETE; | 
 | 	[--sp] = SEQSTAT; | 
 | 	[--sp] = SYSCFG; | 
 | 	[--sp] = r0;	/* Skip IPEND as well. */ | 
 | .endm | 
 |  | 
 | .macro save_context_no_interrupts | 
 | 	[--sp] = R0; | 
 | 	[--sp] = ( R7:0, P5:0 ); | 
 | 	[--sp] = fp; | 
 | 	[--sp] = usp; | 
 |  | 
 | 	[--sp] = i0; | 
 | 	[--sp] = i1; | 
 | 	[--sp] = i2; | 
 | 	[--sp] = i3; | 
 |  | 
 | 	[--sp] = m0; | 
 | 	[--sp] = m1; | 
 | 	[--sp] = m2; | 
 | 	[--sp] = m3; | 
 |  | 
 | 	[--sp] = l0; | 
 | 	[--sp] = l1; | 
 | 	[--sp] = l2; | 
 | 	[--sp] = l3; | 
 |  | 
 | 	[--sp] = b0; | 
 | 	[--sp] = b1; | 
 | 	[--sp] = b2; | 
 | 	[--sp] = b3; | 
 | 	[--sp] = a0.x; | 
 | 	[--sp] = a0.w; | 
 | 	[--sp] = a1.x; | 
 | 	[--sp] = a1.w; | 
 |  | 
 | 	[--sp] = LC0; | 
 | 	[--sp] = LC1; | 
 | 	[--sp] = LT0; | 
 | 	[--sp] = LT1; | 
 | 	[--sp] = LB0; | 
 | 	[--sp] = LB1; | 
 |  | 
 | 	[--sp] = ASTAT; | 
 |  | 
 | 	[--sp] = r0;	/* Skip reserved */ | 
 | 	[--sp] = RETS; | 
 | 	r0 = RETI; | 
 | 	[--sp] = r0; | 
 | 	[--sp] = RETX; | 
 | 	[--sp] = RETN; | 
 | 	[--sp] = RETE; | 
 | 	[--sp] = SEQSTAT; | 
 | 	[--sp] = SYSCFG; | 
 | 	[--sp] = r0;	/* Skip IPEND as well. */ | 
 | .endm | 
 |  | 
 | .macro restore_context_no_interrupts | 
 | 	sp += 4; | 
 | 	SYSCFG = [sp++]; | 
 | 	SEQSTAT = [sp++]; | 
 | 	RETE = [sp++]; | 
 | 	RETN = [sp++]; | 
 | 	RETX = [sp++]; | 
 | 	r0 = [sp++]; | 
 | 	RETI = r0; | 
 | 	RETS = [sp++]; | 
 |  | 
 | 	sp += 4; | 
 |  | 
 | 	ASTAT = [sp++]; | 
 |  | 
 | 	LB1 = [sp++]; | 
 | 	LB0 = [sp++]; | 
 | 	LT1 = [sp++]; | 
 | 	LT0 = [sp++]; | 
 | 	LC1 = [sp++]; | 
 | 	LC0 = [sp++]; | 
 |  | 
 | 	a1.w = [sp++]; | 
 | 	a1.x = [sp++]; | 
 | 	a0.w = [sp++]; | 
 | 	a0.x = [sp++]; | 
 | 	b3 = [sp++]; | 
 | 	b2 = [sp++]; | 
 | 	b1 = [sp++]; | 
 | 	b0 = [sp++]; | 
 |  | 
 | 	l3 = [sp++]; | 
 | 	l2 = [sp++]; | 
 | 	l1 = [sp++]; | 
 | 	l0 = [sp++]; | 
 |  | 
 | 	m3 = [sp++]; | 
 | 	m2 = [sp++]; | 
 | 	m1 = [sp++]; | 
 | 	m0 = [sp++]; | 
 |  | 
 | 	i3 = [sp++]; | 
 | 	i2 = [sp++]; | 
 | 	i1 = [sp++]; | 
 | 	i0 = [sp++]; | 
 |  | 
 | 	sp += 4; | 
 | 	fp = [sp++]; | 
 |  | 
 | 	( R7 : 0, P5 : 0) = [ SP ++ ]; | 
 | 	sp += 4; | 
 | .endm | 
 |  | 
 | .macro restore_context_with_interrupts | 
 | 	sp += 4; | 
 | 	SYSCFG = [sp++]; | 
 | 	SEQSTAT = [sp++]; | 
 | 	RETE = [sp++]; | 
 | 	RETN = [sp++]; | 
 | 	RETX = [sp++]; | 
 | 	RETI = [sp++]; | 
 | 	RETS = [sp++]; | 
 |  | 
 | 	sp += 4; | 
 |  | 
 | 	ASTAT = [sp++]; | 
 |  | 
 | 	LB1 = [sp++]; | 
 | 	LB0 = [sp++]; | 
 | 	LT1 = [sp++]; | 
 | 	LT0 = [sp++]; | 
 | 	LC1 = [sp++]; | 
 | 	LC0 = [sp++]; | 
 |  | 
 | 	a1.w = [sp++]; | 
 | 	a1.x = [sp++]; | 
 | 	a0.w = [sp++]; | 
 | 	a0.x = [sp++]; | 
 | 	b3 = [sp++]; | 
 | 	b2 = [sp++]; | 
 | 	b1 = [sp++]; | 
 | 	b0 = [sp++]; | 
 |  | 
 | 	l3 = [sp++]; | 
 | 	l2 = [sp++]; | 
 | 	l1 = [sp++]; | 
 | 	l0 = [sp++]; | 
 |  | 
 | 	m3 = [sp++]; | 
 | 	m2 = [sp++]; | 
 | 	m1 = [sp++]; | 
 | 	m0 = [sp++]; | 
 |  | 
 | 	i3 = [sp++]; | 
 | 	i2 = [sp++]; | 
 | 	i1 = [sp++]; | 
 | 	i0 = [sp++]; | 
 |  | 
 | 	sp += 4; | 
 | 	fp = [sp++]; | 
 |  | 
 | 	( R7 : 0, P5 : 0) = [ SP ++ ]; | 
 | 	sp += 4; | 
 | .endm | 
 |  | 
 | #endif | 
 | #endif |