1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __M68K_ENTRY_H 3 #define __M68K_ENTRY_H 4 5 #include <asm/setup.h> 6 #include <asm/page.h> 7 #ifdef __ASSEMBLY__ 8 #include <asm/thread_info.h> 9 #endif 10 11 /* 12 * Stack layout in 'ret_from_exception': 13 * 14 * This allows access to the syscall arguments in registers d1-d5 15 * 16 * 0(sp) - d1 17 * 4(sp) - d2 18 * 8(sp) - d3 19 * C(sp) - d4 20 * 10(sp) - d5 21 * 14(sp) - a0 22 * 18(sp) - a1 23 * 1C(sp) - a2 24 * 20(sp) - d0 25 * 24(sp) - orig_d0 26 * 28(sp) - stack adjustment 27 * 2C(sp) - [ sr ] [ format & vector ] 28 * 2E(sp) - [ pc-hiword ] [ sr ] 29 * 30(sp) - [ pc-loword ] [ pc-hiword ] 30 * 32(sp) - [ format & vector ] [ pc-loword ] 31 * ^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^ 32 * M68K COLDFIRE 33 */ 34 35 /* the following macro is used when enabling interrupts */ 36 #if defined(MACH_ATARI_ONLY) 37 /* block out HSYNC = ipl 2 on the atari */ 38 #define ALLOWINT (~0x500) 39 #else 40 /* portable version */ 41 #define ALLOWINT (~0x700) 42 #endif /* machine compilation types */ 43 44 #ifdef __ASSEMBLY__ 45 /* 46 * This defines the normal kernel pt-regs layout. 47 * 48 * regs a3-a6 and d6-d7 are preserved by C code 49 * the kernel doesn't mess with usp unless it needs to 50 */ 51 #define SWITCH_STACK_SIZE (6*4+4) /* includes return address */ 52 53 #ifdef CONFIG_COLDFIRE 54 #ifdef CONFIG_COLDFIRE_SW_A7 55 /* 56 * This is made a little more tricky on older ColdFires. There is no 57 * separate supervisor 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 will happen. 60 */ 61 .globl sw_usp 62 .globl sw_ksp 63 64 .macro SAVE_ALL_SYS 65 move #0x2700,%sr /* disable intrs */ 66 btst #5,%sp@(2) /* from user? */ 67 bnes 6f /* no, skip */ 68 movel %sp,sw_usp /* save user sp */ 69 addql #8,sw_usp /* remove exception */ 70 movel sw_ksp,%sp /* kernel sp */ 71 subql #8,%sp /* room for exception */ 72 clrl %sp@- /* stkadj */ 73 movel %d0,%sp@- /* orig d0 */ 74 movel %d0,%sp@- /* d0 */ 75 lea %sp@(-32),%sp /* space for 8 regs */ 76 moveml %d1-%d5/%a0-%a2,%sp@ 77 movel sw_usp,%a0 /* get usp */ 78 movel %a0@-,%sp@(PT_OFF_PC) /* copy exception program counter */ 79 movel %a0@-,%sp@(PT_OFF_FORMATVEC)/*copy exception format/vector/sr */ 80 bra 7f 81 6: 82 clrl %sp@- /* stkadj */ 83 movel %d0,%sp@- /* orig d0 */ 84 movel %d0,%sp@- /* d0 */ 85 lea %sp@(-32),%sp /* space for 8 regs */ 86 moveml %d1-%d5/%a0-%a2,%sp@ 87 7: 88 .endm 89 90 .macro SAVE_ALL_INT 91 SAVE_ALL_SYS 92 moveq #-1,%d0 /* not system call entry */ 93 movel %d0,%sp@(PT_OFF_ORIG_D0) 94 .endm 95 96 .macro RESTORE_USER 97 move #0x2700,%sr /* disable intrs */ 98 movel sw_usp,%a0 /* get usp */ 99 movel %sp@(PT_OFF_PC),%a0@- /* copy exception program counter */ 100 movel %sp@(PT_OFF_FORMATVEC),%a0@-/*copy exception format/vector/sr */ 101 moveml %sp@,%d1-%d5/%a0-%a2 102 lea %sp@(32),%sp /* space for 8 regs */ 103 movel %sp@+,%d0 104 addql #4,%sp /* orig d0 */ 105 addl %sp@+,%sp /* stkadj */ 106 addql #8,%sp /* remove exception */ 107 movel %sp,sw_ksp /* save ksp */ 108 subql #8,sw_usp /* set exception */ 109 movel sw_usp,%sp /* restore usp */ 110 rte 111 .endm 112 113 .macro RDUSP 114 movel sw_usp,%a3 115 .endm 116 117 .macro WRUSP 118 movel %a3,sw_usp 119 .endm 120 121 #else /* !CONFIG_COLDFIRE_SW_A7 */ 122 /* 123 * Modern ColdFire parts have separate supervisor and user stack 124 * pointers. Simple load and restore macros for this case. 125 */ 126 .macro SAVE_ALL_SYS 127 move #0x2700,%sr /* disable intrs */ 128 clrl %sp@- /* stkadj */ 129 movel %d0,%sp@- /* orig d0 */ 130 movel %d0,%sp@- /* d0 */ 131 lea %sp@(-32),%sp /* space for 8 regs */ 132 moveml %d1-%d5/%a0-%a2,%sp@ 133 .endm 134 135 .macro SAVE_ALL_INT 136 move #0x2700,%sr /* disable intrs */ 137 clrl %sp@- /* stkadj */ 138 pea -1:w /* orig d0 */ 139 movel %d0,%sp@- /* d0 */ 140 lea %sp@(-32),%sp /* space for 8 regs */ 141 moveml %d1-%d5/%a0-%a2,%sp@ 142 .endm 143 144 .macro RESTORE_USER 145 moveml %sp@,%d1-%d5/%a0-%a2 146 lea %sp@(32),%sp /* space for 8 regs */ 147 movel %sp@+,%d0 148 addql #4,%sp /* orig d0 */ 149 addl %sp@+,%sp /* stkadj */ 150 rte 151 .endm 152 153 .macro RDUSP 154 /*move %usp,%a3*/ 155 .word 0x4e6b 156 .endm 157 158 .macro WRUSP 159 /*move %a3,%usp*/ 160 .word 0x4e63 161 .endm 162 163 #endif /* !CONFIG_COLDFIRE_SW_A7 */ 164 165 .macro SAVE_SWITCH_STACK 166 lea %sp@(-24),%sp /* 6 regs */ 167 moveml %a3-%a6/%d6-%d7,%sp@ 168 .endm 169 170 .macro RESTORE_SWITCH_STACK 171 moveml %sp@,%a3-%a6/%d6-%d7 172 lea %sp@(24),%sp /* 6 regs */ 173 .endm 174 175 #else /* !CONFIG_COLDFIRE */ 176 177 /* 178 * All other types of m68k parts (68000, 680x0, CPU32) have the same 179 * entry and exit code. 180 */ 181 182 /* 183 * a -1 in the orig_d0 field signifies 184 * that the stack frame is NOT for syscall 185 */ 186 .macro SAVE_ALL_INT 187 clrl %sp@- /* stk_adj */ 188 pea -1:w /* orig d0 */ 189 movel %d0,%sp@- /* d0 */ 190 moveml %d1-%d5/%a0-%a2,%sp@- 191 .endm 192 193 .macro SAVE_ALL_SYS 194 clrl %sp@- /* stk_adj */ 195 movel %d0,%sp@- /* orig d0 */ 196 movel %d0,%sp@- /* d0 */ 197 moveml %d1-%d5/%a0-%a2,%sp@- 198 .endm 199 200 .macro RESTORE_ALL 201 moveml %sp@+,%a0-%a2/%d1-%d5 202 movel %sp@+,%d0 203 addql #4,%sp /* orig d0 */ 204 addl %sp@+,%sp /* stk adj */ 205 rte 206 .endm 207 208 209 .macro SAVE_SWITCH_STACK 210 moveml %a3-%a6/%d6-%d7,%sp@- 211 .endm 212 213 .macro RESTORE_SWITCH_STACK 214 moveml %sp@+,%a3-%a6/%d6-%d7 215 .endm 216 217 #endif /* !CONFIG_COLDFIRE */ 218 219 /* 220 * Register %a2 is reserved and set to current task on MMU enabled systems. 221 * Non-MMU systems do not reserve %a2 in this way, and this definition is 222 * not used for them. 223 */ 224 #ifdef CONFIG_MMU 225 226 #define curptr a2 227 228 #define GET_CURRENT(tmp) get_current tmp 229 .macro get_current reg=%d0 230 movel %sp,\reg 231 andl #-THREAD_SIZE,\reg 232 movel \reg,%curptr 233 movel %curptr@,%curptr 234 .endm 235 236 #else 237 238 #define GET_CURRENT(tmp) 239 240 #endif /* CONFIG_MMU */ 241 242 #else /* C source */ 243 244 #define STR(X) STR1(X) 245 #define STR1(X) #X 246 247 #define SAVE_ALL_INT \ 248 "clrl %%sp@-;" /* stk_adj */ \ 249 "pea -1:w;" /* orig d0 = -1 */ \ 250 "movel %%d0,%%sp@-;" /* d0 */ \ 251 "moveml %%d1-%%d5/%%a0-%%a2,%%sp@-" 252 253 #define GET_CURRENT(tmp) \ 254 "movel %%sp,"#tmp"\n\t" \ 255 "andw #-"STR(THREAD_SIZE)","#tmp"\n\t" \ 256 "movel "#tmp",%%a2\n\t" \ 257 "movel %%a2@,%%a2" 258 259 #endif 260 261 #endif /* __M68K_ENTRY_H */ 262