Merge branch 'agp-next' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied...
[linux-2.6] / include / asm-mn10300 / frame.inc
1 /* MN10300 Microcontroller core system register definitions -*- asm -*-
2  *
3  * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
4  * Written by David Howells (dhowells@redhat.com)
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public Licence
8  * as published by the Free Software Foundation; either version
9  * 2 of the Licence, or (at your option) any later version.
10  */
11 #ifndef _ASM_FRAME_INC
12 #define _ASM_FRAME_INC
13
14 #ifndef __ASSEMBLY__
15 #error not for use in C files
16 #endif
17
18 #ifndef __ASM_OFFSETS_H__
19 #include <asm/asm-offsets.h>
20 #endif
21
22 #define pi break
23
24 #define fp a3
25
26 ###############################################################################
27 #
28 # build a stack frame from the registers
29 # - the caller has subtracted 4 from SP before coming here
30 #
31 ###############################################################################
32 .macro SAVE_ALL
33         add     -4,sp                           # next exception frame ptr save area
34         movm    [other],(sp)
35         mov     usp,a1
36         mov     a1,(sp)                         # USP in MOVM[other] dummy slot
37         movm    [d2,d3,a2,a3,exreg0,exreg1,exother],(sp)
38         mov     sp,fp                           # FRAME pointer in A3
39         add     -12,sp                          # allow for calls to be made
40         mov     (__frame),a1
41         mov     a1,(REG_NEXT,fp)
42         mov     fp,(__frame)
43
44         and     ~EPSW_FE,epsw                   # disable the FPU inside the kernel
45
46         # we may be holding current in E2
47 #ifdef CONFIG_MN10300_CURRENT_IN_E2
48         mov     (__current),e2
49 #endif
50 .endm
51
52 ###############################################################################
53 #
54 # restore the registers from a stack frame
55 #
56 ###############################################################################
57 .macro RESTORE_ALL
58         # peel back the stack to the calling frame
59         # - this permits execve() to discard extra frames due to kernel syscalls
60         mov     (__frame),fp
61         mov     fp,sp
62         mov     (REG_NEXT,fp),d0                # userspace has regs->next == 0
63         mov     d0,(__frame)
64
65 #ifndef CONFIG_MN10300_USING_JTAG
66         mov     (REG_EPSW,fp),d0
67         btst    EPSW_T,d0
68         beq     99f
69
70         or      EPSW_NMID,epsw
71         movhu   (DCR),d1
72         or      0x0001, d1
73         movhu   d1,(DCR)
74
75 99:
76 #endif
77         movm    (sp),[d2,d3,a2,a3,exreg0,exreg1,exother]
78
79         # must restore usp even if returning to kernel space,
80         # when CONFIG_PREEMPT is enabled.
81         mov     (sp),a1                         # USP in MOVM[other] dummy slot
82         mov     a1,usp
83
84         movm    (sp),[other]
85         add     8,sp
86         rti
87
88 .endm
89
90
91 #endif /* _ASM_FRAME_INC */