linux/arch/m68k/include/asm/entry.h
<<
>>
Prefs
   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 */
 262