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