161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#ifndef __M68K_ENTRY_H
261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#define __M68K_ENTRY_H
361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#include <asm/setup.h>
561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#include <asm/page.h>
661619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#ifdef __ASSEMBLY__
761619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#include <asm/thread_info.h>
861619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#endif
961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
1061619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer/*
1161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer * Stack layout in 'ret_from_exception':
1261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer *
1361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer *	This allows access to the syscall arguments in registers d1-d5
1461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer *
1561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer *	 0(sp) - d1
1661619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer *	 4(sp) - d2
1761619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer *	 8(sp) - d3
1861619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer *	 C(sp) - d4
1961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer *	10(sp) - d5
2061619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer *	14(sp) - a0
2161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer *	18(sp) - a1
2261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer *	1C(sp) - a2
2361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer *	20(sp) - d0
2461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer *	24(sp) - orig_d0
2561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer *	28(sp) - stack adjustment
2661619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer *	2C(sp) - [ sr              ] [ format & vector ]
2761619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer *	2E(sp) - [ pc-hiword       ] [ sr              ]
2861619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer *	30(sp) - [ pc-loword       ] [ pc-hiword       ]
2961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer *	32(sp) - [ format & vector ] [ pc-loword       ]
3061619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer *		  ^^^^^^^^^^^^^^^^^   ^^^^^^^^^^^^^^^^^
3161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer *			M68K		  COLDFIRE
3261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer */
3361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
3461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer/* the following macro is used when enabling interrupts */
3561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#if defined(MACH_ATARI_ONLY)
36c663600584a596b5e66258cc10716fb781a5c2c9Mikael Pettersson	/* block out HSYNC = ipl 2 on the atari */
37c663600584a596b5e66258cc10716fb781a5c2c9Mikael Pettersson#define ALLOWINT	(~0x500)
3849148020bcb6910ce71417bd990a5ce7017f9bd3Sam Ravnborg#else
3961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	/* portable version */
4061619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#define ALLOWINT	(~0x700)
4161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#endif /* machine compilation types */
4261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
4361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#ifdef __ASSEMBLY__
4461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer/*
4561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer * This defines the normal kernel pt-regs layout.
4661619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer *
4761619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer * regs a3-a6 and d6-d7 are preserved by C code
4861619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer * the kernel doesn't mess with usp unless it needs to
4961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer */
5061619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#define SWITCH_STACK_SIZE	(6*4+4)	/* includes return address */
5161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
5261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#ifdef CONFIG_COLDFIRE
5361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#ifdef CONFIG_COLDFIRE_SW_A7
5461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer/*
5561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer * This is made a little more tricky on older ColdFires. There is no
5661619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer * separate supervisor and user stack pointers. Need to artificially
5761619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer * construct a usp in software... When doing this we need to disable
5861619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer * interrupts, otherwise bad things will happen.
5961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer */
6061619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.globl sw_usp
6161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.globl sw_ksp
6261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
6361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.macro SAVE_ALL_SYS
6461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	move	#0x2700,%sr		/* disable intrs */
6561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	btst	#5,%sp@(2)		/* from user? */
6661619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	bnes	6f			/* no, skip */
6761619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	%sp,sw_usp		/* save user sp */
6861619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	addql	#8,sw_usp		/* remove exception */
6961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	sw_ksp,%sp		/* kernel sp */
7061619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	subql	#8,%sp			/* room for exception */
7161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	clrl	%sp@-			/* stkadj */
7261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	%d0,%sp@-		/* orig d0 */
7361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	%d0,%sp@-		/* d0 */
7461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	lea	%sp@(-32),%sp		/* space for 8 regs */
7561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	moveml	%d1-%d5/%a0-%a2,%sp@
7661619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	sw_usp,%a0		/* get usp */
7761619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	%a0@-,%sp@(PT_OFF_PC)	/* copy exception program counter */
7861619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	%a0@-,%sp@(PT_OFF_FORMATVEC)/*copy exception format/vector/sr */
7961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	bra	7f
8061619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	6:
8161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	clrl	%sp@-			/* stkadj */
8261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	%d0,%sp@-		/* orig d0 */
8361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	%d0,%sp@-		/* d0 */
8461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	lea	%sp@(-32),%sp		/* space for 8 regs */
8561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	moveml	%d1-%d5/%a0-%a2,%sp@
8661619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	7:
8761619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.endm
8861619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
8961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.macro SAVE_ALL_INT
9061619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	SAVE_ALL_SYS
9161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	moveq	#-1,%d0			/* not system call entry */
9261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	%d0,%sp@(PT_OFF_ORIG_D0)
9361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.endm
9461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
9561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.macro RESTORE_USER
9661619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	move	#0x2700,%sr		/* disable intrs */
9761619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	sw_usp,%a0		/* get usp */
9861619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	%sp@(PT_OFF_PC),%a0@-	/* copy exception program counter */
9961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	%sp@(PT_OFF_FORMATVEC),%a0@-/*copy exception format/vector/sr */
10061619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	moveml	%sp@,%d1-%d5/%a0-%a2
10161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	lea	%sp@(32),%sp		/* space for 8 regs */
10261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	%sp@+,%d0
10361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	addql	#4,%sp			/* orig d0 */
10461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	addl	%sp@+,%sp		/* stkadj */
10561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	addql	#8,%sp			/* remove exception */
10661619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	%sp,sw_ksp		/* save ksp */
10761619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	subql	#8,sw_usp		/* set exception */
10861619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	sw_usp,%sp		/* restore usp */
10961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	rte
11061619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.endm
11161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
11261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.macro RDUSP
11361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	sw_usp,%a3
11461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.endm
11561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
11661619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.macro WRUSP
11761619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	%a3,sw_usp
11861619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.endm
11961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
12061619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#else /* !CONFIG_COLDFIRE_SW_A7 */
12161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer/*
12261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer * Modern ColdFire parts have separate supervisor and user stack
12361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer * pointers. Simple load and restore macros for this case.
12461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer */
12561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.macro SAVE_ALL_SYS
12661619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	move	#0x2700,%sr		/* disable intrs */
12761619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	clrl	%sp@-			/* stkadj */
12861619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	%d0,%sp@-		/* orig d0 */
12961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	%d0,%sp@-		/* d0 */
13061619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	lea	%sp@(-32),%sp		/* space for 8 regs */
13161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	moveml	%d1-%d5/%a0-%a2,%sp@
13261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.endm
13361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
13461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.macro SAVE_ALL_INT
13561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	move	#0x2700,%sr		/* disable intrs */
13661619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	clrl	%sp@-			/* stkadj */
13761619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	pea	-1:w			/* orig d0 */
13861619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	%d0,%sp@-		/* d0 */
13961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	lea	%sp@(-32),%sp		/* space for 8 regs */
14061619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	moveml	%d1-%d5/%a0-%a2,%sp@
14161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.endm
14261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
14361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.macro RESTORE_USER
14461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	moveml	%sp@,%d1-%d5/%a0-%a2
14561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	lea	%sp@(32),%sp		/* space for 8 regs */
14661619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	%sp@+,%d0
14761619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	addql	#4,%sp			/* orig d0 */
14861619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	addl	%sp@+,%sp		/* stkadj */
14961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	rte
15061619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.endm
15161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
15261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.macro RDUSP
15361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	/*move	%usp,%a3*/
15461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	.word	0x4e6b
15561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.endm
15661619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
15761619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.macro WRUSP
15861619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	/*move	%a3,%usp*/
15961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	.word	0x4e63
16061619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.endm
16161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
16261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#endif /* !CONFIG_COLDFIRE_SW_A7 */
16361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
16461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.macro SAVE_SWITCH_STACK
16561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	lea	%sp@(-24),%sp		/* 6 regs */
16661619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	moveml	%a3-%a6/%d6-%d7,%sp@
16761619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.endm
16861619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
16961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.macro RESTORE_SWITCH_STACK
17061619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	moveml	%sp@,%a3-%a6/%d6-%d7
17161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	lea	%sp@(24),%sp		/* 6 regs */
17261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.endm
17361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
17461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#else /* !CONFIG_COLDFIRE */
17561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
17661619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer/*
17761619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer * All other types of m68k parts (68000, 680x0, CPU32) have the same
17861619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer * entry and exit code.
17961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer */
18061619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
18161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer/*
18261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer * a -1 in the orig_d0 field signifies
18361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer * that the stack frame is NOT for syscall
18461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer */
18561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.macro SAVE_ALL_INT
18661619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	clrl	%sp@-			/* stk_adj */
18761619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	pea	-1:w			/* orig d0 */
18861619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	%d0,%sp@-		/* d0 */
18961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	moveml	%d1-%d5/%a0-%a2,%sp@-
19061619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.endm
19161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
19261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.macro SAVE_ALL_SYS
19361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	clrl	%sp@-			/* stk_adj */
19461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	%d0,%sp@-		/* orig d0 */
19561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	%d0,%sp@-		/* d0 */
19661619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	moveml	%d1-%d5/%a0-%a2,%sp@-
19761619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.endm
19861619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
19961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.macro RESTORE_ALL
20061619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	moveml	%sp@+,%a0-%a2/%d1-%d5
20161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	%sp@+,%d0
20261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	addql	#4,%sp			/* orig d0 */
20361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	addl	%sp@+,%sp		/* stk adj */
20461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	rte
20561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.endm
20661619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
20761619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
20861619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.macro SAVE_SWITCH_STACK
20961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	moveml	%a3-%a6/%d6-%d7,%sp@-
21061619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.endm
21161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
21261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.macro RESTORE_SWITCH_STACK
21361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	moveml	%sp@+,%a3-%a6/%d6-%d7
21461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.endm
21561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
21661619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#endif /* !CONFIG_COLDFIRE */
21761619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
21861619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer/*
21961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer * Register %a2 is reserved and set to current task on MMU enabled systems.
22061619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer * Non-MMU systems do not reserve %a2 in this way, and this definition is
22161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer * not used for them.
22261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer */
223bbc6f1ba509cf9cda42ce63bbd40afe577ab028eGreg Ungerer#ifdef CONFIG_MMU
224bbc6f1ba509cf9cda42ce63bbd40afe577ab028eGreg Ungerer
22561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#define curptr a2
22661619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
22761619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#define GET_CURRENT(tmp) get_current tmp
22861619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.macro get_current reg=%d0
22961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	%sp,\reg
230bbc6f1ba509cf9cda42ce63bbd40afe577ab028eGreg Ungerer	andl	#-THREAD_SIZE,\reg
23161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	\reg,%curptr
23261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	movel	%curptr@,%curptr
23361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer.endm
23461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
235bbc6f1ba509cf9cda42ce63bbd40afe577ab028eGreg Ungerer#else
236bbc6f1ba509cf9cda42ce63bbd40afe577ab028eGreg Ungerer
237bbc6f1ba509cf9cda42ce63bbd40afe577ab028eGreg Ungerer#define GET_CURRENT(tmp)
238bbc6f1ba509cf9cda42ce63bbd40afe577ab028eGreg Ungerer
239bbc6f1ba509cf9cda42ce63bbd40afe577ab028eGreg Ungerer#endif /* CONFIG_MMU */
240bbc6f1ba509cf9cda42ce63bbd40afe577ab028eGreg Ungerer
24161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#else /* C source */
24261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
24361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#define STR(X) STR1(X)
24461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#define STR1(X) #X
24561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
24661619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#define SAVE_ALL_INT				\
24761619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	"clrl	%%sp@-;"    /* stk_adj */	\
24861619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	"pea	-1:w;"	    /* orig d0 = -1 */	\
24961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	"movel	%%d0,%%sp@-;" /* d0 */		\
25061619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	"moveml	%%d1-%%d5/%%a0-%%a2,%%sp@-"
25161619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
25261619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#define GET_CURRENT(tmp) \
25361619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	"movel	%%sp,"#tmp"\n\t" \
25461619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	"andw	#-"STR(THREAD_SIZE)","#tmp"\n\t" \
25561619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	"movel	"#tmp",%%a2\n\t" \
25661619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer	"movel	%%a2@,%%a2"
25761619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
25849148020bcb6910ce71417bd990a5ce7017f9bd3Sam Ravnborg#endif
25961619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer
26061619b12078dc8b85a3d4cbfa16f650daa341bd1Greg Ungerer#endif /* __M68K_ENTRY_H */
261