1 #ifndef __M68KNOMMU_ENTRY_H 2 #define __M68KNOMMU_ENTRY_H 3 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 */ 183