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