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