entry.h (5902B)
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 */