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