Merge rsync://rsync.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[linux-2.6] / include / asm-avr32 / asm.h
1 /*
2  * Copyright (C) 2004-2006 Atmel Corporation
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  */
8 #ifndef __ASM_AVR32_ASM_H__
9 #define __ASM_AVR32_ASM_H__
10
11 #include <asm/sysreg.h>
12 #include <asm/asm-offsets.h>
13 #include <asm/thread_info.h>
14
15 #define mask_interrupts         ssrf    SR_GM_BIT
16 #define mask_exceptions         ssrf    SR_EM_BIT
17 #define unmask_interrupts       csrf    SR_GM_BIT
18 #define unmask_exceptions       csrf    SR_EM_BIT
19
20 #ifdef CONFIG_FRAME_POINTER
21         .macro  save_fp
22         st.w    --sp, r7
23         .endm
24         .macro  restore_fp
25         ld.w    r7, sp++
26         .endm
27         .macro  zero_fp
28         mov     r7, 0
29         .endm
30 #else
31         .macro  save_fp
32         .endm
33         .macro  restore_fp
34         .endm
35         .macro  zero_fp
36         .endm
37 #endif
38         .macro  get_thread_info reg
39         mov     \reg, sp
40         andl    \reg, ~(THREAD_SIZE - 1) & 0xffff
41         .endm
42
43         /* Save and restore registers */
44         .macro  save_min sr, tmp=lr
45         pushm   lr
46         mfsr    \tmp, \sr
47         zero_fp
48         st.w    --sp, \tmp
49         .endm
50
51         .macro  restore_min sr, tmp=lr
52         ld.w    \tmp, sp++
53         mtsr    \sr, \tmp
54         popm    lr
55         .endm
56
57         .macro  save_half sr, tmp=lr
58         save_fp
59         pushm   r8-r9,r10,r11,r12,lr
60         zero_fp
61         mfsr    \tmp, \sr
62         st.w    --sp, \tmp
63         .endm
64
65         .macro  restore_half sr, tmp=lr
66         ld.w    \tmp, sp++
67         mtsr    \sr, \tmp
68         popm    r8-r9,r10,r11,r12,lr
69         restore_fp
70         .endm
71
72         .macro  save_full_user sr, tmp=lr
73         stmts   --sp, r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,sp,lr
74         st.w    --sp, lr
75         zero_fp
76         mfsr    \tmp, \sr
77         st.w    --sp, \tmp
78         .endm
79
80         .macro  restore_full_user sr, tmp=lr
81         ld.w    \tmp, sp++
82         mtsr    \sr, \tmp
83         ld.w    lr, sp++
84         ldmts   sp++, r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,sp,lr
85         .endm
86
87         /* uaccess macros */
88         .macro branch_if_kernel scratch, label
89         get_thread_info \scratch
90         ld.w    \scratch, \scratch[TI_flags]
91         bld     \scratch, TIF_USERSPACE
92         brcc    \label
93         .endm
94
95         .macro ret_if_privileged scratch, addr, size, ret
96         sub     \scratch, \size, 1
97         add     \scratch, \addr
98         retcs   \ret
99         retmi   \ret
100         .endm
101
102 #endif /* __ASM_AVR32_ASM_H__ */