| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | #ifndef __M68KNOMMU_ENTRY_H | 
|  | 2 | #define __M68KNOMMU_ENTRY_H | 
|  | 3 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 4 | #include <asm/setup.h> | 
|  | 5 | #include <asm/page.h> | 
|  | 6 |  | 
|  | 7 | /* | 
|  | 8 | * Stack layout in 'ret_from_exception': | 
|  | 9 | * | 
|  | 10 | * This allows access to the syscall arguments in registers d1-d5 | 
|  | 11 | * | 
|  | 12 | *	 0(sp) - d1 | 
|  | 13 | *	 4(sp) - d2 | 
|  | 14 | *	 8(sp) - d3 | 
|  | 15 | *	 C(sp) - d4 | 
|  | 16 | *	10(sp) - d5 | 
|  | 17 | *	14(sp) - a0 | 
|  | 18 | *	18(sp) - a1 | 
|  | 19 | *	1C(sp) - a2 | 
|  | 20 | *	20(sp) - d0 | 
|  | 21 | *	24(sp) - orig_d0 | 
|  | 22 | *	28(sp) - stack adjustment | 
|  | 23 | *	2C(sp) - [ sr              ] [ format & vector ] | 
|  | 24 | *	2E(sp) - [ pc-hiword       ] [ sr              ] | 
|  | 25 | *	30(sp) - [ pc-loword       ] [ pc-hiword       ] | 
|  | 26 | *	32(sp) - [ format & vector ] [ pc-loword       ] | 
|  | 27 | *		  ^^^^^^^^^^^^^^^^^   ^^^^^^^^^^^^^^^^^ | 
|  | 28 | *			M68K		  COLDFIRE | 
|  | 29 | */ | 
|  | 30 |  | 
|  | 31 | #define ALLOWINT 0xf8ff | 
|  | 32 |  | 
|  | 33 | #ifdef __ASSEMBLY__ | 
|  | 34 |  | 
|  | 35 | /* process bits for task_struct.flags */ | 
|  | 36 | PF_TRACESYS_OFF = 3 | 
|  | 37 | PF_TRACESYS_BIT = 5 | 
|  | 38 | PF_PTRACED_OFF = 3 | 
|  | 39 | PF_PTRACED_BIT = 4 | 
|  | 40 | PF_DTRACE_OFF = 1 | 
|  | 41 | PF_DTRACE_BIT = 5 | 
|  | 42 |  | 
|  | 43 | LENOSYS = 38 | 
|  | 44 |  | 
|  | 45 | #define SWITCH_STACK_SIZE (6*4+4)	/* Includes return address */ | 
|  | 46 |  | 
|  | 47 | /* | 
|  | 48 | * This defines the normal kernel pt-regs layout. | 
|  | 49 | * | 
|  | 50 | * regs are a2-a6 and d6-d7 preserved by C code | 
|  | 51 | * the kernel doesn't mess with usp unless it needs to | 
|  | 52 | */ | 
|  | 53 |  | 
|  | 54 | #ifdef CONFIG_COLDFIRE | 
|  | 55 | /* | 
|  | 56 | * This is made a little more tricky on the ColdFire. There is no | 
|  | 57 | * separate kernel and user stack pointers. Need to artificially | 
|  | 58 | * construct a usp in software... When doing this we need to disable | 
|  | 59 | * interrupts, otherwise bad things could happen. | 
|  | 60 | */ | 
|  | 61 | .macro SAVE_ALL | 
|  | 62 | move	#0x2700,%sr		/* disable intrs */ | 
|  | 63 | btst	#5,%sp@(2)		/* from user? */ | 
|  | 64 | bnes	6f			/* no, skip */ | 
|  | 65 | movel	%sp,sw_usp		/* save user sp */ | 
|  | 66 | addql	#8,sw_usp		/* remove exception */ | 
|  | 67 | movel	sw_ksp,%sp		/* kernel sp */ | 
|  | 68 | subql	#8,%sp			/* room for exception */ | 
|  | 69 | clrl	%sp@-			/* stkadj */ | 
|  | 70 | movel	%d0,%sp@-		/* orig d0 */ | 
|  | 71 | movel	%d0,%sp@-		/* d0 */ | 
|  | 72 | lea	%sp@(-32),%sp		/* space for 8 regs */ | 
|  | 73 | moveml	%d1-%d5/%a0-%a2,%sp@ | 
|  | 74 | movel	sw_usp,%a0		/* get usp */ | 
|  | 75 | movel	%a0@-,%sp@(PT_PC)	/* copy exception program counter */ | 
|  | 76 | movel	%a0@-,%sp@(PT_FORMATVEC)/* copy exception format/vector/sr */ | 
|  | 77 | bra	7f | 
|  | 78 | 6: | 
|  | 79 | clrl	%sp@-			/* stkadj */ | 
|  | 80 | movel	%d0,%sp@-		/* orig d0 */ | 
|  | 81 | movel	%d0,%sp@-		/* d0 */ | 
|  | 82 | lea	%sp@(-32),%sp		/* space for 8 regs */ | 
|  | 83 | moveml	%d1-%d5/%a0-%a2,%sp@ | 
|  | 84 | 7: | 
|  | 85 | .endm | 
|  | 86 |  | 
|  | 87 | .macro RESTORE_ALL | 
|  | 88 | btst	#5,%sp@(PT_SR)		/* going user? */ | 
|  | 89 | bnes	8f			/* no, skip */ | 
|  | 90 | move	#0x2700,%sr		/* disable intrs */ | 
|  | 91 | movel	sw_usp,%a0		/* get usp */ | 
|  | 92 | movel	%sp@(PT_PC),%a0@-	/* copy exception program counter */ | 
|  | 93 | movel	%sp@(PT_FORMATVEC),%a0@-/* copy exception format/vector/sr */ | 
|  | 94 | moveml	%sp@,%d1-%d5/%a0-%a2 | 
|  | 95 | lea	%sp@(32),%sp		/* space for 8 regs */ | 
|  | 96 | movel	%sp@+,%d0 | 
|  | 97 | addql	#4,%sp			/* orig d0 */ | 
|  | 98 | addl	%sp@+,%sp		/* stkadj */ | 
|  | 99 | addql	#8,%sp			/* remove exception */ | 
|  | 100 | movel	%sp,sw_ksp		/* save ksp */ | 
|  | 101 | subql	#8,sw_usp		/* set exception */ | 
|  | 102 | movel	sw_usp,%sp		/* restore usp */ | 
|  | 103 | rte | 
|  | 104 | 8: | 
|  | 105 | moveml	%sp@,%d1-%d5/%a0-%a2 | 
|  | 106 | lea	%sp@(32),%sp		/* space for 8 regs */ | 
|  | 107 | movel	%sp@+,%d0 | 
|  | 108 | addql	#4,%sp			/* orig d0 */ | 
|  | 109 | addl	%sp@+,%sp		/* stkadj */ | 
|  | 110 | rte | 
|  | 111 | .endm | 
|  | 112 |  | 
|  | 113 | /* | 
|  | 114 | * Quick exception save, use current stack only. | 
|  | 115 | */ | 
|  | 116 | .macro SAVE_LOCAL | 
|  | 117 | move	#0x2700,%sr		/* disable intrs */ | 
|  | 118 | clrl	%sp@-			/* stkadj */ | 
|  | 119 | movel	%d0,%sp@-		/* orig d0 */ | 
|  | 120 | movel	%d0,%sp@-		/* d0 */ | 
|  | 121 | lea	%sp@(-32),%sp		/* space for 8 regs */ | 
|  | 122 | moveml	%d1-%d5/%a0-%a2,%sp@ | 
|  | 123 | .endm | 
|  | 124 |  | 
|  | 125 | .macro RESTORE_LOCAL | 
|  | 126 | moveml	%sp@,%d1-%d5/%a0-%a2 | 
|  | 127 | lea	%sp@(32),%sp		/* space for 8 regs */ | 
|  | 128 | movel	%sp@+,%d0 | 
|  | 129 | addql	#4,%sp			/* orig d0 */ | 
|  | 130 | addl	%sp@+,%sp		/* stkadj */ | 
|  | 131 | rte | 
|  | 132 | .endm | 
|  | 133 |  | 
|  | 134 | .macro SAVE_SWITCH_STACK | 
|  | 135 | lea	%sp@(-24),%sp		/* 6 regs */ | 
|  | 136 | moveml	%a3-%a6/%d6-%d7,%sp@ | 
|  | 137 | .endm | 
|  | 138 |  | 
|  | 139 | .macro RESTORE_SWITCH_STACK | 
|  | 140 | moveml	%sp@,%a3-%a6/%d6-%d7 | 
|  | 141 | lea	%sp@(24),%sp		/* 6 regs */ | 
|  | 142 | .endm | 
|  | 143 |  | 
|  | 144 | /* | 
|  | 145 | * Software copy of the user and kernel stack pointers... Ugh... | 
|  | 146 | * Need these to get around ColdFire not having separate kernel | 
|  | 147 | * and user stack pointers. | 
|  | 148 | */ | 
|  | 149 | .globl sw_usp | 
|  | 150 | .globl sw_ksp | 
|  | 151 |  | 
|  | 152 | #else /* !CONFIG_COLDFIRE */ | 
|  | 153 |  | 
|  | 154 | /* | 
|  | 155 | * Standard 68k interrupt entry and exit macros. | 
|  | 156 | */ | 
|  | 157 | .macro SAVE_ALL | 
|  | 158 | clrl	%sp@-			/* stkadj */ | 
|  | 159 | movel	%d0,%sp@-		/* orig d0 */ | 
|  | 160 | movel	%d0,%sp@-		/* d0 */ | 
|  | 161 | moveml	%d1-%d5/%a0-%a2,%sp@- | 
|  | 162 | .endm | 
|  | 163 |  | 
|  | 164 | .macro RESTORE_ALL | 
|  | 165 | moveml	%sp@+,%a0-%a2/%d1-%d5 | 
|  | 166 | movel	%sp@+,%d0 | 
|  | 167 | addql	#4,%sp			/* orig d0 */ | 
|  | 168 | addl	%sp@+,%sp		/* stkadj */ | 
|  | 169 | rte | 
|  | 170 | .endm | 
|  | 171 |  | 
|  | 172 | .macro SAVE_SWITCH_STACK | 
|  | 173 | moveml	%a3-%a6/%d6-%d7,%sp@- | 
|  | 174 | .endm | 
|  | 175 |  | 
|  | 176 | .macro RESTORE_SWITCH_STACK | 
|  | 177 | moveml	%sp@+,%a3-%a6/%d6-%d7 | 
|  | 178 | .endm | 
|  | 179 |  | 
|  | 180 | #endif /* !CONFIG_COLDFIRE */ | 
|  | 181 | #endif /* __ASSEMBLY__ */ | 
|  | 182 | #endif /* __M68KNOMMU_ENTRY_H */ |