f159ee7829
In order to be able to use asm-offsets.h in C files the existing namespace conflicts must be solved first. In asm-offsets.h e.g. PT_D0 gets defined which is the offset of the d0 member of the pt_regs structure. However a same define (with a different meaning) exists in asm/ptregs.h. So rename the defines created with the asm-offset mechanism to PT_OFF_D0 etc. There also already exist a few defines with these names that have the same meaning. So remove the existing defines and use the asm-offset generated ones. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Nick Piggin <nickpiggin@yahoo.com.au> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: Horst Hartmann <horsth@linux.vnet.ibm.com> Cc: Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: David Miller <davem@davemloft.net> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Cc: Roman Zippel <zippel@linux-m68k.org> Cc: <linux-arch@vger.kernel.org> LKML-Reference: <20090831124416.666403991@de.ibm.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
183 lines
4.3 KiB
C
183 lines
4.3 KiB
C
#ifndef __M68KNOMMU_ENTRY_H
|
|
#define __M68KNOMMU_ENTRY_H
|
|
|
|
#include <asm/setup.h>
|
|
#include <asm/page.h>
|
|
|
|
/*
|
|
* Stack layout in 'ret_from_exception':
|
|
*
|
|
* This allows access to the syscall arguments in registers d1-d5
|
|
*
|
|
* 0(sp) - d1
|
|
* 4(sp) - d2
|
|
* 8(sp) - d3
|
|
* C(sp) - d4
|
|
* 10(sp) - d5
|
|
* 14(sp) - a0
|
|
* 18(sp) - a1
|
|
* 1C(sp) - a2
|
|
* 20(sp) - d0
|
|
* 24(sp) - orig_d0
|
|
* 28(sp) - stack adjustment
|
|
* 2C(sp) - [ sr ] [ format & vector ]
|
|
* 2E(sp) - [ pc-hiword ] [ sr ]
|
|
* 30(sp) - [ pc-loword ] [ pc-hiword ]
|
|
* 32(sp) - [ format & vector ] [ pc-loword ]
|
|
* ^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^
|
|
* M68K COLDFIRE
|
|
*/
|
|
|
|
#define ALLOWINT 0xf8ff
|
|
|
|
#ifdef __ASSEMBLY__
|
|
|
|
/* process bits for task_struct.flags */
|
|
PF_TRACESYS_OFF = 3
|
|
PF_TRACESYS_BIT = 5
|
|
PF_PTRACED_OFF = 3
|
|
PF_PTRACED_BIT = 4
|
|
PF_DTRACE_OFF = 1
|
|
PF_DTRACE_BIT = 5
|
|
|
|
LENOSYS = 38
|
|
|
|
#define SWITCH_STACK_SIZE (6*4+4) /* Includes return address */
|
|
|
|
/*
|
|
* This defines the normal kernel pt-regs layout.
|
|
*
|
|
* regs are a2-a6 and d6-d7 preserved by C code
|
|
* the kernel doesn't mess with usp unless it needs to
|
|
*/
|
|
|
|
#ifdef CONFIG_COLDFIRE
|
|
/*
|
|
* This is made a little more tricky on the ColdFire. There is no
|
|
* separate kernel and user stack pointers. Need to artificially
|
|
* construct a usp in software... When doing this we need to disable
|
|
* interrupts, otherwise bad things could happen.
|
|
*/
|
|
.macro SAVE_ALL
|
|
move #0x2700,%sr /* disable intrs */
|
|
btst #5,%sp@(2) /* from user? */
|
|
bnes 6f /* no, skip */
|
|
movel %sp,sw_usp /* save user sp */
|
|
addql #8,sw_usp /* remove exception */
|
|
movel sw_ksp,%sp /* kernel sp */
|
|
subql #8,%sp /* room for exception */
|
|
clrl %sp@- /* stkadj */
|
|
movel %d0,%sp@- /* orig d0 */
|
|
movel %d0,%sp@- /* d0 */
|
|
lea %sp@(-32),%sp /* space for 8 regs */
|
|
moveml %d1-%d5/%a0-%a2,%sp@
|
|
movel sw_usp,%a0 /* get usp */
|
|
movel %a0@-,%sp@(PT_OFF_PC) /* copy exception program counter */
|
|
movel %a0@-,%sp@(PT_OFF_FORMATVEC)/*copy exception format/vector/sr */
|
|
bra 7f
|
|
6:
|
|
clrl %sp@- /* stkadj */
|
|
movel %d0,%sp@- /* orig d0 */
|
|
movel %d0,%sp@- /* d0 */
|
|
lea %sp@(-32),%sp /* space for 8 regs */
|
|
moveml %d1-%d5/%a0-%a2,%sp@
|
|
7:
|
|
.endm
|
|
|
|
.macro RESTORE_ALL
|
|
btst #5,%sp@(PT_SR) /* going user? */
|
|
bnes 8f /* no, skip */
|
|
move #0x2700,%sr /* disable intrs */
|
|
movel sw_usp,%a0 /* get usp */
|
|
movel %sp@(PT_OFF_PC),%a0@- /* copy exception program counter */
|
|
movel %sp@(PT_OFF_FORMATVEC),%a0@-/*copy exception format/vector/sr */
|
|
moveml %sp@,%d1-%d5/%a0-%a2
|
|
lea %sp@(32),%sp /* space for 8 regs */
|
|
movel %sp@+,%d0
|
|
addql #4,%sp /* orig d0 */
|
|
addl %sp@+,%sp /* stkadj */
|
|
addql #8,%sp /* remove exception */
|
|
movel %sp,sw_ksp /* save ksp */
|
|
subql #8,sw_usp /* set exception */
|
|
movel sw_usp,%sp /* restore usp */
|
|
rte
|
|
8:
|
|
moveml %sp@,%d1-%d5/%a0-%a2
|
|
lea %sp@(32),%sp /* space for 8 regs */
|
|
movel %sp@+,%d0
|
|
addql #4,%sp /* orig d0 */
|
|
addl %sp@+,%sp /* stkadj */
|
|
rte
|
|
.endm
|
|
|
|
/*
|
|
* Quick exception save, use current stack only.
|
|
*/
|
|
.macro SAVE_LOCAL
|
|
move #0x2700,%sr /* disable intrs */
|
|
clrl %sp@- /* stkadj */
|
|
movel %d0,%sp@- /* orig d0 */
|
|
movel %d0,%sp@- /* d0 */
|
|
lea %sp@(-32),%sp /* space for 8 regs */
|
|
moveml %d1-%d5/%a0-%a2,%sp@
|
|
.endm
|
|
|
|
.macro RESTORE_LOCAL
|
|
moveml %sp@,%d1-%d5/%a0-%a2
|
|
lea %sp@(32),%sp /* space for 8 regs */
|
|
movel %sp@+,%d0
|
|
addql #4,%sp /* orig d0 */
|
|
addl %sp@+,%sp /* stkadj */
|
|
rte
|
|
.endm
|
|
|
|
.macro SAVE_SWITCH_STACK
|
|
lea %sp@(-24),%sp /* 6 regs */
|
|
moveml %a3-%a6/%d6-%d7,%sp@
|
|
.endm
|
|
|
|
.macro RESTORE_SWITCH_STACK
|
|
moveml %sp@,%a3-%a6/%d6-%d7
|
|
lea %sp@(24),%sp /* 6 regs */
|
|
.endm
|
|
|
|
/*
|
|
* Software copy of the user and kernel stack pointers... Ugh...
|
|
* Need these to get around ColdFire not having separate kernel
|
|
* and user stack pointers.
|
|
*/
|
|
.globl sw_usp
|
|
.globl sw_ksp
|
|
|
|
#else /* !CONFIG_COLDFIRE */
|
|
|
|
/*
|
|
* Standard 68k interrupt entry and exit macros.
|
|
*/
|
|
.macro SAVE_ALL
|
|
clrl %sp@- /* stkadj */
|
|
movel %d0,%sp@- /* orig d0 */
|
|
movel %d0,%sp@- /* d0 */
|
|
moveml %d1-%d5/%a0-%a2,%sp@-
|
|
.endm
|
|
|
|
.macro RESTORE_ALL
|
|
moveml %sp@+,%a0-%a2/%d1-%d5
|
|
movel %sp@+,%d0
|
|
addql #4,%sp /* orig d0 */
|
|
addl %sp@+,%sp /* stkadj */
|
|
rte
|
|
.endm
|
|
|
|
.macro SAVE_SWITCH_STACK
|
|
moveml %a3-%a6/%d6-%d7,%sp@-
|
|
.endm
|
|
|
|
.macro RESTORE_SWITCH_STACK
|
|
moveml %sp@+,%a3-%a6/%d6-%d7
|
|
.endm
|
|
|
|
#endif /* !CONFIG_COLDFIRE */
|
|
#endif /* __ASSEMBLY__ */
|
|
#endif /* __M68KNOMMU_ENTRY_H */
|